X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=tests%2Fmem_functions.cc;h=cca23464e01ac16d9b63aa21e2c5cdef6ca3395d;hb=1805d9d7e2c959f92c28057b7cfadcd48ba9a68a;hp=12758eeb0c95f2f31b11723817e77c7856a18f83;hpb=36f67e19846d18ec8d590eeb3fae03930e44ecdb;p=m6w6%2Flibmemcached diff --git a/tests/mem_functions.cc b/tests/mem_functions.cc index 12758eeb..cca23464 100644 --- a/tests/mem_functions.cc +++ b/tests/mem_functions.cc @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,7 @@ #include "tests/debug.h" #include "tests/deprecated.h" #include "tests/error_conditions.h" +#include "tests/exist.h" #include "tests/ketama.h" #include "tests/namespace.h" #include "tests/parser.h" @@ -571,9 +573,11 @@ static test_return_t cas2_test(memcached_st *memc) test_compare(MEMCACHED_SUCCESS, rc); } - rc= memcached_mget(memc, keys, key_length, 3); + test_compare(MEMCACHED_SUCCESS, + memcached_mget(memc, keys, key_length, 3)); results= memcached_result_create(memc, &results_obj); + test_true(results); results= memcached_fetch_result(memc, &results_obj, &rc); test_true(results); @@ -616,9 +620,11 @@ static test_return_t cas_test(memcached_st *memc) (time_t)0, (uint32_t)0); test_compare(MEMCACHED_SUCCESS, rc); - rc= memcached_mget(memc, keys, keylengths, 1); + test_compare(MEMCACHED_SUCCESS, + memcached_mget(memc, keys, keylengths, 1)); results= memcached_result_create(memc, &results_obj); + test_true(results); results= memcached_fetch_result(memc, &results_obj, &rc); test_true(results); @@ -817,17 +823,14 @@ static test_return_t bad_key_test(memcached_st *memc) { memcached_return_t rc; const char *key= "foo bad"; - char *string; - size_t string_length; uint32_t flags; memcached_st *memc_clone; - unsigned int set= 1; - size_t max_keylen= 0xffff; - // Just skip if we are in binary mode. uint64_t query_id= memcached_query_id(memc); - if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL)) - return TEST_SKIPPED; + + // Just skip if we are in binary mode. + test_skip(false, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL)); + test_compare(query_id, memcached_query_id(memc)); // We should not increase the query_id for memcached_behavior_get() memc_clone= memcached_clone(NULL, memc); @@ -835,37 +838,42 @@ static test_return_t bad_key_test(memcached_st *memc) query_id= memcached_query_id(memc_clone); test_compare(MEMCACHED_SUCCESS, - memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set)); + memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true)); test_compare(query_id, memcached_query_id(memc_clone)); // We should not increase the query_id for memcached_behavior_set() /* All keys are valid in the binary protocol (except for length) */ if (not memcached_behavior_get(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL)) { - query_id= memcached_query_id(memc_clone); - string= memcached_get(memc_clone, key, strlen(key), - &string_length, &flags, &rc); - test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc); - test_zero(string_length); - test_false(string); + uint64_t before_query_id= memcached_query_id(memc_clone); + { + size_t string_length; + char *string= memcached_get(memc_clone, key, strlen(key), + &string_length, &flags, &rc); + test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc); + test_zero(string_length); + test_false(string); + } + test_compare(before_query_id +1, memcached_query_id(memc_clone)); - set= 0; query_id= memcached_query_id(memc_clone); test_compare(MEMCACHED_SUCCESS, - memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set)); + memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, false)); test_compare(query_id, memcached_query_id(memc_clone)); // We should not increase the query_id for memcached_behavior_set() - string= memcached_get(memc_clone, key, strlen(key), - &string_length, &flags, &rc); - test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc)); - test_zero(string_length); - test_false(string); + { + size_t string_length; + char *string= memcached_get(memc_clone, key, strlen(key), + &string_length, &flags, &rc); + test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc)); + test_zero(string_length); + test_false(string); + } /* Test multi key for bad keys */ const char *keys[] = { "GoodKey", "Bad Key", "NotMine" }; size_t key_lengths[] = { 7, 7, 7 }; - set= 1; query_id= memcached_query_id(memc_clone); test_compare(MEMCACHED_SUCCESS, - memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set)); + memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true)); test_compare(query_id, memcached_query_id(memc_clone)); query_id= memcached_query_id(memc_clone); @@ -878,8 +886,6 @@ static test_return_t bad_key_test(memcached_st *memc) memcached_mget_by_key(memc_clone, "foo daddy", 9, keys, key_lengths, 1)); test_compare(query_id +1, memcached_query_id(memc_clone)); - max_keylen= 250; - /* The following test should be moved to the end of this function when the memcached server is updated to allow max size length of the keys in the binary protocol @@ -887,35 +893,33 @@ static test_return_t bad_key_test(memcached_st *memc) test_compare(MEMCACHED_SUCCESS, memcached_callback_set(memc_clone, MEMCACHED_CALLBACK_NAMESPACE, NULL)); - char *longkey= (char *)malloc(max_keylen + 1); - if (longkey) + std::vector longkey; + longkey.insert(longkey.end(), MEMCACHED_MAX_KEY, 'a'); + test_compare(longkey.size(), size_t(MEMCACHED_MAX_KEY)); { - memset(longkey, 'a', max_keylen + 1); - string= memcached_get(memc_clone, longkey, max_keylen, - &string_length, &flags, &rc); + size_t string_length; + // We subtract 1 + test_null(memcached_get(memc_clone, &longkey[0], longkey.size() -1, &string_length, &flags, &rc)); test_compare(MEMCACHED_NOTFOUND, rc); test_zero(string_length); - test_false(string); - string= memcached_get(memc_clone, longkey, max_keylen + 1, - &string_length, &flags, &rc); + test_null(memcached_get(memc_clone, &longkey[0], longkey.size(), &string_length, &flags, &rc)); test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc); test_zero(string_length); - test_false(string); - - free(longkey); } } /* Make sure zero length keys are marked as bad */ - set= 1; - test_compare(MEMCACHED_SUCCESS, - memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set)); - string= memcached_get(memc_clone, key, 0, - &string_length, &flags, &rc); - test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc); - test_zero(string_length); - test_false(string); + { + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true)); + size_t string_length; + char *string= memcached_get(memc_clone, key, 0, + &string_length, &flags, &rc); + test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc); + test_zero(string_length); + test_false(string); + } memcached_free(memc_clone); @@ -990,12 +994,11 @@ static memcached_return_t delete_trigger(memcached_st *, static test_return_t delete_through(memcached_st *memc) { memcached_trigger_delete_key_fn callback; - memcached_return_t rc; callback= (memcached_trigger_delete_key_fn)delete_trigger; - rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_DELETE_TRIGGER, *(void**)&callback); - test_compare(MEMCACHED_SUCCESS, rc); + test_compare(MEMCACHED_SUCCESS, + memcached_callback_set(memc, MEMCACHED_CALLBACK_DELETE_TRIGGER, *(void**)&callback)); return TEST_SUCCESS; } @@ -1264,6 +1267,7 @@ static test_return_t mget_end(memcached_st *memc) // this should indicate end string= memcached_fetch(memc, key, &key_length, &string_length, &flags, &rc); test_compare(MEMCACHED_END, rc); + test_null(string); // now get just one rc= memcached_mget(memc, keys, lengths, 1); @@ -1280,6 +1284,7 @@ static test_return_t mget_end(memcached_st *memc) // this should indicate end string= memcached_fetch(memc, key, &key_length, &string_length, &flags, &rc); test_compare(MEMCACHED_END, rc); + test_null(string); return TEST_SUCCESS; } @@ -2781,43 +2786,33 @@ static test_return_t user_supplied_bug13(memcached_st *memc) */ static test_return_t user_supplied_bug14(memcached_st *memc) { - size_t setter= 1; - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter); - memcached_return_t rc; - const char *key= "foo"; - char *value; - size_t value_length= 18000; - char *string; - size_t string_length; - uint32_t flags; - unsigned int x; - size_t current_length; + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, true); - value = (char*)malloc(value_length); - test_true(value); - - for (x= 0; x < value_length; x++) - value[x] = (char) (x % 127); + std::vector value; + for (size_t x= 0; x < 18000; x++) + { + value.push_back((char) (x % 127)); + } - for (current_length= 0; current_length < value_length; current_length++) + for (size_t current_length= 0; current_length < value.size(); current_length++) { - rc= memcached_set(memc, key, strlen(key), - value, current_length, - (time_t)0, (uint32_t)0); - test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED); + memcached_return_t rc= memcached_set(memc, test_literal_param("foo"), + &value[0], current_length, + (time_t)0, (uint32_t)0); + test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED); - string= memcached_get(memc, key, strlen(key), - &string_length, &flags, &rc); + size_t string_length; + uint32_t flags; + char *string= memcached_get(memc, test_literal_param("foo"), + &string_length, &flags, &rc); test_compare(MEMCACHED_SUCCESS, rc); - test_true(string_length == current_length); - test_memcmp(string, value, string_length); + test_compare(string_length, current_length); + test_memcmp(string, &value[0], string_length); free(string); } - free(value); - return TEST_SUCCESS; } @@ -2826,35 +2821,31 @@ static test_return_t user_supplied_bug14(memcached_st *memc) */ static test_return_t user_supplied_bug15(memcached_st *memc) { - uint32_t x; - memcached_return_t rc; - const char *key= "mykey"; - size_t length; - uint32_t flags; - - for (x= 0; x < 2; x++) + for (uint32_t x= 0; x < 2; x++) { - rc= memcached_set(memc, key, strlen(key), - NULL, 0, - (time_t)0, (uint32_t)0); + memcached_return_t rc= memcached_set(memc, test_literal_param("mykey"), + NULL, 0, + (time_t)0, (uint32_t)0); test_compare(MEMCACHED_SUCCESS, rc); - char *value= memcached_get(memc, key, strlen(key), + size_t length; + uint32_t flags; + char *value= memcached_get(memc, test_literal_param("mykey"), &length, &flags, &rc); test_compare(MEMCACHED_SUCCESS, rc); test_false(value); - test_false(length); - test_false(flags); + test_zero(length); + test_zero(flags); - value= memcached_get(memc, key, strlen(key), + value= memcached_get(memc, test_literal_param("mykey"), &length, &flags, &rc); test_compare(MEMCACHED_SUCCESS, rc); test_true(value == NULL); - test_true(length == 0); - test_true(flags == 0); + test_zero(length); + test_zero(flags); } return TEST_SUCCESS; @@ -2863,25 +2854,21 @@ static test_return_t user_supplied_bug15(memcached_st *memc) /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */ static test_return_t user_supplied_bug16(memcached_st *memc) { - memcached_return_t rc; - const char *key= "mykey"; - char *value; - size_t length; - uint32_t flags; - - rc= memcached_set(memc, key, strlen(key), - NULL, 0, - (time_t)0, UINT32_MAX); + memcached_return_t rc= memcached_set(memc, test_literal_param("mykey"), + NULL, 0, + (time_t)0, UINT32_MAX); test_compare(MEMCACHED_SUCCESS, rc); - value= memcached_get(memc, key, strlen(key), + size_t length; + uint32_t flags; + char *value= memcached_get(memc, test_literal_param("mykey"), &length, &flags, &rc); test_compare(MEMCACHED_SUCCESS, rc); test_true(value == NULL); - test_true(length == 0); - test_true(flags == UINT32_MAX); + test_zero(length); + test_compare(flags, UINT32_MAX); return TEST_SUCCESS; } @@ -2890,21 +2877,18 @@ static test_return_t user_supplied_bug16(memcached_st *memc) /* Check the validity of chinese key*/ static test_return_t user_supplied_bug17(memcached_st *memc) { - memcached_return_t rc; const char *key= "豆瓣"; const char *value="我们在炎热抑郁的夏天无法停止豆瓣"; - char *value2; - size_t length; - uint32_t flags; - - rc= memcached_set(memc, key, strlen(key), - value, strlen(value), - (time_t)0, 0); + memcached_return_t rc= memcached_set(memc, key, strlen(key), + value, strlen(value), + (time_t)0, 0); test_compare(MEMCACHED_SUCCESS, rc); - value2= memcached_get(memc, key, strlen(key), - &length, &flags, &rc); + size_t length; + uint32_t flags; + char *value2= memcached_get(memc, key, strlen(key), + &length, &flags, &rc); test_true(length==strlen(value)); test_compare(MEMCACHED_SUCCESS, rc); @@ -2936,29 +2920,30 @@ static test_return_t user_supplied_bug19(memcached_st *) /* CAS test from Andei */ static test_return_t user_supplied_bug20(memcached_st *memc) { - memcached_return_t status; - memcached_result_st *result, result_obj; - const char *key = "abc"; - size_t key_len = strlen("abc"); - const char *value = "foobar"; - size_t value_len = strlen(value); + const char *key= "abc"; + size_t key_len= strlen("abc"); - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1); + test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, true)); - status = memcached_set(memc, key, key_len, value, value_len, (time_t)0, (uint32_t)0); - test_true(status == MEMCACHED_SUCCESS); + test_compare(MEMCACHED_SUCCESS, + memcached_set(memc, + test_literal_param("abc"), + test_literal_param("foobar"), + (time_t)0, (uint32_t)0)); - status = memcached_mget(memc, &key, &key_len, 1); - test_true(status == MEMCACHED_SUCCESS); + test_compare(MEMCACHED_SUCCESS, + memcached_mget(memc, &key, &key_len, 1)); - result= memcached_result_create(memc, &result_obj); + memcached_result_st result_obj; + memcached_result_st *result= memcached_result_create(memc, &result_obj); test_true(result); memcached_result_create(memc, &result_obj); + memcached_return_t status; result= memcached_fetch_result(memc, &result_obj, &status); test_true(result); - test_true(status == MEMCACHED_SUCCESS); + test_compare(MEMCACHED_SUCCESS, status); memcached_result_free(result); @@ -2992,7 +2977,7 @@ static test_return_t _user_supplied_bug21(memcached_st* memc, size_t key_count) test_true(memc_clone); /* only binproto uses getq for mget */ - test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1)); + test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, true)); /* empty the cache to ensure misses (hence non-responses) */ test_compare(MEMCACHED_SUCCESS, memcached_flush(memc_clone, 0)); @@ -3056,7 +3041,9 @@ static test_return_t user_supplied_bug21(memcached_st *memc) test_rc= pre_binary(memc); if (test_rc != TEST_SUCCESS) + { return test_rc; + } /* should work as of r580 */ test_compare(TEST_SUCCESS, @@ -3069,23 +3056,20 @@ static test_return_t user_supplied_bug21(memcached_st *memc) return TEST_SUCCESS; } -static test_return_t output_ketama_weighted_keys(memcached_st *trash) +static test_return_t output_ketama_weighted_keys(memcached_st *) { - (void) trash; - - memcached_return_t rc; memcached_st *memc= memcached_create(NULL); test_true(memc); - rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1); - test_compare(MEMCACHED_SUCCESS, rc); + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, true)); uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED); - test_true(value == 1); + test_compare(value, uint64_t(1)); - rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5); - test_compare(MEMCACHED_SUCCESS, rc); + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5)); value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH); test_true(value == MEMCACHED_HASH_MD5); @@ -3132,30 +3116,26 @@ static test_return_t output_ketama_weighted_keys(memcached_st *trash) static test_return_t result_static(memcached_st *memc) { memcached_result_st result; - memcached_result_st *result_ptr; - - result_ptr= memcached_result_create(memc, &result); - test_true(result.options.is_allocated == false); - test_true(memcached_is_initialized(&result) == true); + memcached_result_st *result_ptr= memcached_result_create(memc, &result); + test_false(result.options.is_allocated); + test_true(memcached_is_initialized(&result)); test_true(result_ptr); test_true(result_ptr == &result); memcached_result_free(&result); - test_true(result.options.is_allocated == false); - test_true(memcached_is_initialized(&result) == false); + test_false(result.options.is_allocated); + test_false(memcached_is_initialized(&result)); return TEST_SUCCESS; } static test_return_t result_alloc(memcached_st *memc) { - memcached_result_st *result_ptr; - - result_ptr= memcached_result_create(memc, NULL); + memcached_result_st *result_ptr= memcached_result_create(memc, NULL); test_true(result_ptr); - test_true(result_ptr->options.is_allocated == true); - test_true(memcached_is_initialized(result_ptr) == true); + test_true(result_ptr->options.is_allocated); + test_true(memcached_is_initialized(result_ptr)); memcached_result_free(result_ptr); return TEST_SUCCESS; @@ -3169,9 +3149,8 @@ static test_return_t cleanup_pairs(memcached_st *memc) return TEST_SUCCESS; } -static test_return_t generate_pairs(memcached_st *memc) +static test_return_t generate_pairs(memcached_st *) { - (void)memc; global_pairs= pairs_generate(GLOBAL_COUNT, 400); global_count= GLOBAL_COUNT; @@ -3238,10 +3217,7 @@ static test_return_t generate_data_with_stats(memcached_st *memc) } static test_return_t generate_buffer_data(memcached_st *memc) { - size_t latch= 0; - - latch= 1; - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch); + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, true); generate_data(memc); return TEST_SUCCESS; @@ -3316,7 +3292,7 @@ static test_return_t mget_read(memcached_st *memc) unsigned int keys_returned; test_compare(TEST_SUCCESS, fetch_all_results(memc, keys_returned, MEMCACHED_SUCCESS)); test_true(keys_returned > 0); - test_compare_got(global_count, keys_returned, "Possible false, positive, memcached may have ejected key/value based on memory needs"); + test_compare_warn_hint(global_count, keys_returned, "Possible false, positive, memcached may have ejected key/value based on memory needs"); } return TEST_SUCCESS; @@ -3334,6 +3310,7 @@ static test_return_t mget_read_result(memcached_st *memc) { memcached_result_st results_obj; memcached_result_st *results= memcached_result_create(memc, &results_obj); + test_true(results); memcached_return_t rc; while ((results= memcached_fetch_result(memc, &results_obj, &rc))) @@ -3404,6 +3381,8 @@ static test_return_t mget_read_partial_result(memcached_st *memc) { memcached_result_st results_obj; memcached_result_st *results= memcached_result_create(memc, &results_obj); + test_true(results); + test_false(memcached_is_allocated(results)); memcached_return_t rc; while ((results= memcached_fetch_result(memc, &results_obj, &rc))) @@ -3446,8 +3425,7 @@ static test_return_t delete_generate(memcached_st *memc) static test_return_t delete_buffer_generate(memcached_st *memc) { - uint64_t latch= 1; - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch); + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, true); for (size_t x= 0; x < global_count; x++) { @@ -3546,13 +3524,8 @@ static test_return_t pre_nonblock_binary(memcached_st *memc) static test_return_t pre_murmur(memcached_st *memc) { -#ifdef HAVE_MURMUR_HASH - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR); + test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR)); return TEST_SUCCESS; -#else - (void) memc; - return TEST_SKIPPED; -#endif } static test_return_t pre_jenkins(memcached_st *memc) @@ -3579,25 +3552,20 @@ static test_return_t pre_crc(memcached_st *memc) static test_return_t pre_hsieh(memcached_st *memc) { -#ifdef HAVE_HSIEH_HASH - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH); + test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH)); return TEST_SUCCESS; -#else - (void) memc; - return TEST_SKIPPED; -#endif } static test_return_t pre_hash_fnv1_64(memcached_st *memc) { - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR); + test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR)); return TEST_SUCCESS; } static test_return_t pre_hash_fnv1a_64(memcached_st *memc) { - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_64); + test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_64)); return TEST_SUCCESS; } @@ -3622,7 +3590,7 @@ static test_return_t pre_behavior_ketama(memcached_st *memc) test_compare(MEMCACHED_SUCCESS, rc); uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA); - test_true(value == 1); + test_compare(value, uint64_t(1)); return TEST_SUCCESS; } @@ -3633,13 +3601,13 @@ static test_return_t pre_behavior_ketama_weighted(memcached_st *memc) test_compare(MEMCACHED_SUCCESS, rc); uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED); - test_true(value == 1); + test_compare(value, uint64_t(1)); - rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5); - test_compare(MEMCACHED_SUCCESS, rc); + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5)); value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH); - test_true(value == MEMCACHED_HASH_MD5); + test_compare(MEMCACHED_HASH_MD5, memcached_hash_t(value)); return TEST_SUCCESS; } @@ -3764,6 +3732,7 @@ static test_return_t selection_of_namespace_tests(memcached_st *memc) /* Make sure be default none exists */ value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc); + test_null(value); test_compare_got(MEMCACHED_FAILURE, rc, memcached_strerror(NULL, rc)); /* Test a clean set */ @@ -3835,6 +3804,7 @@ static test_return_t set_namespace(memcached_st *memc) /* Make sure be default none exists */ value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc); + test_null(value); test_compare_got(MEMCACHED_FAILURE, rc, memcached_strerror(NULL, rc)); /* Test a clean set */ @@ -3958,7 +3928,9 @@ static test_return_t enable_consistent_hsieh(memcached_st *memc) memcached_hash_t hash; memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value); if ((rc= pre_hsieh(memc)) != TEST_SUCCESS) + { return rc; + } value= (memcached_server_distribution_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION); test_true(value == MEMCACHED_DISTRIBUTION_CONSISTENT); @@ -4033,13 +4005,12 @@ static test_return_t pre_settimer(memcached_st *memc) return TEST_SUCCESS; } -static test_return_t poll_timeout(memcached_st *memc) +static test_return_t MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test(memcached_st *memc) { const uint64_t timeout= 100; // Not using, just checking that it sets memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout); - test_compare(timeout, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT)); return TEST_SUCCESS; @@ -4053,12 +4024,12 @@ static test_return_t noreply_test(memcached_st *memc) memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1)); test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1)); - test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY) == 1); - test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS) == 1); - test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS) == 1); + test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY)); + test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS)); + test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS)); memcached_return_t ret; - for (int count=0; count < 5; ++count) + for (int count= 0; count < 5; ++count) { for (size_t x= 0; x < 100; ++x) { @@ -4187,10 +4158,9 @@ static test_return_t noreply_test(memcached_st *memc) static test_return_t analyzer_test(memcached_st *memc) { memcached_return_t rc; - memcached_stat_st *memc_stat; memcached_analysis_st *report; - memc_stat= memcached_stat(memc, NULL, &rc); + memcached_stat_st *memc_stat= memcached_stat(memc, NULL, &rc); test_compare(MEMCACHED_SUCCESS, rc); test_true(memc_stat); @@ -4222,68 +4192,85 @@ static test_return_t dump_test(memcached_st *memc) return TEST_SUCCESS; } -struct test_pool_context_st { - memcached_pool_st* pool; - memcached_st* mmc; -}; - -static void* connection_release(void *arg) -{ - test_pool_context_st *resource= static_cast(arg); - - usleep(250); - // Release all of the memc we are holding - assert(memcached_success(memcached_pool_push(resource->pool, resource->mmc))); - return arg; -} #define POOL_SIZE 10 static test_return_t connection_pool_test(memcached_st *memc) { memcached_pool_st* pool= memcached_pool_create(memc, 5, POOL_SIZE); - test_true(pool != NULL); + test_true(pool); memcached_st *mmc[POOL_SIZE]; - memcached_return_t rc; // Fill up our array that we will store the memc that are in the pool for (size_t x= 0; x < POOL_SIZE; ++x) { - mmc[x]= memcached_pool_pop(pool, false, &rc); - test_true(mmc[x] != NULL); + memcached_return_t rc; + mmc[x]= memcached_pool_fetch(pool, NULL, &rc); test_compare(MEMCACHED_SUCCESS, rc); + test_true(mmc[x]); } // All memc should be gone - test_true(memcached_pool_pop(pool, false, &rc) == NULL); - test_compare(MEMCACHED_SUCCESS, rc); + { + memcached_return_t rc; + test_null(memcached_pool_fetch(pool, NULL, &rc)); + test_compare(MEMCACHED_NOTFOUND, rc); + } - pthread_t tid; - test_pool_context_st item= { pool, mmc[9] }; + // Release them.. + for (size_t x= 0; x < POOL_SIZE; ++x) + { + if (mmc[x]) + { + test_compare(MEMCACHED_SUCCESS, memcached_pool_release(pool, mmc[x])); + } + } + test_true(memcached_pool_destroy(pool) == memc); - pthread_create(&tid, NULL, connection_release, &item); - mmc[9]= memcached_pool_pop(pool, true, &rc); - test_compare(MEMCACHED_SUCCESS, rc); - pthread_join(tid, NULL); - test_true(mmc[9]); - const char *key= "key"; - size_t keylen= strlen(key); + return TEST_SUCCESS; +} + +static test_return_t connection_pool2_test(memcached_st *memc) +{ + memcached_pool_st* pool= memcached_pool_create(memc, 5, POOL_SIZE); + test_true(pool); + memcached_st *mmc[POOL_SIZE]; + + // Fill up our array that we will store the memc that are in the pool + for (size_t x= 0; x < POOL_SIZE; ++x) + { + memcached_return_t rc; + mmc[x]= memcached_pool_fetch(pool, NULL, &rc); + test_compare(MEMCACHED_SUCCESS, rc); + test_true(mmc[x]); + } + + // All memc should be gone + { + memcached_return_t rc; + test_null(memcached_pool_fetch(pool, NULL, &rc)); + test_compare(MEMCACHED_NOTFOUND, rc); + } // verify that I can do ops with all connections test_compare(MEMCACHED_SUCCESS, - memcached_set(mmc[0], key, keylen, "0", 1, 0, 0)); + memcached_set(mmc[0], + test_literal_param("key"), + "0", 1, 0, 0)); for (uint64_t x= 0; x < POOL_SIZE; ++x) { uint64_t number_value; test_compare(MEMCACHED_SUCCESS, - memcached_increment(mmc[x], key, keylen, 1, &number_value)); + memcached_increment(mmc[x], + test_literal_param("key"), + 1, &number_value)); test_compare(number_value, (x+1)); } // Release them.. for (size_t x= 0; x < POOL_SIZE; ++x) { - test_compare(MEMCACHED_SUCCESS, memcached_pool_push(pool, mmc[x])); + test_compare(MEMCACHED_SUCCESS, memcached_pool_release(pool, mmc[x])); } @@ -4291,22 +4278,137 @@ static test_return_t connection_pool_test(memcached_st *memc) * of the connections in the pool. It should however be enabled * when I push the item into the pool */ - mmc[0]= memcached_pool_pop(pool, false, &rc); + mmc[0]= memcached_pool_fetch(pool, NULL, NULL); test_true(mmc[0]); - rc= memcached_pool_behavior_set(pool, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK, 9999); - test_compare(MEMCACHED_SUCCESS, rc); + test_compare(MEMCACHED_SUCCESS, + memcached_pool_behavior_set(pool, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK, 9999)); - mmc[1]= memcached_pool_pop(pool, false, &rc); - test_true(mmc[1]); + { + memcached_return_t rc; + mmc[1]= memcached_pool_fetch(pool, NULL, &rc); + test_true(mmc[1]); + test_compare(MEMCACHED_SUCCESS, rc); + } test_compare(UINT64_C(9999), memcached_behavior_get(mmc[1], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK)); - test_compare(MEMCACHED_SUCCESS, memcached_pool_push(pool, mmc[1])); - test_compare(MEMCACHED_SUCCESS, memcached_pool_push(pool, mmc[0])); + test_compare(MEMCACHED_SUCCESS, memcached_pool_release(pool, mmc[1])); + test_compare(MEMCACHED_SUCCESS, memcached_pool_release(pool, mmc[0])); + + { + memcached_return_t rc; + mmc[0]= memcached_pool_fetch(pool, NULL, &rc); + test_true(mmc[0]); + test_compare(MEMCACHED_SUCCESS, rc); + } - mmc[0]= memcached_pool_pop(pool, false, &rc); test_compare(UINT64_C(9999), memcached_behavior_get(mmc[0], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK)); - test_compare(MEMCACHED_SUCCESS, memcached_pool_push(pool, mmc[0])); + test_compare(MEMCACHED_SUCCESS, memcached_pool_release(pool, mmc[0])); + + test_true(memcached_pool_destroy(pool) == memc); + + return TEST_SUCCESS; +} + +struct test_pool_context_st { + volatile memcached_return_t rc; + memcached_pool_st* pool; + memcached_st* mmc; + sem_t _lock; + + test_pool_context_st(memcached_pool_st *pool_arg, memcached_st *memc_arg): + rc(MEMCACHED_FAILURE), + pool(pool_arg), + mmc(memc_arg) + { + sem_init(&_lock, 0, 0); + } + + void wait() + { + sem_wait(&_lock); + } + + void release() + { + sem_post(&_lock); + } + + ~test_pool_context_st() + { + sem_destroy(&_lock); + } +}; + +static void* connection_release(void *arg) +{ + test_pool_context_st *resource= static_cast(arg); + assert(resource); + if (resource == NULL) + { + abort(); + } + + // Release all of the memc we are holding + resource->rc= memcached_pool_release(resource->pool, resource->mmc); + resource->release(); + + pthread_exit(arg); +} + +static test_return_t connection_pool3_test(memcached_st *memc) +{ + memcached_pool_st* pool= memcached_pool_create(memc, 1, 1); + test_true(pool); + + memcached_st *pool_memc; + { + memcached_return_t rc; + pool_memc= memcached_pool_fetch(pool, NULL, &rc); + test_compare(MEMCACHED_SUCCESS, rc); + test_true(pool_memc); + } + + /* + @note This comment was written to describe what was believed to be the original authors intent. + + This portion of the test creates a thread that will wait until told to free a memcached_st + that will be grabbed by the main thread. + + It is believed that this tests whether or not we are handling ownership correctly. + */ + pthread_t tid; + test_pool_context_st item(pool, pool_memc); + + test_zero(pthread_create(&tid, NULL, connection_release, &item)); + item.wait(); + + memcached_return_t rc; + memcached_st *pop_memc; + int counter= 5; + do + { + struct timespec relative_time= { 0, 0 }; + pop_memc= memcached_pool_fetch(pool, &relative_time, &rc); + + if (memcached_failed(rc)) + { + test_null(pop_memc); + } + } while (rc == MEMCACHED_TIMEOUT and --counter); + + if (memcached_failed(rc)) // Cleanup thread since we will exit once we test. + { + pthread_join(tid, NULL); + test_compare(MEMCACHED_SUCCESS, rc); + } + + { + int pthread_ret= pthread_join(tid, NULL); + test_true(pthread_ret == 0 or pthread_ret == ESRCH); + } + test_compare(MEMCACHED_SUCCESS, rc); + test_true(pool_memc == pop_memc); test_true(memcached_pool_destroy(pool) == memc); @@ -4343,20 +4445,32 @@ static test_return_t util_version_test(memcached_st *memc) test_true(if_successful == true); if (instance->micro_version > 0) + { if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->minor_version, (uint8_t)(instance->micro_version -1)); + } else if (instance->minor_version > 0) + { if_successful= libmemcached_util_version_check(memc, instance->major_version, (uint8_t)(instance->minor_version - 1), instance->micro_version); + } else if (instance->major_version > 0) + { if_successful= libmemcached_util_version_check(memc, (uint8_t)(instance->major_version -1), instance->minor_version, instance->micro_version); + } test_true(if_successful == true); if (instance->micro_version > 0) + { if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->minor_version, (uint8_t)(instance->micro_version +1)); + } else if (instance->minor_version > 0) + { if_successful= libmemcached_util_version_check(memc, instance->major_version, (uint8_t)(instance->minor_version +1), instance->micro_version); + } else if (instance->major_version > 0) + { if_successful= libmemcached_util_version_check(memc, (uint8_t)(instance->major_version +1), instance->minor_version, instance->micro_version); + } test_true(if_successful == false); @@ -4442,26 +4556,21 @@ static test_return_t hash_sanity_test (memcached_st *memc) static test_return_t hsieh_avaibility_test (memcached_st *memc) { - memcached_return_t expected_rc= MEMCACHED_INVALID_ARGUMENTS; -#ifdef HAVE_HSIEH_HASH - expected_rc= MEMCACHED_SUCCESS; -#endif - memcached_return_t rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, - (uint64_t)MEMCACHED_HASH_HSIEH); - test_true(rc == expected_rc); + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH)); + + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, + (uint64_t)MEMCACHED_HASH_HSIEH)); return TEST_SUCCESS; } static test_return_t murmur_avaibility_test (memcached_st *memc) { - memcached_return_t expected_rc= MEMCACHED_INVALID_ARGUMENTS; -#ifdef HAVE_MURMUR_HASH - expected_rc= MEMCACHED_SUCCESS; -#endif - memcached_return_t rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, - (uint64_t)MEMCACHED_HASH_MURMUR); - test_true(rc == expected_rc); + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR)); + + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR)); return TEST_SUCCESS; } @@ -4473,10 +4582,8 @@ static test_return_t one_at_a_time_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_DEFAULT); - test_true(one_at_a_time_values[x] == hash_val); + test_compare(one_at_a_time_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_DEFAULT)); } return TEST_SUCCESS; @@ -4489,10 +4596,8 @@ static test_return_t md5_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MD5); - test_true(md5_values[x] == hash_val); + test_compare(md5_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MD5)); } return TEST_SUCCESS; @@ -4505,10 +4610,8 @@ static test_return_t crc_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_CRC); - test_true(crc_values[x] == hash_val); + test_compare(crc_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_CRC)); } return TEST_SUCCESS; @@ -4516,15 +4619,15 @@ static test_return_t crc_run (memcached_st *) static test_return_t fnv1_64_run (memcached_st *) { + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64)); + uint32_t x; const char **ptr; for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_64); - test_true(fnv1_64_values[x] == hash_val); + test_compare(fnv1_64_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_64)); } return TEST_SUCCESS; @@ -4532,15 +4635,15 @@ static test_return_t fnv1_64_run (memcached_st *) static test_return_t fnv1a_64_run (memcached_st *) { + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1A_64)); + uint32_t x; const char **ptr; for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_64); - test_true(fnv1a_64_values[x] == hash_val); + test_compare(fnv1a_64_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_64)); } return TEST_SUCCESS; @@ -4553,10 +4656,8 @@ static test_return_t fnv1_32_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_32); - test_true(fnv1_32_values[x] == hash_val); + test_compare(fnv1_32_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_32)); } return TEST_SUCCESS; @@ -4569,10 +4670,8 @@ static test_return_t fnv1a_32_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_32); - test_true(fnv1a_32_values[x] == hash_val); + test_compare(fnv1a_32_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_32)); } return TEST_SUCCESS; @@ -4580,15 +4679,15 @@ static test_return_t fnv1a_32_run (memcached_st *) static test_return_t hsieh_run (memcached_st *) { + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH)); + uint32_t x; const char **ptr; for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_HSIEH); - test_true(hsieh_values[x] == hash_val); + test_compare(hsieh_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_HSIEH)); } return TEST_SUCCESS; @@ -4596,6 +4695,8 @@ static test_return_t hsieh_run (memcached_st *) static test_return_t murmur_run (memcached_st *) { + test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR)); + #ifdef WORDS_BIGENDIAN (void)murmur_values; return TEST_SKIPPED; @@ -4605,10 +4706,8 @@ static test_return_t murmur_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MURMUR); - test_true(murmur_values[x] == hash_val); + test_compare(murmur_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MURMUR)); } return TEST_SUCCESS; @@ -4622,24 +4721,20 @@ static test_return_t jenkins_run (memcached_st *) for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++) { - uint32_t hash_val; - - hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_JENKINS); - test_true(jenkins_values[x] == hash_val); + test_compare(jenkins_values[x], + memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_JENKINS)); } return TEST_SUCCESS; } -static uint32_t hash_md5_test_function(const char *string, size_t string_length, void *context) +static uint32_t hash_md5_test_function(const char *string, size_t string_length, void *) { - (void)context; return libhashkit_md5(string, string_length); } -static uint32_t hash_crc_test_function(const char *string, size_t string_length, void *context) +static uint32_t hash_crc_test_function(const char *string, size_t string_length, void *) { - (void)context; return libhashkit_crc32(string, string_length); } @@ -4749,10 +4844,9 @@ static test_return_t memcached_get_MEMCACHED_NOTFOUND(memcached_st *memc) size_t len; uint32_t flags; memcached_return rc; - char *value; // See if memcached is reachable. - value= memcached_get(memc, key, strlen(key), &len, &flags, &rc); + char *value= memcached_get(memc, key, strlen(key), &len, &flags, &rc); test_false(value); test_zero(len); @@ -5594,7 +5688,7 @@ static test_return_t regression_bug_655423(memcached_st *memc) test_compare(MEMCACHED_SUCCESS, rc); test_true(value); - test_compare(100UL, value_length); + test_compare(100LLU, value_length); free(value); } @@ -5678,6 +5772,27 @@ static test_return_t regression_bug_490520(memcached_st *memc) return TEST_SUCCESS; } + +static test_return_t regression_bug_854604(memcached_st *) +{ + char buffer[1024]; + + test_compare(MEMCACHED_INVALID_ARGUMENTS, libmemcached_check_configuration(0, 0, buffer, 0)); + + test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 0)); + + test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 1)); + test_compare(buffer[0], 0); + + test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 10)); + test_true(strlen(buffer)); + + test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, sizeof(buffer))); + test_true(strlen(buffer)); + + return TEST_SUCCESS; +} + static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it) { fprintf(stderr, "Iteration #%u: ", it); @@ -5842,11 +5957,17 @@ test_st tests[] ={ {"delete_through", true, (test_callback_fn*)delete_through }, {"noreply", true, (test_callback_fn*)noreply_test}, {"analyzer", true, (test_callback_fn*)analyzer_test}, - {"connectionpool", true, (test_callback_fn*)connection_pool_test }, + {"memcached_pool_st", true, (test_callback_fn*)connection_pool_test }, + {"memcached_pool_st #2", true, (test_callback_fn*)connection_pool2_test }, + {"memcached_pool_st #3", true, (test_callback_fn*)connection_pool3_test }, {"memcached_pool_test", true, (test_callback_fn*)memcached_pool_test }, {"test_get_last_disconnect", true, (test_callback_fn*)test_get_last_disconnect}, {"verbosity", true, (test_callback_fn*)test_verbosity}, {"memcached_stat_execute", true, (test_callback_fn*)memcached_stat_execute_test}, + {"memcached_exist(MEMCACHED_NOTFOUND)", true, (test_callback_fn*)memcached_exist_NOTFOUND }, + {"memcached_exist(MEMCACHED_SUCCESS)", true, (test_callback_fn*)memcached_exist_SUCCESS }, + {"memcached_exist_by_key(MEMCACHED_NOTFOUND)", true, (test_callback_fn*)memcached_exist_by_key_NOTFOUND }, + {"memcached_exist_by_key(MEMCACHED_SUCCESS)", true, (test_callback_fn*)memcached_exist_by_key_SUCCESS }, {0, 0, 0} }; @@ -5857,6 +5978,7 @@ test_st behavior_tests[] ={ {"MEMCACHED_BEHAVIOR_CORK", false, (test_callback_fn*)MEMCACHED_BEHAVIOR_CORK_test}, {"MEMCACHED_BEHAVIOR_TCP_KEEPALIVE", false, (test_callback_fn*)MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test}, {"MEMCACHED_BEHAVIOR_TCP_KEEPIDLE", false, (test_callback_fn*)MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test}, + {"MEMCACHED_BEHAVIOR_POLL_TIMEOUT", false, (test_callback_fn*)MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test}, {0, 0, 0} }; @@ -5983,6 +6105,7 @@ test_st regression_tests[]= { {"lp:71231153 poll()", true, (test_callback_fn*)regression_bug_71231153_poll }, {"lp:655423", true, (test_callback_fn*)regression_bug_655423 }, {"lp:490520", true, (test_callback_fn*)regression_bug_490520 }, + {"lp:854604", true, (test_callback_fn*)regression_bug_854604 }, {0, false, (test_callback_fn*)0} }; @@ -6141,7 +6264,6 @@ collection_st collection[] ={ {"ketama_auto_eject_hosts", (test_callback_fn*)pre_behavior_ketama, 0, ketama_auto_eject_hosts}, {"unix_socket", (test_callback_fn*)pre_unix_socket, 0, tests}, {"unix_socket_nodelay", (test_callback_fn*)pre_nodelay, 0, tests}, - {"poll_timeout", (test_callback_fn*)poll_timeout, 0, tests}, {"gets", (test_callback_fn*)enable_cas, 0, tests}, {"consistent_crc", (test_callback_fn*)enable_consistent_crc, 0, tests}, {"consistent_hsieh", (test_callback_fn*)enable_consistent_hsieh, 0, tests},