vinted-memcached 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (210) hide show
  1. checksums.yaml +7 -0
  2. data/BENCHMARKS +142 -0
  3. data/CHANGELOG +176 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +45 -0
  6. data/LICENSE +184 -0
  7. data/Manifest +209 -0
  8. data/README.rdoc +124 -0
  9. data/Rakefile +134 -0
  10. data/TODO +1 -0
  11. data/ext/extconf-make.rb +25 -0
  12. data/ext/extconf.rb +78 -0
  13. data/ext/libmemcached-0.32/AUTHORS +7 -0
  14. data/ext/libmemcached-0.32/COPYING +32 -0
  15. data/ext/libmemcached-0.32/ChangeLog +303 -0
  16. data/ext/libmemcached-0.32/INSTALL +302 -0
  17. data/ext/libmemcached-0.32/Makefile.am +36 -0
  18. data/ext/libmemcached-0.32/Makefile.in +911 -0
  19. data/ext/libmemcached-0.32/NEWS +1 -0
  20. data/ext/libmemcached-0.32/README +33 -0
  21. data/ext/libmemcached-0.32/THANKS +14 -0
  22. data/ext/libmemcached-0.32/TODO +11 -0
  23. data/ext/libmemcached-0.32/aclocal.m4 +2108 -0
  24. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  25. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  26. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  27. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  28. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  29. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  30. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  31. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  32. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  33. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  34. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  35. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  36. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  37. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  38. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  39. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  40. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  41. data/ext/libmemcached-0.32/config/compile +143 -0
  42. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  43. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  44. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  45. data/ext/libmemcached-0.32/config/depcomp +630 -0
  46. data/ext/libmemcached-0.32/config/install-sh +520 -0
  47. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  48. data/ext/libmemcached-0.32/config/missing +376 -0
  49. data/ext/libmemcached-0.32/config.h.in +254 -0
  50. data/ext/libmemcached-0.32/configure +23843 -0
  51. data/ext/libmemcached-0.32/configure.ac +120 -0
  52. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  53. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  54. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  55. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  56. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  57. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  58. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  59. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  60. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  61. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  62. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  63. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  64. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  65. data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
  66. data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
  67. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  68. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  69. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  70. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  71. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +290 -0
  72. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  73. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  74. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  75. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
  76. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  77. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
  78. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  79. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  80. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  81. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  82. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  83. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +23 -0
  84. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  85. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  86. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  87. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  88. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  89. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +594 -0
  90. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  91. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  92. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  93. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  94. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  95. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  96. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  97. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  98. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  99. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  100. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  101. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  102. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  103. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  104. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
  105. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  106. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  107. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  108. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  109. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  110. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  111. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  112. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  113. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  114. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  115. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  116. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  117. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  118. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  119. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  120. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  121. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  122. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  123. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  124. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  125. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  126. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  127. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  128. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  129. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  130. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  131. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  132. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  133. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  134. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  135. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  136. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  137. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  138. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  139. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  140. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  141. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  142. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  143. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  144. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  145. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  146. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  147. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  148. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  149. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  150. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  151. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  152. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  153. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  154. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  155. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  156. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  157. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  158. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  159. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  160. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  161. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  162. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  163. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  164. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  165. data/ext/libmemcached-0.32/tests/function.c +4904 -0
  166. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  167. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  168. data/ext/libmemcached-0.32/tests/output.res +7 -0
  169. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  170. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  171. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  172. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  173. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  174. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  175. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  176. data/ext/libmemcached-0.32/tests/server.c +118 -0
  177. data/ext/libmemcached-0.32/tests/server.h +25 -0
  178. data/ext/libmemcached-0.32/tests/start.c +16 -0
  179. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  180. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  181. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  182. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  183. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  184. data/ext/libmemcached-0.32/tests/test.c +137 -0
  185. data/ext/libmemcached-0.32/tests/test.h +46 -0
  186. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  187. data/ext/rlibmemcached.i +258 -0
  188. data/ext/rlibmemcached_wrap.c +13917 -0
  189. data/lib/memcached/auth.rb +16 -0
  190. data/lib/memcached/behaviors.rb +78 -0
  191. data/lib/memcached/exceptions.rb +84 -0
  192. data/lib/memcached/experimental.rb +48 -0
  193. data/lib/memcached/marshal_codec.rb +10 -0
  194. data/lib/memcached/memcached.rb +732 -0
  195. data/lib/memcached/rails.rb +250 -0
  196. data/lib/memcached.rb +33 -0
  197. data/memcached.gemspec +0 -0
  198. data/test/profile/benchmark.rb +280 -0
  199. data/test/profile/c_profiler.rb +14 -0
  200. data/test/profile/exercise.rb +185 -0
  201. data/test/profile/rb_profiler.rb +21 -0
  202. data/test/profile/valgrind.rb +10 -0
  203. data/test/setup.rb +30 -0
  204. data/test/teardown.rb +0 -0
  205. data/test/test_helper.rb +18 -0
  206. data/test/unit/binding_test.rb +8 -0
  207. data/test/unit/memcached_experimental_test.rb +272 -0
  208. data/test/unit/memcached_test.rb +1487 -0
  209. data/test/unit/rails_test.rb +330 -0
  210. metadata +336 -0
