]> granicus.if.org Git - curl/commitdiff
test case 506 added, written by Dirk Manske
authorDaniel Stenberg <daniel@haxx.se>
Mon, 11 Aug 2003 06:44:46 +0000 (06:44 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 11 Aug 2003 06:44:46 +0000 (06:44 +0000)
tests/data/Makefile.am
tests/data/test506 [new file with mode: 0644]
tests/libtest/Makefile.am
tests/libtest/lib506.c [new file with mode: 0644]

index ae7ff1cf97fe68dfbd90e7067365e87a9f23929c..f2a8257b2d6ca351f3750bf593274bfb6ae33c87 100644 (file)
@@ -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 (file)
index 0000000..bb9ee38
--- /dev/null
@@ -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>
index d7cdea4303736761262833ee48d5a48c41e3c9b1..b901c545d0e5b64708b9d847d636a0239141865b 100644 (file)
@@ -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 (file)
index 0000000..52f6a38
--- /dev/null
@@ -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;
+}
+