test: poll_timeout; see php-memcached-dev/php-memcached#531
[awesomized/libmemcached] / test / tests / memcached / poll_timeout.cpp
1 #include "test/lib/common.hpp"
2 #include "test/lib/MemcachedCluster.hpp"
3
4 TEST_CASE("memcached_poll_timeout") {
5 auto test = MemcachedCluster::network();
6 auto memc = &test.memc;
7
8 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1));
9 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1));
10 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0));
11 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 20));
12 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 20*1000));
13 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 20*1000));
14 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 60));
15 REQUIRE_SUCCESS(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 20));
16
17
18 memcached_return_t rc;
19 size_t len;
20
21 auto num = 500;
22 auto hit = 0u;
23 auto rnd = random_ascii_string(128);
24
25 REQUIRE_SUCCESS(memcached_flush(memc, 0));
26
27 for (auto i = 0; i < num; ++i) {
28 auto setKey = rnd + to_string(i);
29 REQUIRE_SUCCESS(memcached_set(memc, setKey.c_str(), setKey.length(), setKey.c_str(),
30 setKey.length(), 1, 0));
31 }
32 memcached_quit(memc);
33
34 auto timeoutAchieved = false;
35 for (auto i = 0; i < num; ++i) {
36 for (auto j = 0; j < i; ++j) {
37 auto getKey = rnd + to_string(j);
38 auto len = getKey.length();
39 char key[MEMCACHED_MAX_KEY];
40 memcpy(key, getKey.c_str(), len + 1);
41 const char *keys[1] = {key};
42 std::cerr << int(timeoutAchieved);
43
44 REQUIRE_SUCCESS(memcached_mget(memc, keys, &len, 1));
45 auto numResults = 0;
46 while (auto rv = memcached_fetch(memc, key, nullptr, &len, nullptr, &rc)) {
47 REQUIRE(!timeoutAchieved);
48
49 REQUIRE_SUCCESS(rc);
50 free(rv);
51
52 numResults++;
53 REQUIRE(numResults == 1);
54 }
55
56 if (MEMCACHED_END == rc || MEMCACHED_NOTFOUND == rc ){
57 continue;
58 }
59
60 if (MEMCACHED_TIMEOUT == rc){
61 timeoutAchieved = true;
62 continue;
63 }
64
65 INFO(rc);
66 REQUIRE(false);
67 }
68 }
69 }