@@ -0,0 +1,4904 @@
1
+ /*
2
+ Sample test application.
3
+ */
4
+
5
+ #include "libmemcached/common.h"
6
+
7
+ #include <assert.h>
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+ #include <string.h>
11
+ #include <sys/time.h>
12
+ #include <sys/types.h>
13
+ #include <sys/stat.h>
14
+ #include <unistd.h>
15
+ #include <time.h>
16
+ #include "server.h"
17
+ #include "clients/generator.h"
18
+ #include "clients/execute.h"
19
+
20
+ #ifndef INT64_MAX
21
+ #define INT64_MAX LONG_MAX
22
+ #endif
23
+ #ifndef INT32_MAX
24
+ #define INT32_MAX INT_MAX
25
+ #endif
26
+
27
+
28
+ #include "test.h"
29
+
30
+ #ifdef HAVE_LIBMEMCACHEDUTIL
31
+ #include <pthread.h>
32
+ #include "libmemcached/memcached_util.h"
33
+ #endif
34
+
35
+ #define GLOBAL_COUNT 10000
36
+ #define GLOBAL2_COUNT 100
37
+ #define SERVERS_TO_CREATE 5
38
+ static uint32_t global_count;
39
+
40
+ static pairs_st *global_pairs;
41
+ static const char *global_keys[GLOBAL_COUNT];
42
+ static size_t global_keys_length[GLOBAL_COUNT];
43
+
44
+ static test_return init_test(memcached_st *not_used __attribute__((unused)))
45
+ {
46
+ memcached_st memc;
47
+
48
+ (void)memcached_create(&memc);
49
+ memcached_free(&memc);
50
+
51
+ return 0;
52
+ }
53
+
54
+ static test_return server_list_null_test(memcached_st *ptr __attribute__((unused)))
55
+ {
56
+ memcached_server_st *server_list;
57
+ memcached_return rc;
58
+
59
+ server_list= memcached_server_list_append_with_weight(NULL, NULL, 0, 0, NULL);
60
+ assert(server_list == NULL);
61
+
62
+ server_list= memcached_server_list_append_with_weight(NULL, "localhost", 0, 0, NULL);
63
+ assert(server_list == NULL);
64
+
65
+ server_list= memcached_server_list_append_with_weight(NULL, NULL, 0, 0, &rc);
66
+ assert(server_list == NULL);
67
+
68
+ return 0;
69
+ }
70
+
71
+ #define TEST_PORT_COUNT 7
72
+ uint32_t test_ports[TEST_PORT_COUNT];
73
+
74
+ static memcached_return server_display_function(memcached_st *ptr __attribute__((unused)), memcached_server_st *server, void *context)
75
+ {
76
+ /* Do Nothing */
77
+ uint32_t bigger= *((uint32_t *)(context));
78
+ assert(bigger <= server->port);
79
+ *((uint32_t *)(context))= server->port;
80
+
81
+ return MEMCACHED_SUCCESS;
82
+ }
83
+
84
+ static test_return server_sort_test(memcached_st *ptr __attribute__((unused)))
85
+ {
86
+ uint32_t x;
87
+ uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
88
+ memcached_return rc;
89
+ memcached_server_function callbacks[1];
90
+ memcached_st *local_memc;
91
+
92
+ local_memc= memcached_create(NULL);
93
+ assert(local_memc);
94
+ memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SORT_HOSTS, 1);
95
+
96
+ for (x= 0; x < TEST_PORT_COUNT; x++)
97
+ {
98
+ test_ports[x]= (uint32_t)random() % 64000;
99
+ rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0);
100
+ assert(local_memc->number_of_hosts == x + 1);
101
+ assert(local_memc->hosts[0].count == x+1);
102
+ assert(rc == MEMCACHED_SUCCESS);
103
+ }
104
+
105
+ callbacks[0]= server_display_function;
106
+ memcached_server_cursor(local_memc, callbacks, (void *)&bigger, 1);
107
+
108
+
109
+ memcached_free(local_memc);
110
+
111
+ return 0;
112
+ }
113
+
114
+ static test_return server_sort2_test(memcached_st *ptr __attribute__((unused)))
115
+ {
116
+ uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
117
+ memcached_return rc;
118
+ memcached_server_function callbacks[1];
119
+ memcached_st *local_memc;
120
+
121
+ local_memc= memcached_create(NULL);
122
+ assert(local_memc);
123
+ rc= memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SORT_HOSTS, 1);
124
+ assert(rc == MEMCACHED_SUCCESS);
125
+
126
+ rc= memcached_server_add_with_weight(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0);
127
+ assert(rc == MEMCACHED_SUCCESS);
128
+ assert(local_memc->hosts[0].port == 43043);
129
+
130
+ rc= memcached_server_add_with_weight(local_memc, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0);
131
+ assert(rc == MEMCACHED_SUCCESS);
132
+ assert(local_memc->hosts[0].port == 43042);
133
+ assert(local_memc->hosts[1].port == 43043);
134
+
135
+ callbacks[0]= server_display_function;
136
+ memcached_server_cursor(local_memc, callbacks, (void *)&bigger, 1);
137
+
138
+
139
+ memcached_free(local_memc);
140
+
141
+ return 0;
142
+ }
143
+
144
+ static memcached_return server_display_unsort_function(memcached_st *ptr __attribute__((unused)), memcached_server_st *server, void *context)
145
+ {
146
+ /* Do Nothing */
147
+ uint32_t x= *((uint32_t *)(context));
148
+
149
+ assert(test_ports[x] == server->port);
150
+ *((uint32_t *)(context))= ++x;
151
+
152
+ return MEMCACHED_SUCCESS;
153
+ }
154
+
155
+ static test_return server_unsort_test(memcached_st *ptr __attribute__((unused)))
156
+ {
157
+ uint32_t x;
158
+ uint32_t counter= 0; /* Prime the value for the assert in server_display_function */
159
+ uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
160
+ memcached_return rc;
161
+ memcached_server_function callbacks[1];
162
+ memcached_st *local_memc;
163
+
164
+ local_memc= memcached_create(NULL);
165
+ assert(local_memc);
166
+
167
+ for (x= 0; x < TEST_PORT_COUNT; x++)
168
+ {
169
+ test_ports[x]= (uint32_t)(random() % 64000);
170
+ rc= memcached_server_add_with_weight(local_memc, "localhost", test_ports[x], 0);
171
+ assert(local_memc->number_of_hosts == x+1);
172
+ assert(local_memc->hosts[0].count == x+1);
173
+ assert(rc == MEMCACHED_SUCCESS);
174
+ }
175
+
176
+ callbacks[0]= server_display_unsort_function;
177
+ memcached_server_cursor(local_memc, callbacks, (void *)&counter, 1);
178
+
179
+ /* Now we sort old data! */
180
+ memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SORT_HOSTS, 1);
181
+ callbacks[0]= server_display_function;
182
+ memcached_server_cursor(local_memc, callbacks, (void *)&bigger, 1);
183
+
184
+
185
+ memcached_free(local_memc);
186
+
187
+ return 0;
188
+ }
189
+
190
+ static test_return allocation_test(memcached_st *not_used __attribute__((unused)))
191
+ {
192
+ memcached_st *memc;
193
+ memc= memcached_create(NULL);
194
+ assert(memc);
195
+ memcached_free(memc);
196
+
197
+ return 0;
198
+ }
199
+
200
+ static test_return clone_test(memcached_st *memc)
201
+ {
202
+ /* All null? */
203
+ {
204
+ memcached_st *memc_clone;
205
+ memc_clone= memcached_clone(NULL, NULL);
206
+ assert(memc_clone);
207
+ memcached_free(memc_clone);
208
+ }
209
+
210
+ /* Can we init from null? */
211
+ {
212
+ memcached_st *memc_clone;
213
+ memc_clone= memcached_clone(NULL, memc);
214
+ assert(memc_clone);
215
+
216
+ assert(memc_clone->call_free == memc->call_free);
217
+ assert(memc_clone->call_malloc == memc->call_malloc);
218
+ assert(memc_clone->call_realloc == memc->call_realloc);
219
+ assert(memc_clone->call_calloc == memc->call_calloc);
220
+ assert(memc_clone->connect_timeout == memc->connect_timeout);
221
+ assert(memc_clone->delete_trigger == memc->delete_trigger);
222
+ assert(memc_clone->distribution == memc->distribution);
223
+ assert(memc_clone->flags == memc->flags);
224
+ assert(memc_clone->get_key_failure == memc->get_key_failure);
225
+ assert(memc_clone->hash == memc->hash);
226
+ assert(memc_clone->hash_continuum == memc->hash_continuum);
227
+ assert(memc_clone->io_bytes_watermark == memc->io_bytes_watermark);
228
+ assert(memc_clone->io_msg_watermark == memc->io_msg_watermark);
229
+ assert(memc_clone->io_key_prefetch == memc->io_key_prefetch);
230
+ assert(memc_clone->on_cleanup == memc->on_cleanup);
231
+ assert(memc_clone->on_clone == memc->on_clone);
232
+ assert(memc_clone->poll_timeout == memc->poll_timeout);
233
+ assert(memc_clone->poll_max_retries == memc->poll_max_retries);
234
+ assert(memc_clone->rcv_timeout == memc->rcv_timeout);
235
+ assert(memc_clone->recv_size == memc->recv_size);
236
+ assert(memc_clone->retry_timeout == memc->retry_timeout);
237
+ assert(memc_clone->send_size == memc->send_size);
238
+ assert(memc_clone->server_failure_limit == memc->server_failure_limit);
239
+ assert(memc_clone->snd_timeout == memc->snd_timeout);
240
+ assert(memc_clone->user_data == memc->user_data);
241
+
242
+ memcached_free(memc_clone);
243
+ }
244
+
245
+ /* Can we init from struct? */
246
+ {
247
+ memcached_st declared_clone;
248
+ memcached_st *memc_clone;
249
+ memset(&declared_clone, 0 , sizeof(memcached_st));
250
+ memc_clone= memcached_clone(&declared_clone, NULL);
251
+ assert(memc_clone);
252
+ memcached_free(memc_clone);
253
+ }
254
+
255
+ /* Can we init from struct? */
256
+ {
257
+ memcached_st declared_clone;
258
+ memcached_st *memc_clone;
259
+ memset(&declared_clone, 0 , sizeof(memcached_st));
260
+ memc_clone= memcached_clone(&declared_clone, memc);
261
+ assert(memc_clone);
262
+ memcached_free(memc_clone);
263
+ }
264
+
265
+ return 0;
266
+ }
267
+
268
+ static test_return userdata_test(memcached_st *memc)
269
+ {
270
+ void* foo= NULL;
271
+ assert(memcached_set_user_data(memc, foo) == NULL);
272
+ assert(memcached_get_user_data(memc) == foo);
273
+ assert(memcached_set_user_data(memc, NULL) == foo);
274
+
275
+ return TEST_SUCCESS;
276
+ }
277
+
278
+ static test_return connection_test(memcached_st *memc)
279
+ {
280
+ memcached_return rc;
281
+
282
+ rc= memcached_server_add_with_weight(memc, "localhost", 0, 0);
283
+ assert(rc == MEMCACHED_SUCCESS);
284
+
285
+ return 0;
286
+ }
287
+
288
+ static test_return error_test(memcached_st *memc)
289
+ {
290
+ memcached_return rc;
291
+ uint32_t values[] = { 851992627U, 2337886783U, 3196981036U, 4001849190U, 982370485U, 1263635348U, 4242906218U, 3829656100U, 1891735253U,
292
+ 334139633U, 2257084983U, 3088286104U, 13199785U, 2542027183U, 1097051614U, 199566778U, 2748246961U, 2465192557U,
293
+ 1664094137U, 2405439045U, 1842224848U, 692413798U, 3479807801U, 919913813U, 4269430871U, 610793021U, 527273862U,
294
+ 1437122909U, 2300930706U, 2943759320U, 674306647U, 2400528935U, 54481931U, 4186304426U, 1741088401U, 2979625118U,
295
+ 4159057246U, 1769812374U, 2302537950U, 1110330676U};
296
+
297
+ /* You have updated the memcache_error messages but not updated docs/tests. */
298
+ assert(MEMCACHED_SUCCESS == 0 && MEMCACHED_MAXIMUM_RETURN == 40);
299
+ for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
300
+ {
301
+ uint32_t hash_val;
302
+ hash_val= memcached_generate_hash_value(memcached_strerror(memc, rc), strlen(memcached_strerror(memc, rc)), MEMCACHED_HASH_JENKINS);
303
+ assert(values[rc] == hash_val);
304
+ }
305
+
306
+ return 0;
307
+ }
308
+
309
+ static test_return set_test(memcached_st *memc)
310
+ {
311
+ memcached_return rc;
312
+ const char *key= "foo";
313
+ const char *value= "when we sanitize";
314
+
315
+ rc= memcached_set(memc, key, strlen(key),
316
+ value, strlen(value),
317
+ (time_t)0, (uint32_t)0);
318
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
319
+
320
+ return 0;
321
+ }
322
+
323
+ static test_return append_test(memcached_st *memc)
324
+ {
325
+ memcached_return rc;
326
+ const char *key= "fig";
327
+ const char *in_value= "we";
328
+ char *out_value= NULL;
329
+ size_t value_length;
330
+ uint32_t flags;
331
+
332
+ rc= memcached_flush(memc, 0);
333
+ assert(rc == MEMCACHED_SUCCESS);
334
+
335
+ rc= memcached_set(memc, key, strlen(key),
336
+ in_value, strlen(in_value),
337
+ (time_t)0, (uint32_t)0);
338
+ assert(rc == MEMCACHED_SUCCESS);
339
+
340
+ rc= memcached_append(memc, key, strlen(key),
341
+ " the", strlen(" the"),
342
+ (time_t)0, (uint32_t)0);
343
+ assert(rc == MEMCACHED_SUCCESS);
344
+
345
+ rc= memcached_append(memc, key, strlen(key),
346
+ " people", strlen(" people"),
347
+ (time_t)0, (uint32_t)0);
348
+ assert(rc == MEMCACHED_SUCCESS);
349
+
350
+ out_value= memcached_get(memc, key, strlen(key),
351
+ &value_length, &flags, &rc);
352
+ assert(!memcmp(out_value, "we the people", strlen("we the people")));
353
+ assert(strlen("we the people") == value_length);
354
+ assert(rc == MEMCACHED_SUCCESS);
355
+ free(out_value);
356
+
357
+ return 0;
358
+ }
359
+
360
+ static test_return append_binary_test(memcached_st *memc)
361
+ {
362
+ memcached_return rc;
363
+ const char *key= "numbers";
364
+ unsigned int *store_ptr;
365
+ unsigned int store_list[] = { 23, 56, 499, 98, 32847, 0 };
366
+ char *value;
367
+ size_t value_length;
368
+ uint32_t flags;
369
+ unsigned int x;
370
+
371
+ rc= memcached_flush(memc, 0);
372
+ assert(rc == MEMCACHED_SUCCESS);
373
+
374
+ rc= memcached_set(memc,
375
+ key, strlen(key),
376
+ NULL, 0,
377
+ (time_t)0, (uint32_t)0);
378
+ assert(rc == MEMCACHED_SUCCESS);
379
+
380
+ for (x= 0; store_list[x] ; x++)
381
+ {
382
+ rc= memcached_append(memc,
383
+ key, strlen(key),
384
+ (char *)&store_list[x], sizeof(unsigned int),
385
+ (time_t)0, (uint32_t)0);
386
+ assert(rc == MEMCACHED_SUCCESS);
387
+ }
388
+
389
+ value= memcached_get(memc, key, strlen(key),
390
+ &value_length, &flags, &rc);
391
+ assert((value_length == (sizeof(unsigned int) * x)));
392
+ assert(rc == MEMCACHED_SUCCESS);
393
+
394
+ store_ptr= (unsigned int *)value;
395
+ x= 0;
396
+ while ((size_t)store_ptr < (size_t)(value + value_length))
397
+ {
398
+ assert(*store_ptr == store_list[x++]);
399
+ store_ptr++;
400
+ }
401
+ free(value);
402
+
403
+ return 0;
404
+ }
405
+
406
+ static test_return cas2_test(memcached_st *memc)
407
+ {
408
+ memcached_return rc;
409
+ const char *keys[]= {"fudge", "son", "food"};
410
+ size_t key_length[]= {5, 3, 4};
411
+ const char *value= "we the people";
412
+ size_t value_length= strlen("we the people");
413
+ unsigned int x;
414
+ memcached_result_st results_obj;
415
+ memcached_result_st *results;
416
+ unsigned int set= 1;
417
+
418
+ rc= memcached_flush(memc, 0);
419
+ assert(rc == MEMCACHED_SUCCESS);
420
+
421
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
422
+
423
+ for (x= 0; x < 3; x++)
424
+ {
425
+ rc= memcached_set(memc, keys[x], key_length[x],
426
+ keys[x], key_length[x],
427
+ (time_t)50, (uint32_t)9);
428
+ assert(rc == MEMCACHED_SUCCESS);
429
+ }
430
+
431
+ rc= memcached_mget(memc, keys, key_length, 3);
432
+
433
+ results= memcached_result_create(memc, &results_obj);
434
+
435
+ results= memcached_fetch_result(memc, &results_obj, &rc);
436
+ assert(results);
437
+ assert(results->cas);
438
+ assert(rc == MEMCACHED_SUCCESS);
439
+ assert(memcached_result_cas(results));
440
+
441
+ assert(!memcmp(value, "we the people", strlen("we the people")));
442
+ assert(strlen("we the people") == value_length);
443
+ assert(rc == MEMCACHED_SUCCESS);
444
+
445
+ memcached_result_free(&results_obj);
446
+
447
+ return 0;
448
+ }
449
+
450
+ static test_return cas_test(memcached_st *memc)
451
+ {
452
+ memcached_return rc;
453
+ const char *key= "fun";
454
+ size_t key_length= strlen(key);
455
+ const char *value= "we the people";
456
+ const char* keys[2] = { key, NULL };
457
+ size_t keylengths[2] = { strlen(key), 0 };
458
+ size_t value_length= strlen(value);
459
+ const char *value2= "change the value";
460
+ size_t value2_length= strlen(value2);
461
+ uint64_t cas;
462
+
463
+ memcached_result_st results_obj;
464
+ memcached_result_st *results;
465
+ unsigned int set= 1;
466
+
467
+ rc= memcached_flush(memc, 0);
468
+ assert(rc == MEMCACHED_SUCCESS);
469
+
470
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
471
+
472
+ rc= memcached_set(memc, key, strlen(key),
473
+ value, strlen(value),
474
+ (time_t)0, (uint32_t)0);
475
+ assert(rc == MEMCACHED_SUCCESS);
476
+
477
+ rc= memcached_mget(memc, keys, keylengths, 1);
478
+
479
+ results= memcached_result_create(memc, &results_obj);
480
+
481
+ results= memcached_fetch_result(memc, &results_obj, &rc);
482
+ assert(results);
483
+ assert(rc == MEMCACHED_SUCCESS);
484
+ assert(memcached_result_cas(results));
485
+ assert(!memcmp(value, memcached_result_value(results), value_length));
486
+ assert(strlen(memcached_result_value(results)) == value_length);
487
+ assert(rc == MEMCACHED_SUCCESS);
488
+ cas = memcached_result_cas(results);
489
+
490
+ #if 0
491
+ results= memcached_fetch_result(memc, &results_obj, &rc);
492
+ assert(rc == MEMCACHED_END);
493
+ assert(results == NULL);
494
+ #endif
495
+
496
+ rc= memcached_cas(memc, key, key_length, value2, value2_length, 0, 0, cas);
497
+ assert(rc == MEMCACHED_SUCCESS);
498
+
499
+ /*
500
+ * The item will have a new cas value, so try to set it again with the old
501
+ * value. This should fail!
502
+ */
503
+ rc= memcached_cas(memc, key, key_length, value2, value2_length, 0, 0, cas);
504
+ assert(rc == MEMCACHED_DATA_EXISTS);
505
+
506
+ memcached_result_free(&results_obj);
507
+
508
+ return 0;
509
+ }
510
+
511
+ static test_return mget_len_no_cas_test(memcached_st *memc)
512
+ {
513
+ unsigned int x;
514
+ memcached_return rc;
515
+ uint32_t number_of_keys = 3;
516
+ const char *keys[]= {"fudge_for_me", "son_of_bonnie", "food_a_la_carte"};
517
+ size_t keys_length[]= {12, 13, 15};
518
+ const unsigned int specified_length = 4;
519
+ char *result_str;
520
+
521
+ memcached_result_st results_obj;
522
+ memcached_result_st *results;
523
+
524
+ results= memcached_result_create(memc, &results_obj);
525
+ assert(results);
526
+ assert(&results_obj == results);
527
+
528
+ /* We need to empty the server before continuing test */
529
+ rc= memcached_flush(memc, 0);
530
+ assert(rc == MEMCACHED_SUCCESS);
531
+
532
+ rc= memcached_mget(memc, keys, keys_length, number_of_keys);
533
+ assert(rc == MEMCACHED_SUCCESS);
534
+
535
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
536
+ {
537
+ assert(results);
538
+ }
539
+
540
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
541
+ assert(!results);
542
+ assert(rc == MEMCACHED_END);
543
+
544
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 0);
545
+
546
+ for (x= 0; x < number_of_keys; x++)
547
+ {
548
+ rc= memcached_set(memc, keys[x], keys_length[x],
549
+ keys[x], keys_length[x],
550
+ (time_t)50, (uint32_t)9);
551
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
552
+ }
553
+
554
+ rc= memcached_mget_len(memc, keys, keys_length, number_of_keys, specified_length);
555
+
556
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
557
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
558
+ return 0;
559
+ }
560
+
561
+ assert(rc == MEMCACHED_SUCCESS);
562
+
563
+ x = 0;
564
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
565
+ {
566
+ assert(results);
567
+ assert(&results_obj == results);
568
+ assert(rc == MEMCACHED_SUCCESS);
569
+ assert(!memcached_result_cas(results));
570
+
571
+ result_str = memcached_result_value(results);
572
+ assert(strlen(result_str) == specified_length);
573
+
574
+ x++;
575
+ }
576
+ assert(x == number_of_keys);
577
+
578
+ memcached_result_free(&results_obj);
579
+
580
+ return 0;
581
+ }
582
+
583
+ static test_return mget_len_cas_test(memcached_st *memc)
584
+ {
585
+ unsigned int x;
586
+ memcached_return rc;
587
+ uint32_t number_of_keys = 3;
588
+ const char *keys[]= {"fudge_for_me", "son_of_bonnie", "food_a_la_carte"};
589
+ size_t keys_length[]= {12, 13, 15};
590
+ const unsigned int specified_length = 4;
591
+ const char *value2= "change the value";
592
+ size_t value2_length= strlen(value2);
593
+ memcached_st *mclone;
594
+ char *result_str;
595
+ uint64_t cas;
596
+ char *key;
597
+ uint32_t key_length;
598
+
599
+ memcached_result_st results_obj;
600
+ memcached_result_st *results;
601
+
602
+ results= memcached_result_create(memc, &results_obj);
603
+ assert(results);
604
+ assert(&results_obj == results);
605
+
606
+ /* We need to empty the server before continuing test */
607
+ rc= memcached_flush(memc, 0);
608
+ assert(rc == MEMCACHED_SUCCESS);
609
+
610
+ rc= memcached_mget(memc, keys, keys_length, number_of_keys);
611
+ assert(rc == MEMCACHED_SUCCESS);
612
+
613
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
614
+ {
615
+ assert(results);
616
+ }
617
+
618
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
619
+ assert(!results);
620
+ assert(rc == MEMCACHED_END);
621
+
622
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
623
+
624
+ for (x= 0; x < number_of_keys; x++)
625
+ {
626
+ rc= memcached_set(memc, keys[x], keys_length[x],
627
+ keys[x], keys_length[x],
628
+ (time_t)50, (uint32_t)9);
629
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
630
+ }
631
+
632
+ rc= memcached_mget_len(memc, keys, keys_length, number_of_keys, specified_length);
633
+
634
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
635
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
636
+ return 0;
637
+ }
638
+
639
+ assert(rc == MEMCACHED_SUCCESS);
640
+
641
+ /*
642
+ * memcached_cas() calls below truncate memcached_fetch_result()'s
643
+ * results so clone the memcached_st state and move on with life.
644
+ * This happens when using memcached_mget() and memcached_mget_len().
645
+ */
646
+ mclone= memcached_clone(NULL, memc);
647
+
648
+ x = 0;
649
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
650
+ {
651
+ assert(results);
652
+ assert(&results_obj == results);
653
+ assert(rc == MEMCACHED_SUCCESS);
654
+
655
+ result_str = memcached_result_value(results);
656
+ assert(strlen(result_str) == specified_length);
657
+
658
+ assert(memcached_result_cas(results));
659
+
660
+ cas = memcached_result_cas(results);
661
+ key = memcached_result_key_value(results);
662
+ key_length = memcached_result_key_length(results);
663
+ rc= memcached_cas(mclone, key, key_length, value2, value2_length, 0, 0, cas);
664
+
665
+ /*
666
+ * The item will have a new cas value, so try to set it again with the old
667
+ * value. This should fail!
668
+ */
669
+ rc= memcached_cas(mclone, key, key_length, value2, value2_length, 0, 0, cas);
670
+ assert(rc == MEMCACHED_DATA_EXISTS);
671
+
672
+ x++;
673
+ }
674
+ assert(x == number_of_keys);
675
+
676
+ memcached_result_free(&results_obj);
677
+
678
+ return 0;
679
+ }
680
+
681
+ static test_return prepend_test(memcached_st *memc)
682
+ {
683
+ memcached_return rc;
684
+ const char *key= "fig";
685
+ const char *value= "people";
686
+ char *out_value= NULL;
687
+ size_t value_length;
688
+ uint32_t flags;
689
+
690
+ rc= memcached_flush(memc, 0);
691
+ assert(rc == MEMCACHED_SUCCESS);
692
+
693
+ rc= memcached_set(memc, key, strlen(key),
694
+ value, strlen(value),
695
+ (time_t)0, (uint32_t)0);
696
+ assert(rc == MEMCACHED_SUCCESS);
697
+
698
+ rc= memcached_prepend(memc, key, strlen(key),
699
+ "the ", strlen("the "),
700
+ (time_t)0, (uint32_t)0);
701
+ assert(rc == MEMCACHED_SUCCESS);
702
+
703
+ rc= memcached_prepend(memc, key, strlen(key),
704
+ "we ", strlen("we "),
705
+ (time_t)0, (uint32_t)0);
706
+ assert(rc == MEMCACHED_SUCCESS);
707
+
708
+ out_value= memcached_get(memc, key, strlen(key),
709
+ &value_length, &flags, &rc);
710
+ assert(!memcmp(out_value, "we the people", strlen("we the people")));
711
+ assert(strlen("we the people") == value_length);
712
+ assert(rc == MEMCACHED_SUCCESS);
713
+ free(out_value);
714
+
715
+ return 0;
716
+ }
717
+
718
+ /*
719
+ Set the value, then quit to make sure it is flushed.
720
+ Come back in and test that add fails.
721
+ */
722
+ static test_return add_test(memcached_st *memc)
723
+ {
724
+ memcached_return rc;
725
+ const char *key= "foo";
726
+ const char *value= "when we sanitize";
727
+ unsigned long long setting_value;
728
+
729
+ setting_value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
730
+
731
+ rc= memcached_set(memc, key, strlen(key),
732
+ value, strlen(value),
733
+ (time_t)0, (uint32_t)0);
734
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
735
+ memcached_quit(memc);
736
+ rc= memcached_add(memc, key, strlen(key),
737
+ value, strlen(value),
738
+ (time_t)0, (uint32_t)0);
739
+
740
+ /* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
741
+ if (setting_value)
742
+ assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_STORED);
743
+ else
744
+ assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_DATA_EXISTS);
745
+
746
+ return 0;
747
+ }
748
+
749
+ /*
750
+ ** There was a problem of leaking filedescriptors in the initial release
751
+ ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
752
+ ** systems it seems that the kernel is slow on reclaiming the resources
753
+ ** because the connects starts to time out (the test doesn't do much
754
+ ** anyway, so just loop 10 iterations)
755
+ */
756
+ static test_return add_wrapper(memcached_st *memc)
757
+ {
758
+ unsigned int x;
759
+ unsigned int max= 10000;
760
+ #ifdef __sun
761
+ max= 10;
762
+ #endif
763
+
764
+ for (x= 0; x < max; x++)
765
+ add_test(memc);
766
+
767
+ return 0;
768
+ }
769
+
770
+ static test_return replace_test(memcached_st *memc)
771
+ {
772
+ memcached_return rc;
773
+ const char *key= "foo";
774
+ const char *value= "when we sanitize";
775
+ const char *original= "first we insert some data";
776
+
777
+ rc= memcached_set(memc, key, strlen(key),
778
+ original, strlen(original),
779
+ (time_t)0, (uint32_t)0);
780
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
781
+
782
+ rc= memcached_replace(memc, key, strlen(key),
783
+ value, strlen(value),
784
+ (time_t)0, (uint32_t)0);
785
+ assert(rc == MEMCACHED_SUCCESS);
786
+
787
+ return 0;
788
+ }
789
+
790
+ static test_return delete_test(memcached_st *memc)
791
+ {
792
+ memcached_return rc;
793
+ const char *key= "foo";
794
+ const char *value= "when we sanitize";
795
+
796
+ rc= memcached_set(memc, key, strlen(key),
797
+ value, strlen(value),
798
+ (time_t)0, (uint32_t)0);
799
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
800
+
801
+ rc= memcached_delete(memc, key, strlen(key), (time_t)0);
802
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
803
+
804
+ return 0;
805
+ }
806
+
807
+ static test_return flush_test(memcached_st *memc)
808
+ {
809
+ memcached_return rc;
810
+
811
+ rc= memcached_flush(memc, 0);
812
+ assert(rc == MEMCACHED_SUCCESS);
813
+
814
+ return 0;
815
+ }
816
+
817
+ static memcached_return server_function(memcached_st *ptr __attribute__((unused)),
818
+ memcached_server_st *server __attribute__((unused)),
819
+ void *context __attribute__((unused)))
820
+ {
821
+ /* Do Nothing */
822
+
823
+ return MEMCACHED_SUCCESS;
824
+ }
825
+
826
+ static test_return memcached_server_cursor_test(memcached_st *memc)
827
+ {
828
+ char context[8];
829
+ strcpy(context, "foo bad");
830
+ memcached_server_function callbacks[1];
831
+
832
+ callbacks[0]= server_function;
833
+ memcached_server_cursor(memc, callbacks, context, 1);
834
+ return 0;
835
+ }
836
+
837
+ static test_return bad_key_test(memcached_st *memc)
838
+ {
839
+ memcached_return rc;
840
+ const char *key= "foo bad";
841
+ char *string;
842
+ size_t string_length;
843
+ uint32_t flags;
844
+ memcached_st *memc_clone;
845
+ unsigned int set= 1;
846
+ size_t max_keylen= 0xffff;
847
+ const char *keys[] = { "GoodKey", "Bad Key", "NotMine" };
848
+
849
+ memc_clone= memcached_clone(NULL, memc);
850
+ assert(memc_clone);
851
+
852
+ rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
853
+ assert(rc == MEMCACHED_SUCCESS);
854
+
855
+ /* All keys are valid in the binary protocol (except for length) */
856
+ if (memcached_behavior_get(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 0)
857
+ {
858
+ string= memcached_get(memc_clone, key, strlen(key),
859
+ &string_length, &flags, &rc);
860
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
861
+ assert(string_length == 0);
862
+ assert(!string);
863
+
864
+ set= 0;
865
+ rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
866
+ assert(rc == MEMCACHED_SUCCESS);
867
+ string= memcached_get(memc_clone, key, strlen(key),
868
+ &string_length, &flags, &rc);
869
+ assert(rc == MEMCACHED_NOTFOUND);
870
+ assert(string_length == 0);
871
+ assert(!string);
872
+
873
+ /* Test multi key for bad keys */
874
+ size_t key_lengths[] = { 7, 7, 7 };
875
+ set= 1;
876
+ rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
877
+ assert(rc == MEMCACHED_SUCCESS);
878
+
879
+ rc= memcached_mget(memc_clone, keys, key_lengths, 3);
880
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
881
+
882
+ rc= memcached_mget_by_key(memc_clone, "foo daddy", 9, keys, key_lengths,
883
+ 1, GET_LEN_ARG_UNSPECIFIED);
884
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
885
+
886
+ max_keylen= 250;
887
+
888
+ /* The following test should be moved to the end of this function when the
889
+ memcached server is updated to allow max size length of the keys in the
890
+ binary protocol
891
+ */
892
+ rc= memcached_callback_set(memc_clone, MEMCACHED_CALLBACK_PREFIX_KEY, NULL);
893
+ assert(rc == MEMCACHED_SUCCESS);
894
+
895
+ char *longkey= malloc(max_keylen + 1);
896
+ if (longkey != NULL)
897
+ {
898
+ memset(longkey, 'a', max_keylen + 1);
899
+ string= memcached_get(memc_clone, longkey, max_keylen,
900
+ &string_length, &flags, &rc);
901
+ assert(rc == MEMCACHED_NOTFOUND);
902
+ assert(string_length == 0);
903
+ assert(!string);
904
+
905
+ string= memcached_get(memc_clone, longkey, max_keylen + 1,
906
+ &string_length, &flags, &rc);
907
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
908
+ assert(string_length == 0);
909
+ assert(!string);
910
+
911
+ free(longkey);
912
+ }
913
+ }
914
+
915
+ /* Make sure zero length keys are marked as bad */
916
+ set= 1;
917
+ rc= memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
918
+ assert(rc == MEMCACHED_SUCCESS);
919
+ string= memcached_get(memc_clone, key, 0,
920
+ &string_length, &flags, &rc);
921
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
922
+ assert(string_length == 0);
923
+ assert(!string);
924
+
925
+ memcached_free(memc_clone);
926
+
927
+ return 0;
928
+ }
929
+
930
+ #define READ_THROUGH_VALUE "set for me"
931
+ static memcached_return read_through_trigger(memcached_st *memc __attribute__((unused)),
932
+ char *key __attribute__((unused)),
933
+ size_t key_length __attribute__((unused)),
934
+ memcached_result_st *result)
935
+ {
936
+
937
+ return memcached_result_set_value(result, READ_THROUGH_VALUE, strlen(READ_THROUGH_VALUE));
938
+ }
939
+
940
+ static test_return read_through(memcached_st *memc)
941
+ {
942
+ memcached_return rc;
943
+ const char *key= "foo";
944
+ char *string;
945
+ size_t string_length;
946
+ uint32_t flags;
947
+ memcached_trigger_key cb= (memcached_trigger_key)read_through_trigger;
948
+
949
+ string= memcached_get(memc, key, strlen(key),
950
+ &string_length, &flags, &rc);
951
+
952
+ assert(rc == MEMCACHED_NOTFOUND);
953
+ assert(string_length == 0);
954
+ assert(!string);
955
+
956
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE,
957
+ *(void **)&cb);
958
+ assert(rc == MEMCACHED_SUCCESS);
959
+
960
+ string= memcached_get(memc, key, strlen(key),
961
+ &string_length, &flags, &rc);
962
+
963
+ assert(rc == MEMCACHED_SUCCESS);
964
+ assert(string_length == strlen(READ_THROUGH_VALUE));
965
+ assert(!strcmp(READ_THROUGH_VALUE, string));
966
+ free(string);
967
+
968
+ string= memcached_get(memc, key, strlen(key),
969
+ &string_length, &flags, &rc);
970
+
971
+ assert(rc == MEMCACHED_SUCCESS);
972
+ assert(string_length == strlen(READ_THROUGH_VALUE));
973
+ assert(!strcmp(READ_THROUGH_VALUE, string));
974
+ free(string);
975
+
976
+ return 0;
977
+ }
978
+
979
+ static memcached_return delete_trigger(memcached_st *ptr __attribute__((unused)),
980
+ const char *key,
981
+ size_t key_length __attribute__((unused)))
982
+ {
983
+ assert(key);
984
+
985
+ return MEMCACHED_SUCCESS;
986
+ }
987
+
988
+ static test_return delete_through(memcached_st *memc)
989
+ {
990
+ memcached_trigger_delete_key callback;
991
+ memcached_return rc;
992
+
993
+ callback= (memcached_trigger_delete_key)delete_trigger;
994
+
995
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_DELETE_TRIGGER, *(void**)&callback);
996
+ assert(rc == MEMCACHED_SUCCESS);
997
+
998
+ return 0;
999
+ }
1000
+
1001
+ static test_return get_test(memcached_st *memc)
1002
+ {
1003
+ memcached_return rc;
1004
+ const char *key= "foo";
1005
+ char *string;
1006
+ size_t string_length;
1007
+ uint32_t flags;
1008
+
1009
+ rc= memcached_delete(memc, key, strlen(key), (time_t)0);
1010
+ assert(rc == MEMCACHED_BUFFERED || rc == MEMCACHED_NOTFOUND);
1011
+
1012
+ string= memcached_get(memc, key, strlen(key),
1013
+ &string_length, &flags, &rc);
1014
+
1015
+ assert(rc == MEMCACHED_NOTFOUND);
1016
+ assert(string_length == 0);
1017
+ assert(!string);
1018
+
1019
+ return 0;
1020
+ }
1021
+
1022
+ static test_return get_test2(memcached_st *memc)
1023
+ {
1024
+ memcached_return rc;
1025
+ const char *key= "foo";
1026
+ const char *value= "when we sanitize";
1027
+ char *string;
1028
+ size_t string_length;
1029
+ uint32_t flags;
1030
+
1031
+ rc= memcached_set(memc, key, strlen(key),
1032
+ value, strlen(value),
1033
+ (time_t)0, (uint32_t)0);
1034
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1035
+
1036
+ string= memcached_get(memc, key, strlen(key),
1037
+ &string_length, &flags, &rc);
1038
+
1039
+ assert(string);
1040
+ assert(rc == MEMCACHED_SUCCESS);
1041
+ assert(string_length == strlen(value));
1042
+ assert(!memcmp(string, value, string_length));
1043
+
1044
+ free(string);
1045
+
1046
+ return 0;
1047
+ }
1048
+
1049
+ static test_return get_len_test(memcached_st *memc)
1050
+ {
1051
+ memcached_return rc;
1052
+ const char *key= "foo_never_found_thank_you";
1053
+ const uint32_t user_spec_len = 4;
1054
+ char *string;
1055
+ size_t string_length;
1056
+ uint32_t flags;
1057
+
1058
+ rc= memcached_delete(memc, key, strlen(key), (time_t)0);
1059
+ assert(rc == MEMCACHED_BUFFERED || rc == MEMCACHED_NOTFOUND);
1060
+
1061
+ string= memcached_get_len(memc, key, strlen(key), user_spec_len,
1062
+ &string_length, &flags, &rc);
1063
+
1064
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
1065
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
1066
+ } else {
1067
+ assert(rc == MEMCACHED_NOTFOUND);
1068
+ assert(string_length == 0);
1069
+ assert(!string);
1070
+ }
1071
+
1072
+ return 0;
1073
+ }
1074
+
1075
+ static test_return get_len_test2(memcached_st *memc)
1076
+ {
1077
+ memcached_return rc;
1078
+ const char *key= "foo";
1079
+ const char *value= "when we sanitize";
1080
+ const uint32_t user_spec_len = 6;
1081
+ const char *ret_value= "when w";
1082
+ char *string;
1083
+ size_t string_length;
1084
+ uint32_t flags;
1085
+
1086
+ rc= memcached_set(memc, key, strlen(key),
1087
+ value, strlen(value),
1088
+ (time_t)0, (uint32_t)0);
1089
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1090
+
1091
+ string= memcached_get_len(memc, key, strlen(key), user_spec_len,
1092
+ &string_length, &flags, &rc);
1093
+
1094
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
1095
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
1096
+ } else {
1097
+ assert(string);
1098
+ assert(rc == MEMCACHED_SUCCESS);
1099
+ assert(string_length == strlen(ret_value));
1100
+ assert(!memcmp(string, ret_value, string_length));
1101
+
1102
+ free(string);
1103
+ }
1104
+
1105
+ return 0;
1106
+ }
1107
+
1108
+ static test_return get_len_test3(memcached_st *memc)
1109
+ {
1110
+ memcached_return rc;
1111
+ const char *key= "test";
1112
+ const char *value= "bar";
1113
+ const uint32_t user_spec_len = 2;
1114
+ const char *ret_value= "ba";
1115
+ char *string;
1116
+ size_t string_length;
1117
+ uint32_t flags;
1118
+
1119
+ rc= memcached_set(memc, key, strlen(key),
1120
+ value, strlen(value),
1121
+ (time_t)0, (uint32_t)0);
1122
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1123
+
1124
+ string= memcached_get_len(memc, key, strlen(key), user_spec_len,
1125
+ &string_length, &flags, &rc);
1126
+
1127
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
1128
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
1129
+ } else {
1130
+ assert(string);
1131
+ assert(rc == MEMCACHED_SUCCESS);
1132
+ assert(string_length == strlen(ret_value));
1133
+ assert(!memcmp(string, ret_value, string_length));
1134
+
1135
+ free(string);
1136
+ }
1137
+
1138
+ return 0;
1139
+ }
1140
+
1141
+
1142
+
1143
+ static test_return set_test2(memcached_st *memc)
1144
+ {
1145
+ memcached_return rc;
1146
+ const char *key= "foo";
1147
+ const char *value= "train in the brain";
1148
+ size_t value_length= strlen(value);
1149
+ unsigned int x;
1150
+
1151
+ for (x= 0; x < 10; x++)
1152
+ {
1153
+ rc= memcached_set(memc, key, strlen(key),
1154
+ value, value_length,
1155
+ (time_t)0, (uint32_t)0);
1156
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1157
+ }
1158
+
1159
+ return 0;
1160
+ }
1161
+
1162
+ static test_return set_test3(memcached_st *memc)
1163
+ {
1164
+ memcached_return rc;
1165
+ char *value;
1166
+ size_t value_length= 8191;
1167
+ unsigned int x;
1168
+
1169
+ value = (char*)malloc(value_length);
1170
+ assert(value);
1171
+
1172
+ for (x= 0; x < value_length; x++)
1173
+ value[x] = (char) (x % 127);
1174
+
1175
+ /* The dump test relies on there being at least 32 items in memcached */
1176
+ for (x= 0; x < 32; x++)
1177
+ {
1178
+ char key[16];
1179
+
1180
+ sprintf(key, "foo%u", x);
1181
+
1182
+ rc= memcached_set(memc, key, strlen(key),
1183
+ value, value_length,
1184
+ (time_t)0, (uint32_t)0);
1185
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1186
+ }
1187
+
1188
+ free(value);
1189
+
1190
+ return 0;
1191
+ }
1192
+
1193
+ static test_return get_test3(memcached_st *memc)
1194
+ {
1195
+ memcached_return rc;
1196
+ const char *key= "foo";
1197
+ char *value;
1198
+ size_t value_length= 8191;
1199
+ char *string;
1200
+ size_t string_length;
1201
+ uint32_t flags;
1202
+ uint32_t x;
1203
+
1204
+ value = (char*)malloc(value_length);
1205
+ assert(value);
1206
+
1207
+ for (x= 0; x < value_length; x++)
1208
+ value[x] = (char) (x % 127);
1209
+
1210
+ rc= memcached_set(memc, key, strlen(key),
1211
+ value, value_length,
1212
+ (time_t)0, (uint32_t)0);
1213
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1214
+
1215
+ string= memcached_get(memc, key, strlen(key),
1216
+ &string_length, &flags, &rc);
1217
+
1218
+ assert(rc == MEMCACHED_SUCCESS);
1219
+ assert(string);
1220
+ assert(string_length == value_length);
1221
+ assert(!memcmp(string, value, string_length));
1222
+
1223
+ free(string);
1224
+ free(value);
1225
+
1226
+ return 0;
1227
+ }
1228
+
1229
+ static test_return get_test4(memcached_st *memc)
1230
+ {
1231
+ memcached_return rc;
1232
+ const char *key= "foo";
1233
+ char *value;
1234
+ size_t value_length= 8191;
1235
+ char *string;
1236
+ size_t string_length;
1237
+ uint32_t flags;
1238
+ uint32_t x;
1239
+
1240
+ value = (char*)malloc(value_length);
1241
+ assert(value);
1242
+
1243
+ for (x= 0; x < value_length; x++)
1244
+ value[x] = (char) (x % 127);
1245
+
1246
+ rc= memcached_set(memc, key, strlen(key),
1247
+ value, value_length,
1248
+ (time_t)0, (uint32_t)0);
1249
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1250
+
1251
+ for (x= 0; x < 10; x++)
1252
+ {
1253
+ string= memcached_get(memc, key, strlen(key),
1254
+ &string_length, &flags, &rc);
1255
+
1256
+ assert(rc == MEMCACHED_SUCCESS);
1257
+ assert(string);
1258
+ assert(string_length == value_length);
1259
+ assert(!memcmp(string, value, string_length));
1260
+ free(string);
1261
+ }
1262
+
1263
+ free(value);
1264
+
1265
+ return 0;
1266
+ }
1267
+
1268
+ /*
1269
+ * This test verifies that memcached_read_one_response doesn't try to
1270
+ * dereference a NIL-pointer if you issue a multi-get and don't read out all
1271
+ * responses before you execute a storage command.
1272
+ */
1273
+ static test_return get_test5(memcached_st *memc)
1274
+ {
1275
+ /*
1276
+ ** Request the same key twice, to ensure that we hash to the same server
1277
+ ** (so that we have multiple response values queued up) ;-)
1278
+ */
1279
+ const char *keys[]= { "key", "key" };
1280
+ size_t lengths[]= { 3, 3 };
1281
+ uint32_t flags;
1282
+ size_t rlen;
1283
+
1284
+ memcached_return rc= memcached_set(memc, keys[0], lengths[0],
1285
+ keys[0], lengths[0], 0, 0);
1286
+ assert(rc == MEMCACHED_SUCCESS);
1287
+ rc= memcached_mget(memc, keys, lengths, 2);
1288
+
1289
+ memcached_result_st results_obj;
1290
+ memcached_result_st *results;
1291
+ results=memcached_result_create(memc, &results_obj);
1292
+ assert(results);
1293
+ results=memcached_fetch_result(memc, &results_obj, &rc);
1294
+ assert(results);
1295
+ memcached_result_free(&results_obj);
1296
+
1297
+ /* Don't read out the second result, but issue a set instead.. */
1298
+ rc= memcached_set(memc, keys[0], lengths[0], keys[0], lengths[0], 0, 0);
1299
+ assert(rc == MEMCACHED_SUCCESS);
1300
+
1301
+ char *val= memcached_get_by_key(memc, keys[0], lengths[0], "yek", 3,
1302
+ GET_LEN_ARG_UNSPECIFIED,
1303
+ &rlen, &flags, &rc);
1304
+ assert(val == NULL);
1305
+ assert(rc == MEMCACHED_NOTFOUND);
1306
+ val= memcached_get(memc, keys[0], lengths[0], &rlen, &flags, &rc);
1307
+ assert(val != NULL);
1308
+ assert(rc == MEMCACHED_SUCCESS);
1309
+ free(val);
1310
+
1311
+ return TEST_SUCCESS;
1312
+ }
1313
+
1314
+ /*
1315
+ * This test verifies that dummy NOOP response will be fetched when
1316
+ * client try to GET missing key.
1317
+ */
1318
+ static test_return get_test6(memcached_st *memc)
1319
+ {
1320
+ const char *key= "getkey";
1321
+ const char *val= "getval";
1322
+ size_t len;
1323
+ uint32_t flags;
1324
+ char *value;
1325
+ memcached_return rc;
1326
+
1327
+ value= memcached_get(memc, key, strlen(key), &len, &flags, &rc);
1328
+ assert(len == 0);
1329
+ assert(value == 0);
1330
+ assert(rc == MEMCACHED_NOTFOUND);
1331
+
1332
+ rc= memcached_set(memc, key, strlen(key), val, strlen(val), 2, 0);
1333
+ assert(rc == MEMCACHED_SUCCESS);
1334
+
1335
+ return TEST_SUCCESS;
1336
+ }
1337
+
1338
+
1339
+ /* Do not copy the style of this code, I just access hosts to testthis function */
1340
+ static test_return stats_servername_test(memcached_st *memc)
1341
+ {
1342
+ memcached_return rc;
1343
+ memcached_stat_st memc_stat;
1344
+ rc= memcached_stat_servername(&memc_stat, NULL,
1345
+ memc->hosts[0].hostname,
1346
+ memc->hosts[0].port);
1347
+
1348
+ return 0;
1349
+ }
1350
+
1351
+ static test_return increment_test(memcached_st *memc)
1352
+ {
1353
+ uint64_t new_number;
1354
+ memcached_return rc;
1355
+ const char *key= "number";
1356
+ const char *value= "0";
1357
+
1358
+ rc= memcached_set(memc, key, strlen(key),
1359
+ value, strlen(value),
1360
+ (time_t)0, (uint32_t)0);
1361
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1362
+
1363
+ rc= memcached_increment(memc, key, strlen(key),
1364
+ 1, &new_number);
1365
+ assert(rc == MEMCACHED_SUCCESS);
1366
+ assert(new_number == 1);
1367
+
1368
+ rc= memcached_increment(memc, key, strlen(key),
1369
+ 1, &new_number);
1370
+ assert(rc == MEMCACHED_SUCCESS);
1371
+ assert(new_number == 2);
1372
+
1373
+ return 0;
1374
+ }
1375
+
1376
+ static test_return increment_with_initial_test(memcached_st *memc)
1377
+ {
1378
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) != 0)
1379
+ {
1380
+ uint64_t new_number;
1381
+ memcached_return rc;
1382
+ const char *key= "number";
1383
+ uint64_t initial= 0;
1384
+
1385
+ rc= memcached_increment_with_initial(memc, key, strlen(key),
1386
+ 1, initial, 0, &new_number);
1387
+ assert(rc == MEMCACHED_SUCCESS);
1388
+ assert(new_number == initial);
1389
+
1390
+ rc= memcached_increment_with_initial(memc, key, strlen(key),
1391
+ 1, initial, 0, &new_number);
1392
+ assert(rc == MEMCACHED_SUCCESS);
1393
+ assert(new_number == (initial + 1));
1394
+ }
1395
+ return 0;
1396
+ }
1397
+
1398
+ static test_return decrement_test(memcached_st *memc)
1399
+ {
1400
+ uint64_t new_number;
1401
+ memcached_return rc;
1402
+ const char *key= "number";
1403
+ const char *value= "3";
1404
+
1405
+ rc= memcached_set(memc, key, strlen(key),
1406
+ value, strlen(value),
1407
+ (time_t)0, (uint32_t)0);
1408
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1409
+
1410
+ rc= memcached_decrement(memc, key, strlen(key),
1411
+ 1, &new_number);
1412
+ assert(rc == MEMCACHED_SUCCESS);
1413
+ assert(new_number == 2);
1414
+
1415
+ rc= memcached_decrement(memc, key, strlen(key),
1416
+ 1, &new_number);
1417
+ assert(rc == MEMCACHED_SUCCESS);
1418
+ assert(new_number == 1);
1419
+
1420
+ return 0;
1421
+ }
1422
+
1423
+ static test_return decrement_with_initial_test(memcached_st *memc)
1424
+ {
1425
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) != 0)
1426
+ {
1427
+ uint64_t new_number;
1428
+ memcached_return rc;
1429
+ const char *key= "number";
1430
+ uint64_t initial= 3;
1431
+
1432
+ rc= memcached_decrement_with_initial(memc, key, strlen(key),
1433
+ 1, initial, 0, &new_number);
1434
+ assert(rc == MEMCACHED_SUCCESS);
1435
+ assert(new_number == initial);
1436
+
1437
+ rc= memcached_decrement_with_initial(memc, key, strlen(key),
1438
+ 1, initial, 0, &new_number);
1439
+ assert(rc == MEMCACHED_SUCCESS);
1440
+ assert(new_number == (initial - 1));
1441
+ }
1442
+ return 0;
1443
+ }
1444
+
1445
+ static test_return quit_test(memcached_st *memc)
1446
+ {
1447
+ memcached_return rc;
1448
+ const char *key= "fudge";
1449
+ const char *value= "sanford and sun";
1450
+
1451
+ rc= memcached_set(memc, key, strlen(key),
1452
+ value, strlen(value),
1453
+ (time_t)10, (uint32_t)3);
1454
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1455
+ memcached_quit(memc);
1456
+
1457
+ rc= memcached_set(memc, key, strlen(key),
1458
+ value, strlen(value),
1459
+ (time_t)50, (uint32_t)9);
1460
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1461
+
1462
+ return 0;
1463
+ }
1464
+
1465
+ static test_return mget_result_test(memcached_st *memc)
1466
+ {
1467
+ memcached_return rc;
1468
+ const char *keys[]= {"fudge", "son", "food"};
1469
+ size_t key_length[]= {5, 3, 4};
1470
+ unsigned int x;
1471
+
1472
+ memcached_result_st results_obj;
1473
+ memcached_result_st *results;
1474
+
1475
+ results= memcached_result_create(memc, &results_obj);
1476
+ assert(results);
1477
+ assert(&results_obj == results);
1478
+
1479
+ /* We need to empty the server before continueing test */
1480
+ rc= memcached_flush(memc, 0);
1481
+ assert(rc == MEMCACHED_SUCCESS);
1482
+
1483
+ rc= memcached_mget(memc, keys, key_length, 3);
1484
+ assert(rc == MEMCACHED_SUCCESS);
1485
+
1486
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
1487
+ {
1488
+ assert(results);
1489
+ }
1490
+
1491
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
1492
+ assert(!results);
1493
+ assert(rc == MEMCACHED_END);
1494
+
1495
+ for (x= 0; x < 3; x++)
1496
+ {
1497
+ rc= memcached_set(memc, keys[x], key_length[x],
1498
+ keys[x], key_length[x],
1499
+ (time_t)50, (uint32_t)9);
1500
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1501
+ }
1502
+
1503
+ rc= memcached_mget(memc, keys, key_length, 3);
1504
+ assert(rc == MEMCACHED_SUCCESS);
1505
+
1506
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
1507
+ {
1508
+ assert(results);
1509
+ assert(&results_obj == results);
1510
+ assert(rc == MEMCACHED_SUCCESS);
1511
+ assert(memcached_result_key_length(results) == memcached_result_length(results));
1512
+ assert(!memcmp(memcached_result_key_value(results),
1513
+ memcached_result_value(results),
1514
+ memcached_result_length(results)));
1515
+ }
1516
+
1517
+ memcached_result_free(&results_obj);
1518
+
1519
+ return 0;
1520
+ }
1521
+
1522
+ static test_return mget_len_result_test(memcached_st *memc)
1523
+ {
1524
+ memcached_return rc;
1525
+ uint32_t number_of_keys = 3;
1526
+ const char *keys[]= {"fudge_for_me", "son_of_bonnie", "food_a_la_carte"};
1527
+ size_t key_length[]= {12, 13, 15};
1528
+ const unsigned int specified_length = 4;
1529
+ const char *expected_results[]= {"fudg", "son_", "food"};
1530
+ unsigned int x;
1531
+
1532
+ memcached_result_st results_obj;
1533
+ memcached_result_st *results;
1534
+
1535
+ results= memcached_result_create(memc, &results_obj);
1536
+ assert(results);
1537
+ assert(&results_obj == results);
1538
+
1539
+ /* We need to empty the server before continueing test */
1540
+ rc= memcached_flush(memc, 0);
1541
+ assert(rc == MEMCACHED_SUCCESS);
1542
+
1543
+ rc= memcached_mget(memc, keys, key_length, number_of_keys);
1544
+ assert(rc == MEMCACHED_SUCCESS);
1545
+
1546
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
1547
+ {
1548
+ assert(results);
1549
+ }
1550
+
1551
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
1552
+ assert(!results);
1553
+ assert(rc == MEMCACHED_END);
1554
+
1555
+ for (x= 0; x < number_of_keys; x++)
1556
+ {
1557
+ rc= memcached_set(memc, keys[x], key_length[x],
1558
+ keys[x], key_length[x],
1559
+ (time_t)50, (uint32_t)9);
1560
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1561
+ }
1562
+
1563
+ rc= memcached_mget_len(memc, keys, key_length, number_of_keys, specified_length);
1564
+
1565
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1) {
1566
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
1567
+ return 0;
1568
+ }
1569
+
1570
+ assert(rc == MEMCACHED_SUCCESS);
1571
+
1572
+ x = 0;
1573
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
1574
+ {
1575
+ char *result_str = memcached_result_value(results);
1576
+ size_t str_len = strlen(result_str);
1577
+ assert(results);
1578
+ assert(&results_obj == results);
1579
+ assert(rc == MEMCACHED_SUCCESS);
1580
+ assert(str_len == specified_length);
1581
+ assert(strlen(expected_results[0]) == specified_length);
1582
+ assert(strlen(expected_results[1]) == specified_length);
1583
+ assert(strlen(expected_results[2]) == specified_length);
1584
+ assert((memcmp(result_str, expected_results[0], specified_length) == 0) ||
1585
+ (memcmp(result_str, expected_results[1], specified_length) == 0) ||
1586
+ (memcmp(result_str, expected_results[2], specified_length) == 0));
1587
+ x++;
1588
+ }
1589
+ assert(x == number_of_keys);
1590
+
1591
+ memcached_result_free(&results_obj);
1592
+
1593
+ return 0;
1594
+ }
1595
+
1596
+ static test_return mget_result_alloc_test(memcached_st *memc)
1597
+ {
1598
+ memcached_return rc;
1599
+ const char *keys[]= {"fudge", "son", "food"};
1600
+ size_t key_length[]= {5, 3, 4};
1601
+ unsigned int x;
1602
+
1603
+ memcached_result_st *results;
1604
+
1605
+ /* We need to empty the server before continueing test */
1606
+ rc= memcached_flush(memc, 0);
1607
+ assert(rc == MEMCACHED_SUCCESS);
1608
+
1609
+ rc= memcached_mget(memc, keys, key_length, 3);
1610
+ assert(rc == MEMCACHED_SUCCESS);
1611
+
1612
+ while ((results= memcached_fetch_result(memc, NULL, &rc)) != NULL)
1613
+ {
1614
+ assert(results);
1615
+ }
1616
+ assert(!results);
1617
+ assert(rc == MEMCACHED_END);
1618
+
1619
+ for (x= 0; x < 3; x++)
1620
+ {
1621
+ rc= memcached_set(memc, keys[x], key_length[x],
1622
+ keys[x], key_length[x],
1623
+ (time_t)50, (uint32_t)9);
1624
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1625
+ }
1626
+
1627
+ rc= memcached_mget(memc, keys, key_length, 3);
1628
+ assert(rc == MEMCACHED_SUCCESS);
1629
+
1630
+ x= 0;
1631
+ while ((results= memcached_fetch_result(memc, NULL, &rc)))
1632
+ {
1633
+ assert(results);
1634
+ assert(rc == MEMCACHED_SUCCESS);
1635
+ assert(memcached_result_key_length(results) == memcached_result_length(results));
1636
+ assert(!memcmp(memcached_result_key_value(results),
1637
+ memcached_result_value(results),
1638
+ memcached_result_length(results)));
1639
+ memcached_result_free(results);
1640
+ x++;
1641
+ }
1642
+
1643
+ return 0;
1644
+ }
1645
+
1646
+ /* Count the results */
1647
+ static memcached_return callback_counter(memcached_st *ptr __attribute__((unused)),
1648
+ memcached_result_st *result __attribute__((unused)),
1649
+ void *context)
1650
+ {
1651
+ unsigned int *counter= (unsigned int *)context;
1652
+
1653
+ *counter= *counter + 1;
1654
+
1655
+ return MEMCACHED_SUCCESS;
1656
+ }
1657
+
1658
+ static test_return mget_result_function(memcached_st *memc)
1659
+ {
1660
+ memcached_return rc;
1661
+ const char *keys[]= {"fudge", "son", "food"};
1662
+ size_t key_length[]= {5, 3, 4};
1663
+ unsigned int x;
1664
+ unsigned int counter;
1665
+ memcached_execute_function callbacks[1];
1666
+
1667
+ /* We need to empty the server before continueing test */
1668
+ rc= memcached_flush(memc, 0);
1669
+ for (x= 0; x < 3; x++)
1670
+ {
1671
+ rc= memcached_set(memc, keys[x], key_length[x],
1672
+ keys[x], key_length[x],
1673
+ (time_t)50, (uint32_t)9);
1674
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1675
+ }
1676
+
1677
+ rc= memcached_mget(memc, keys, key_length, 3);
1678
+ assert(rc == MEMCACHED_SUCCESS);
1679
+
1680
+ callbacks[0]= &callback_counter;
1681
+ counter= 0;
1682
+ rc= memcached_fetch_execute(memc, callbacks, (void *)&counter, 1);
1683
+
1684
+ assert(counter == 3);
1685
+
1686
+ return 0;
1687
+ }
1688
+
1689
+ static test_return mget_test(memcached_st *memc)
1690
+ {
1691
+ memcached_return rc;
1692
+ const char *keys[]= {"fudge", "son", "food"};
1693
+ size_t key_length[]= {5, 3, 4};
1694
+ unsigned int x;
1695
+ uint32_t flags;
1696
+
1697
+ char return_key[MEMCACHED_MAX_KEY];
1698
+ size_t return_key_length;
1699
+ char *return_value;
1700
+ size_t return_value_length;
1701
+
1702
+ /* We need to empty the server before continueing test */
1703
+ rc= memcached_flush(memc, 0);
1704
+ assert(rc == MEMCACHED_SUCCESS);
1705
+
1706
+ rc= memcached_mget(memc, keys, key_length, 3);
1707
+ assert(rc == MEMCACHED_SUCCESS);
1708
+
1709
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1710
+ &return_value_length, &flags, &rc)) != NULL)
1711
+ {
1712
+ assert(return_value);
1713
+ }
1714
+ assert(!return_value);
1715
+ assert(return_value_length == 0);
1716
+ assert(rc == MEMCACHED_END);
1717
+
1718
+ for (x= 0; x < 3; x++)
1719
+ {
1720
+ rc= memcached_set(memc, keys[x], key_length[x],
1721
+ keys[x], key_length[x],
1722
+ (time_t)50, (uint32_t)9);
1723
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1724
+ }
1725
+
1726
+ rc= memcached_mget(memc, keys, key_length, 3);
1727
+ assert(rc == MEMCACHED_SUCCESS);
1728
+
1729
+ x= 0;
1730
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1731
+ &return_value_length, &flags, &rc)))
1732
+ {
1733
+ assert(return_value);
1734
+ assert(rc == MEMCACHED_SUCCESS);
1735
+ assert(return_key_length == return_value_length);
1736
+ assert(!memcmp(return_value, return_key, return_value_length));
1737
+ free(return_value);
1738
+ x++;
1739
+ }
1740
+
1741
+ return 0;
1742
+ }
1743
+
1744
+ static test_return get_stats_keys(memcached_st *memc)
1745
+ {
1746
+ char **list;
1747
+ char **ptr;
1748
+ memcached_stat_st memc_stat;
1749
+ memcached_return rc;
1750
+
1751
+ list= memcached_stat_get_keys(memc, &memc_stat, &rc);
1752
+ assert(rc == MEMCACHED_SUCCESS);
1753
+ for (ptr= list; *ptr; ptr++)
1754
+ assert(*ptr);
1755
+ fflush(stdout);
1756
+
1757
+ free(list);
1758
+
1759
+ return 0;
1760
+ }
1761
+
1762
+ static test_return version_string_test(memcached_st *memc __attribute__((unused)))
1763
+ {
1764
+ const char *version_string;
1765
+
1766
+ version_string= memcached_lib_version();
1767
+
1768
+ assert(!strcmp(version_string, LIBMEMCACHED_VERSION_STRING));
1769
+
1770
+ return 0;
1771
+ }
1772
+
1773
+ static test_return get_stats(memcached_st *memc)
1774
+ {
1775
+ unsigned int x;
1776
+ char **list;
1777
+ char **ptr;
1778
+ memcached_return rc;
1779
+ memcached_stat_st *memc_stat;
1780
+
1781
+ memc_stat= memcached_stat(memc, NULL, &rc);
1782
+ assert(rc == MEMCACHED_SUCCESS);
1783
+
1784
+ assert(rc == MEMCACHED_SUCCESS);
1785
+ assert(memc_stat);
1786
+
1787
+ for (x= 0; x < memcached_server_count(memc); x++)
1788
+ {
1789
+ list= memcached_stat_get_keys(memc, memc_stat+x, &rc);
1790
+ assert(rc == MEMCACHED_SUCCESS);
1791
+ for (ptr= list; *ptr; ptr++);
1792
+
1793
+ free(list);
1794
+ }
1795
+
1796
+ memcached_stat_free(NULL, memc_stat);
1797
+
1798
+ return 0;
1799
+ }
1800
+
1801
+ static test_return add_host_test(memcached_st *memc)
1802
+ {
1803
+ unsigned int x;
1804
+ memcached_server_st *servers;
1805
+ memcached_return rc;
1806
+ char servername[]= "0.example.com";
1807
+
1808
+ servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
1809
+ assert(servers);
1810
+ assert(1 == memcached_server_list_count(servers));
1811
+
1812
+ for (x= 2; x < 20; x++)
1813
+ {
1814
+ char buffer[SMALL_STRING_LEN];
1815
+
1816
+ snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
1817
+ servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0,
1818
+ &rc);
1819
+ assert(rc == MEMCACHED_SUCCESS);
1820
+ assert(x == memcached_server_list_count(servers));
1821
+ }
1822
+
1823
+ rc= memcached_server_push(memc, servers);
1824
+ assert(rc == MEMCACHED_SUCCESS);
1825
+ rc= memcached_server_push(memc, servers);
1826
+ assert(rc == MEMCACHED_SUCCESS);
1827
+
1828
+ memcached_server_list_free(servers);
1829
+
1830
+ return 0;
1831
+ }
1832
+
1833
+ static memcached_return clone_test_callback(memcached_st *parent __attribute__((unused)), memcached_st *memc_clone __attribute__((unused)))
1834
+ {
1835
+ return MEMCACHED_SUCCESS;
1836
+ }
1837
+
1838
+ static memcached_return cleanup_test_callback(memcached_st *ptr __attribute__((unused)))
1839
+ {
1840
+ return MEMCACHED_SUCCESS;
1841
+ }
1842
+
1843
+ static test_return callback_test(memcached_st *memc)
1844
+ {
1845
+ /* Test User Data */
1846
+ {
1847
+ int x= 5;
1848
+ int *test_ptr;
1849
+ memcached_return rc;
1850
+
1851
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_USER_DATA, &x);
1852
+ assert(rc == MEMCACHED_SUCCESS);
1853
+ test_ptr= (int *)memcached_callback_get(memc, MEMCACHED_CALLBACK_USER_DATA, &rc);
1854
+ assert(*test_ptr == x);
1855
+ }
1856
+
1857
+ /* Test Clone Callback */
1858
+ {
1859
+ memcached_clone_func clone_cb= (memcached_clone_func)clone_test_callback;
1860
+ void *clone_cb_ptr= *(void **)&clone_cb;
1861
+ void *temp_function= NULL;
1862
+ memcached_return rc;
1863
+
1864
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION,
1865
+ clone_cb_ptr);
1866
+ assert(rc == MEMCACHED_SUCCESS);
1867
+ temp_function= memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1868
+ assert(temp_function == clone_cb_ptr);
1869
+ }
1870
+
1871
+ /* Test Cleanup Callback */
1872
+ {
1873
+ memcached_cleanup_func cleanup_cb=
1874
+ (memcached_cleanup_func)cleanup_test_callback;
1875
+ void *cleanup_cb_ptr= *(void **)&cleanup_cb;
1876
+ void *temp_function= NULL;
1877
+ memcached_return rc;
1878
+
1879
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION,
1880
+ cleanup_cb_ptr);
1881
+ assert(rc == MEMCACHED_SUCCESS);
1882
+ temp_function= memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1883
+ assert(temp_function == cleanup_cb_ptr);
1884
+ }
1885
+
1886
+ return 0;
1887
+ }
1888
+
1889
+ /* We don't test the behavior itself, we test the switches */
1890
+ static test_return behavior_test(memcached_st *memc)
1891
+ {
1892
+ uint64_t value;
1893
+ uint32_t set= 1;
1894
+
1895
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
1896
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
1897
+ assert(value == 1);
1898
+
1899
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
1900
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
1901
+ assert(value == 1);
1902
+
1903
+ set= MEMCACHED_HASH_MD5;
1904
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1905
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1906
+ assert(value == MEMCACHED_HASH_MD5);
1907
+
1908
+ set= 0;
1909
+
1910
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
1911
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
1912
+ assert(value == 0);
1913
+
1914
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
1915
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
1916
+ assert(value == 0);
1917
+
1918
+ set= MEMCACHED_HASH_DEFAULT;
1919
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1920
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1921
+ assert(value == MEMCACHED_HASH_DEFAULT);
1922
+
1923
+ set= MEMCACHED_HASH_CRC;
1924
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1925
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1926
+ assert(value == MEMCACHED_HASH_CRC);
1927
+
1928
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
1929
+ assert(value > 0);
1930
+
1931
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
1932
+ assert(value > 0);
1933
+ return 0;
1934
+ }
1935
+
1936
+ /* Test case provided by Cal Haldenbrand */
1937
+ static test_return user_supplied_bug1(memcached_st *memc)
1938
+ {
1939
+ unsigned int setter= 1;
1940
+ unsigned int x;
1941
+
1942
+ unsigned long long total= 0;
1943
+ uint32_t size= 0;
1944
+ char key[10];
1945
+ char randomstuff[6 * 1024];
1946
+ memcached_return rc;
1947
+
1948
+ memset(randomstuff, 0, 6 * 1024);
1949
+
1950
+ /* We just keep looking at the same values over and over */
1951
+ srandom(10);
1952
+
1953
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
1954
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1955
+
1956
+
1957
+ /* add key */
1958
+ for (x= 0 ; total < 20 * 1024576 ; x++ )
1959
+ {
1960
+ unsigned int j= 0;
1961
+
1962
+ size= (uint32_t)(rand() % ( 5 * 1024 ) ) + 400;
1963
+ memset(randomstuff, 0, 6 * 1024);
1964
+ assert(size < 6 * 1024); /* Being safe here */
1965
+
1966
+ for (j= 0 ; j < size ;j++)
1967
+ randomstuff[j] = (signed char) ((rand() % 26) + 97);
1968
+
1969
+ total += size;
1970
+ sprintf(key, "%d", x);
1971
+ rc = memcached_set(memc, key, strlen(key),
1972
+ randomstuff, strlen(randomstuff), 10, 0);
1973
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1974
+ /* If we fail, lets try again */
1975
+ if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED)
1976
+ rc = memcached_set(memc, key, strlen(key),
1977
+ randomstuff, strlen(randomstuff), 10, 0);
1978
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1979
+ }
1980
+
1981
+ return 0;
1982
+ }
1983
+
1984
+ /* Test case provided by Cal Haldenbrand */
1985
+ static test_return user_supplied_bug2(memcached_st *memc)
1986
+ {
1987
+ int errors;
1988
+ unsigned int setter;
1989
+ unsigned int x;
1990
+ unsigned long long total;
1991
+
1992
+ setter= 1;
1993
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
1994
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1995
+ #ifdef NOT_YET
1996
+ setter = 20 * 1024576;
1997
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, setter);
1998
+ setter = 20 * 1024576;
1999
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, setter);
2000
+ getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
2001
+ getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
2002
+
2003
+ for (x= 0, errors= 0, total= 0 ; total < 20 * 1024576 ; x++)
2004
+ #endif
2005
+
2006
+ for (x= 0, errors= 0, total= 0 ; total < 24576 ; x++)
2007
+ {
2008
+ memcached_return rc= MEMCACHED_SUCCESS;
2009
+ char buffer[SMALL_STRING_LEN];
2010
+ uint32_t flags= 0;
2011
+ size_t val_len= 0;
2012
+ char *getval;
2013
+
2014
+ memset(buffer, 0, SMALL_STRING_LEN);
2015
+
2016
+ snprintf(buffer, SMALL_STRING_LEN, "%u", x);
2017
+ getval= memcached_get(memc, buffer, strlen(buffer),
2018
+ &val_len, &flags, &rc);
2019
+ if (rc != MEMCACHED_SUCCESS)
2020
+ {
2021
+ if (rc == MEMCACHED_NOTFOUND)
2022
+ errors++;
2023
+ else
2024
+ {
2025
+ assert(rc);
2026
+ }
2027
+
2028
+ continue;
2029
+ }
2030
+ total+= val_len;
2031
+ errors= 0;
2032
+ free(getval);
2033
+ }
2034
+
2035
+ return 0;
2036
+ }
2037
+
2038
+ /* Do a large mget() over all the keys we think exist */
2039
+ #define KEY_COUNT 3000 // * 1024576
2040
+ static test_return user_supplied_bug3(memcached_st *memc)
2041
+ {
2042
+ memcached_return rc;
2043
+ unsigned int setter;
2044
+ unsigned int x;
2045
+ char **keys;
2046
+ size_t key_lengths[KEY_COUNT];
2047
+
2048
+ setter= 1;
2049
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
2050
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
2051
+ #ifdef NOT_YET
2052
+ setter = 20 * 1024576;
2053
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, setter);
2054
+ setter = 20 * 1024576;
2055
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, setter);
2056
+ getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
2057
+ getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
2058
+ #endif
2059
+
2060
+ keys= (char **)malloc(sizeof(char *) * KEY_COUNT);
2061
+ assert(keys);
2062
+ memset(keys, 0, (sizeof(char *) * KEY_COUNT));
2063
+ for (x= 0; x < KEY_COUNT; x++)
2064
+ {
2065
+ char buffer[30];
2066
+
2067
+ snprintf(buffer, 30, "%u", x);
2068
+ keys[x]= strdup(buffer);
2069
+ key_lengths[x]= strlen(keys[x]);
2070
+ }
2071
+
2072
+ rc= memcached_mget(memc, (const char **)keys, key_lengths, KEY_COUNT);
2073
+ assert(rc == MEMCACHED_SUCCESS);
2074
+
2075
+ /* Turn this into a help function */
2076
+ {
2077
+ char return_key[MEMCACHED_MAX_KEY];
2078
+ size_t return_key_length;
2079
+ char *return_value;
2080
+ size_t return_value_length;
2081
+ uint32_t flags;
2082
+
2083
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2084
+ &return_value_length, &flags, &rc)))
2085
+ {
2086
+ assert(return_value);
2087
+ assert(rc == MEMCACHED_SUCCESS);
2088
+ free(return_value);
2089
+ }
2090
+ }
2091
+
2092
+ for (x= 0; x < KEY_COUNT; x++)
2093
+ free(keys[x]);
2094
+ free(keys);
2095
+
2096
+ return 0;
2097
+ }
2098
+
2099
+ /* Make sure we behave properly if server list has no values */
2100
+ static test_return user_supplied_bug4(memcached_st *memc)
2101
+ {
2102
+ memcached_return rc;
2103
+ const char *keys[]= {"fudge", "son", "food"};
2104
+ size_t key_length[]= {5, 3, 4};
2105
+ unsigned int x;
2106
+ uint32_t flags;
2107
+ char return_key[MEMCACHED_MAX_KEY];
2108
+ size_t return_key_length;
2109
+ char *return_value;
2110
+ size_t return_value_length;
2111
+
2112
+ /* Here we free everything before running a bunch of mget tests */
2113
+ {
2114
+ memcached_server_list_free(memc->hosts);
2115
+ memc->hosts= NULL;
2116
+ memc->number_of_hosts= 0;
2117
+ }
2118
+
2119
+
2120
+ /* We need to empty the server before continueing test */
2121
+ rc= memcached_flush(memc, 0);
2122
+ assert(rc == MEMCACHED_NO_SERVERS);
2123
+
2124
+ rc= memcached_mget(memc, keys, key_length, 3);
2125
+ assert(rc == MEMCACHED_NO_SERVERS);
2126
+
2127
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2128
+ &return_value_length, &flags, &rc)) != NULL)
2129
+ {
2130
+ assert(return_value);
2131
+ }
2132
+ assert(!return_value);
2133
+ assert(return_value_length == 0);
2134
+ assert(rc == MEMCACHED_NO_SERVERS);
2135
+
2136
+ for (x= 0; x < 3; x++)
2137
+ {
2138
+ rc= memcached_set(memc, keys[x], key_length[x],
2139
+ keys[x], key_length[x],
2140
+ (time_t)50, (uint32_t)9);
2141
+ assert(rc == MEMCACHED_NO_SERVERS);
2142
+ }
2143
+
2144
+ rc= memcached_mget(memc, keys, key_length, 3);
2145
+ assert(rc == MEMCACHED_NO_SERVERS);
2146
+
2147
+ x= 0;
2148
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2149
+ &return_value_length, &flags, &rc)))
2150
+ {
2151
+ assert(return_value);
2152
+ assert(rc == MEMCACHED_SUCCESS);
2153
+ assert(return_key_length == return_value_length);
2154
+ assert(!memcmp(return_value, return_key, return_value_length));
2155
+ free(return_value);
2156
+ x++;
2157
+ }
2158
+
2159
+ return 0;
2160
+ }
2161
+
2162
+ #define VALUE_SIZE_BUG5 1048064
2163
+ static test_return user_supplied_bug5(memcached_st *memc)
2164
+ {
2165
+ memcached_return rc;
2166
+ const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2167
+ size_t key_length[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2168
+ char return_key[MEMCACHED_MAX_KEY];
2169
+ size_t return_key_length;
2170
+ char *value;
2171
+ size_t value_length;
2172
+ uint32_t flags;
2173
+ unsigned int count;
2174
+ unsigned int x;
2175
+ char insert_data[VALUE_SIZE_BUG5];
2176
+
2177
+ for (x= 0; x < VALUE_SIZE_BUG5; x++)
2178
+ insert_data[x]= (signed char)rand();
2179
+
2180
+ memcached_flush(memc, 0);
2181
+ value= memcached_get(memc, keys[0], key_length[0],
2182
+ &value_length, &flags, &rc);
2183
+ assert(value == NULL);
2184
+ rc= memcached_mget(memc, keys, key_length, 4);
2185
+
2186
+ count= 0;
2187
+ while ((value= memcached_fetch(memc, return_key, &return_key_length,
2188
+ &value_length, &flags, &rc)))
2189
+ count++;
2190
+ assert(count == 0);
2191
+
2192
+ for (x= 0; x < 4; x++)
2193
+ {
2194
+ rc= memcached_set(memc, keys[x], key_length[x],
2195
+ insert_data, VALUE_SIZE_BUG5,
2196
+ (time_t)0, (uint32_t)0);
2197
+ assert(rc == MEMCACHED_SUCCESS);
2198
+ }
2199
+
2200
+ for (x= 0; x < 10; x++)
2201
+ {
2202
+ value= memcached_get(memc, keys[0], key_length[0],
2203
+ &value_length, &flags, &rc);
2204
+ assert(value);
2205
+ free(value);
2206
+
2207
+ rc= memcached_mget(memc, keys, key_length, 4);
2208
+ count= 0;
2209
+ while ((value= memcached_fetch(memc, return_key, &return_key_length,
2210
+ &value_length, &flags, &rc)))
2211
+ {
2212
+ count++;
2213
+ free(value);
2214
+ }
2215
+ assert(count == 4);
2216
+ }
2217
+
2218
+ return 0;
2219
+ }
2220
+
2221
+ static test_return user_supplied_bug6(memcached_st *memc)
2222
+ {
2223
+ memcached_return rc;
2224
+ const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2225
+ size_t key_length[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2226
+ char return_key[MEMCACHED_MAX_KEY];
2227
+ size_t return_key_length;
2228
+ char *value;
2229
+ size_t value_length;
2230
+ uint32_t flags;
2231
+ unsigned int count;
2232
+ unsigned int x;
2233
+ char insert_data[VALUE_SIZE_BUG5];
2234
+
2235
+ for (x= 0; x < VALUE_SIZE_BUG5; x++)
2236
+ insert_data[x]= (signed char)rand();
2237
+
2238
+ memcached_flush(memc, 0);
2239
+ value= memcached_get(memc, keys[0], key_length[0],
2240
+ &value_length, &flags, &rc);
2241
+ assert(value == NULL);
2242
+ assert(rc == MEMCACHED_NOTFOUND);
2243
+ rc= memcached_mget(memc, keys, key_length, 4);
2244
+ assert(rc == MEMCACHED_SUCCESS);
2245
+
2246
+ count= 0;
2247
+ while ((value= memcached_fetch(memc, return_key, &return_key_length,
2248
+ &value_length, &flags, &rc)))
2249
+ count++;
2250
+ assert(count == 0);
2251
+ assert(rc == MEMCACHED_END);
2252
+
2253
+ for (x= 0; x < 4; x++)
2254
+ {
2255
+ rc= memcached_set(memc, keys[x], key_length[x],
2256
+ insert_data, VALUE_SIZE_BUG5,
2257
+ (time_t)0, (uint32_t)0);
2258
+ assert(rc == MEMCACHED_SUCCESS);
2259
+ }
2260
+
2261
+ for (x= 0; x < 2; x++)
2262
+ {
2263
+ value= memcached_get(memc, keys[0], key_length[0],
2264
+ &value_length, &flags, &rc);
2265
+ assert(value);
2266
+ free(value);
2267
+
2268
+ rc= memcached_mget(memc, keys, key_length, 4);
2269
+ assert(rc == MEMCACHED_SUCCESS);
2270
+ count= 3;
2271
+ /* We test for purge of partial complete fetches */
2272
+ for (count= 3; count; count--)
2273
+ {
2274
+ value= memcached_fetch(memc, return_key, &return_key_length,
2275
+ &value_length, &flags, &rc);
2276
+ assert(rc == MEMCACHED_SUCCESS);
2277
+ assert(!(memcmp(value, insert_data, value_length)));
2278
+ assert(value_length);
2279
+ free(value);
2280
+ }
2281
+ }
2282
+
2283
+ return 0;
2284
+ }
2285
+
2286
+ static test_return user_supplied_bug8(memcached_st *memc __attribute__((unused)))
2287
+ {
2288
+ memcached_return rc;
2289
+ memcached_st *mine;
2290
+ memcached_st *memc_clone;
2291
+
2292
+ memcached_server_st *servers;
2293
+ const char *server_list= "memcache1.memcache.bk.sapo.pt:11211, memcache1.memcache.bk.sapo.pt:11212, memcache1.memcache.bk.sapo.pt:11213, memcache1.memcache.bk.sapo.pt:11214, memcache2.memcache.bk.sapo.pt:11211, memcache2.memcache.bk.sapo.pt:11212, memcache2.memcache.bk.sapo.pt:11213, memcache2.memcache.bk.sapo.pt:11214";
2294
+
2295
+ servers= memcached_servers_parse(server_list);
2296
+ assert(servers);
2297
+
2298
+ mine= memcached_create(NULL);
2299
+ rc= memcached_server_push(mine, servers);
2300
+ assert(rc == MEMCACHED_SUCCESS);
2301
+ memcached_server_list_free(servers);
2302
+
2303
+ assert(mine);
2304
+ memc_clone= memcached_clone(NULL, mine);
2305
+
2306
+ memcached_quit(mine);
2307
+ memcached_quit(memc_clone);
2308
+
2309
+
2310
+ memcached_free(mine);
2311
+ memcached_free(memc_clone);
2312
+
2313
+ return 0;
2314
+ }
2315
+
2316
+ /* Test flag store/retrieve */
2317
+ static test_return user_supplied_bug7(memcached_st *memc)
2318
+ {
2319
+ memcached_return rc;
2320
+ const char *keys= "036790384900";
2321
+ size_t key_length= strlen(keys);
2322
+ char return_key[MEMCACHED_MAX_KEY];
2323
+ size_t return_key_length;
2324
+ char *value;
2325
+ size_t value_length;
2326
+ uint32_t flags;
2327
+ unsigned int x;
2328
+ char insert_data[VALUE_SIZE_BUG5];
2329
+
2330
+ for (x= 0; x < VALUE_SIZE_BUG5; x++)
2331
+ insert_data[x]= (signed char)rand();
2332
+
2333
+ memcached_flush(memc, 0);
2334
+
2335
+ flags= 245;
2336
+ rc= memcached_set(memc, keys, key_length,
2337
+ insert_data, VALUE_SIZE_BUG5,
2338
+ (time_t)0, flags);
2339
+ assert(rc == MEMCACHED_SUCCESS);
2340
+
2341
+ flags= 0;
2342
+ value= memcached_get(memc, keys, key_length,
2343
+ &value_length, &flags, &rc);
2344
+ assert(flags == 245);
2345
+ assert(value);
2346
+ free(value);
2347
+
2348
+ rc= memcached_mget(memc, &keys, &key_length, 1);
2349
+
2350
+ flags= 0;
2351
+ value= memcached_fetch(memc, return_key, &return_key_length,
2352
+ &value_length, &flags, &rc);
2353
+ assert(flags == 245);
2354
+ assert(value);
2355
+ free(value);
2356
+
2357
+
2358
+ return 0;
2359
+ }
2360
+
2361
+ static test_return user_supplied_bug9(memcached_st *memc)
2362
+ {
2363
+ memcached_return rc;
2364
+ const char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2365
+ size_t key_length[3];
2366
+ unsigned int x;
2367
+ uint32_t flags;
2368
+ unsigned count= 0;
2369
+
2370
+ char return_key[MEMCACHED_MAX_KEY];
2371
+ size_t return_key_length;
2372
+ char *return_value;
2373
+ size_t return_value_length;
2374
+
2375
+
2376
+ key_length[0]= strlen("UDATA:edevil@sapo.pt");
2377
+ key_length[1]= strlen("fudge&*@#");
2378
+ key_length[2]= strlen("for^#@&$not");
2379
+
2380
+
2381
+ for (x= 0; x < 3; x++)
2382
+ {
2383
+ rc= memcached_set(memc, keys[x], key_length[x],
2384
+ keys[x], key_length[x],
2385
+ (time_t)50, (uint32_t)9);
2386
+ assert(rc == MEMCACHED_SUCCESS);
2387
+ }
2388
+
2389
+ rc= memcached_mget(memc, keys, key_length, 3);
2390
+ assert(rc == MEMCACHED_SUCCESS);
2391
+
2392
+ /* We need to empty the server before continueing test */
2393
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2394
+ &return_value_length, &flags, &rc)) != NULL)
2395
+ {
2396
+ assert(return_value);
2397
+ free(return_value);
2398
+ count++;
2399
+ }
2400
+ assert(count == 3);
2401
+
2402
+ return 0;
2403
+ }
2404
+
2405
+ /* We are testing with aggressive timeout to get failures */
2406
+ static test_return user_supplied_bug10(memcached_st *memc)
2407
+ {
2408
+ const char *key= "foo";
2409
+ char *value;
2410
+ size_t value_length= 512;
2411
+ unsigned int x;
2412
+ size_t key_len= 3;
2413
+ memcached_return rc;
2414
+ unsigned int set= 1;
2415
+ memcached_st *mclone= memcached_clone(NULL, memc);
2416
+ int32_t timeout;
2417
+
2418
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
2419
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
2420
+ timeout= 2;
2421
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
2422
+ (uint64_t)timeout);
2423
+
2424
+ value = (char*)malloc(value_length * sizeof(char));
2425
+
2426
+ for (x= 0; x < value_length; x++)
2427
+ value[x]= (char) (x % 127);
2428
+
2429
+ for (x= 1; x <= 100000; ++x)
2430
+ {
2431
+ rc= memcached_set(mclone, key, key_len,value, value_length, 0, 0);
2432
+
2433
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_WRITE_FAILURE ||
2434
+ rc == MEMCACHED_BUFFERED || rc == MEMCACHED_TIMEOUT);
2435
+
2436
+ if (rc == MEMCACHED_WRITE_FAILURE || rc == MEMCACHED_TIMEOUT)
2437
+ x--;
2438
+ }
2439
+
2440
+ free(value);
2441
+ memcached_free(mclone);
2442
+
2443
+ return 0;
2444
+ }
2445
+
2446
+ /*
2447
+ We are looking failures in the async protocol
2448
+ */
2449
+ static test_return user_supplied_bug11(memcached_st *memc)
2450
+ {
2451
+ const char *key= "foo";
2452
+ char *value;
2453
+ size_t value_length= 512;
2454
+ unsigned int x;
2455
+ size_t key_len= 3;
2456
+ memcached_return rc;
2457
+ unsigned int set= 1;
2458
+ int32_t timeout;
2459
+ memcached_st *mclone= memcached_clone(NULL, memc);
2460
+
2461
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
2462
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
2463
+ timeout= -1;
2464
+ memcached_behavior_set(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
2465
+ (size_t)timeout);
2466
+
2467
+ timeout= (int32_t)memcached_behavior_get(mclone, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
2468
+
2469
+ assert(timeout == -1);
2470
+
2471
+ value = (char*)malloc(value_length * sizeof(char));
2472
+
2473
+ for (x= 0; x < value_length; x++)
2474
+ value[x]= (char) (x % 127);
2475
+
2476
+ for (x= 1; x <= 100000; ++x)
2477
+ {
2478
+ rc= memcached_set(mclone, key, key_len,value, value_length, 0, 0);
2479
+ }
2480
+
2481
+ free(value);
2482
+ memcached_free(mclone);
2483
+
2484
+ return 0;
2485
+ }
2486
+
2487
+ /*
2488
+ Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2489
+ */
2490
+ static test_return user_supplied_bug12(memcached_st *memc)
2491
+ {
2492
+ memcached_return rc;
2493
+ uint32_t flags;
2494
+ size_t value_length;
2495
+ char *value;
2496
+ uint64_t number_value;
2497
+
2498
+ value= memcached_get(memc, "autoincrement", strlen("autoincrement"),
2499
+ &value_length, &flags, &rc);
2500
+ assert(value == NULL);
2501
+ assert(rc == MEMCACHED_NOTFOUND);
2502
+
2503
+ rc= memcached_increment(memc, "autoincrement", strlen("autoincrement"),
2504
+ 1, &number_value);
2505
+
2506
+ assert(value == NULL);
2507
+ /* The binary protocol will set the key if it doesn't exist */
2508
+ if (memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1)
2509
+ assert(rc == MEMCACHED_SUCCESS);
2510
+ else
2511
+ assert(rc == MEMCACHED_NOTFOUND);
2512
+
2513
+ rc= memcached_set(memc, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
2514
+
2515
+ value= memcached_get(memc, "autoincrement", strlen("autoincrement"),
2516
+ &value_length, &flags, &rc);
2517
+ assert(value);
2518
+ assert(rc == MEMCACHED_SUCCESS);
2519
+ free(value);
2520
+
2521
+ rc= memcached_increment(memc, "autoincrement", strlen("autoincrement"),
2522
+ 1, &number_value);
2523
+ assert(number_value == 2);
2524
+ assert(rc == MEMCACHED_SUCCESS);
2525
+
2526
+ return 0;
2527
+ }
2528
+
2529
+ /*
2530
+ Bug found where command total one more than MEMCACHED_MAX_BUFFER
2531
+ set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2532
+ */
2533
+ static test_return user_supplied_bug13(memcached_st *memc)
2534
+ {
2535
+ char key[] = "key34567890";
2536
+ char *overflow;
2537
+ memcached_return rc;
2538
+ size_t overflowSize;
2539
+
2540
+ char commandFirst[]= "set key34567890 0 0 ";
2541
+ char commandLast[] = " \r\n"; /* first line of command sent to server */
2542
+ size_t commandLength;
2543
+ size_t testSize;
2544
+
2545
+ commandLength = strlen(commandFirst) + strlen(commandLast) + 4; /* 4 is number of characters in size, probably 8196 */
2546
+
2547
+ overflowSize = MEMCACHED_MAX_BUFFER - commandLength;
2548
+
2549
+ for (testSize= overflowSize - 1; testSize < overflowSize + 1; testSize++)
2550
+ {
2551
+ overflow= malloc(testSize);
2552
+ assert(overflow != NULL);
2553
+
2554
+ memset(overflow, 'x', testSize);
2555
+ rc= memcached_set(memc, key, strlen(key),
2556
+ overflow, testSize, 0, 0);
2557
+ assert(rc == MEMCACHED_SUCCESS);
2558
+ free(overflow);
2559
+ }
2560
+
2561
+ return 0;
2562
+ }
2563
+
2564
+
2565
+ /*
2566
+ Test values of many different sizes
2567
+ Bug found where command total one more than MEMCACHED_MAX_BUFFER
2568
+ set key34567890 0 0 8169 \r\n
2569
+ is sent followed by buffer of size 8169, followed by 8169
2570
+ */
2571
+ static test_return user_supplied_bug14(memcached_st *memc)
2572
+ {
2573
+ size_t setter= 1;
2574
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
2575
+ memcached_return rc;
2576
+ const char *key= "foo";
2577
+ char *value;
2578
+ size_t value_length= 18000;
2579
+ char *string;
2580
+ size_t string_length;
2581
+ uint32_t flags;
2582
+ unsigned int x;
2583
+ size_t current_length;
2584
+
2585
+ value = (char*)malloc(value_length);
2586
+ assert(value);
2587
+
2588
+ for (x= 0; x < value_length; x++)
2589
+ value[x] = (char) (x % 127);
2590
+
2591
+ for (current_length= 0; current_length < value_length; current_length++)
2592
+ {
2593
+ rc= memcached_set(memc, key, strlen(key),
2594
+ value, current_length,
2595
+ (time_t)0, (uint32_t)0);
2596
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
2597
+
2598
+ string= memcached_get(memc, key, strlen(key),
2599
+ &string_length, &flags, &rc);
2600
+
2601
+ assert(rc == MEMCACHED_SUCCESS);
2602
+ assert(string_length == current_length);
2603
+ assert(!memcmp(string, value, string_length));
2604
+
2605
+ free(string);
2606
+ }
2607
+
2608
+ free(value);
2609
+
2610
+ return 0;
2611
+ }
2612
+
2613
+ /*
2614
+ Look for zero length value problems
2615
+ */
2616
+ static test_return user_supplied_bug15(memcached_st *memc)
2617
+ {
2618
+ uint32_t x;
2619
+ memcached_return rc;
2620
+ const char *key= "mykey";
2621
+ char *value;
2622
+ size_t length;
2623
+ uint32_t flags;
2624
+
2625
+ for (x= 0; x < 2; x++)
2626
+ {
2627
+ rc= memcached_set(memc, key, strlen(key),
2628
+ NULL, 0,
2629
+ (time_t)0, (uint32_t)0);
2630
+
2631
+ assert(rc == MEMCACHED_SUCCESS);
2632
+
2633
+ value= memcached_get(memc, key, strlen(key),
2634
+ &length, &flags, &rc);
2635
+
2636
+ assert(rc == MEMCACHED_SUCCESS);
2637
+ assert(value == NULL);
2638
+ assert(length == 0);
2639
+ assert(flags == 0);
2640
+
2641
+ value= memcached_get(memc, key, strlen(key),
2642
+ &length, &flags, &rc);
2643
+
2644
+ assert(rc == MEMCACHED_SUCCESS);
2645
+ assert(value == NULL);
2646
+ assert(length == 0);
2647
+ assert(flags == 0);
2648
+ }
2649
+
2650
+ return 0;
2651
+ }
2652
+
2653
+ /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2654
+ static test_return user_supplied_bug16(memcached_st *memc)
2655
+ {
2656
+ memcached_return rc;
2657
+ const char *key= "mykey";
2658
+ char *value;
2659
+ size_t length;
2660
+ uint32_t flags;
2661
+
2662
+ rc= memcached_set(memc, key, strlen(key),
2663
+ NULL, 0,
2664
+ (time_t)0, UINT32_MAX);
2665
+
2666
+ assert(rc == MEMCACHED_SUCCESS);
2667
+
2668
+ value= memcached_get(memc, key, strlen(key),
2669
+ &length, &flags, &rc);
2670
+
2671
+ assert(rc == MEMCACHED_SUCCESS);
2672
+ assert(value == NULL);
2673
+ assert(length == 0);
2674
+ assert(flags == UINT32_MAX);
2675
+
2676
+ return 0;
2677
+ }
2678
+
2679
+ #ifndef __sun
2680
+ /* Check the validity of chinese key*/
2681
+ static test_return user_supplied_bug17(memcached_st *memc)
2682
+ {
2683
+ memcached_return rc;
2684
+ const char *key= "豆瓣";
2685
+ const char *value="我们在炎热抑郁的夏天无法停止豆瓣";
2686
+ char *value2;
2687
+ size_t length;
2688
+ uint32_t flags;
2689
+
2690
+ rc= memcached_set(memc, key, strlen(key),
2691
+ value, strlen(value),
2692
+ (time_t)0, 0);
2693
+
2694
+ assert(rc == MEMCACHED_SUCCESS);
2695
+
2696
+ value2= memcached_get(memc, key, strlen(key),
2697
+ &length, &flags, &rc);
2698
+
2699
+ assert(length==strlen(value));
2700
+ assert(rc == MEMCACHED_SUCCESS);
2701
+ assert(memcmp(value, value2, length)==0);
2702
+ free(value2);
2703
+
2704
+ return 0;
2705
+ }
2706
+ #endif
2707
+
2708
+ /*
2709
+ From Andrei on IRC
2710
+ */
2711
+
2712
+ static test_return user_supplied_bug19(memcached_st *memc)
2713
+ {
2714
+ memcached_st *m;
2715
+ memcached_server_st *s;
2716
+ memcached_return res;
2717
+
2718
+ (void)memc;
2719
+
2720
+ m= memcached_create(NULL);
2721
+ memcached_server_add_with_weight(m, "localhost", 11311, 100);
2722
+ memcached_server_add_with_weight(m, "localhost", 11312, 100);
2723
+
2724
+ s= memcached_server_by_key(m, "a", 1, &res);
2725
+ memcached_server_free(s);
2726
+
2727
+ memcached_free(m);
2728
+
2729
+ return 0;
2730
+ }
2731
+
2732
+ /* CAS test from Andei */
2733
+ static test_return user_supplied_bug20(memcached_st *memc)
2734
+ {
2735
+ memcached_return status;
2736
+ memcached_result_st *result, result_obj;
2737
+ const char *key = "abc";
2738
+ size_t key_len = strlen("abc");
2739
+ const char *value = "foobar";
2740
+ size_t value_len = strlen(value);
2741
+
2742
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
2743
+
2744
+ status = memcached_set(memc, key, key_len, value, value_len, (time_t)0, (uint32_t)0);
2745
+ assert(status == MEMCACHED_SUCCESS);
2746
+
2747
+ status = memcached_mget(memc, &key, &key_len, 1);
2748
+ assert(status == MEMCACHED_SUCCESS);
2749
+
2750
+ result= memcached_result_create(memc, &result_obj);
2751
+ assert(result);
2752
+
2753
+ memcached_result_create(memc, &result_obj);
2754
+ result= memcached_fetch_result(memc, &result_obj, &status);
2755
+
2756
+ assert(result);
2757
+ assert(status == MEMCACHED_SUCCESS);
2758
+
2759
+ memcached_result_free(result);
2760
+
2761
+ return 0;
2762
+ }
2763
+
2764
+ #include "ketama_test_cases.h"
2765
+ static test_return user_supplied_bug18(memcached_st *trash)
2766
+ {
2767
+ memcached_return rc;
2768
+ uint64_t value;
2769
+ int x;
2770
+ memcached_server_st *server_pool;
2771
+ memcached_st *memc;
2772
+
2773
+ (void)trash;
2774
+
2775
+ memc= memcached_create(NULL);
2776
+ assert(memc);
2777
+
2778
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1);
2779
+ assert(rc == MEMCACHED_SUCCESS);
2780
+
2781
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
2782
+ assert(value == 1);
2783
+
2784
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5);
2785
+ assert(rc == MEMCACHED_SUCCESS);
2786
+
2787
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH);
2788
+ assert(value == MEMCACHED_HASH_MD5);
2789
+
2790
+ server_pool = memcached_servers_parse("10.0.1.1:11211 600,10.0.1.2:11211 300,10.0.1.3:11211 200,10.0.1.4:11211 350,10.0.1.5:11211 1000,10.0.1.6:11211 800,10.0.1.7:11211 950,10.0.1.8:11211 100");
2791
+ memcached_server_push(memc, server_pool);
2792
+
2793
+ /* verify that the server list was parsed okay. */
2794
+ assert(memc->number_of_hosts == 8);
2795
+ assert(strcmp(server_pool[0].hostname, "10.0.1.1") == 0);
2796
+ assert(server_pool[0].port == 11211);
2797
+ assert(server_pool[0].weight == 600);
2798
+ assert(strcmp(server_pool[2].hostname, "10.0.1.3") == 0);
2799
+ assert(server_pool[2].port == 11211);
2800
+ assert(server_pool[2].weight == 200);
2801
+ assert(strcmp(server_pool[7].hostname, "10.0.1.8") == 0);
2802
+ assert(server_pool[7].port == 11211);
2803
+ assert(server_pool[7].weight == 100);
2804
+
2805
+ /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
2806
+ * us test the boundary wraparound.
2807
+ */
2808
+ assert(memcached_generate_hash(memc, (char *)"VDEAAAAA", 8) == memc->continuum[0].index);
2809
+
2810
+ /* verify the standard ketama set. */
2811
+ for (x= 0; x < 99; x++)
2812
+ {
2813
+ uint32_t server_idx = memcached_generate_hash(memc, test_cases[x].key, strlen(test_cases[x].key));
2814
+ char *hostname = memc->hosts[server_idx].hostname;
2815
+ assert(strcmp(hostname, test_cases[x].server) == 0);
2816
+ }
2817
+
2818
+ memcached_server_list_free(server_pool);
2819
+ memcached_free(memc);
2820
+
2821
+ return 0;
2822
+ }
2823
+
2824
+ static test_return auto_eject_hosts(memcached_st *trash)
2825
+ {
2826
+ (void) trash;
2827
+ int x;
2828
+
2829
+ memcached_return rc;
2830
+ memcached_st *memc= memcached_create(NULL);
2831
+ assert(memc);
2832
+
2833
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1);
2834
+ assert(rc == MEMCACHED_SUCCESS);
2835
+
2836
+ uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
2837
+ assert(value == 1);
2838
+
2839
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5);
2840
+ assert(rc == MEMCACHED_SUCCESS);
2841
+
2842
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH);
2843
+ assert(value == MEMCACHED_HASH_MD5);
2844
+
2845
+ /* server should be removed when in delay */
2846
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS, 1);
2847
+ assert(rc == MEMCACHED_SUCCESS);
2848
+
2849
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS);
2850
+ assert(value == 1);
2851
+
2852
+ memcached_server_st *server_pool;
2853
+ server_pool = memcached_servers_parse("10.0.1.1:11211 600,10.0.1.2:11211 300,10.0.1.3:11211 200,10.0.1.4:11211 350,10.0.1.5:11211 1000,10.0.1.6:11211 800,10.0.1.7:11211 950,10.0.1.8:11211 100");
2854
+ memcached_server_push(memc, server_pool);
2855
+
2856
+ /* verify that the server list was parsed okay. */
2857
+ assert(memc->number_of_hosts == 8);
2858
+ assert(strcmp(server_pool[0].hostname, "10.0.1.1") == 0);
2859
+ assert(server_pool[0].port == 11211);
2860
+ assert(server_pool[0].weight == 600);
2861
+ assert(strcmp(server_pool[2].hostname, "10.0.1.3") == 0);
2862
+ assert(server_pool[2].port == 11211);
2863
+ assert(server_pool[2].weight == 200);
2864
+ assert(strcmp(server_pool[7].hostname, "10.0.1.8") == 0);
2865
+ assert(server_pool[7].port == 11211);
2866
+ assert(server_pool[7].weight == 100);
2867
+
2868
+ memc->hosts[2].next_retry = time(NULL) + 15;
2869
+ memc->next_distribution_rebuild= time(NULL) - 1;
2870
+
2871
+ for (x= 0; x < 99; x++)
2872
+ {
2873
+ uint32_t server_idx = memcached_generate_hash(memc, test_cases[x].key, strlen(test_cases[x].key));
2874
+ assert(server_idx != 2);
2875
+ }
2876
+
2877
+ /* and re-added when it's back. */
2878
+ memc->hosts[2].next_retry = time(NULL) - 1;
2879
+ memc->next_distribution_rebuild= time(NULL) - 1;
2880
+ run_distribution(memc);
2881
+ for (x= 0; x < 99; x++)
2882
+ {
2883
+ uint32_t server_idx = memcached_generate_hash(memc, test_cases[x].key, strlen(test_cases[x].key));
2884
+ char *hostname = memc->hosts[server_idx].hostname;
2885
+ assert(strcmp(hostname, test_cases[x].server) == 0);
2886
+ }
2887
+
2888
+ memcached_server_list_free(server_pool);
2889
+ memcached_free(memc);
2890
+
2891
+ return TEST_SUCCESS;
2892
+ }
2893
+
2894
+ static test_return result_static(memcached_st *memc)
2895
+ {
2896
+ memcached_result_st result;
2897
+ memcached_result_st *result_ptr;
2898
+
2899
+ result_ptr= memcached_result_create(memc, &result);
2900
+ assert(result.is_allocated == false);
2901
+ assert(result_ptr);
2902
+ memcached_result_free(&result);
2903
+
2904
+ return 0;
2905
+ }
2906
+
2907
+ static test_return result_alloc(memcached_st *memc)
2908
+ {
2909
+ memcached_result_st *result;
2910
+
2911
+ result= memcached_result_create(memc, NULL);
2912
+ assert(result);
2913
+ memcached_result_free(result);
2914
+
2915
+ return 0;
2916
+ }
2917
+
2918
+ static test_return string_static_null(memcached_st *memc)
2919
+ {
2920
+ memcached_string_st string;
2921
+ memcached_string_st *string_ptr;
2922
+
2923
+ string_ptr= memcached_string_create(memc, &string, 0);
2924
+ assert(string.is_allocated == false);
2925
+ assert(string_ptr);
2926
+ memcached_string_free(&string);
2927
+
2928
+ return 0;
2929
+ }
2930
+
2931
+ static test_return string_alloc_null(memcached_st *memc)
2932
+ {
2933
+ memcached_string_st *string;
2934
+
2935
+ string= memcached_string_create(memc, NULL, 0);
2936
+ assert(string);
2937
+ memcached_string_free(string);
2938
+
2939
+ return 0;
2940
+ }
2941
+
2942
+ static test_return string_alloc_with_size(memcached_st *memc)
2943
+ {
2944
+ memcached_string_st *string;
2945
+
2946
+ string= memcached_string_create(memc, NULL, 1024);
2947
+ assert(string);
2948
+ memcached_string_free(string);
2949
+
2950
+ return 0;
2951
+ }
2952
+
2953
+ static test_return string_alloc_with_size_toobig(memcached_st *memc)
2954
+ {
2955
+ memcached_string_st *string;
2956
+
2957
+ string= memcached_string_create(memc, NULL, SIZE_MAX);
2958
+ assert(string == NULL);
2959
+
2960
+ return 0;
2961
+ }
2962
+
2963
+ static test_return string_alloc_append(memcached_st *memc)
2964
+ {
2965
+ unsigned int x;
2966
+ char buffer[SMALL_STRING_LEN];
2967
+ memcached_string_st *string;
2968
+
2969
+ /* Ring the bell! */
2970
+ memset(buffer, 6, SMALL_STRING_LEN);
2971
+
2972
+ string= memcached_string_create(memc, NULL, 100);
2973
+ assert(string);
2974
+
2975
+ for (x= 0; x < 1024; x++)
2976
+ {
2977
+ memcached_return rc;
2978
+ rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
2979
+ assert(rc == MEMCACHED_SUCCESS);
2980
+ }
2981
+ memcached_string_free(string);
2982
+
2983
+ return 0;
2984
+ }
2985
+
2986
+ static test_return string_alloc_append_toobig(memcached_st *memc)
2987
+ {
2988
+ memcached_return rc;
2989
+ unsigned int x;
2990
+ char buffer[SMALL_STRING_LEN];
2991
+ memcached_string_st *string;
2992
+
2993
+ /* Ring the bell! */
2994
+ memset(buffer, 6, SMALL_STRING_LEN);
2995
+
2996
+ string= memcached_string_create(memc, NULL, 100);
2997
+ assert(string);
2998
+
2999
+ for (x= 0; x < 1024; x++)
3000
+ {
3001
+ rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
3002
+ assert(rc == MEMCACHED_SUCCESS);
3003
+ }
3004
+ rc= memcached_string_append(string, buffer, SIZE_MAX);
3005
+ assert(rc == MEMCACHED_MEMORY_ALLOCATION_FAILURE);
3006
+ memcached_string_free(string);
3007
+
3008
+ return 0;
3009
+ }
3010
+
3011
+ static test_return cleanup_pairs(memcached_st *memc __attribute__((unused)))
3012
+ {
3013
+ pairs_free(global_pairs);
3014
+
3015
+ return 0;
3016
+ }
3017
+
3018
+ static test_return generate_pairs(memcached_st *memc __attribute__((unused)))
3019
+ {
3020
+ unsigned long long x;
3021
+ global_pairs= pairs_generate(GLOBAL_COUNT, 400);
3022
+ global_count= GLOBAL_COUNT;
3023
+
3024
+ for (x= 0; x < global_count; x++)
3025
+ {
3026
+ global_keys[x]= global_pairs[x].key;
3027
+ global_keys_length[x]= global_pairs[x].key_length;
3028
+ }
3029
+
3030
+ return 0;
3031
+ }
3032
+
3033
+ static test_return generate_large_pairs(memcached_st *memc __attribute__((unused)))
3034
+ {
3035
+ unsigned long long x;
3036
+ global_pairs= pairs_generate(GLOBAL2_COUNT, MEMCACHED_MAX_BUFFER+10);
3037
+ global_count= GLOBAL2_COUNT;
3038
+
3039
+ for (x= 0; x < global_count; x++)
3040
+ {
3041
+ global_keys[x]= global_pairs[x].key;
3042
+ global_keys_length[x]= global_pairs[x].key_length;
3043
+ }
3044
+
3045
+ return 0;
3046
+ }
3047
+
3048
+ static test_return generate_data(memcached_st *memc)
3049
+ {
3050
+ execute_set(memc, global_pairs, global_count);
3051
+
3052
+ return 0;
3053
+ }
3054
+
3055
+ static test_return generate_data_with_stats(memcached_st *memc)
3056
+ {
3057
+ memcached_stat_st *stat_p;
3058
+ memcached_return rc;
3059
+ uint32_t host_index= 0;
3060
+ execute_set(memc, global_pairs, global_count);
3061
+
3062
+ //TODO: hosts used size stats
3063
+ stat_p= memcached_stat(memc, NULL, &rc);
3064
+ assert(stat_p);
3065
+
3066
+ for (host_index= 0; host_index < SERVERS_TO_CREATE; host_index++)
3067
+ {
3068
+ /* This test was changes so that "make test" would work properlly */
3069
+ #ifdef DEBUG
3070
+ printf("\nserver %u|%s|%u bytes: %llu\n", host_index, (memc->hosts)[host_index].hostname, (memc->hosts)[host_index].port, (unsigned long long)(stat_p + host_index)->bytes);
3071
+ #endif
3072
+ assert((unsigned long long)(stat_p + host_index)->bytes);
3073
+ }
3074
+
3075
+ memcached_stat_free(NULL, stat_p);
3076
+
3077
+ return 0;
3078
+ }
3079
+ static test_return generate_buffer_data(memcached_st *memc)
3080
+ {
3081
+ size_t latch= 0;
3082
+
3083
+ latch= 1;
3084
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch);
3085
+ generate_data(memc);
3086
+
3087
+ return 0;
3088
+ }
3089
+
3090
+ static test_return get_read_count(memcached_st *memc)
3091
+ {
3092
+ unsigned int x;
3093
+ memcached_return rc;
3094
+ memcached_st *memc_clone;
3095
+
3096
+ memc_clone= memcached_clone(NULL, memc);
3097
+ assert(memc_clone);
3098
+
3099
+ memcached_server_add_with_weight(memc_clone, "localhost", 6666, 0);
3100
+
3101
+ {
3102
+ char *return_value;
3103
+ size_t return_value_length;
3104
+ uint32_t flags;
3105
+ uint32_t count;
3106
+
3107
+ for (x= count= 0; x < global_count; x++)
3108
+ {
3109
+ return_value= memcached_get(memc_clone, global_keys[x], global_keys_length[x],
3110
+ &return_value_length, &flags, &rc);
3111
+ if (rc == MEMCACHED_SUCCESS)
3112
+ {
3113
+ count++;
3114
+ if (return_value)
3115
+ free(return_value);
3116
+ }
3117
+ }
3118
+ fprintf(stderr, "\t%u -> %u", global_count, count);
3119
+ }
3120
+
3121
+ memcached_free(memc_clone);
3122
+
3123
+ return 0;
3124
+ }
3125
+
3126
+ static test_return get_read(memcached_st *memc)
3127
+ {
3128
+ unsigned int x;
3129
+ memcached_return rc;
3130
+
3131
+ {
3132
+ char *return_value;
3133
+ size_t return_value_length;
3134
+ uint32_t flags;
3135
+
3136
+ for (x= 0; x < global_count; x++)
3137
+ {
3138
+ return_value= memcached_get(memc, global_keys[x], global_keys_length[x],
3139
+ &return_value_length, &flags, &rc);
3140
+ /*
3141
+ assert(return_value);
3142
+ assert(rc == MEMCACHED_SUCCESS);
3143
+ */
3144
+ if (rc == MEMCACHED_SUCCESS && return_value)
3145
+ free(return_value);
3146
+ }
3147
+ }
3148
+
3149
+ return 0;
3150
+ }
3151
+
3152
+ static test_return mget_read(memcached_st *memc)
3153
+ {
3154
+ memcached_return rc;
3155
+
3156
+ rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
3157
+ assert(rc == MEMCACHED_SUCCESS);
3158
+ /* Turn this into a help function */
3159
+ {
3160
+ char return_key[MEMCACHED_MAX_KEY];
3161
+ size_t return_key_length;
3162
+ char *return_value;
3163
+ size_t return_value_length;
3164
+ uint32_t flags;
3165
+
3166
+ while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
3167
+ &return_value_length, &flags, &rc)))
3168
+ {
3169
+ assert(return_value);
3170
+ assert(rc == MEMCACHED_SUCCESS);
3171
+ free(return_value);
3172
+ }
3173
+ }
3174
+
3175
+ return 0;
3176
+ }
3177
+
3178
+ static test_return mget_read_result(memcached_st *memc)
3179
+ {
3180
+ memcached_return rc;
3181
+
3182
+ rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
3183
+ assert(rc == MEMCACHED_SUCCESS);
3184
+ /* Turn this into a help function */
3185
+ {
3186
+ memcached_result_st results_obj;
3187
+ memcached_result_st *results;
3188
+
3189
+ results= memcached_result_create(memc, &results_obj);
3190
+
3191
+ while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
3192
+ {
3193
+ assert(results);
3194
+ assert(rc == MEMCACHED_SUCCESS);
3195
+ }
3196
+
3197
+ memcached_result_free(&results_obj);
3198
+ }
3199
+
3200
+ return 0;
3201
+ }
3202
+
3203
+ static test_return mget_read_function(memcached_st *memc)
3204
+ {
3205
+ memcached_return rc;
3206
+ unsigned int counter;
3207
+ memcached_execute_function callbacks[1];
3208
+
3209
+ rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
3210
+ assert(rc == MEMCACHED_SUCCESS);
3211
+
3212
+ callbacks[0]= &callback_counter;
3213
+ counter= 0;
3214
+ rc= memcached_fetch_execute(memc, callbacks, (void *)&counter, 1);
3215
+
3216
+ return 0;
3217
+ }
3218
+
3219
+ static test_return delete_generate(memcached_st *memc)
3220
+ {
3221
+ unsigned int x;
3222
+
3223
+ for (x= 0; x < global_count; x++)
3224
+ {
3225
+ (void)memcached_delete(memc, global_keys[x], global_keys_length[x], (time_t)0);
3226
+ }
3227
+
3228
+ return 0;
3229
+ }
3230
+
3231
+ static test_return delete_buffer_generate(memcached_st *memc)
3232
+ {
3233
+ size_t latch= 0;
3234
+ unsigned int x;
3235
+
3236
+ latch= 1;
3237
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch);
3238
+
3239
+ for (x= 0; x < global_count; x++)
3240
+ {
3241
+ (void)memcached_delete(memc, global_keys[x], global_keys_length[x], (time_t)0);
3242
+ }
3243
+
3244
+ return 0;
3245
+ }
3246
+
3247
+ static test_return add_host_test1(memcached_st *memc)
3248
+ {
3249
+ unsigned int x;
3250
+ memcached_return rc;
3251
+ char servername[]= "0.example.com";
3252
+ memcached_server_st *servers;
3253
+
3254
+ servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
3255
+ assert(servers);
3256
+ assert(1 == memcached_server_list_count(servers));
3257
+
3258
+ for (x= 2; x < 20; x++)
3259
+ {
3260
+ char buffer[SMALL_STRING_LEN];
3261
+
3262
+ snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
3263
+ servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0,
3264
+ &rc);
3265
+ assert(rc == MEMCACHED_SUCCESS);
3266
+ assert(x == memcached_server_list_count(servers));
3267
+ }
3268
+
3269
+ rc= memcached_server_push(memc, servers);
3270
+ assert(rc == MEMCACHED_SUCCESS);
3271
+ rc= memcached_server_push(memc, servers);
3272
+ assert(rc == MEMCACHED_SUCCESS);
3273
+
3274
+ memcached_server_list_free(servers);
3275
+
3276
+ return 0;
3277
+ }
3278
+
3279
+ static memcached_return pre_nonblock(memcached_st *memc)
3280
+ {
3281
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
3282
+
3283
+ return MEMCACHED_SUCCESS;
3284
+ }
3285
+
3286
+ static memcached_return pre_nonblock_binary(memcached_st *memc)
3287
+ {
3288
+ memcached_return rc= MEMCACHED_FAILURE;
3289
+ memcached_st *memc_clone;
3290
+
3291
+ memc_clone= memcached_clone(NULL, memc);
3292
+ assert(memc_clone);
3293
+ // The memcached_version needs to be done on a clone, because the server
3294
+ // will not toggle protocol on an connection.
3295
+ memcached_version(memc_clone);
3296
+
3297
+ if (memc_clone->hosts[0].major_version >= 1 && memc_clone->hosts[0].minor_version > 2)
3298
+ {
3299
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
3300
+ rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
3301
+ assert(rc == MEMCACHED_SUCCESS);
3302
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1);
3303
+ }
3304
+
3305
+ memcached_free(memc_clone);
3306
+ return rc;
3307
+ }
3308
+
3309
+ static memcached_return pre_murmur(memcached_st *memc)
3310
+ {
3311
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR);
3312
+
3313
+ return MEMCACHED_SUCCESS;
3314
+ }
3315
+
3316
+ static memcached_return pre_jenkins(memcached_st *memc)
3317
+ {
3318
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_JENKINS);
3319
+
3320
+ return MEMCACHED_SUCCESS;
3321
+ }
3322
+
3323
+
3324
+ static memcached_return pre_md5(memcached_st *memc)
3325
+ {
3326
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MD5);
3327
+
3328
+ return MEMCACHED_SUCCESS;
3329
+ }
3330
+
3331
+ static memcached_return pre_crc(memcached_st *memc)
3332
+ {
3333
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_CRC);
3334
+
3335
+ return MEMCACHED_SUCCESS;
3336
+ }
3337
+
3338
+ static memcached_return pre_hsieh(memcached_st *memc)
3339
+ {
3340
+ #ifdef HAVE_HSIEH_HASH
3341
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH);
3342
+ return MEMCACHED_SUCCESS;
3343
+ #else
3344
+ (void) memc;
3345
+ return MEMCACHED_FAILURE;
3346
+ #endif
3347
+ }
3348
+
3349
+ static memcached_return pre_hash_fnv1_64(memcached_st *memc)
3350
+ {
3351
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_64);
3352
+
3353
+ return MEMCACHED_SUCCESS;
3354
+ }
3355
+
3356
+ static memcached_return pre_hash_fnv1a_64(memcached_st *memc)
3357
+ {
3358
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_64);
3359
+
3360
+ return MEMCACHED_SUCCESS;
3361
+ }
3362
+
3363
+ static memcached_return pre_hash_fnv1_32(memcached_st *memc)
3364
+ {
3365
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_32);
3366
+
3367
+ return MEMCACHED_SUCCESS;
3368
+ }
3369
+
3370
+ static memcached_return pre_hash_fnv1a_32(memcached_st *memc)
3371
+ {
3372
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_32);
3373
+
3374
+ return MEMCACHED_SUCCESS;
3375
+ }
3376
+
3377
+ static memcached_return pre_behavior_ketama(memcached_st *memc)
3378
+ {
3379
+ memcached_return rc;
3380
+ uint64_t value;
3381
+
3382
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA, 1);
3383
+ assert(rc == MEMCACHED_SUCCESS);
3384
+
3385
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA);
3386
+ assert(value == 1);
3387
+
3388
+ return MEMCACHED_SUCCESS;
3389
+ }
3390
+
3391
+ static memcached_return pre_behavior_ketama_weighted(memcached_st *memc)
3392
+ {
3393
+ memcached_return rc;
3394
+ uint64_t value;
3395
+
3396
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, 1);
3397
+ assert(rc == MEMCACHED_SUCCESS);
3398
+
3399
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
3400
+ assert(value == 1);
3401
+
3402
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5);
3403
+ assert(rc == MEMCACHED_SUCCESS);
3404
+
3405
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH);
3406
+ assert(value == MEMCACHED_HASH_MD5);
3407
+ return MEMCACHED_SUCCESS;
3408
+ }
3409
+
3410
+ static memcached_return pre_binary(memcached_st *memc)
3411
+ {
3412
+ memcached_return rc= MEMCACHED_FAILURE;
3413
+ memcached_st *memc_clone;
3414
+
3415
+ memc_clone= memcached_clone(NULL, memc);
3416
+ assert(memc_clone);
3417
+ // The memcached_version needs to be done on a clone, because the server
3418
+ // will not toggle protocol on an connection.
3419
+ memcached_version(memc_clone);
3420
+
3421
+ if (memc_clone->hosts[0].major_version >= 1 && memc_clone->hosts[0].minor_version > 2)
3422
+ {
3423
+ rc = memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
3424
+ assert(rc == MEMCACHED_SUCCESS);
3425
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == 1);
3426
+ }
3427
+
3428
+ memcached_free(memc_clone);
3429
+ return rc;
3430
+ }
3431
+
3432
+ static void my_free(memcached_st *ptr __attribute__((unused)), void *mem)
3433
+ {
3434
+ free(mem);
3435
+ }
3436
+
3437
+ static void *my_malloc(memcached_st *ptr __attribute__((unused)), const size_t size)
3438
+ {
3439
+ void *ret= malloc(size);
3440
+ if (ret != NULL)
3441
+ memset(ret, 0xff, size);
3442
+
3443
+ return ret;
3444
+ }
3445
+
3446
+ static void *my_realloc(memcached_st *ptr __attribute__((unused)), void *mem, const size_t size)
3447
+ {
3448
+ return realloc(mem, size);
3449
+ }
3450
+
3451
+ static void *my_calloc(memcached_st *ptr __attribute__((unused)), size_t nelem, const size_t size)
3452
+ {
3453
+ return calloc(nelem, size);
3454
+ }
3455
+
3456
+ static memcached_return set_prefix(memcached_st *memc)
3457
+ {
3458
+ memcached_return rc;
3459
+ const char *key= "mine";
3460
+ char *value;
3461
+
3462
+ /* Make sure be default none exists */
3463
+ value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
3464
+ assert(rc == MEMCACHED_FAILURE);
3465
+
3466
+ /* Test a clean set */
3467
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)key);
3468
+ assert(rc == MEMCACHED_SUCCESS);
3469
+
3470
+ value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
3471
+ assert(memcmp(value, key, 4) == 0);
3472
+ assert(rc == MEMCACHED_SUCCESS);
3473
+
3474
+ /* Test that we can turn it off */
3475
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, NULL);
3476
+ assert(rc == MEMCACHED_SUCCESS);
3477
+
3478
+ value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
3479
+ assert(rc == MEMCACHED_FAILURE);
3480
+
3481
+ /* Now setup for main test */
3482
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)key);
3483
+ assert(rc == MEMCACHED_SUCCESS);
3484
+
3485
+ value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
3486
+ assert(rc == MEMCACHED_SUCCESS);
3487
+ assert(memcmp(value, key, 4) == 0);
3488
+
3489
+ /* Set to Zero, and then Set to something too large */
3490
+ {
3491
+ char long_key[255];
3492
+ memset(long_key, 0, 255);
3493
+
3494
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, NULL);
3495
+ assert(rc == MEMCACHED_SUCCESS);
3496
+
3497
+ value= memcached_callback_get(memc, MEMCACHED_CALLBACK_PREFIX_KEY, &rc);
3498
+ assert(rc == MEMCACHED_FAILURE);
3499
+ assert(value == NULL);
3500
+
3501
+ /* Test a long key for failure */
3502
+ /* TODO, extend test to determine based on setting, what result should be */
3503
+ strcpy(long_key, "Thisismorethentheallottednumberofcharacters");
3504
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
3505
+ //assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
3506
+ assert(rc == MEMCACHED_SUCCESS);
3507
+
3508
+ /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3509
+ strcpy(long_key, "This is more then the allotted number of characters");
3510
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
3511
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
3512
+
3513
+ /* Test for a bad prefix, but with a short key */
3514
+ rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1);
3515
+ assert(rc == MEMCACHED_SUCCESS);
3516
+
3517
+ strcpy(long_key, "dog cat");
3518
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, long_key);
3519
+ assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
3520
+ }
3521
+
3522
+ return MEMCACHED_SUCCESS;
3523
+ }
3524
+
3525
+ #ifdef MEMCACHED_ENABLE_DEPRECATED
3526
+ static memcached_return deprecated_set_memory_alloc(memcached_st *memc)
3527
+ {
3528
+ void *test_ptr= NULL;
3529
+ void *cb_ptr= NULL;
3530
+ {
3531
+ memcached_malloc_function malloc_cb=
3532
+ (memcached_malloc_function)my_malloc;
3533
+ cb_ptr= *(void **)&malloc_cb;
3534
+ memcached_return rc;
3535
+
3536
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, cb_ptr);
3537
+ assert(rc == MEMCACHED_SUCCESS);
3538
+ test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, &rc);
3539
+ assert(rc == MEMCACHED_SUCCESS);
3540
+ assert(test_ptr == cb_ptr);
3541
+ }
3542
+
3543
+ {
3544
+ memcached_realloc_function realloc_cb=
3545
+ (memcached_realloc_function)my_realloc;
3546
+ cb_ptr= *(void **)&realloc_cb;
3547
+ memcached_return rc;
3548
+
3549
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, cb_ptr);
3550
+ assert(rc == MEMCACHED_SUCCESS);
3551
+ test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, &rc);
3552
+ assert(rc == MEMCACHED_SUCCESS);
3553
+ assert(test_ptr == cb_ptr);
3554
+ }
3555
+
3556
+ {
3557
+ memcached_free_function free_cb=
3558
+ (memcached_free_function)my_free;
3559
+ cb_ptr= *(void **)&free_cb;
3560
+ memcached_return rc;
3561
+
3562
+ rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, cb_ptr);
3563
+ assert(rc == MEMCACHED_SUCCESS);
3564
+ test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, &rc);
3565
+ assert(rc == MEMCACHED_SUCCESS);
3566
+ assert(test_ptr == cb_ptr);
3567
+ }
3568
+ return MEMCACHED_SUCCESS;
3569
+ }
3570
+ #endif
3571
+
3572
+ static memcached_return set_memory_alloc(memcached_st *memc)
3573
+ {
3574
+ memcached_return rc;
3575
+ rc= memcached_set_memory_allocators(memc, NULL, my_free,
3576
+ my_realloc, my_calloc);
3577
+ assert(rc == MEMCACHED_FAILURE);
3578
+
3579
+ rc= memcached_set_memory_allocators(memc, my_malloc, my_free,
3580
+ my_realloc, my_calloc);
3581
+
3582
+ memcached_malloc_function mem_malloc;
3583
+ memcached_free_function mem_free;
3584
+ memcached_realloc_function mem_realloc;
3585
+ memcached_calloc_function mem_calloc;
3586
+ memcached_get_memory_allocators(memc, &mem_malloc, &mem_free,
3587
+ &mem_realloc, &mem_calloc);
3588
+
3589
+ assert(mem_malloc == my_malloc);
3590
+ assert(mem_realloc == my_realloc);
3591
+ assert(mem_calloc == my_calloc);
3592
+ assert(mem_free == my_free);
3593
+
3594
+ return MEMCACHED_SUCCESS;
3595
+ }
3596
+
3597
+ static memcached_return enable_consistent(memcached_st *memc)
3598
+ {
3599
+ memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT;
3600
+ memcached_hash hash;
3601
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
3602
+ if (pre_hsieh(memc) != MEMCACHED_SUCCESS)
3603
+ return MEMCACHED_FAILURE;
3604
+
3605
+ value= (memcached_server_distribution)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
3606
+ assert(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
3607
+
3608
+ hash= (memcached_hash)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
3609
+ assert(hash == MEMCACHED_HASH_HSIEH);
3610
+
3611
+
3612
+ return MEMCACHED_SUCCESS;
3613
+ }
3614
+
3615
+ static memcached_return enable_cas(memcached_st *memc)
3616
+ {
3617
+ unsigned int set= 1;
3618
+
3619
+ memcached_version(memc);
3620
+
3621
+ if ((memc->hosts[0].major_version >= 1 && (memc->hosts[0].minor_version == 2 && memc->hosts[0].micro_version >= 4))
3622
+ || memc->hosts[0].minor_version > 2)
3623
+ {
3624
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
3625
+
3626
+ return MEMCACHED_SUCCESS;
3627
+ }
3628
+
3629
+ return MEMCACHED_FAILURE;
3630
+ }
3631
+
3632
+ static memcached_return check_for_1_2_3(memcached_st *memc)
3633
+ {
3634
+ memcached_version(memc);
3635
+
3636
+ if ((memc->hosts[0].major_version >= 1 && (memc->hosts[0].minor_version == 2 && memc->hosts[0].micro_version >= 4))
3637
+ || memc->hosts[0].minor_version > 2)
3638
+ return MEMCACHED_SUCCESS;
3639
+
3640
+ return MEMCACHED_FAILURE;
3641
+ }
3642
+
3643
+ static memcached_return pre_unix_socket(memcached_st *memc)
3644
+ {
3645
+ memcached_return rc;
3646
+ struct stat buf;
3647
+
3648
+ memcached_server_list_free(memc->hosts);
3649
+ memc->hosts= NULL;
3650
+ memc->number_of_hosts= 0;
3651
+
3652
+ if (stat("/tmp/memcached.socket", &buf))
3653
+ return MEMCACHED_FAILURE;
3654
+
3655
+ rc= memcached_server_add_unix_socket_with_weight(memc, "/tmp/memcached.socket", 0);
3656
+
3657
+ return rc;
3658
+ }
3659
+
3660
+ static memcached_return pre_nodelay(memcached_st *memc)
3661
+ {
3662
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
3663
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0);
3664
+
3665
+ return MEMCACHED_SUCCESS;
3666
+ }
3667
+
3668
+ static memcached_return pre_settimer(memcached_st *memc)
3669
+ {
3670
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
3671
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
3672
+
3673
+ return MEMCACHED_SUCCESS;
3674
+ }
3675
+
3676
+ static memcached_return poll_timeout(memcached_st *memc)
3677
+ {
3678
+ size_t timeout;
3679
+
3680
+ timeout= 100;
3681
+
3682
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout);
3683
+
3684
+ timeout= (size_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
3685
+
3686
+ assert(timeout == 100);
3687
+
3688
+ return MEMCACHED_SUCCESS;
3689
+ }
3690
+
3691
+ static test_return noreply_test(memcached_st *memc)
3692
+ {
3693
+ int count, x;
3694
+ uint32_t y;
3695
+ memcached_return ret;
3696
+ ret= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1);
3697
+ assert(ret == MEMCACHED_SUCCESS);
3698
+ ret= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
3699
+ assert(ret == MEMCACHED_SUCCESS);
3700
+ ret= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1);
3701
+ assert(ret == MEMCACHED_SUCCESS);
3702
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY) == 1);
3703
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS) == 1);
3704
+ assert(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS) == 1);
3705
+
3706
+ for (count=0; count < 5; ++count)
3707
+ {
3708
+ for (x=0; x < 100; ++x)
3709
+ {
3710
+ char key[10];
3711
+ size_t len= (size_t)sprintf(key, "%d", x);
3712
+ switch (count)
3713
+ {
3714
+ case 0:
3715
+ ret=memcached_add(memc, key, len, key, len, 0, 0);
3716
+ break;
3717
+ case 1:
3718
+ ret=memcached_replace(memc, key, len, key, len, 0, 0);
3719
+ break;
3720
+ case 2:
3721
+ ret=memcached_set(memc, key, len, key, len, 0, 0);
3722
+ break;
3723
+ case 3:
3724
+ ret=memcached_append(memc, key, len, key, len, 0, 0);
3725
+ break;
3726
+ case 4:
3727
+ ret=memcached_prepend(memc, key, len, key, len, 0, 0);
3728
+ break;
3729
+ default:
3730
+ assert(count);
3731
+ break;
3732
+ }
3733
+ assert(ret == MEMCACHED_SUCCESS || ret == MEMCACHED_BUFFERED);
3734
+ }
3735
+
3736
+ /*
3737
+ ** NOTE: Don't ever do this in your code! this is not a supported use of the
3738
+ ** API and is _ONLY_ done this way to verify that the library works the
3739
+ ** way it is supposed to do!!!!
3740
+ */
3741
+ int no_msg=0;
3742
+ for (y=0; x < memc->number_of_hosts; ++y)
3743
+ no_msg+=(int)(memc->hosts[y].cursor_active);
3744
+
3745
+ assert(no_msg == 0);
3746
+ assert(memcached_flush_buffers(memc) == MEMCACHED_SUCCESS);
3747
+
3748
+ /*
3749
+ ** Now validate that all items was set properly!
3750
+ */
3751
+ for (x=0; x < 100; ++x)
3752
+ {
3753
+ char key[10];
3754
+ size_t len= (size_t)sprintf(key, "%d", x);
3755
+ size_t length;
3756
+ uint32_t flags;
3757
+ char* value=memcached_get(memc, key, strlen(key),
3758
+ &length, &flags, &ret);
3759
+ assert(ret == MEMCACHED_SUCCESS && value != NULL);
3760
+ switch (count)
3761
+ {
3762
+ case 0: /* FALLTHROUGH */
3763
+ case 1: /* FALLTHROUGH */
3764
+ case 2:
3765
+ assert(strncmp(value, key, len) == 0);
3766
+ assert(len == length);
3767
+ break;
3768
+ case 3:
3769
+ assert(length == len * 2);
3770
+ break;
3771
+ case 4:
3772
+ assert(length == len * 3);
3773
+ break;
3774
+ default:
3775
+ assert(count);
3776
+ break;
3777
+ }
3778
+ free(value);
3779
+ }
3780
+ }
3781
+
3782
+ /* Try setting an illegal cas value (should not return an error to
3783
+ * the caller (because we don't expect a return message from the server)
3784
+ */
3785
+ const char* keys[]= {"0"};
3786
+ size_t lengths[]= {1};
3787
+ size_t length;
3788
+ uint32_t flags;
3789
+ memcached_result_st results_obj;
3790
+ memcached_result_st *results;
3791
+ ret= memcached_mget(memc, keys, lengths, 1);
3792
+ assert(ret == MEMCACHED_SUCCESS);
3793
+
3794
+ results= memcached_result_create(memc, &results_obj);
3795
+ assert(results);
3796
+ results= memcached_fetch_result(memc, &results_obj, &ret);
3797
+ assert(results);
3798
+ assert(ret == MEMCACHED_SUCCESS);
3799
+ uint64_t cas= memcached_result_cas(results);
3800
+ memcached_result_free(&results_obj);
3801
+
3802
+ ret= memcached_cas(memc, keys[0], lengths[0], keys[0], lengths[0], 0, 0, cas);
3803
+ assert(ret == MEMCACHED_SUCCESS);
3804
+
3805
+ /*
3806
+ * The item will have a new cas value, so try to set it again with the old
3807
+ * value. This should fail!
3808
+ */
3809
+ ret= memcached_cas(memc, keys[0], lengths[0], keys[0], lengths[0], 0, 0, cas);
3810
+ assert(ret == MEMCACHED_SUCCESS);
3811
+ assert(memcached_flush_buffers(memc) == MEMCACHED_SUCCESS);
3812
+ char* value=memcached_get(memc, keys[0], lengths[0], &length, &flags, &ret);
3813
+ assert(ret == MEMCACHED_SUCCESS && value != NULL);
3814
+ free(value);
3815
+
3816
+ return TEST_SUCCESS;
3817
+ }
3818
+
3819
+ static test_return analyzer_test(memcached_st *memc)
3820
+ {
3821
+ memcached_return rc;
3822
+ memcached_stat_st *memc_stat;
3823
+ memcached_analysis_st *report;
3824
+
3825
+ memc_stat= memcached_stat(memc, NULL, &rc);
3826
+ assert(rc == MEMCACHED_SUCCESS);
3827
+ assert(memc_stat);
3828
+
3829
+ report= memcached_analyze(memc, memc_stat, &rc);
3830
+ assert(rc == MEMCACHED_SUCCESS);
3831
+ assert(report);
3832
+
3833
+ free(report);
3834
+ memcached_stat_free(NULL, memc_stat);
3835
+
3836
+ return TEST_SUCCESS;
3837
+ }
3838
+
3839
+ /* Count the objects */
3840
+ static memcached_return callback_dump_counter(memcached_st *ptr __attribute__((unused)),
3841
+ const char *key __attribute__((unused)),
3842
+ size_t key_length __attribute__((unused)),
3843
+ void *context)
3844
+ {
3845
+ uint32_t *counter= (uint32_t *)context;
3846
+
3847
+ *counter= *counter + 1;
3848
+
3849
+ return MEMCACHED_SUCCESS;
3850
+ }
3851
+
3852
+ static test_return dump_test(memcached_st *memc)
3853
+ {
3854
+ memcached_return rc;
3855
+ uint32_t counter= 0;
3856
+ memcached_dump_func callbacks[1];
3857
+ test_return main_rc;
3858
+
3859
+ callbacks[0]= &callback_dump_counter;
3860
+
3861
+ /* No support for Binary protocol yet */
3862
+ if (memc->flags & MEM_BINARY_PROTOCOL)
3863
+ return TEST_SUCCESS;
3864
+
3865
+ main_rc= set_test3(memc);
3866
+
3867
+ assert (main_rc == TEST_SUCCESS);
3868
+
3869
+ rc= memcached_dump(memc, callbacks, (void *)&counter, 1);
3870
+ assert(rc == MEMCACHED_SUCCESS);
3871
+
3872
+ /* We may have more then 32 if our previous flush has not completed */
3873
+ assert(counter >= 32);
3874
+
3875
+ return TEST_SUCCESS;
3876
+ }
3877
+
3878
+ #ifdef HAVE_LIBMEMCACHEDUTIL
3879
+ static void* connection_release(void *arg) {
3880
+ struct {
3881
+ memcached_pool_st* pool;
3882
+ memcached_st* mmc;
3883
+ } *resource= arg;
3884
+
3885
+ usleep(250);
3886
+ assert(memcached_pool_push(resource->pool, resource->mmc) == MEMCACHED_SUCCESS);
3887
+ return arg;
3888
+ }
3889
+
3890
+ static test_return connection_pool_test(memcached_st *memc)
3891
+ {
3892
+ memcached_pool_st* pool= memcached_pool_create(memc, 5, 10);
3893
+ assert(pool != NULL);
3894
+ memcached_st* mmc[10];
3895
+ memcached_return rc;
3896
+
3897
+ for (int x= 0; x < 10; ++x) {
3898
+ mmc[x]= memcached_pool_pop(pool, false, &rc);
3899
+ assert(mmc[x] != NULL);
3900
+ assert(rc == MEMCACHED_SUCCESS);
3901
+ }
3902
+
3903
+ assert(memcached_pool_pop(pool, false, &rc) == NULL);
3904
+ assert(rc == MEMCACHED_SUCCESS);
3905
+
3906
+ pthread_t tid;
3907
+ struct {
3908
+ memcached_pool_st* pool;
3909
+ memcached_st* mmc;
3910
+ } item= { .pool = pool, .mmc = mmc[9] };
3911
+ pthread_create(&tid, NULL, connection_release, &item);
3912
+ mmc[9]= memcached_pool_pop(pool, true, &rc);
3913
+ assert(rc == MEMCACHED_SUCCESS);
3914
+ pthread_join(tid, NULL);
3915
+ assert(mmc[9] == item.mmc);
3916
+ const char *key= "key";
3917
+ size_t keylen= strlen(key);
3918
+
3919
+ // verify that I can do ops with all connections
3920
+ rc= memcached_set(mmc[0], key, keylen, "0", 1, 0, 0);
3921
+ assert(rc == MEMCACHED_SUCCESS);
3922
+
3923
+ for (unsigned int x= 0; x < 10; ++x) {
3924
+ uint64_t number_value;
3925
+ rc= memcached_increment(mmc[x], key, keylen, 1, &number_value);
3926
+ assert(rc == MEMCACHED_SUCCESS);
3927
+ assert(number_value == (x+1));
3928
+ }
3929
+
3930
+ // Release them..
3931
+ for (int x= 0; x < 10; ++x)
3932
+ assert(memcached_pool_push(pool, mmc[x]) == MEMCACHED_SUCCESS);
3933
+
3934
+ assert(memcached_pool_destroy(pool) == memc);
3935
+ return TEST_SUCCESS;
3936
+ }
3937
+ #endif
3938
+
3939
+
3940
+ static void increment_request_id(uint16_t *id)
3941
+ {
3942
+ (*id)++;
3943
+ if ((*id & UDP_REQUEST_ID_THREAD_MASK) != 0)
3944
+ *id= 0;
3945
+ }
3946
+
3947
+ static uint16_t *get_udp_request_ids(memcached_st *memc)
3948
+ {
3949
+ uint16_t *ids= malloc(sizeof(uint16_t) * memc->number_of_hosts);
3950
+ assert(ids != NULL);
3951
+ unsigned int x;
3952
+
3953
+ for (x= 0; x < memc->number_of_hosts; x++)
3954
+ ids[x]= get_udp_datagram_request_id((struct udp_datagram_header_st *) memc->hosts[x].write_buffer);
3955
+
3956
+ return ids;
3957
+ }
3958
+
3959
+ static test_return post_udp_op_check(memcached_st *memc, uint16_t *expected_req_ids)
3960
+ {
3961
+ unsigned int x;
3962
+ memcached_server_st *cur_server = memc->hosts;
3963
+ uint16_t *cur_req_ids = get_udp_request_ids(memc);
3964
+
3965
+ for (x= 0; x < memc->number_of_hosts; x++)
3966
+ {
3967
+ assert(cur_server[x].cursor_active == 0);
3968
+ assert(cur_req_ids[x] == expected_req_ids[x]);
3969
+ }
3970
+ free(expected_req_ids);
3971
+ free(cur_req_ids);
3972
+
3973
+ return TEST_SUCCESS;
3974
+ }
3975
+
3976
+ /*
3977
+ ** There is a little bit of a hack here, instead of removing
3978
+ ** the servers, I just set num host to 0 and them add then new udp servers
3979
+ **/
3980
+ static memcached_return init_udp(memcached_st *memc)
3981
+ {
3982
+ memcached_version(memc);
3983
+ /* For the time being, only support udp test for >= 1.2.6 && < 1.3 */
3984
+ if (memc->hosts[0].major_version != 1 || memc->hosts[0].minor_version != 2
3985
+ || memc->hosts[0].micro_version < 6)
3986
+ return MEMCACHED_FAILURE;
3987
+
3988
+ uint32_t num_hosts= memc->number_of_hosts;
3989
+ unsigned int x= 0;
3990
+ memcached_server_st servers[num_hosts];
3991
+ memcpy(servers, memc->hosts, sizeof(memcached_server_st) * num_hosts);
3992
+ for (x= 0; x < num_hosts; x++)
3993
+ memcached_server_free(&memc->hosts[x]);
3994
+
3995
+ memc->number_of_hosts= 0;
3996
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, 1);
3997
+ for (x= 0; x < num_hosts; x++)
3998
+ {
3999
+ assert(memcached_server_add_udp(memc, servers[x].hostname, servers[x].port) == MEMCACHED_SUCCESS);
4000
+ assert(memc->hosts[x].write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH);
4001
+ }
4002
+
4003
+ return MEMCACHED_SUCCESS;
4004
+ }
4005
+
4006
+ static memcached_return binary_init_udp(memcached_st *memc)
4007
+ {
4008
+ pre_binary(memc);
4009
+ return init_udp(memc);
4010
+ }
4011
+
4012
+ /* Make sure that I cant add a tcp server to a udp client */
4013
+ static test_return add_tcp_server_udp_client_test(memcached_st *memc)
4014
+ {
4015
+ memcached_server_st server;
4016
+ memcached_server_clone(&server, &memc->hosts[0]);
4017
+ assert(memcached_server_remove(&(memc->hosts[0])) == MEMCACHED_SUCCESS);
4018
+ assert(memcached_server_add(memc, server.hostname, server.port) == MEMCACHED_INVALID_HOST_PROTOCOL);
4019
+ return TEST_SUCCESS;
4020
+ }
4021
+
4022
+ /* Make sure that I cant add a udp server to a tcp client */
4023
+ static test_return add_udp_server_tcp_client_test(memcached_st *memc)
4024
+ {
4025
+ memcached_server_st server;
4026
+ memcached_server_clone(&server, &memc->hosts[0]);
4027
+ assert(memcached_server_remove(&(memc->hosts[0])) == MEMCACHED_SUCCESS);
4028
+
4029
+ memcached_st tcp_client;
4030
+ memcached_create(&tcp_client);
4031
+ assert(memcached_server_add_udp(&tcp_client, server.hostname, server.port) == MEMCACHED_INVALID_HOST_PROTOCOL);
4032
+ return TEST_SUCCESS;
4033
+ }
4034
+
4035
+ static test_return set_udp_behavior_test(memcached_st *memc)
4036
+ {
4037
+
4038
+ memcached_quit(memc);
4039
+ memc->number_of_hosts= 0;
4040
+ run_distribution(memc);
4041
+ assert(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, 1) == MEMCACHED_SUCCESS);
4042
+ assert(memc->flags & MEM_USE_UDP);
4043
+ assert(memc->flags & MEM_NOREPLY);;
4044
+
4045
+ assert(memc->number_of_hosts == 0);
4046
+
4047
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP,0);
4048
+ assert(!(memc->flags & MEM_USE_UDP));
4049
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY,0);
4050
+ assert(!(memc->flags & MEM_NOREPLY));
4051
+ return TEST_SUCCESS;
4052
+ }
4053
+
4054
+ static test_return udp_set_test(memcached_st *memc)
4055
+ {
4056
+ unsigned int x= 0;
4057
+ unsigned int num_iters= 1025; //request id rolls over at 1024
4058
+ for (x= 0; x < num_iters;x++)
4059
+ {
4060
+ memcached_return rc;
4061
+ const char *key= "foo";
4062
+ const char *value= "when we sanitize";
4063
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4064
+ unsigned int server_key= memcached_generate_hash(memc,key,strlen(key));
4065
+ size_t init_offset= memc->hosts[server_key].write_buffer_offset;
4066
+ rc= memcached_set(memc, key, strlen(key),
4067
+ value, strlen(value),
4068
+ (time_t)0, (uint32_t)0);
4069
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
4070
+ /** NB, the check below assumes that if new write_ptr is less than
4071
+ * the original write_ptr that we have flushed. For large payloads, this
4072
+ * maybe an invalid assumption, but for the small payload we have it is OK
4073
+ */
4074
+ if (rc == MEMCACHED_SUCCESS ||
4075
+ memc->hosts[server_key].write_buffer_offset < init_offset)
4076
+ increment_request_id(&expected_ids[server_key]);
4077
+
4078
+ if (rc == MEMCACHED_SUCCESS)
4079
+ {
4080
+ assert(memc->hosts[server_key].write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH);
4081
+ }
4082
+ else
4083
+ {
4084
+ assert(memc->hosts[server_key].write_buffer_offset != UDP_DATAGRAM_HEADER_LENGTH);
4085
+ assert(memc->hosts[server_key].write_buffer_offset <= MAX_UDP_DATAGRAM_LENGTH);
4086
+ }
4087
+ assert(post_udp_op_check(memc,expected_ids) == TEST_SUCCESS);
4088
+ }
4089
+ return TEST_SUCCESS;
4090
+ }
4091
+
4092
+ static test_return udp_buffered_set_test(memcached_st *memc)
4093
+ {
4094
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
4095
+ return udp_set_test(memc);
4096
+ }
4097
+
4098
+ static test_return udp_set_too_big_test(memcached_st *memc)
4099
+ {
4100
+ memcached_return rc;
4101
+ const char *key= "bar";
4102
+ char value[MAX_UDP_DATAGRAM_LENGTH];
4103
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4104
+ rc= memcached_set(memc, key, strlen(key),
4105
+ value, MAX_UDP_DATAGRAM_LENGTH,
4106
+ (time_t)0, (uint32_t)0);
4107
+ assert(rc == MEMCACHED_WRITE_FAILURE);
4108
+ return post_udp_op_check(memc,expected_ids);
4109
+ }
4110
+
4111
+ static test_return udp_delete_test(memcached_st *memc)
4112
+ {
4113
+ unsigned int x= 0;
4114
+ unsigned int num_iters= 1025; //request id rolls over at 1024
4115
+ for (x= 0; x < num_iters;x++)
4116
+ {
4117
+ memcached_return rc;
4118
+ const char *key= "foo";
4119
+ uint16_t *expected_ids=get_udp_request_ids(memc);
4120
+ unsigned int server_key= memcached_generate_hash(memc, key, strlen(key));
4121
+ size_t init_offset= memc->hosts[server_key].write_buffer_offset;
4122
+ rc= memcached_delete(memc, key, strlen(key), 0);
4123
+ assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
4124
+ if (rc == MEMCACHED_SUCCESS || memc->hosts[server_key].write_buffer_offset < init_offset)
4125
+ increment_request_id(&expected_ids[server_key]);
4126
+ if (rc == MEMCACHED_SUCCESS)
4127
+ assert(memc->hosts[server_key].write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH);
4128
+ else
4129
+ {
4130
+ assert(memc->hosts[server_key].write_buffer_offset != UDP_DATAGRAM_HEADER_LENGTH);
4131
+ assert(memc->hosts[server_key].write_buffer_offset <= MAX_UDP_DATAGRAM_LENGTH);
4132
+ }
4133
+ assert(post_udp_op_check(memc,expected_ids) == TEST_SUCCESS);
4134
+ }
4135
+ return TEST_SUCCESS;
4136
+ }
4137
+
4138
+ static test_return udp_buffered_delete_test(memcached_st *memc)
4139
+ {
4140
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
4141
+ return udp_delete_test(memc);
4142
+ }
4143
+
4144
+ static test_return udp_verbosity_test(memcached_st *memc)
4145
+ {
4146
+ memcached_return rc;
4147
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4148
+ unsigned int x;
4149
+ for (x= 0; x < memc->number_of_hosts;x++)
4150
+ increment_request_id(&expected_ids[x]);
4151
+
4152
+ rc= memcached_verbosity(memc,3);
4153
+ assert(rc == MEMCACHED_SUCCESS);
4154
+ return post_udp_op_check(memc,expected_ids);
4155
+ }
4156
+
4157
+ static test_return udp_quit_test(memcached_st *memc)
4158
+ {
4159
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4160
+ memcached_quit(memc);
4161
+ return post_udp_op_check(memc, expected_ids);
4162
+ }
4163
+
4164
+ static test_return udp_flush_test(memcached_st *memc)
4165
+ {
4166
+ memcached_return rc;
4167
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4168
+ unsigned int x;
4169
+ for (x= 0; x < memc->number_of_hosts;x++)
4170
+ increment_request_id(&expected_ids[x]);
4171
+
4172
+ rc= memcached_flush(memc,0);
4173
+ assert(rc == MEMCACHED_SUCCESS);
4174
+ return post_udp_op_check(memc,expected_ids);
4175
+ }
4176
+
4177
+ static test_return udp_incr_test(memcached_st *memc)
4178
+ {
4179
+ memcached_return rc;
4180
+ const char *key= "incr";
4181
+ const char *value= "1";
4182
+ rc= memcached_set(memc, key, strlen(key),
4183
+ value, strlen(value),
4184
+ (time_t)0, (uint32_t)0);
4185
+
4186
+ assert(rc == MEMCACHED_SUCCESS);
4187
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4188
+ unsigned int server_key= memcached_generate_hash(memc, key, strlen(key));
4189
+ increment_request_id(&expected_ids[server_key]);
4190
+ uint64_t newvalue;
4191
+ rc= memcached_increment(memc, key, strlen(key), 1, &newvalue);
4192
+ assert(rc == MEMCACHED_SUCCESS);
4193
+ return post_udp_op_check(memc, expected_ids);
4194
+ }
4195
+
4196
+ static test_return udp_decr_test(memcached_st *memc)
4197
+ {
4198
+ memcached_return rc;
4199
+ const char *key= "decr";
4200
+ const char *value= "1";
4201
+ rc= memcached_set(memc, key, strlen(key),
4202
+ value, strlen(value),
4203
+ (time_t)0, (uint32_t)0);
4204
+
4205
+ assert(rc == MEMCACHED_SUCCESS);
4206
+ uint16_t *expected_ids= get_udp_request_ids(memc);
4207
+ unsigned int server_key= memcached_generate_hash(memc, key, strlen(key));
4208
+ increment_request_id(&expected_ids[server_key]);
4209
+ uint64_t newvalue;
4210
+ rc= memcached_decrement(memc, key, strlen(key), 1, &newvalue);
4211
+ assert(rc == MEMCACHED_SUCCESS);
4212
+ return post_udp_op_check(memc, expected_ids);
4213
+ }
4214
+
4215
+
4216
+ static test_return udp_stat_test(memcached_st *memc)
4217
+ {
4218
+ memcached_stat_st * rv= NULL;
4219
+ memcached_return rc;
4220
+ char args[]= "";
4221
+ uint16_t *expected_ids = get_udp_request_ids(memc);
4222
+ rv = memcached_stat(memc, args, &rc);
4223
+ free(rv);
4224
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
4225
+ return post_udp_op_check(memc, expected_ids);
4226
+ }
4227
+
4228
+ static test_return udp_version_test(memcached_st *memc)
4229
+ {
4230
+ memcached_return rc;
4231
+ uint16_t *expected_ids = get_udp_request_ids(memc);
4232
+ rc = memcached_version(memc);
4233
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
4234
+ return post_udp_op_check(memc, expected_ids);
4235
+ }
4236
+
4237
+ static test_return udp_get_test(memcached_st *memc)
4238
+ {
4239
+ memcached_return rc;
4240
+ const char *key= "foo";
4241
+ size_t vlen;
4242
+ uint16_t *expected_ids = get_udp_request_ids(memc);
4243
+ char *val= memcached_get(memc, key, strlen(key), &vlen, (uint32_t)0, &rc);
4244
+ assert(rc == MEMCACHED_NOT_SUPPORTED);
4245
+ assert(val == NULL);
4246
+ return post_udp_op_check(memc, expected_ids);
4247
+ }
4248
+
4249
+ static test_return udp_mixed_io_test(memcached_st *memc)
4250
+ {
4251
+ test_st current_op;
4252
+ test_st mixed_io_ops [] ={
4253
+ {"udp_set_test", 0, udp_set_test},
4254
+ {"udp_set_too_big_test", 0, udp_set_too_big_test},
4255
+ {"udp_delete_test", 0, udp_delete_test},
4256
+ {"udp_verbosity_test", 0, udp_verbosity_test},
4257
+ {"udp_quit_test", 0, udp_quit_test},
4258
+ {"udp_flush_test", 0, udp_flush_test},
4259
+ {"udp_incr_test", 0, udp_incr_test},
4260
+ {"udp_decr_test", 0, udp_decr_test},
4261
+ {"udp_version_test", 0, udp_version_test}
4262
+ };
4263
+ unsigned int x= 0;
4264
+ for (x= 0; x < 500; x++)
4265
+ {
4266
+ current_op= mixed_io_ops[random() % 9];
4267
+ assert(current_op.function(memc) == TEST_SUCCESS);
4268
+ }
4269
+ return TEST_SUCCESS;
4270
+ }
4271
+
4272
+ static test_return hsieh_avaibility_test (memcached_st *memc)
4273
+ {
4274
+ memcached_return expected_rc= MEMCACHED_FAILURE;
4275
+ #ifdef HAVE_HSIEH_HASH
4276
+ expected_rc= MEMCACHED_SUCCESS;
4277
+ #endif
4278
+ memcached_return rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH,
4279
+ (uint64_t)MEMCACHED_HASH_HSIEH);
4280
+ assert(rc == expected_rc);
4281
+ return TEST_SUCCESS;
4282
+ }
4283
+
4284
+ static const char *list[]=
4285
+ {
4286
+ "apple",
4287
+ "beat",
4288
+ "carrot",
4289
+ "daikon",
4290
+ "eggplant",
4291
+ "flower",
4292
+ "green",
4293
+ "hide",
4294
+ "ick",
4295
+ "jack",
4296
+ "kick",
4297
+ "lime",
4298
+ "mushrooms",
4299
+ "nectarine",
4300
+ "orange",
4301
+ "peach",
4302
+ "quant",
4303
+ "ripen",
4304
+ "strawberry",
4305
+ "tang",
4306
+ "up",
4307
+ "volumne",
4308
+ "when",
4309
+ "yellow",
4310
+ "zip",
4311
+ NULL
4312
+ };
4313
+
4314
+ static test_return md5_run (memcached_st *memc __attribute__((unused)))
4315
+ {
4316
+ uint32_t x;
4317
+ const char **ptr;
4318
+ uint32_t values[]= { 3195025439U, 2556848621U, 3724893440U, 3332385401U,
4319
+ 245758794U, 2550894432U, 121710495U, 3053817768U,
4320
+ 1250994555U, 1862072655U, 2631955953U, 2951528551U,
4321
+ 1451250070U, 2820856945U, 2060845566U, 3646985608U,
4322
+ 2138080750U, 217675895U, 2230934345U, 1234361223U,
4323
+ 3968582726U, 2455685270U, 1293568479U, 199067604U,
4324
+ 2042482093U };
4325
+
4326
+
4327
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4328
+ {
4329
+ uint32_t hash_val;
4330
+
4331
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MD5);
4332
+ assert(values[x] == hash_val);
4333
+ }
4334
+
4335
+ return TEST_SUCCESS;
4336
+ }
4337
+
4338
+ static test_return crc_run (memcached_st *memc __attribute__((unused)))
4339
+ {
4340
+ uint32_t x;
4341
+ const char **ptr;
4342
+ uint32_t values[]= { 10542U, 22009U, 14526U, 19510U, 19432U, 10199U, 20634U,
4343
+ 9369U, 11511U, 10362U, 7893U, 31289U, 11313U, 9354U,
4344
+ 7621U, 30628U, 15218U, 25967U, 2695U, 9380U,
4345
+ 17300U, 28156U, 9192U, 20484U, 16925U };
4346
+
4347
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4348
+ {
4349
+ uint32_t hash_val;
4350
+
4351
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_CRC);
4352
+ assert(values[x] == hash_val);
4353
+ }
4354
+
4355
+ return TEST_SUCCESS;
4356
+ }
4357
+
4358
+ static test_return fnv1_64_run (memcached_st *memc __attribute__((unused)))
4359
+ {
4360
+ uint32_t x;
4361
+ const char **ptr;
4362
+ uint32_t values[]= { 473199127U, 4148981457U, 3971873300U, 3257986707U,
4363
+ 1722477987U, 2991193800U, 4147007314U, 3633179701U,
4364
+ 1805162104U, 3503289120U, 3395702895U, 3325073042U,
4365
+ 2345265314U, 3340346032U, 2722964135U, 1173398992U,
4366
+ 2815549194U, 2562818319U, 224996066U, 2680194749U,
4367
+ 3035305390U, 246890365U, 2395624193U, 4145193337U,
4368
+ 1801941682U };
4369
+
4370
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4371
+ {
4372
+ uint32_t hash_val;
4373
+
4374
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_64);
4375
+ assert(values[x] == hash_val);
4376
+ }
4377
+
4378
+ return TEST_SUCCESS;
4379
+ }
4380
+
4381
+ static test_return fnv1a_64_run (memcached_st *memc __attribute__((unused)))
4382
+ {
4383
+ uint32_t x;
4384
+ const char **ptr;
4385
+ uint32_t values[]= { 1488911807U, 2500855813U, 1510099634U, 1390325195U,
4386
+ 3647689787U, 3241528582U, 1669328060U, 2604311949U,
4387
+ 734810122U, 1516407546U, 560948863U, 1767346780U,
4388
+ 561034892U, 4156330026U, 3716417003U, 3475297030U,
4389
+ 1518272172U, 227211583U, 3938128828U, 126112909U,
4390
+ 3043416448U, 3131561933U, 1328739897U, 2455664041U,
4391
+ 2272238452U };
4392
+
4393
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4394
+ {
4395
+ uint32_t hash_val;
4396
+
4397
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_64);
4398
+ assert(values[x] == hash_val);
4399
+ }
4400
+
4401
+ return TEST_SUCCESS;
4402
+ }
4403
+
4404
+ static test_return fnv1_32_run (memcached_st *memc __attribute__((unused)))
4405
+ {
4406
+ uint32_t x;
4407
+ const char **ptr;
4408
+ uint32_t values[]= { 67176023U, 1190179409U, 2043204404U, 3221866419U,
4409
+ 2567703427U, 3787535528U, 4147287986U, 3500475733U,
4410
+ 344481048U, 3865235296U, 2181839183U, 119581266U,
4411
+ 510234242U, 4248244304U, 1362796839U, 103389328U,
4412
+ 1449620010U, 182962511U, 3554262370U, 3206747549U,
4413
+ 1551306158U, 4127558461U, 1889140833U, 2774173721U,
4414
+ 1180552018U };
4415
+
4416
+
4417
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4418
+ {
4419
+ uint32_t hash_val;
4420
+
4421
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_32);
4422
+ assert(values[x] == hash_val);
4423
+ }
4424
+
4425
+ return TEST_SUCCESS;
4426
+ }
4427
+
4428
+ static test_return fnv1a_32_run (memcached_st *memc __attribute__((unused)))
4429
+ {
4430
+ uint32_t x;
4431
+ const char **ptr;
4432
+ uint32_t values[]= { 280767167U, 2421315013U, 3072375666U, 855001899U,
4433
+ 459261019U, 3521085446U, 18738364U, 1625305005U,
4434
+ 2162232970U, 777243802U, 3323728671U, 132336572U,
4435
+ 3654473228U, 260679466U, 1169454059U, 2698319462U,
4436
+ 1062177260U, 235516991U, 2218399068U, 405302637U,
4437
+ 1128467232U, 3579622413U, 2138539289U, 96429129U,
4438
+ 2877453236U };
4439
+
4440
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4441
+ {
4442
+ uint32_t hash_val;
4443
+
4444
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_32);
4445
+ assert(values[x] == hash_val);
4446
+ }
4447
+
4448
+ return TEST_SUCCESS;
4449
+ }
4450
+
4451
+ static test_return hsieh_run (memcached_st *memc __attribute__((unused)))
4452
+ {
4453
+ uint32_t x;
4454
+ const char **ptr;
4455
+ #ifdef HAVE_HSIEH_HASH
4456
+ uint32_t values[]= { 3738850110, 3636226060, 3821074029, 3489929160, 3485772682, 80540287,
4457
+ 1805464076, 1895033657, 409795758, 979934958, 3634096985, 1284445480,
4458
+ 2265380744, 707972988, 353823508, 1549198350, 1327930172, 9304163,
4459
+ 4220749037, 2493964934, 2777873870, 2057831732, 1510213931, 2027828987,
4460
+ 3395453351 };
4461
+ #else
4462
+ uint32_t values[]= { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
4463
+ #endif
4464
+
4465
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4466
+ {
4467
+ uint32_t hash_val;
4468
+
4469
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_HSIEH);
4470
+ assert(values[x] == hash_val);
4471
+ }
4472
+
4473
+ return TEST_SUCCESS;
4474
+ }
4475
+
4476
+ static test_return murmur_run (memcached_st *memc __attribute__((unused)))
4477
+ {
4478
+ uint32_t x;
4479
+ const char **ptr;
4480
+ uint32_t values[]= { 473199127U, 4148981457U, 3971873300U, 3257986707U,
4481
+ 1722477987U, 2991193800U, 4147007314U, 3633179701U,
4482
+ 1805162104U, 3503289120U, 3395702895U, 3325073042U,
4483
+ 2345265314U, 3340346032U, 2722964135U, 1173398992U,
4484
+ 2815549194U, 2562818319U, 224996066U, 2680194749U,
4485
+ 3035305390U, 246890365U, 2395624193U, 4145193337U,
4486
+ 1801941682U };
4487
+
4488
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4489
+ {
4490
+ uint32_t hash_val;
4491
+
4492
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_64);
4493
+ assert(values[x] == hash_val);
4494
+ }
4495
+
4496
+ return TEST_SUCCESS;
4497
+ }
4498
+
4499
+ static test_return jenkins_run (memcached_st *memc __attribute__((unused)))
4500
+ {
4501
+ uint32_t x;
4502
+ const char **ptr;
4503
+ uint32_t values[]= { 1442444624U, 4253821186U, 1885058256U, 2120131735U,
4504
+ 3261968576U, 3515188778U, 4232909173U, 4288625128U,
4505
+ 1812047395U, 3689182164U, 2502979932U, 1214050606U,
4506
+ 2415988847U, 1494268927U, 1025545760U, 3920481083U,
4507
+ 4153263658U, 3824871822U, 3072759809U, 798622255U,
4508
+ 3065432577U, 1453328165U, 2691550971U, 3408888387U,
4509
+ 2629893356U };
4510
+
4511
+
4512
+ for (ptr= list, x= 0; *ptr; ptr++, x++)
4513
+ {
4514
+ uint32_t hash_val;
4515
+
4516
+ hash_val= memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_JENKINS);
4517
+ assert(values[x] == hash_val);
4518
+ }
4519
+
4520
+ return TEST_SUCCESS;
4521
+ }
4522
+
4523
+ static memcached_return check_touch_capability(memcached_st *memc)
4524
+ {
4525
+ test_return test_rc= pre_binary(memc);
4526
+
4527
+ if (test_rc != TEST_SUCCESS)
4528
+ return MEMCACHED_PROTOCOL_ERROR;
4529
+
4530
+ const char *key= "touch_capability_key";
4531
+ const char *val= "touch_capability_val";
4532
+ memcached_return rc = memcached_touch(memc, key, strlen(key), 1);
4533
+ /* it should return NOTFOUND here if TOUCH is implemented */
4534
+ return (rc == MEMCACHED_NOTFOUND) ? MEMCACHED_SUCCESS : MEMCACHED_PROTOCOL_ERROR;
4535
+ }
4536
+
4537
+ static test_return test_memcached_touch(memcached_st *memc)
4538
+ {
4539
+ const char *key= "touchkey";
4540
+ const char *val= "touchval";
4541
+ size_t len;
4542
+ uint32_t flags;
4543
+ memcached_return rc;
4544
+ char *value;
4545
+
4546
+ value= memcached_get(memc, key, strlen(key), &len, &flags, &rc);
4547
+ assert(len == 0);
4548
+ assert(value == 0);
4549
+ assert(rc == MEMCACHED_NOTFOUND);
4550
+
4551
+ rc= memcached_set(memc, key, strlen(key), val, strlen(val), 2, 0);
4552
+ assert(rc == MEMCACHED_SUCCESS);
4553
+
4554
+ sleep(1);
4555
+
4556
+ value= memcached_get(memc, key, strlen(key), &len, &flags, &rc);
4557
+ assert(len == 8);
4558
+ assert(memcmp(value, val, len) == 0);
4559
+ assert(rc == MEMCACHED_SUCCESS);
4560
+
4561
+ rc= memcached_touch(memc, key, strlen(key), 3);
4562
+ assert(rc == MEMCACHED_SUCCESS);
4563
+
4564
+ sleep(2);
4565
+
4566
+ value= memcached_get(memc, key, strlen(key), &len, &flags, &rc);
4567
+ assert(len == 8);
4568
+ assert(memcmp(value, val, len) == 0);
4569
+ assert(rc == MEMCACHED_SUCCESS);
4570
+
4571
+ sleep(2);
4572
+
4573
+ value= memcached_get(memc, key, strlen(key), &len, &flags, &rc);
4574
+ assert(len == 0);
4575
+ assert(value == 0);
4576
+ assert(rc == MEMCACHED_NOTFOUND);
4577
+
4578
+ return TEST_SUCCESS;
4579
+ }
4580
+
4581
+ static test_return test_memcached_touch_with_prefix(memcached_st *orig_memc)
4582
+ {
4583
+ const char *key= "touchkey";
4584
+ const char *val= "touchval";
4585
+ const char *prefix= "namespace:";
4586
+ memcached_return rc;
4587
+ memcached_st *memc= memcached_clone(NULL, orig_memc);
4588
+
4589
+ rc = memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)prefix);
4590
+ assert(rc == MEMCACHED_SUCCESS);
4591
+
4592
+ rc= memcached_set(memc, key, strlen(key), val, strlen(val), 2, 0);
4593
+ assert(rc == MEMCACHED_SUCCESS);
4594
+
4595
+ rc= memcached_touch(memc, key, strlen(key), 3);
4596
+ assert(rc == MEMCACHED_SUCCESS);
4597
+
4598
+ return TEST_SUCCESS;
4599
+ }
4600
+
4601
+
4602
+ test_st udp_setup_server_tests[] ={
4603
+ {"set_udp_behavior_test", 0, set_udp_behavior_test},
4604
+ {"add_tcp_server_udp_client_test", 0, add_tcp_server_udp_client_test},
4605
+ {"add_udp_server_tcp_client_test", 0, add_udp_server_tcp_client_test},
4606
+ {0, 0, 0}
4607
+ };
4608
+
4609
+ test_st upd_io_tests[] ={
4610
+ {"udp_set_test", 0, udp_set_test},
4611
+ {"udp_buffered_set_test", 0, udp_buffered_set_test},
4612
+ {"udp_set_too_big_test", 0, udp_set_too_big_test},
4613
+ {"udp_delete_test", 0, udp_delete_test},
4614
+ {"udp_buffered_delete_test", 0, udp_buffered_delete_test},
4615
+ {"udp_verbosity_test", 0, udp_verbosity_test},
4616
+ {"udp_quit_test", 0, udp_quit_test},
4617
+ {"udp_flush_test", 0, udp_flush_test},
4618
+ {"udp_incr_test", 0, udp_incr_test},
4619
+ {"udp_decr_test", 0, udp_decr_test},
4620
+ {"udp_stat_test", 0, udp_stat_test},
4621
+ {"udp_version_test", 0, udp_version_test},
4622
+ {"udp_get_test", 0, udp_get_test},
4623
+ {"udp_mixed_io_test", 0, udp_mixed_io_test},
4624
+ {0, 0, 0}
4625
+ };
4626
+
4627
+ /* Clean the server before beginning testing */
4628
+ test_st tests[] ={
4629
+ {"flush", 0, flush_test },
4630
+ {"init", 0, init_test },
4631
+ {"allocation", 0, allocation_test },
4632
+ {"server_list_null_test", 0, server_list_null_test},
4633
+ {"server_unsort", 0, server_unsort_test},
4634
+ {"server_sort", 0, server_sort_test},
4635
+ {"server_sort2", 0, server_sort2_test},
4636
+ {"clone_test", 0, clone_test },
4637
+ {"connection_test", 0, connection_test},
4638
+ {"callback_test", 0, callback_test},
4639
+ {"behavior_test", 0, behavior_test},
4640
+ {"userdata_test", 0, userdata_test},
4641
+ {"error", 0, error_test },
4642
+ {"set", 0, set_test },
4643
+ {"set2", 0, set_test2 },
4644
+ {"set3", 0, set_test3 },
4645
+ /* {"dump", 1, dump_test},*/
4646
+ {"add", 1, add_test },
4647
+ {"replace", 1, replace_test },
4648
+ {"delete", 1, delete_test },
4649
+ {"get", 1, get_test },
4650
+ {"get2", 0, get_test2 },
4651
+ {"get3", 0, get_test3 },
4652
+ {"get4", 0, get_test4 },
4653
+ {"partial mget", 0, get_test5 },
4654
+ {"get_miss_noop", 0, get_test6 },
4655
+ {"get_len", 1, get_len_test },
4656
+ {"get_len2", 0, get_len_test2 },
4657
+ {"get_len3", 0, get_len_test3 },
4658
+ {"stats_servername", 0, stats_servername_test },
4659
+ {"increment", 0, increment_test },
4660
+ {"increment_with_initial", 1, increment_with_initial_test },
4661
+ {"decrement", 0, decrement_test },
4662
+ {"decrement_with_initial", 1, decrement_with_initial_test },
4663
+ {"quit", 0, quit_test },
4664
+ {"mget", 1, mget_test },
4665
+ {"mget_result", 1, mget_result_test },
4666
+ {"mget_len_result", 1, mget_len_result_test },
4667
+ {"mget_result_alloc", 1, mget_result_alloc_test },
4668
+ {"mget_result_function", 1, mget_result_function },
4669
+ {"get_stats", 0, get_stats },
4670
+ {"add_host_test", 0, add_host_test },
4671
+ {"add_host_test_1", 0, add_host_test1 },
4672
+ {"get_stats_keys", 0, get_stats_keys },
4673
+ {"behavior_test", 0, get_stats_keys },
4674
+ {"callback_test", 0, get_stats_keys },
4675
+ {"version_string_test", 0, version_string_test},
4676
+ {"bad_key", 1, bad_key_test },
4677
+ {"memcached_server_cursor", 1, memcached_server_cursor_test },
4678
+ {"read_through", 1, read_through },
4679
+ {"delete_through", 1, delete_through },
4680
+ {"noreply", 1, noreply_test},
4681
+ {"analyzer", 1, analyzer_test},
4682
+ #ifdef HAVE_LIBMEMCACHEDUTIL
4683
+ {"connectionpool", 1, connection_pool_test },
4684
+ #endif
4685
+ {0, 0, 0}
4686
+ };
4687
+
4688
+ test_st async_tests[] ={
4689
+ {"add", 1, add_wrapper },
4690
+ {0, 0, 0}
4691
+ };
4692
+
4693
+ test_st string_tests[] ={
4694
+ {"string static with null", 0, string_static_null },
4695
+ {"string alloc with null", 0, string_alloc_null },
4696
+ {"string alloc with 1K", 0, string_alloc_with_size },
4697
+ {"string alloc with malloc failure", 0, string_alloc_with_size_toobig },
4698
+ {"string append", 0, string_alloc_append },
4699
+ {"string append failure (too big)", 0, string_alloc_append_toobig },
4700
+ {0, 0, 0}
4701
+ };
4702
+
4703
+ test_st result_tests[] ={
4704
+ {"result static", 0, result_static},
4705
+ {"result alloc", 0, result_alloc},
4706
+ {0, 0, 0}
4707
+ };
4708
+
4709
+ test_st version_1_2_3[] ={
4710
+ {"append", 0, append_test },
4711
+ {"prepend", 0, prepend_test },
4712
+ {"cas", 0, cas_test },
4713
+ {"cas2", 0, cas2_test },
4714
+ {"mget_len_no_cas", 0, mget_len_no_cas_test },
4715
+ {"mget_len_cas", 0, mget_len_cas_test },
4716
+ {"append_binary", 0, append_binary_test },
4717
+ {0, 0, 0}
4718
+ };
4719
+
4720
+ test_st user_tests[] ={
4721
+ {"user_supplied_bug1", 0, user_supplied_bug1 },
4722
+ {"user_supplied_bug2", 0, user_supplied_bug2 },
4723
+ {"user_supplied_bug3", 0, user_supplied_bug3 },
4724
+ {"user_supplied_bug4", 0, user_supplied_bug4 },
4725
+ {"user_supplied_bug5", 1, user_supplied_bug5 },
4726
+ {"user_supplied_bug6", 1, user_supplied_bug6 },
4727
+ {"user_supplied_bug7", 1, user_supplied_bug7 },
4728
+ {"user_supplied_bug8", 1, user_supplied_bug8 },
4729
+ {"user_supplied_bug9", 1, user_supplied_bug9 },
4730
+ {"user_supplied_bug10", 1, user_supplied_bug10 },
4731
+ {"user_supplied_bug11", 1, user_supplied_bug11 },
4732
+ {"user_supplied_bug12", 1, user_supplied_bug12 },
4733
+ {"user_supplied_bug13", 1, user_supplied_bug13 },
4734
+ {"user_supplied_bug14", 1, user_supplied_bug14 },
4735
+ {"user_supplied_bug15", 1, user_supplied_bug15 },
4736
+ {"user_supplied_bug16", 1, user_supplied_bug16 },
4737
+ #ifndef __sun
4738
+ /*
4739
+ ** It seems to be something weird with the character sets..
4740
+ ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
4741
+ ** guess I need to find out how this is supposed to work.. Perhaps I need
4742
+ ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
4743
+ ** so just disable the code for now...).
4744
+ */
4745
+ {"user_supplied_bug17", 1, user_supplied_bug17 },
4746
+ #endif
4747
+ {"user_supplied_bug18", 1, user_supplied_bug18 },
4748
+ {"user_supplied_bug19", 1, user_supplied_bug19 },
4749
+ {"user_supplied_bug20", 1, user_supplied_bug20 },
4750
+ {0, 0, 0}
4751
+ };
4752
+
4753
+ test_st generate_tests[] ={
4754
+ {"generate_pairs", 1, generate_pairs },
4755
+ {"generate_data", 1, generate_data },
4756
+ {"get_read", 0, get_read },
4757
+ {"delete_generate", 0, delete_generate },
4758
+ {"generate_buffer_data", 1, generate_buffer_data },
4759
+ {"delete_buffer", 0, delete_buffer_generate},
4760
+ {"generate_data", 1, generate_data },
4761
+ {"mget_read", 0, mget_read },
4762
+ {"mget_read_result", 0, mget_read_result },
4763
+ {"mget_read_function", 0, mget_read_function },
4764
+ {"cleanup", 1, cleanup_pairs },
4765
+ {"generate_large_pairs", 1, generate_large_pairs },
4766
+ {"generate_data", 1, generate_data },
4767
+ {"generate_buffer_data", 1, generate_buffer_data },
4768
+ {"cleanup", 1, cleanup_pairs },
4769
+ {0, 0, 0}
4770
+ };
4771
+
4772
+ test_st consistent_tests[] ={
4773
+ {"generate_pairs", 1, generate_pairs },
4774
+ {"generate_data", 1, generate_data },
4775
+ {"get_read", 0, get_read_count },
4776
+ {"cleanup", 1, cleanup_pairs },
4777
+ {0, 0, 0}
4778
+ };
4779
+
4780
+ test_st consistent_weighted_tests[] ={
4781
+ {"generate_pairs", 1, generate_pairs },
4782
+ {"generate_data", 1, generate_data_with_stats },
4783
+ {"get_read", 0, get_read_count },
4784
+ {"cleanup", 1, cleanup_pairs },
4785
+ {0, 0, 0}
4786
+ };
4787
+
4788
+ test_st hsieh_availability[] ={
4789
+ {"hsieh_avaibility_test",0,hsieh_avaibility_test},
4790
+ {0, 0, 0}
4791
+ };
4792
+
4793
+ test_st ketama_auto_eject_hosts[] ={
4794
+ {"auto_eject_hosts", 1, auto_eject_hosts },
4795
+ {0, 0, 0}
4796
+ };
4797
+
4798
+ test_st hash_tests[] ={
4799
+ {"md5", 0, md5_run },
4800
+ {"crc", 0, crc_run },
4801
+ {"fnv1_64", 0, fnv1_64_run },
4802
+ {"fnv1a_64", 0, fnv1a_64_run },
4803
+ {"fnv1_32", 0, fnv1_32_run },
4804
+ {"fnv1a_32", 0, fnv1a_32_run },
4805
+ {"hsieh", 0, hsieh_run },
4806
+ {"murmur", 0, murmur_run },
4807
+ {"jenkis", 0, jenkins_run },
4808
+ {0, 0, 0}
4809
+ };
4810
+
4811
+ test_st touch_tests[] ={
4812
+ {"memcached_touch", 1, test_memcached_touch},
4813
+ {"memcached_touch_with_prefix", 1, test_memcached_touch_with_prefix},
4814
+ {0, 0, 0}
4815
+ };
4816
+
4817
+ collection_st collection[] ={
4818
+ {"hsieh_availability",0,0,hsieh_availability},
4819
+ {"udp_setup", init_udp, 0, udp_setup_server_tests},
4820
+ {"udp_io", init_udp, 0, upd_io_tests},
4821
+ {"udp_binary_io", binary_init_udp, 0, upd_io_tests},
4822
+ {"block", 0, 0, tests},
4823
+ {"binary", pre_binary, 0, tests},
4824
+ {"nonblock", pre_nonblock, 0, tests},
4825
+ {"nodelay", pre_nodelay, 0, tests},
4826
+ {"settimer", pre_settimer, 0, tests},
4827
+ {"md5", pre_md5, 0, tests},
4828
+ {"crc", pre_crc, 0, tests},
4829
+ {"hsieh", pre_hsieh, 0, tests},
4830
+ {"jenkins", pre_jenkins, 0, tests},
4831
+ {"fnv1_64", pre_hash_fnv1_64, 0, tests},
4832
+ {"fnv1a_64", pre_hash_fnv1a_64, 0, tests},
4833
+ {"fnv1_32", pre_hash_fnv1_32, 0, tests},
4834
+ {"fnv1a_32", pre_hash_fnv1a_32, 0, tests},
4835
+ {"ketama", pre_behavior_ketama, 0, tests},
4836
+ {"ketama_auto_eject_hosts", pre_behavior_ketama, 0, ketama_auto_eject_hosts},
4837
+ {"unix_socket", pre_unix_socket, 0, tests},
4838
+ {"unix_socket_nodelay", pre_nodelay, 0, tests},
4839
+ {"poll_timeout", poll_timeout, 0, tests},
4840
+ {"gets", enable_cas, 0, tests},
4841
+ {"consistent", enable_consistent, 0, tests},
4842
+ #ifdef MEMCACHED_ENABLE_DEPRECATED
4843
+ {"deprecated_memory_allocators", deprecated_set_memory_alloc, 0, tests},
4844
+ #endif
4845
+ {"memory_allocators", set_memory_alloc, 0, tests},
4846
+ {"prefix", set_prefix, 0, tests},
4847
+ {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3},
4848
+ {"string", 0, 0, string_tests},
4849
+ {"result", 0, 0, result_tests},
4850
+ {"async", pre_nonblock, 0, async_tests},
4851
+ {"async_binary", pre_nonblock_binary, 0, async_tests},
4852
+ {"user", 0, 0, user_tests},
4853
+ {"generate", 0, 0, generate_tests},
4854
+ {"generate_hsieh", pre_hsieh, 0, generate_tests},
4855
+ {"generate_ketama", pre_behavior_ketama, 0, generate_tests},
4856
+ {"generate_hsieh_consistent", enable_consistent, 0, generate_tests},
4857
+ {"generate_md5", pre_md5, 0, generate_tests},
4858
+ {"generate_murmur", pre_murmur, 0, generate_tests},
4859
+ {"generate_jenkins", pre_jenkins, 0, generate_tests},
4860
+ {"generate_nonblock", pre_nonblock, 0, generate_tests},
4861
+ {"consistent_not", 0, 0, consistent_tests},
4862
+ {"consistent_ketama", pre_behavior_ketama, 0, consistent_tests},
4863
+ {"consistent_ketama_weighted", pre_behavior_ketama_weighted, 0, consistent_weighted_tests},
4864
+ {"test_hashes", 0, 0, hash_tests},
4865
+ {"touch", check_touch_capability, 0, touch_tests},
4866
+ {0, 0, 0, 0}
4867
+ };
4868
+
4869
+ #define SERVERS_TO_CREATE 5
4870
+
4871
+ /* Prototypes for functions we will pass to test framework */
4872
+ void *world_create(void);
4873
+ void world_destroy(void *p);
4874
+
4875
+ void *world_create(void)
4876
+ {
4877
+ server_startup_st *construct;
4878
+
4879
+ construct= (server_startup_st *)malloc(sizeof(server_startup_st));
4880
+ memset(construct, 0, sizeof(server_startup_st));
4881
+ construct->count= SERVERS_TO_CREATE;
4882
+ construct->udp= 0;
4883
+ server_startup(construct);
4884
+
4885
+ return construct;
4886
+ }
4887
+
4888
+
4889
+ void world_destroy(void *p)
4890
+ {
4891
+ server_startup_st *construct= (server_startup_st *)p;
4892
+ memcached_server_st *servers= (memcached_server_st *)construct->servers;
4893
+ memcached_server_list_free(servers);
4894
+
4895
+ server_shutdown(construct);
4896
+ free(construct);
4897
+ }
4898
+
4899
+ void get_world(world_st *world)
4900
+ {
4901
+ world->collections= collection;
4902
+ world->create= world_create;
4903
+ world->destroy= world_destroy;
4904
+ }