cc7dd9aa1512d78e20344c14674501dd2ab04784
[m6w6/libmemcached] / testing / tests / memcached / regression / lp490486.cpp
1 #include "testing/lib/common.hpp"
2 #include "testing/lib/MemcachedCluster.hpp"
3
4 #define NUM_KEYS 20480U
5
6 static memcached_return_t callback_counter(const memcached_st *, memcached_result_st *, void *context) {
7 auto *counter= reinterpret_cast<size_t *>(context);
8 *counter = *counter + 1;
9
10 return MEMCACHED_SUCCESS;
11 }
12
13 TEST_CASE("memcached_regression_lp490486") {
14 MemcachedCluster test{Cluster{Server{MEMCACHED_BINARY, {"-p", random_port_string}}, 1}};
15 auto memc = &test.memc;
16
17 test.enableBinaryProto();
18
19 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 1000));
20 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS, 1));
21 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 3600));
22
23 array<string, NUM_KEYS> str;
24 array<char *, NUM_KEYS> chr;
25 array<size_t, NUM_KEYS> len;
26
27 for (auto i = 0U; i < NUM_KEYS; ++i) {
28 char blob[1024];
29
30 str[i] = random_ascii_string(36);
31 chr[i] = str[i].data();
32 len[i] = str[i].length();
33
34 REQUIRE_SUCCESS(memcached_set(memc, chr[i], len[i], blob, sizeof(blob), 0, 0));
35 }
36
37 size_t counter = 0;
38 memcached_return_t rc;
39 memcached_execute_fn cb[] = {&callback_counter};
40 REQUIRE_SUCCESS(memcached_mget_execute(memc, chr.data(), len.data(), NUM_KEYS, cb, &counter, 1));
41
42 do {
43 char key_buf[MEMCACHED_MAX_KEY];
44 size_t key_len;
45
46 Malloced value(memcached_fetch(memc, key_buf, &key_len, nullptr, nullptr, &rc));
47 counter += !!*value;
48 } while(rc == MEMCACHED_SUCCESS);
49
50 REQUIRE_RC(MEMCACHED_END, rc);
51 REQUIRE(counter == NUM_KEYS);
52 }