aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/data/Makefile.am2
-rw-r--r--tests/data/test506147
-rw-r--r--tests/libtest/Makefile.am7
-rw-r--r--tests/libtest/lib506.c210
4 files changed, 364 insertions, 2 deletions
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index ae7ff1cf9..f2a8257b2 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -22,4 +22,4 @@ test500 test501 test502 test503 test504 test136 test57 test137 test138 \
test58 test139 test140 test141 test59 test60 test61 test142 test143 \
test62 test63 test64 test65 test66 test144 test145 test67 test68 test41 \
test40 test42 test69 test70 test71 test72 test73 test146 test505 \
-test74 test75 test76 test77 test78 test147 test148
+test74 test75 test76 test77 test78 test147 test148 test506
diff --git a/tests/data/test506 b/tests/data/test506
new file mode 100644
index 000000000..bb9ee3836
--- /dev/null
+++ b/tests/data/test506
@@ -0,0 +1,147 @@
+# Server-side
+<reply>
+<data1>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Server: test-server/fake
+Content-Type: text/html
+Set-Cookie: test1=one; domain=foo.com; expires=Tue Feb 1 11:56:27 MET 2007
+Set-Cookie: test2=two; domain=host.foo.com; expires=Tue Feb 1 11:56:27 MET 2007
+Set-Cookie: test3=three; domain=foo.com; expires=Tue Feb 1 11:56:27 MET 2007
+Content-Length: 29
+
+run 1: set cookie 1, 2 and 3
+</data1>
+<data2>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:01 GMT
+Server: test-server/fake
+Content-Type: text/html
+Set-Cookie: test4=four; domain=host.foo.com; expires=Tue Feb 1 11:56:27 MET 2007
+Set-Cookie: test5=five; domain=host.foo.com; expires=Tue Feb 1 11:56:27 MET 2007
+Content-Length: 26
+
+run 2: set cookie 4 and 5
+</data2>
+<data3>
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:02 GMT
+Server: test-server/fake
+Content-Type: text/html
+Funny-head: yesyes
+Set-Cookie: test4=overwritten4; domain=host.foo.com; expires=Thu Dec 31 23:59:59 MET 2009
+Set-Cookie: test1=overwritten1; domain=foo.com; expires=Tue Feb 2 11:56:27 MET 2007
+Content-Type: text/html
+Content-Length: 32
+
+run 3: overwrite cookie 1 and 4
+</data5>
+</reply>
+
+# Client-side
+<client>
+<server>
+http
+</server>
+<name>
+HTTP with shared cookie list (and dns cache)
+</name>
+<tool>
+lib506
+</tool>
+<command>
+http://%HOSTIP:%HOSTPORT/506
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<stdout>
+GLOBAL_INIT
+SHARE_INIT
+CURL_LOCK_DATA_COOKIE
+CURL_LOCK_DATA_DNS
+*** run 1
+CURLOPT_SHARE
+lock: share <Pigs in space>
+unlock: share <Pigs in space>
+PERFORM
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+run 1: set cookie 1, 2 and 3
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+CLEANUP
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+*** run 2
+CURLOPT_SHARE
+lock: share <Pigs in space>
+unlock: share <Pigs in space>
+PERFORM
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+run 2: set cookie 4 and 5
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+CLEANUP
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+*** run 3
+CURLOPT_SHARE
+lock: share <Pigs in space>
+unlock: share <Pigs in space>
+CURLOPT_COOKIEJAR
+PERFORM
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+run 3: overwrite cookie 1 and 4
+lock: dns <Pigs in space>
+unlock: dns <Pigs in space>
+try SHARE_CLEANUP...
+lock: share <Pigs in space>
+unlock: share <Pigs in space>
+SHARE_CLEANUP failed, correct
+CLEANUP
+lock: cookie <Pigs in space>
+unlock: cookie <Pigs in space>
+SHARE_CLEANUP
+lock: share <Pigs in space>
+unlock: share <Pigs in space>
+GLOBAL_CLEANUP
+</stdout>
+<stderr>
+http://%HOSTIP:%HOSTPORT/506
+</stderr>
+<file name="log/jar506">
+# Netscape HTTP Cookie File
+# http://www.netscape.com/newsref/std/cookie_spec.html
+# This file was generated by libcurl! Edit at your own risk.
+
+.foo.com TRUE / FALSE 1170413787 test1 overwritten1
+.host.foo.com TRUE / FALSE 1170327387 test2 two
+.foo.com TRUE / FALSE 1170327387 test3 three
+.host.foo.com TRUE / FALSE 1262300399 test4 overwritten4
+.host.foo.com TRUE / FALSE 1170327387 test5 five
+</file>
+</verify>
diff --git a/tests/libtest/Makefile.am b/tests/libtest/Makefile.am
index d7cdea430..b901c545d 100644
--- a/tests/libtest/Makefile.am
+++ b/tests/libtest/Makefile.am
@@ -11,7 +11,7 @@ LIBDIR = ../../lib
SUPPORTFILES = first.c test.h
# here are all tools used for running libcurl tests
-noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505
+noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506
lib500_SOURCES = lib500.c $(SUPPORTFILES)
lib500_LDADD = $(LIBDIR)/libcurl.la
@@ -36,3 +36,8 @@ lib504_DEPENDENCIES = $(LIBDIR)/libcurl.la
lib505_SOURCES = lib505.c $(SUPPORTFILES)
lib505_LDADD = $(LIBDIR)/libcurl.la
lib505_DEPENDENCIES = $(LIBDIR)/libcurl.la
+
+lib506_SOURCES = lib506.c $(SUPPORTFILES)
+lib506_LDADD = $(LIBDIR)/libcurl.la
+lib506_DEPENDENCIES = $(LIBDIR)/libcurl.la
+
diff --git a/tests/libtest/lib506.c b/tests/libtest/lib506.c
new file mode 100644
index 000000000..52f6a38e7
--- /dev/null
+++ b/tests/libtest/lib506.c
@@ -0,0 +1,210 @@
+#include "test.h"
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+const char *HOSTHEADER = "Host: www.host.foo.com";
+const char *JAR = "log/jar506";
+#define THREADS 2
+
+
+/* struct containing data of a thread */
+struct Tdata {
+ CURLSH *share;
+ char *url;
+};
+
+
+/* lock callback */
+void lock(CURL *handle, curl_lock_data data, curl_lock_access access,
+ void *useptr )
+{
+ const char *what;
+ (void)handle;
+ (void)access;
+ switch ( data ) {
+ case CURL_LOCK_DATA_SHARE:
+ what = "share ";
+ break;
+ case CURL_LOCK_DATA_DNS:
+ what = "dns ";
+ break;
+ case CURL_LOCK_DATA_COOKIE:
+ what = "cookie";
+ break;
+ default:
+ fprintf(stderr, "lock: no such data: %d\n",data);
+ return;
+ }
+ printf("lock: %s <%s>\n", what, (char *)useptr);
+}
+
+/* unlock callback */
+void unlock(CURL *handle, curl_lock_data data, void *useptr )
+{
+ const char *what;
+ (void)handle;
+ switch ( data ) {
+ case CURL_LOCK_DATA_SHARE:
+ what = "share ";
+ break;
+ case CURL_LOCK_DATA_DNS:
+ what = "dns ";
+ break;
+ case CURL_LOCK_DATA_COOKIE:
+ what = "cookie";
+ break;
+ default:
+ fprintf(stderr, "unlock: no such data: %d\n",data);
+ return;
+ }
+ printf("unlock: %s <%s>\n", what, (char *)useptr);
+}
+
+
+/* build host entry */
+struct curl_slist *sethost(struct curl_slist *headers)
+{
+ (void)headers;
+ return curl_slist_append(NULL, HOSTHEADER );
+}
+
+
+/* the dummy thread function */
+void *fire(void *ptr)
+{
+ CURLcode code;
+ struct curl_slist *headers;
+ struct Tdata *tdata = (struct Tdata*)ptr;
+ CURL *curl = curl_easy_init();
+ int i;
+
+ headers = sethost(NULL);
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, (void*)headers);
+ curl_easy_setopt(curl, CURLOPT_URL, (void*)tdata->url);
+ printf( "CURLOPT_SHARE\n" );
+ curl_easy_setopt(curl, CURLOPT_SHARE, (void*)tdata->share);
+
+ printf( "PERFORM\n" );
+ code = curl_easy_perform(curl);
+ if( code != CURLE_OK ) {
+ fprintf(stderr, "perform url '%s' repeat %d failed, curlcode %d\n",
+ tdata->url, i, code);
+ }
+
+ printf( "CLEANUP\n" );
+ curl_easy_cleanup(curl);
+ curl_slist_free_all(headers);
+
+ return NULL;
+}
+
+
+/* build request url */
+char *suburl(char *base, int i)
+{
+ int len = strlen(base);
+ char *url = (char *)malloc(len+5);
+ if (!url) {
+ abort();
+ }
+ strcpy(url, base);
+ strcat(url, "0000");
+ url[len+3] = 48+i;
+ return url;
+}
+
+
+/* test function */
+CURLcode test(char *URL)
+{
+ CURLcode res;
+ CURLSHcode scode;
+ char *url;
+ struct Tdata tdata;
+ CURL *curl;
+ CURLSH *share;
+ struct curl_slist *headers;
+ int i;
+
+ printf( "GLOBAL_INIT\n" );
+ curl_global_init( CURL_GLOBAL_ALL );
+
+ /* prepare share */
+ printf( "SHARE_INIT\n" );
+ share = curl_share_init();
+ curl_share_setopt( share, CURLSHOPT_LOCKFUNC, lock);
+ curl_share_setopt( share, CURLSHOPT_UNLOCKFUNC, unlock);
+ curl_share_setopt( share, CURLSHOPT_USERDATA, "Pigs in space");
+ printf( "CURL_LOCK_DATA_COOKIE\n" );
+ curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+ printf( "CURL_LOCK_DATA_DNS\n" );
+ curl_share_setopt( share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
+
+ res = 0;
+
+ /* start treads */
+ for (i=1; i<=THREADS; i++ ) {
+
+ /* set thread data */
+ tdata.url = suburl( URL, i ); /* must be freed */
+ tdata.share = share;
+
+ /* simulate thread, direct call of "thread" function */
+ printf( "*** run %d\n",i );
+ fire( &tdata );
+
+ free( tdata.url );
+
+ }
+
+
+ /* fetch a another one and save cookies */
+ printf( "*** run %d\n", i );
+ curl = curl_easy_init();
+
+ url = suburl( URL, i );
+ headers = sethost( NULL );
+ curl_easy_setopt( curl, CURLOPT_HTTPHEADER, (void*)headers );
+ curl_easy_setopt( curl, CURLOPT_URL, url );
+ printf( "CURLOPT_SHARE\n" );
+ curl_easy_setopt( curl, CURLOPT_SHARE, share );
+ printf( "CURLOPT_COOKIEJAR\n" );
+ curl_easy_setopt( curl, CURLOPT_COOKIEJAR, JAR );
+
+ printf( "PERFORM\n" );
+ curl_easy_perform( curl );
+
+ /* try to free share, expect to fail because share is in use*/
+ printf( "try SHARE_CLEANUP...\n" );
+ scode = curl_share_cleanup( share );
+ if ( scode==CURLSHE_OK )
+ {
+ fprintf(stderr, "curl_share_cleanup succeed but error expected\n");
+ share = NULL;
+ } else {
+ printf( "SHARE_CLEANUP failed, correct\n" );
+ }
+
+ /* clean up last handle */
+ printf( "CLEANUP\n" );
+ curl_easy_cleanup( curl );
+ curl_slist_free_all( headers );
+ free(url);
+
+
+ /* free share */
+ printf( "SHARE_CLEANUP\n" );
+ scode = curl_share_cleanup( share );
+ if ( scode!=CURLSHE_OK )
+ {
+ fprintf(stderr, "curl_share_cleanup failed, code errno %d\n", scode);
+ }
+
+ printf( "GLOBAL_CLEANUP\n" );
+ curl_global_cleanup();
+
+ return res;
+}
+