else
{
if (opt_verbose)
+ {
printf("key: %s\nflags: %x\nlength: %zu\nvalue: ",
argv[optind], flags, string_length);
- if (opt_file) {
- FILE *fp;
- size_t written = 0;
-
- fp = fopen(opt_file, "w");
- if (!fp) {
- perror("fopen");
- return_code= -1;
- break;
- }
-
- written = fwrite(string, 1, string_length, fp);
- if (written != string_length) {
- fprintf(stderr, "error writing file (written %d, should be %d)\n", written, string_length);
- return_code= -1;
- break;
- }
-
- if (fclose(fp)) {
- fprintf(stderr, "error closing file\n");
- return_code= -1;
- break;
- }
}
- else {
+
+ if (opt_file)
+ {
+ FILE *fp;
+ size_t written;
+
+ fp= fopen(opt_file, "w");
+ if (!fp)
+ {
+ perror("fopen");
+ return_code= -1;
+ break;
+ }
+
+ written= fwrite(string, 1, string_length, fp);
+ if (written != string_length)
+ {
+ fprintf(stderr, "error writing file (written %zu, should be %zu)\n", written, string_length);
+ return_code= -1;
+ break;
+ }
+
+ if (fclose(fp))
+ {
+ fprintf(stderr, "error closing file\n");
+ return_code= -1;
+ break;
+ }
+ }
+ else
+ {
printf("%.*s\n", (int)string_length, string);
}
free(string);
fprintf(stderr, "memcat: %s: memcache error %s",
argv[optind], memcached_strerror(memc, rc));
if (memc->cached_errno)
+ {
fprintf(stderr, " system error %s", strerror(memc->cached_errno));
+ }
fprintf(stderr, "\n");
return_code= -1;
return TEST_SUCCESS;
}
+/*
+ Test case adapted from John Gorman <johngorman2@gmail.com>
+
+ We are testing the error condition when we connect to a server via memcached_get_by_key()
+ but find that the server is not available.
+*/
+static test_return_t memcached_get_by_key_MEMCACHED_SOME_ERRORS(memcached_st *memc)
+{
+ (void)memc;
+ memcached_st *tl_memc_h;
+ memcached_server_st *servers;
+
+ const char *key= "MemcachedLives";
+ size_t len;
+ uint32_t flags;
+ memcached_return rc;
+ char *value;
+
+ // Create a handle.
+ tl_memc_h= memcached_create(NULL);
+ servers= memcached_servers_parse("localhost:9898"); // This server should not exist
+ memcached_server_push(tl_memc_h, servers);
+ memcached_server_list_free(servers);
+
+ // See if memcached is reachable.
+ value= memcached_get_by_key(tl_memc_h, key, strlen(key), key, strlen(key), &len, &flags, &rc);
+
+ if (value)
+ {
+ free(value);
+ test_true(value); // Pointer won't be zero so this is fine.
+ }
+
+ test_true(len == 0);
+ test_true(rc == MEMCACHED_SOME_ERRORS);
+
+ return TEST_SUCCESS;
+}
+
+/*
+ We connect to a server which exists, but search for a key that does not exist.
+*/
+static test_return_t memcached_get_by_key_MEMCACHED_NOTFOUND(memcached_st *memc)
+{
+ const char *key= "MemcachedKeyNotEXIST";
+ size_t len;
+ uint32_t flags;
+ memcached_return rc;
+ char *value;
+
+ // See if memcached is reachable.
+ value= memcached_get_by_key(memc, key, strlen(key), key, strlen(key), &len, &flags, &rc);
+
+ if (value)
+ {
+ free(value);
+ test_true(value); // Pointer won't be zero so this is fine.
+ }
+
+ test_true(len == 0);
+ test_true(rc == MEMCACHED_NOTFOUND);
+
+ return TEST_SUCCESS;
+}
+
static test_return_t ketama_compatibility_libmemcached(memcached_st *trash)
{
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);
{"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}
};
test_st error_conditions[] ={
{"memcached_get_MEMCACHED_SOME_ERRORS", 0, (test_callback_fn)memcached_get_MEMCACHED_SOME_ERRORS },
{"memcached_get_MEMCACHED_NOTFOUND", 0, (test_callback_fn)memcached_get_MEMCACHED_NOTFOUND },
+ {"memcached_get_by_key_MEMCACHED_SOME_ERRORS", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_SOME_ERRORS },
+ {"memcached_get_by_key_MEMCACHED_NOTFOUND", 0, (test_callback_fn)memcached_get_by_key_MEMCACHED_NOTFOUND },
{0, 0, (test_callback_fn)0}
};