Merge in version util.
[m6w6/libmemcached] / tests / mem_functions.c
index 11d7219b68f2b2e6bf0be1bf18351883ebfe2b06..e12ad3f7d9a70a6ef4977b040370300f2f50332d 100644 (file)
@@ -3145,6 +3145,8 @@ static test_return_t output_ketama_weighted_keys(memcached_st *trash)
     char *hostname = memc->hosts[server_idx].hostname;
     in_port_t port = memc->hosts[server_idx].port;
     fprintf(fp, "key %s is on host /%s:%u\n", key, hostname, port);
+    memcached_server_instance_st instance=
+      memcached_server_instance_by_position(memc, host_index);
   }
   fclose(fp);
 #endif
@@ -3590,7 +3592,6 @@ static test_return_t pre_nonblock_binary(memcached_st *memc)
 {
   memcached_return_t rc= MEMCACHED_FAILURE;
   memcached_st *memc_clone;
-  memcached_server_instance_st instance;
 
   memc_clone= memcached_clone(NULL, memc);
   test_true(memc_clone);
@@ -3598,9 +3599,7 @@ static test_return_t pre_nonblock_binary(memcached_st *memc)
   // will not toggle protocol on an connection.
   memcached_version(memc_clone);
 
-  instance= memcached_server_instance_by_position(memc_clone, 0);
-
-  if (instance->major_version >= 1 && instance->minor_version > 2)
+  if (libmemcached_util_version_check(memc_clone, 1, 2, 0))
   {
     memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
     rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
@@ -3726,7 +3725,6 @@ static test_return_t pre_binary(memcached_st *memc)
 {
   memcached_return_t rc= MEMCACHED_FAILURE;
   memcached_st *memc_clone;
-  memcached_server_instance_st instance;
 
   memc_clone= memcached_clone(NULL, memc);
   test_true(memc_clone);
@@ -3734,9 +3732,7 @@ static test_return_t pre_binary(memcached_st *memc)
   // will not toggle protocol on an connection.
   memcached_version(memc_clone);
 
-  instance= memcached_server_instance_by_position(memc_clone, 0);
-
-  if (instance->major_version >= 1 && instance->minor_version > 2)
+  if (libmemcached_util_version_check(memc_clone, 1, 2, 0))
   {
     rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
     test_true(rc == MEMCACHED_SUCCESS);
@@ -4070,13 +4066,7 @@ static test_return_t enable_cas(memcached_st *memc)
 {
   unsigned int set= 1;
 
-  memcached_server_instance_st instance=
-    memcached_server_instance_by_position(memc, 0);
-
-  memcached_version(memc);
-
-  if ((instance->major_version >= 1 && (instance->minor_version == 2 && instance->micro_version >= 4))
-      || instance->minor_version > 2)
+  if (libmemcached_util_version_check(memc, 1, 2, 4))
   {
     memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
 
@@ -4095,7 +4085,9 @@ static test_return_t check_for_1_2_3(memcached_st *memc)
 
   if ((instance->major_version >= 1 && (instance->minor_version == 2 && instance->micro_version >= 4))
       || instance->minor_version > 2)
+  {
     return TEST_SUCCESS;
+  }
 
   return TEST_SKIPPED;
 }
@@ -4423,6 +4415,64 @@ static test_return_t connection_pool_test(memcached_st *memc)
   test_true(memcached_pool_destroy(pool) == memc);
   return TEST_SUCCESS;
 }
+
+static test_return_t util_version_test(memcached_st *memc)
+{
+  bool if_successful;
+
+  if_successful= libmemcached_util_version_check(memc, 0, 0, 0);
+  test_true(if_successful == true);
+
+  if_successful= libmemcached_util_version_check(memc, 9, 9, 9);
+  test_true(if_successful == false);
+
+  memcached_server_instance_st instance=
+    memcached_server_instance_by_position(memc, 0);
+
+  memcached_version(memc);
+
+  // We only use one binary when we test, so this should be just fine.
+  if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->micro_version, instance->minor_version);
+  test_true(if_successful == true);
+
+  if (instance->minor_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->micro_version, instance->minor_version -1);
+  else if (instance->micro_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->micro_version - 1, instance->minor_version);
+  else if (instance->major_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version -1, instance->micro_version, instance->minor_version);
+
+  test_true(if_successful == true);
+
+  if (instance->minor_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->micro_version, instance->minor_version +1);
+  else if (instance->micro_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->micro_version +1, instance->minor_version);
+  else if (instance->major_version > 0)
+    if_successful= libmemcached_util_version_check(memc, instance->major_version +1, instance->micro_version, instance->minor_version);
+
+  test_true(if_successful == false);
+
+  return TEST_SUCCESS;
+}
+
+static test_return_t ping_test(memcached_st *memc)
+{
+  memcached_return_t rc;
+  memcached_server_instance_st instance=
+    memcached_server_instance_by_position(memc, 0);
+
+  // Test both the version that returns a code, and the one that does not.
+  test_true(libmemcached_util_ping(memcached_server_name(instance),
+                                   memcached_server_port(instance), NULL));
+
+  test_true(libmemcached_util_ping(memcached_server_name(instance),
+                                   memcached_server_port(instance), &rc));
+
+  test_true(rc == MEMCACHED_SUCCESS);
+
+  return TEST_SUCCESS;
+}
 #endif
 
 static test_return_t replication_set_test(memcached_st *memc)
@@ -5529,12 +5579,8 @@ static test_return_t regression_bug_463297(memcached_st *memc)
   test_true(memc_clone != NULL);
   test_true(memcached_version(memc_clone) == MEMCACHED_SUCCESS);
 
-  memcached_server_instance_st instance=
-    memcached_server_instance_by_position(memc_clone, 0);
 
-  if (instance->major_version > 1 ||
-      (instance->major_version == 1 &&
-       instance->minor_version > 2))
+  if (libmemcached_util_version_check(memc_clone, 1, 1, 2))
   {
      /* Binary protocol doesn't support deferred delete */
      memcached_st *bin_clone= memcached_clone(NULL, memc);
@@ -5860,6 +5906,34 @@ static test_return_t regression_bug_490486(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+static test_return_t regression_bug_583031(memcached_st *unused)
+{
+  (void)unused;
+
+    memcached_st *memc= memcached_create(NULL);
+    assert(memc);
+    memcached_server_add(memc, "10.2.3.4", 11211);
+
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 3);
+
+    memcached_return_t rc;
+    size_t length;
+    uint32_t flags;
+
+    (void)memcached_get(memc, "dsf", 3, &length, &flags, &rc);
+
+    test_true(rc == MEMCACHED_TIMEOUT);
+
+    memcached_free(memc);
+
+    return TEST_SUCCESS;
+}
+
 static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
 {
   fprintf(stderr, "Iteration #%u: ", it);
@@ -6060,6 +6134,8 @@ test_st tests[] ={
   {"analyzer", 1, (test_callback_fn)analyzer_test},
 #ifdef HAVE_LIBMEMCACHEDUTIL
   {"connectionpool", 1, (test_callback_fn)connection_pool_test },
+  {"ping", 1, (test_callback_fn)ping_test },
+  {"util_version", 1, (test_callback_fn)util_version_test },
 #endif
   {"test_get_last_disconnect", 1, (test_callback_fn)test_get_last_disconnect},
   {"verbosity", 1, (test_callback_fn)test_verbosity},
@@ -6171,6 +6247,7 @@ test_st regression_tests[]= {
   {"lp:447342", 1, (test_callback_fn)regression_bug_447342 },
   {"lp:463297", 1, (test_callback_fn)regression_bug_463297 },
   {"lp:490486", 1, (test_callback_fn)regression_bug_490486 },
+  {"lp:583031", 1, (test_callback_fn)regression_bug_583031 },
   {"lp:?", 1, (test_callback_fn)regression_bug_ },
   {0, 0, (test_callback_fn)0}
 };