Switch to using bind() to just find free ports to use while testing.
authorBrian Aker <brian@tangent.org>
Sun, 19 Feb 2012 00:14:16 +0000 (16:14 -0800)
committerBrian Aker <brian@tangent.org>
Sun, 19 Feb 2012 00:14:16 +0000 (16:14 -0800)
23 files changed:
clients/execute.cc
libtest/port.cc
libtest/port.h
libtest/unittest.cc
tests/cycle.cc
tests/failure.cc
tests/libmemcached-1.0/all_tests.cc
tests/libmemcached-1.0/all_tests_socket.cc
tests/libmemcached-1.0/atomsmasher.cc
tests/libmemcached-1.0/sasl.cc
tests/libmemcached_world.h
tests/libmemcached_world_socket.h
tests/mem_udp.cc
tests/memcapable.cc
tests/memcat.cc
tests/memcp.cc
tests/memdump.cc
tests/memexist.cc
tests/memflush.cc
tests/memrm.cc
tests/memslap.cc
tests/memstat.cc
tests/memtouch.cc

index b276954533e1b119375cd3aba183886dfbf30d21..f877851e8adb50743779f0cee7844af535df3f1d 100644 (file)
@@ -27,7 +27,7 @@ unsigned int execute_set(memcached_st *memc, pairs_st *pairs, unsigned int numbe
     memcached_return_t rc= memcached_set(memc, pairs[x].key, pairs[x].key_length,
                                          pairs[x].value, pairs[x].value_length,
                                          0, 0);
-    if (rc != MEMCACHED_SUCCESS and rc != MEMCACHED_BUFFERED)
+    if (memcached_failed(rc))
     {
       fprintf(stderr, "%s:%d Failure on insert (%s) of %.*s\n",
               __FILE__, __LINE__,
@@ -52,7 +52,6 @@ unsigned int execute_set(memcached_st *memc, pairs_st *pairs, unsigned int numbe
 */
 unsigned int execute_get(memcached_st *memc, pairs_st *pairs, unsigned int number_of)
 {
-  memcached_return_t rc;
   unsigned int x;
   unsigned int retrieved;
 
@@ -64,10 +63,11 @@ unsigned int execute_get(memcached_st *memc, pairs_st *pairs, unsigned int numbe
 
     unsigned int fetch_key= (unsigned int)((unsigned int)random() % number_of);
 
+    memcached_return_t rc;
     char *value= memcached_get(memc, pairs[fetch_key].key, pairs[fetch_key].key_length,
                                &value_length, &flags, &rc);
 
-    if (rc != MEMCACHED_SUCCESS)
+    if (memcached_failed(rc))
     {
       fprintf(stderr, "%s:%d Failure on read(%s) of %.*s\n",
               __FILE__, __LINE__,
index 36939e147aa9e3903f99e9960da826ceea4bf519..c1f2f94551cad8bdb24fc2a742c331141dc03053 100644 (file)
 #include <cassert>
 #include <cstdlib>
 #include <cstring>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <unistd.h>
 #include <ctime>
 #include <fnmatch.h>
 #include <iostream>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h> 
+#include <sys/wait.h>
+#include <unistd.h>
 
 #include <signal.h>
 
@@ -74,4 +75,39 @@ void set_max_port(in_port_t port)
   global_max_port= port;
 }
 
+in_port_t get_free_port()
+{
+  in_port_t ret_port= in_port_t(0);
+  int sd;
+  if ((sd= socket(AF_INET, SOCK_STREAM, 0)) != -1)
+  {
+    int optval= 1;
+    if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) != -1)
+    {
+      struct sockaddr_in sin;
+      sin.sin_port= 0;
+      sin.sin_addr.s_addr= 0;
+      sin.sin_addr.s_addr= INADDR_ANY;
+      sin.sin_family= AF_INET;
+
+      if (bind(sd, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) != -1)
+      {
+        socklen_t addrlen= sizeof(sin);
+
+        if (listen(sd, 100) != -1)
+        {
+          if (getsockname(sd, (struct sockaddr *)&sin, &addrlen) != -1)
+          {
+            ret_port= sin.sin_port;
+          }
+        }
+      }
+    }
+
+    close(sd);
+  }
+
+  return ret_port;
+}
+
 } // namespace libtest
index 20891254a171b5c75c0863b639af2fdce059eb6c..d6fbcb25384151afc8034acd63902f302c10ae0f 100644 (file)
@@ -40,4 +40,7 @@ in_port_t max_port();
 LIBTEST_API
 void set_max_port(in_port_t port);
 
+LIBTEST_API
+in_port_t get_free_port();
+
 } // namespace libtest
index 2d171dfdfae7cea3d3dc37b09f73e184bd4f0317..21dcbc74416bbc3d044ca8e7ef486bbc3be2e907 100644 (file)
@@ -237,7 +237,7 @@ static test_return_t gearmand_cycle_test(void *object)
 #endif
 
   const char *argv[1]= { "cycle_gearmand" };
-  test_true(server_startup(*servers, "gearmand", 9999, 1, argv));
+  test_true(server_startup(*servers, "gearmand", get_free_port(), 1, argv));
 
   return TEST_SUCCESS;
 }
@@ -251,7 +251,7 @@ static test_return_t memcached_cycle_test(void *object)
   {
     test_true(has_memcached_binary());
     const char *argv[1]= { "cycle_memcached" };
-    test_true(server_startup(*servers, "memcached", 9998, 1, argv));
+    test_true(server_startup(*servers, "memcached", get_free_port(), 1, argv));
 
     return TEST_SUCCESS;
   }
@@ -270,7 +270,7 @@ static test_return_t memcached_socket_cycle_test(void *object)
     {
       test_true(has_memcached_binary());
       const char *argv[1]= { "cycle_memcached" };
-      test_true(servers->start_socket_server("memcached", 9997, 1, argv));
+      test_true(servers->start_socket_server("memcached", get_free_port(), 1, argv));
 
       return TEST_SUCCESS;
     }
@@ -295,7 +295,7 @@ static test_return_t memcached_sasl_test(void *object)
     {
       test_true(has_memcached_sasl_binary());
       const char *argv[1]= { "cycle_memcached_sasl" };
-      test_true(server_startup(*servers, "memcached-sasl", 9996, 1, argv));
+      test_true(server_startup(*servers, "memcached-sasl", get_free_port(), 1, argv));
 
       return TEST_SUCCESS;
     }
@@ -506,6 +506,13 @@ static test_return_t application_wait_services_BINARY2(void *)
   return TEST_SUCCESS;
 }
 
+static test_return_t get_free_port_TEST(void *)
+{
+  in_port_t ret_port;
+  test_true_hint((ret_port= get_free_port()), ret_port);
+  return TEST_SUCCESS;
+}
+
 static test_return_t check_for_gearman(void *)
 {
   test_skip(true, HAVE_LIBGEARMAN);
@@ -590,6 +597,11 @@ test_st cmdline_tests[] ={
   {0, 0, 0}
 };
 
+test_st get_free_port_TESTS[] ={
+  {"get_free_port()", 0, get_free_port_TEST },
+  {0, 0, 0}
+};
+
 test_st application_tests[] ={
   {"vchar_t", 0, vchar_t_TEST },
   {"true", 0, application_true_BINARY },
@@ -625,6 +637,7 @@ collection_st collection[] ={
   {"cmdline", 0, 0, cmdline_tests},
   {"application", 0, 0, application_tests},
   {"http", check_for_curl, 0, http_tests},
+  {"get_free_port()", 0, 0, get_free_port_TESTS},
   {0, 0, 0, 0}
 };
 
index 64d2b860355e217dc53ec59dcccea160c6654e2f..a762d00b54d71eb58f00cbb4e98dd1c4852d2c8c 100644 (file)
@@ -127,7 +127,6 @@ collection_st collection[] ={
 };
 
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
 #include "tests/libmemcached_world.h"
 
 void get_world(Framework *world)
index cbc165e0c7d1a2b3f1d0210425cdb203b3205c47..1348e50cd05a8c4365c8ff31c85589d0bcd47a84 100644 (file)
@@ -204,7 +204,6 @@ collection_st collection[] ={
   { 0, 0, 0, 0 }
 };
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
 #include "libmemcached_world.h"
 
 void get_world(Framework *world)
index 8561c9594218084a054884ace674406afb71c633..7fae6d31311bce55c6f4b5e7f34460ca88b4367d 100644 (file)
@@ -35,8 +35,6 @@
  *
  */
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
-
 #include <config.h>
 #include <libtest/test.hpp>
 
index 9698cc75a347762cea8d85f202e0c2d86f2e1ecf..ccb1d3c8692da912a980bcca1d1505292bee0618 100644 (file)
@@ -35,8 +35,6 @@
  *
  */
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
-
 #include <config.h>
 #include <libtest/test.hpp>
 
index 73162d3a225c37d072f48dff4e23976449454151..ad4483ed4df87e2f887fb9bb6834c801caadd9f1 100644 (file)
@@ -275,8 +275,6 @@ collection_st collection[] ={
 };
 
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
-
 #include "tests/libmemcached_world.h"
 
 void get_world(Framework *world)
index 70b42987245464aa863957c68dc749f5a3524ae8..ee8b5e67166d649be03b3e642236f47e109ac6a2 100644 (file)
@@ -43,7 +43,6 @@ using namespace libtest;
   Test cases
 */
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +20
 #include <libmemcached/memcached.h>
 
 static test_return_t pre_sasl(memcached_st *)
index 2e7aa25da818cbeede99ead981ecab409dfa739a..0d3b57dff1a24b1a5006ebe5fe33c59dd013aece 100644 (file)
@@ -78,11 +78,10 @@ static void *world_create(libtest::server_startup_st& servers, test_return_t& er
 
   for (uint32_t x= 0; x < servers.count(); x++)
   {
-    in_port_t port;
-
     char variable_buffer[1024];
     snprintf(variable_buffer, sizeof(variable_buffer), "LIBMEMCACHED_PORT_%u", x);
 
+    in_port_t port;
     char *var;
     if ((var= getenv(variable_buffer)))
     {
@@ -90,7 +89,7 @@ static void *world_create(libtest::server_startup_st& servers, test_return_t& er
     }
     else
     {
-      port= in_port_t(TEST_PORT_BASE +x);
+      port= in_port_t(libtest::get_free_port());
     }
 
     const char *argv[1]= { "memcached" };
@@ -153,17 +152,6 @@ static test_return_t world_container_startup(libmemcached_test_container_st *con
     }
   }
 
-  for (uint32_t host= 0; host < memcached_server_count(container->parent); ++host)
-  {
-    memcached_server_instance_st instance=
-      memcached_server_instance_by_position(container->parent, host);
-
-    if (instance->type == MEMCACHED_CONNECTION_TCP)
-    {
-      test_true_got(memcached_server_port(instance) >= TEST_PORT_BASE, memcached_server_port(instance));
-    }
-  }
-
   return TEST_SUCCESS;
 }
 
@@ -201,8 +189,7 @@ static test_return_t world_pre_run(libmemcached_test_container_st *container)
   test_true(container->memc);
   for (uint32_t loop= 0; loop < memcached_server_list_count(container->memc->servers); loop++)
   {
-    memcached_server_instance_st instance=
-      memcached_server_instance_by_position(container->memc, loop);
+    memcached_server_instance_st instance= memcached_server_instance_by_position(container->memc, loop);
 
     test_compare(-1, instance->fd);
     test_compare(0U, instance->cursor_active);
index b034ca6181b0d99966acc9c82d88dc3c2ecb09de..3e410084de3844340bcdc3eafe20490d79aa158e 100644 (file)
@@ -63,11 +63,10 @@ static void *world_create(libtest::server_startup_st& servers, test_return_t& er
     return NULL;
   }
 
-  in_port_t max_port= TEST_PORT_BASE;
   for (uint32_t x= 0; x < servers.count(); x++)
   {
     const char *argv[1]= { "memcached" };
-    if (not servers.start_socket_server("memcached", max_port +1, 1, argv))
+    if (not servers.start_socket_server("memcached", libtest::get_free_port(), 1, argv))
     {
       error= TEST_FATAL;
       return NULL;
@@ -116,17 +115,6 @@ static test_return_t world_container_startup(libmemcached_test_container_st *con
     }
   }
 
-  for (uint32_t host= 0; host < memcached_server_count(container->parent); ++host)
-  {
-    memcached_server_instance_st instance=
-      memcached_server_instance_by_position(container->parent, host);
-
-    if (instance->type == MEMCACHED_CONNECTION_TCP)
-    {
-      test_true_got(memcached_server_port(instance) >= TEST_PORT_BASE, memcached_server_port(instance));
-    }
-  }
-
   return TEST_SUCCESS;
 }
 
index 1ef95becad18fca438ada9365fbdc764f59d3331..ff631921351b3ad4e65885b95848ef99fa2a3965 100644 (file)
@@ -563,7 +563,6 @@ collection_st collection[] ={
   {0, 0, 0, 0}
 };
 
-#define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
 #include "tests/libmemcached_world.h"
 
 void get_world(Framework *world)
index 4984818841cb4ed95e4bf3918d967fe931d32e32..048333ee3bce2660b99d556ddb10f551e48c43fd 100644 (file)
@@ -114,7 +114,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memcapable" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 4b1096aca9b110b64c0402e2427d00a989015440..bb496a1e56122b5e3ff2a89a7c2a32653eea8900 100644 (file)
@@ -143,7 +143,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memcat" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 698041e69043ae895deb9e83b7332004b5b8ce78..7ce19101a0864829bc24cfb8aa0a55a39c2d34f8 100644 (file)
@@ -102,7 +102,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memcp" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 790d1a68b1669a7475818537e3c666b6c36f571a..80a3fe6bd4f88bb4b6bc5cf2a8209b2fe65df8b8 100644 (file)
@@ -129,7 +129,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memdump" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 9de01fa36ef657dc3a3b58c6ff90eca29a4a64f3..091a8bbeed3497b0126c29e782bb533a5e4056ce 100644 (file)
@@ -141,7 +141,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memexist" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 9754470830201e44084bca16b895523e02424bd0..5339f4e26845017bdebea9c12f997e79d8f65c0c 100644 (file)
@@ -102,7 +102,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memflush" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 382693cd8a90e1290472926069241170c8b8de67..23003beef0d7d813ae546298b1c3e4f4f639d788 100644 (file)
@@ -140,7 +140,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memrm" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index f353978d2305a02ba7c87b32bb0a23aecffe47a2..55c89111acd79f5f9ddaf0ed0c26da8709a6ae55 100644 (file)
@@ -174,7 +174,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memslap" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 33a14e334eeb45624c0ce8a2dd8270848e41dbee..c99836ac2146299f7213310ae0e2fe6c4b879359 100644 (file)
@@ -123,7 +123,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memstat" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }
index 2710cb6c19856707e58da1c3d083dd2353c2daf1..0b28cbc7bfa0b5ce773c7b506f019c5cfc392e44 100644 (file)
@@ -135,7 +135,7 @@ static void *world_create(server_startup_st& servers, test_return_t& error)
   }
 
   const char *argv[1]= { "memtouch" };
-  if (not server_startup(servers, "memcached", MEMCACHED_DEFAULT_PORT +10, 1, argv))
+  if (not server_startup(servers, "memcached", libtest::get_free_port(), 1, argv))
   {
     error= TEST_FAILURE;
   }