From: Trond Norbye Date: Tue, 28 Sep 2010 09:59:05 +0000 (+0200) Subject: The mget test in memcapable shouldn't care about the order items arrive X-Git-Tag: 0.51~48^2 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;ds=sidebyside;h=9c484853399248f4ea8da7aecccc5cf7d59963c7;p=m6w6%2Flibmemcached The mget test in memcapable shouldn't care about the order items arrive --- diff --git a/clients/memcapable.c b/clients/memcapable.c index 6ef5bc69..4feb96ef 100644 --- a/clients/memcapable.c +++ b/clients/memcapable.c @@ -1316,6 +1316,42 @@ static enum test_return test_ascii_add_noreply(void) return test_ascii_add_impl("test_ascii_add_noreply", true); } +static enum test_return ascii_get_unknown_value(char **key, char **value, + ssize_t *ndata) +{ + char buffer[1024]; + + execute(receive_line(buffer, sizeof(buffer))); + verify(strncmp(buffer, "VALUE ", 6) == 0); + char *end = strchr(buffer + 6, ' '); + verify(end != NULL); + *end = '\0'; + *key = strdup(buffer + 6); + verify(*key != NULL); + char *ptr= end + 1; + + unsigned long val= strtoul(ptr, &end, 10); /* flags */ + verify(ptr != end); + verify(val == 0); + verify(end != NULL); + *ndata = (ssize_t)strtoul(end, &end, 10); /* size */ + verify(ptr != end); + verify(end != NULL); + while (*end != '\n' && isspace(*end)) + ++end; + verify(*end == '\n'); + + *value = malloc((size_t)*ndata); + verify(*value != NULL); + + execute(retry_read(*value, (size_t)*ndata)); + + execute(retry_read(buffer, 2)); + verify(memcmp(buffer, "\r\n", 2) == 0); + + return TEST_PASS; +} + static enum test_return ascii_get_value(const char *key, const char *value) { @@ -1584,25 +1620,57 @@ static enum test_return test_ascii_gets(void) static enum test_return test_ascii_mget(void) { - execute(ascii_set_item("test_ascii_mget1", "value")); - execute(ascii_set_item("test_ascii_mget2", "value")); - execute(ascii_set_item("test_ascii_mget3", "value")); - execute(ascii_set_item("test_ascii_mget4", "value")); - execute(ascii_set_item("test_ascii_mget5", "value")); - - execute(send_string("get test_ascii_mget1 test_ascii_mget2 test_ascii_mget3 " - "test_ascii_mget4 test_ascii_mget5 " - "test_ascii_mget6\r\n")); - execute(ascii_get_value("test_ascii_mget1", "value")); - execute(ascii_get_value("test_ascii_mget2", "value")); - execute(ascii_get_value("test_ascii_mget3", "value")); - execute(ascii_get_value("test_ascii_mget4", "value")); - execute(ascii_get_value("test_ascii_mget5", "value")); - - char buffer[5]; - execute(retry_read(buffer, 5)); - verify(memcmp(buffer, "END\r\n", 5) == 0); - return TEST_PASS; + const int nkeys= 5; + const char * const keys[]= { + "test_ascii_mget1", + "test_ascii_mget2", + /* test_ascii_mget_3 does not exist :) */ + "test_ascii_mget4", + "test_ascii_mget5", + "test_ascii_mget6" + }; + + for (int x= 0; x < nkeys; ++x) + execute(ascii_set_item(keys[x], "value")); + + /* Ask for a key that doesn't exist as well */ + execute(send_string("get test_ascii_mget1 test_ascii_mget2 test_ascii_mget3 " + "test_ascii_mget4 test_ascii_mget5 " + "test_ascii_mget6\r\n")); + + char* returned[nkeys]; + + for (int x= 0; x < nkeys; ++x) + { + ssize_t nbytes = 0; + char *v= NULL; + execute(ascii_get_unknown_value(&returned[x], &v, &nbytes)); + verify(nbytes == 5); + verify(memcmp(v, "value", 5) == 0); + free(v); + } + char buffer[5]; + execute(retry_read(buffer, 5)); + verify(memcmp(buffer, "END\r\n", 5) == 0); + + /* verify that we got all the keys we expected */ + for (int x= 0; x < nkeys; ++x) + { + bool found= false; + for (int y= 0; y < nkeys; ++y) { + if (strcmp(keys[x], returned[y]) == 0) + { + found = true; + break; + } + } + verify(found); + } + + for (int x= 0; x < nkeys; ++x) + free(returned[x]); + + return TEST_PASS; } static enum test_return test_ascii_incr_impl(const char* key, bool noreply)