return an int
[platform/upstream/curl.git] / tests / libtest / lib506.c
1 #include "test.h"
2 #include <stdlib.h>
3 #include <ctype.h>
4 #include <errno.h>
5
6 const char *HOSTHEADER = "Host: www.host.foo.com";
7 const char *JAR = "log/jar506";
8 #define THREADS 2
9
10
11 /* struct containing data of a thread */
12 struct Tdata {
13   CURLSH *share;
14   char *url;
15 };
16
17 struct userdata {
18   char *text;
19   int counter;
20 };
21
22 /* lock callback */
23 void lock(CURL *handle, curl_lock_data data, curl_lock_access access,
24           void *useptr )
25 {
26   const char *what;
27   struct userdata *user = (struct userdata *)useptr;
28
29   (void)handle;
30   (void)access;
31
32   switch ( data ) {
33     case CURL_LOCK_DATA_SHARE:
34       what = "share";  
35       break;
36     case CURL_LOCK_DATA_DNS:
37       what = "dns";  
38       break;
39     case CURL_LOCK_DATA_COOKIE:
40       what = "cookie";  
41       break;
42     default:
43       fprintf(stderr, "lock: no such data: %d\n",data);
44       return;
45   }
46   printf("lock:   %-6s <%s>: %d\n", what, user->text, user->counter);
47   user->counter++;
48 }
49
50 /* unlock callback */
51 void unlock(CURL *handle, curl_lock_data data, void *useptr )
52 {
53   const char *what;
54   struct userdata *user = (struct userdata *)useptr;
55   (void)handle;
56   switch ( data ) {
57     case CURL_LOCK_DATA_SHARE:
58       what = "share";  
59       break;
60     case CURL_LOCK_DATA_DNS:
61       what = "dns";  
62       break;
63     case CURL_LOCK_DATA_COOKIE:
64       what = "cookie";  
65       break;
66     default:
67       fprintf(stderr, "unlock: no such data: %d\n",data);
68       return;
69   }
70   printf("unlock: %-6s <%s>: %d\n", what, user->text, user->counter);
71   user->counter++;
72 }
73
74
75 /* build host entry */
76 struct curl_slist *sethost(struct curl_slist *headers)
77 {
78   (void)headers;
79   return curl_slist_append(NULL, HOSTHEADER );
80 }
81
82
83 /* the dummy thread function */
84 void *fire(void *ptr)
85 {
86   CURLcode code;
87   struct curl_slist *headers;
88   struct Tdata *tdata = (struct Tdata*)ptr;
89   CURL *curl = curl_easy_init();
90   int i=0;
91
92   headers = sethost(NULL);
93   curl_easy_setopt(curl, CURLOPT_VERBOSE,    1);
94   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, (void*)headers);
95   curl_easy_setopt(curl, CURLOPT_URL,        (void*)tdata->url);
96   printf( "CURLOPT_SHARE\n" );
97   curl_easy_setopt(curl, CURLOPT_SHARE, (void*)tdata->share);
98
99   printf( "PERFORM\n" );
100   code = curl_easy_perform(curl);
101   if( code != CURLE_OK ) {
102     fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
103             tdata->url, i, code);
104   }
105
106   printf( "CLEANUP\n" );
107   curl_easy_cleanup(curl);
108   curl_slist_free_all(headers);
109
110   return NULL;
111 }
112
113
114 /* build request url */
115 char *suburl(char *base, int i)
116 {
117   int len = strlen(base);
118   char *url = (char *)malloc(len+5);
119   if (!url) {
120     abort();
121   }
122   strcpy(url, base);
123   strcat(url, "0000");
124   url[len+3] = 48+i;
125   return url;
126 }
127
128
129 /* test function */
130 int test(char *URL)
131 {
132   int res;
133   CURLSHcode scode;
134   char *url;
135   struct Tdata tdata;
136   CURL *curl;
137   CURLSH *share;
138   struct curl_slist *headers;
139   int i;
140   struct userdata user;
141
142   user.text = (char *)"Pigs in space";
143   user.counter = 0;
144   
145   printf( "GLOBAL_INIT\n" );
146   curl_global_init( CURL_GLOBAL_ALL );
147
148   /* prepare share */
149   printf( "SHARE_INIT\n" );
150   share = curl_share_init();
151   curl_share_setopt( share, CURLSHOPT_LOCKFUNC,   lock);
152   curl_share_setopt( share, CURLSHOPT_UNLOCKFUNC, unlock);
153   curl_share_setopt( share, CURLSHOPT_USERDATA,   &user);
154   printf( "CURL_LOCK_DATA_COOKIE\n" );
155   curl_share_setopt( share, CURLSHOPT_SHARE,      CURL_LOCK_DATA_COOKIE);
156   printf( "CURL_LOCK_DATA_DNS\n" );
157   curl_share_setopt( share, CURLSHOPT_SHARE,      CURL_LOCK_DATA_DNS);
158   
159   res = 0;
160
161   /* start treads */
162   for (i=1; i<=THREADS; i++ ) {
163     
164     /* set thread data */
165     tdata.url   = suburl( URL, i ); /* must be freed */
166     tdata.share = share;
167
168     /* simulate thread, direct call of "thread" function */
169     printf( "*** run %d\n",i );
170     fire( &tdata );
171
172     free( tdata.url );
173
174   }
175
176
177   /* fetch a another one and save cookies */
178   printf( "*** run %d\n", i );
179   curl = curl_easy_init();
180
181   url = suburl( URL, i );
182   headers = sethost( NULL );
183   curl_easy_setopt( curl, CURLOPT_HTTPHEADER, (void*)headers );
184   curl_easy_setopt( curl, CURLOPT_URL,        url );
185   printf( "CURLOPT_SHARE\n" );
186   curl_easy_setopt( curl, CURLOPT_SHARE,      share );
187   printf( "CURLOPT_COOKIEJAR\n" );
188   curl_easy_setopt( curl, CURLOPT_COOKIEJAR,  JAR );
189
190   printf( "PERFORM\n" );
191   curl_easy_perform( curl );
192
193   /* try to free share, expect to fail because share is in use*/
194   printf( "try SHARE_CLEANUP...\n" );
195   scode = curl_share_cleanup( share );
196   if ( scode==CURLSHE_OK )
197   {
198     fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
199     share = NULL;
200   } else {
201     printf( "SHARE_CLEANUP failed, correct\n" );
202   }
203
204   /* clean up last handle */
205   printf( "CLEANUP\n" );
206   curl_easy_cleanup( curl );
207   curl_slist_free_all( headers );
208   free(url);
209   
210   
211   /* free share */
212   printf( "SHARE_CLEANUP\n" );
213   scode = curl_share_cleanup( share );
214   if ( scode!=CURLSHE_OK )
215   {
216     fprintf(stderr, "curl_share_cleanup failed, code errno %d\n", scode);
217   }
218   
219   printf( "GLOBAL_CLEANUP\n" );
220   curl_global_cleanup();
221  
222   return res;
223 }
224