Testing the hudson port changing feature.
[awesomized/libmemcached] / tests / server.c
index f0926695133571f946ccfcad05a1f06dc11a5326..70c0ae3b52e2497d06323292c5cb5547c1fb5124 100644 (file)
@@ -1,8 +1,19 @@
+/* LibMemcached
+ * Copyright (C) 2006-2009 Brian Aker
+ * All rights reserved.
+ *
+ * Use and distribution licensed under the BSD license.  See
+ * the COPYING file in the parent directory for full text.
+ *
+ * Summary:
+ *
+ */
+
 /*
   Startup, and shutdown the memcached servers.
 */
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10 
+#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT+10
 
 #include "config.h"
 
 #include <assert.h>
 #include <signal.h>
 #include <libmemcached/memcached.h>
+#include <libmemcached/util.h>
 #include <unistd.h>
+#include <sys/time.h>
+
 #include "server.h"
 
 void server_startup(server_startup_st *construct)
 {
-  unsigned int x;
-
   if ((construct->server_list= getenv("MEMCACHED_SERVERS")))
   {
     printf("servers %s\n", construct->server_list);
@@ -34,14 +46,31 @@ void server_startup(server_startup_st *construct)
       char *end_ptr;
       end_ptr= server_string_buffer;
 
-      for (x= 0; x < construct->count; x++)
+      for (uint32_t x= 0; x < construct->count; x++)
       {
         char buffer[1024]; /* Nothing special for number */
         int count;
         int status;
+        in_port_t port;
+
+        {
+          char *var;
+          char variable_buffer[1024];
+
+          snprintf(variable_buffer, sizeof(variable_buffer), "LIBMEMCACHED_PORT_%u", x);
+
+          if ((var= getenv(variable_buffer)))
+          {
+            port= (in_port_t)atoi(var);
+          }
+          else
+          {
+            port= (in_port_t)(x + TEST_PORT_BASE);
+          }
+        }
 
         sprintf(buffer, "/tmp/%umemc.pid", x);
-        if (access(buffer, F_OK) == 0) 
+        if (access(buffer, F_OK) == 0)
         {
           FILE *fp= fopen(buffer, "r");
           remove(buffer);
@@ -49,9 +78,9 @@ void server_startup(server_startup_st *construct)
           if (fp != NULL)
           {
             if (fgets(buffer, sizeof(buffer), fp) != NULL)
-            { 
-              pid_t pid = (pid_t)atol(buffer);
-              if (pid != 0) 
+            {
+              pid_t pid= (pid_t)atoi(buffer);
+              if (pid != 0)
                 kill(pid, SIGTERM);
             }
 
@@ -61,21 +90,62 @@ void server_startup(server_startup_st *construct)
 
         if (x == 0)
         {
-          sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u -m 128",
-                    MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
-        } 
+          sprintf(buffer, "%s -d -u root -P /tmp/%umemc.pid -t 1 -p %u -U %u -m 128",
+                 MEMCACHED_BINARY, x, port, port);
+        }
         else
         {
-          sprintf(buffer, "%s -d -P /tmp/%umemc.pid -t 1 -p %u -U %u",
-                    MEMCACHED_BINARY, x, x + TEST_PORT_BASE, x + TEST_PORT_BASE);
+          sprintf(buffer, "%s -d -u root -P /tmp/%umemc.pid -t 1 -p %u -U %u",
+                 MEMCACHED_BINARY, x, port, port);
         }
-        fprintf(stderr, "STARTING SERVER: %s\n", buffer);
-        status= system(buffer);
-        count= sprintf(end_ptr, "localhost:%u,", x + TEST_PORT_BASE);
+       if (libmemcached_util_ping("localhost", port, NULL))
+       {
+         fprintf(stderr, "Server on port %u already exists\n", port);
+       }
+       else
+       {
+         status= system(buffer);
+         fprintf(stderr, "STARTING SERVER: %s  status:%d\n", buffer, status);
+       }
+        count= sprintf(end_ptr, "localhost:%u,", port);
         end_ptr+= count;
       }
       *end_ptr= 0;
 
+      for (uint32_t x= 0; x < construct->count; x++)
+      {
+        uint32_t counter= 3;
+        char buffer[1024]; /* Nothing special for number */
+
+        snprintf(buffer, sizeof(buffer), "/tmp/%umemc.pid", x);
+
+        while (--counter)
+        {
+          int memcached_pid;
+
+          FILE *file;
+          file= fopen(buffer, "r");
+          if (file == NULL)
+          {
+#ifndef WIN32
+            struct timespec req= { .tv_sec= 0, .tv_nsec= 5000 };
+            nanosleep(&req, NULL);
+#endif
+            continue;
+          }
+          char *found= fgets(buffer, sizeof(buffer), file);
+          if (!found)
+          {
+            abort();
+          }
+          // Yes, we currently pitch this and don't make use of it.
+          memcached_pid= atoi(buffer);
+          fclose(file);
+        }
+
+
+      }
+
       construct->server_list= strdup(server_string_buffer);
     }
     printf("servers %s\n", construct->server_list);
@@ -86,9 +156,9 @@ void server_startup(server_startup_st *construct)
 
   srandom((unsigned int)time(NULL));
 
-  for (x= 0; x < memcached_server_list_count(construct->servers); x++)
+  for (uint32_t x= 0; x < memcached_server_list_count(construct->servers); x++)
   {
-    printf("\t%s : %u\n", construct->servers[x].hostname, construct->servers[x].port);
+    printf("\t%s : %d\n", memcached_server_name(&construct->servers[x]), memcached_server_port(&construct->servers[x]));
     assert(construct->servers[x].fd == -1);
     assert(construct->servers[x].cursor_active == 0);
   }
@@ -98,17 +168,15 @@ void server_startup(server_startup_st *construct)
 
 void server_shutdown(server_startup_st *construct)
 {
-  unsigned int x;
-
   if (construct->server_list)
   {
-    for (x= 0; x < construct->count; x++)
+    for (uint32_t x= 0; x < construct->count; x++)
     {
       char buffer[1024]; /* Nothing special for number */
       sprintf(buffer, "cat /tmp/%umemc.pid | xargs kill", x);
       /* We have to check the return value of this or the compiler will yell */
       int sys_ret= system(buffer);
-      assert(sys_ret != -1); 
+      assert(sys_ret != -1);
       sprintf(buffer, "/tmp/%umemc.pid", x);
       unlink(buffer);
     }