Base code merged to SPIN 2.4
[platform/upstream/curl.git] / tests / libtest / lib506.c
index bddda12..4dad0d9 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -40,12 +40,15 @@ struct userdata {
   int counter;
 };
 
+int lock[3];
+
 /* lock callback */
 static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
           void *useptr )
 {
   const char *what;
   struct userdata *user = (struct userdata *)useptr;
+  int locknum;
 
   (void)handle;
   (void)laccess;
@@ -53,17 +56,28 @@ static void my_lock(CURL *handle, curl_lock_data data, curl_lock_access laccess,
   switch ( data ) {
     case CURL_LOCK_DATA_SHARE:
       what = "share";
+      locknum = 0;
       break;
     case CURL_LOCK_DATA_DNS:
       what = "dns";
+      locknum = 1;
       break;
     case CURL_LOCK_DATA_COOKIE:
       what = "cookie";
+      locknum = 2;
       break;
     default:
       fprintf(stderr, "lock: no such data: %d\n", (int)data);
       return;
   }
+
+  /* detect locking of locked locks */
+  if(lock[locknum]) {
+    printf("lock: double locked %s\n", what);
+    return;
+  }
+  lock[locknum]++;
+
   printf("lock:   %-6s [%s]: %d\n", what, user->text, user->counter);
   user->counter++;
 }
@@ -73,21 +87,33 @@ static void my_unlock(CURL *handle, curl_lock_data data, void *useptr )
 {
   const char *what;
   struct userdata *user = (struct userdata *)useptr;
+  int locknum;
   (void)handle;
   switch ( data ) {
     case CURL_LOCK_DATA_SHARE:
       what = "share";
+      locknum = 0;
       break;
     case CURL_LOCK_DATA_DNS:
       what = "dns";
+      locknum = 1;
       break;
     case CURL_LOCK_DATA_COOKIE:
       what = "cookie";
+      locknum = 2;
       break;
     default:
       fprintf(stderr, "unlock: no such data: %d\n", (int)data);
       return;
   }
+
+  /* detect unlocking of unlocked locks */
+  if(!lock[locknum]) {
+    printf("unlock: double unlocked %s\n", what);
+    return;
+  }
+  lock[locknum]--;
+
   printf("unlock: %-6s [%s]: %d\n", what, user->text, user->counter);
   user->counter++;
 }
@@ -149,11 +175,14 @@ int test(char *URL)
 {
   int res;
   CURLSHcode scode = CURLSHE_OK;
-  char *url;
+  CURLcode code = CURLE_OK;
+  char *url = NULL;
   struct Tdata tdata;
   CURL *curl;
   CURLSH *share;
-  struct curl_slist *headers;
+  struct curl_slist *headers = NULL;
+  struct curl_slist *cookies = NULL;
+  struct curl_slist *next_cookie = NULL;
   int i;
   struct userdata user;
 
@@ -270,6 +299,55 @@ int test(char *URL)
   printf( "PERFORM\n" );
   curl_easy_perform( curl );
 
+  printf( "CLEANUP\n" );
+  curl_easy_cleanup( curl );
+  curl_free(url);
+  curl_slist_free_all( headers );
+
+  /* load cookies */
+  if ((curl = curl_easy_init()) == NULL) {
+    fprintf(stderr, "curl_easy_init() failed\n");
+    curl_share_cleanup(share);
+    curl_global_cleanup();
+    return TEST_ERR_MAJOR_BAD;
+  }
+  url = suburl( URL, i );
+  headers = sethost( NULL );
+  test_setopt( curl, CURLOPT_HTTPHEADER, headers );
+  test_setopt( curl, CURLOPT_URL,        url );
+  printf( "CURLOPT_SHARE\n" );
+  test_setopt( curl, CURLOPT_SHARE,      share );
+  printf( "CURLOPT_COOKIELIST ALL\n" );
+  test_setopt( curl, CURLOPT_COOKIELIST, "ALL" );
+  printf( "CURLOPT_COOKIEJAR\n" );
+  test_setopt( curl, CURLOPT_COOKIEFILE, JAR );
+  printf( "CURLOPT_COOKIELIST RELOAD\n" );
+  test_setopt( curl, CURLOPT_COOKIELIST, "RELOAD" );
+
+  code = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
+  if ( code != CURLE_OK )
+  {
+    fprintf(stderr, "curl_easy_getinfo() failed\n");
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+  printf("loaded cookies:\n");
+  if ( !cookies )
+  {
+    fprintf(stderr, "  reloading cookies from '%s' failed\n", JAR);
+    res = TEST_ERR_MAJOR_BAD;
+    goto test_cleanup;
+  }
+  printf("-----------------\n");
+  next_cookie = cookies;
+  while ( next_cookie )
+  {
+    printf( "  %s\n", next_cookie->data );
+    next_cookie = next_cookie->next;
+  }
+  printf("-----------------\n");
+  curl_slist_free_all( cookies );
+
   /* try to free share, expect to fail because share is in use*/
   printf( "try SHARE_CLEANUP...\n" );
   scode = curl_share_cleanup( share );
@@ -287,7 +365,6 @@ test_cleanup:
   printf( "CLEANUP\n" );
   curl_easy_cleanup( curl );
   curl_slist_free_all( headers );
-
   curl_free(url);
 
   /* free share */