1 /* libMemcached Functions Test
2 * Copyright (C) 2006-2009 Brian Aker
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
10 Sample test application.
13 #include "libmemcached/common.h"
20 #include <sys/types.h>
26 #include "clients/generator.h"
27 #include "clients/execute.h"
30 #define INT64_MAX LONG_MAX
33 #define INT32_MAX INT_MAX
39 #ifdef HAVE_LIBMEMCACHEDUTIL
41 #include "libmemcached/memcached_util.h"
44 #include "hash_results.h"
46 #define GLOBAL_COUNT 10000
47 #define GLOBAL2_COUNT 100
48 #define SERVERS_TO_CREATE 5
49 static uint32_t global_count
;
51 static pairs_st
*global_pairs
;
52 static const char *global_keys
[GLOBAL_COUNT
];
53 static size_t global_keys_length
[GLOBAL_COUNT
];
55 static test_return_t
init_test(memcached_st
*not_used
__attribute__((unused
)))
59 (void)memcached_create(&memc
);
60 memcached_free(&memc
);
65 static test_return_t
server_list_null_test(memcached_st
*ptr
__attribute__((unused
)))
67 memcached_server_st
*server_list
;
68 memcached_return_t rc
;
70 server_list
= memcached_server_list_append_with_weight(NULL
, NULL
, 0, 0, NULL
);
71 test_truth(server_list
== NULL
);
73 server_list
= memcached_server_list_append_with_weight(NULL
, "localhost", 0, 0, NULL
);
74 test_truth(server_list
== NULL
);
76 server_list
= memcached_server_list_append_with_weight(NULL
, NULL
, 0, 0, &rc
);
77 test_truth(server_list
== NULL
);
82 #define TEST_PORT_COUNT 7
83 uint32_t test_ports
[TEST_PORT_COUNT
];
85 static memcached_return_t
server_display_function(memcached_st
*ptr
__attribute__((unused
)), memcached_server_st
*server
, void *context
)
88 uint32_t bigger
= *((uint32_t *)(context
));
89 assert(bigger
<= server
->port
);
90 *((uint32_t *)(context
))= server
->port
;
92 return MEMCACHED_SUCCESS
;
95 static test_return_t
server_sort_test(memcached_st
*ptr
__attribute__((unused
)))
98 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
99 memcached_return_t rc
;
100 memcached_server_fn callbacks
[1];
101 memcached_st
*local_memc
;
103 local_memc
= memcached_create(NULL
);
104 test_truth(local_memc
);
105 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
107 for (x
= 0; x
< TEST_PORT_COUNT
; x
++)
109 test_ports
[x
]= (uint32_t)random() % 64000;
110 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
111 test_truth(local_memc
->number_of_hosts
== x
+ 1);
112 test_truth(local_memc
->hosts
[0].count
== x
+1);
113 test_truth(rc
== MEMCACHED_SUCCESS
);
116 callbacks
[0]= server_display_function
;
117 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
120 memcached_free(local_memc
);
125 static test_return_t
server_sort2_test(memcached_st
*ptr
__attribute__((unused
)))
127 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
128 memcached_return_t rc
;
129 memcached_server_fn callbacks
[1];
130 memcached_st
*local_memc
;
132 local_memc
= memcached_create(NULL
);
133 test_truth(local_memc
);
134 rc
= memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
135 test_truth(rc
== MEMCACHED_SUCCESS
);
137 rc
= memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0);
138 test_truth(rc
== MEMCACHED_SUCCESS
);
139 test_truth(local_memc
->hosts
[0].port
== 43043);
141 rc
= memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0);
142 test_truth(rc
== MEMCACHED_SUCCESS
);
143 test_truth(local_memc
->hosts
[0].port
== 43042);
144 test_truth(local_memc
->hosts
[1].port
== 43043);
146 callbacks
[0]= server_display_function
;
147 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
150 memcached_free(local_memc
);
155 static memcached_return_t
server_display_unsort_function(memcached_st
*ptr
__attribute__((unused
)), memcached_server_st
*server
, void *context
)
158 uint32_t x
= *((uint32_t *)(context
));
160 assert(test_ports
[x
] == server
->port
);
161 *((uint32_t *)(context
))= ++x
;
163 return MEMCACHED_SUCCESS
;
166 static test_return_t
server_unsort_test(memcached_st
*ptr
__attribute__((unused
)))
169 uint32_t counter
= 0; /* Prime the value for the test_truth in server_display_function */
170 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
171 memcached_return_t rc
;
172 memcached_server_fn callbacks
[1];
173 memcached_st
*local_memc
;
175 local_memc
= memcached_create(NULL
);
176 test_truth(local_memc
);
178 for (x
= 0; x
< TEST_PORT_COUNT
; x
++)
180 test_ports
[x
]= (uint32_t)(random() % 64000);
181 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
182 test_truth(local_memc
->number_of_hosts
== x
+1);
183 test_truth(local_memc
->hosts
[0].count
== x
+1);
184 test_truth(rc
== MEMCACHED_SUCCESS
);
187 callbacks
[0]= server_display_unsort_function
;
188 memcached_server_cursor(local_memc
, callbacks
, (void *)&counter
, 1);
190 /* Now we sort old data! */
191 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
192 callbacks
[0]= server_display_function
;
193 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
196 memcached_free(local_memc
);
201 static test_return_t
allocation_test(memcached_st
*not_used
__attribute__((unused
)))
204 memc
= memcached_create(NULL
);
206 memcached_free(memc
);
211 static test_return_t
clone_test(memcached_st
*memc
)
215 memcached_st
*memc_clone
;
216 memc_clone
= memcached_clone(NULL
, NULL
);
217 test_truth(memc_clone
);
218 memcached_free(memc_clone
);
221 /* Can we init from null? */
223 memcached_st
*memc_clone
;
224 memc_clone
= memcached_clone(NULL
, memc
);
225 test_truth(memc_clone
);
227 test_truth(memc_clone
->call_free
== memc
->call_free
);
228 test_truth(memc_clone
->call_malloc
== memc
->call_malloc
);
229 test_truth(memc_clone
->call_realloc
== memc
->call_realloc
);
230 test_truth(memc_clone
->call_calloc
== memc
->call_calloc
);
231 test_truth(memc_clone
->connect_timeout
== memc
->connect_timeout
);
232 test_truth(memc_clone
->delete_trigger
== memc
->delete_trigger
);
233 test_truth(memc_clone
->distribution
== memc
->distribution
);
234 { // Test all of the flags
235 test_truth(memc_clone
->flags
.no_block
== memc
->flags
.no_block
);
236 test_truth(memc_clone
->flags
.tcp_nodelay
== memc
->flags
.tcp_nodelay
);
237 test_truth(memc_clone
->flags
.reuse_memory
== memc
->flags
.reuse_memory
);
238 test_truth(memc_clone
->flags
.use_cache_lookups
== memc
->flags
.use_cache_lookups
);
239 test_truth(memc_clone
->flags
.support_cas
== memc
->flags
.support_cas
);
240 test_truth(memc_clone
->flags
.buffer_requests
== memc
->flags
.buffer_requests
);
241 test_truth(memc_clone
->flags
.use_sort_hosts
== memc
->flags
.use_sort_hosts
);
242 test_truth(memc_clone
->flags
.verify_key
== memc
->flags
.verify_key
);
243 test_truth(memc_clone
->flags
.ketama_weighted
== memc
->flags
.ketama_weighted
);
244 test_truth(memc_clone
->flags
.binary_protocol
== memc
->flags
.binary_protocol
);
245 test_truth(memc_clone
->flags
.hash_with_prefix_key
== memc
->flags
.hash_with_prefix_key
);
246 test_truth(memc_clone
->flags
.no_reply
== memc
->flags
.no_reply
);
247 test_truth(memc_clone
->flags
.use_udp
== memc
->flags
.use_udp
);
248 test_truth(memc_clone
->flags
.auto_eject_hosts
== memc
->flags
.auto_eject_hosts
);
249 test_truth(memc_clone
->flags
.randomize_replica_read
== memc
->flags
.randomize_replica_read
);
251 test_truth(memc_clone
->get_key_failure
== memc
->get_key_failure
);
252 test_truth(memc_clone
->hash
== memc
->hash
);
253 test_truth(memc_clone
->distribution_hash
== memc
->distribution_hash
);
254 test_truth(memc_clone
->io_bytes_watermark
== memc
->io_bytes_watermark
);
255 test_truth(memc_clone
->io_msg_watermark
== memc
->io_msg_watermark
);
256 test_truth(memc_clone
->io_key_prefetch
== memc
->io_key_prefetch
);
257 test_truth(memc_clone
->on_cleanup
== memc
->on_cleanup
);
258 test_truth(memc_clone
->on_clone
== memc
->on_clone
);
259 test_truth(memc_clone
->poll_timeout
== memc
->poll_timeout
);
260 test_truth(memc_clone
->rcv_timeout
== memc
->rcv_timeout
);
261 test_truth(memc_clone
->recv_size
== memc
->recv_size
);
262 test_truth(memc_clone
->retry_timeout
== memc
->retry_timeout
);
263 test_truth(memc_clone
->send_size
== memc
->send_size
);
264 test_truth(memc_clone
->server_failure_limit
== memc
->server_failure_limit
);
265 test_truth(memc_clone
->snd_timeout
== memc
->snd_timeout
);
266 test_truth(memc_clone
->user_data
== memc
->user_data
);
268 memcached_free(memc_clone
);
271 /* Can we init from struct? */
273 memcached_st declared_clone
;
274 memcached_st
*memc_clone
;
275 memset(&declared_clone
, 0 , sizeof(memcached_st
));
276 memc_clone
= memcached_clone(&declared_clone
, NULL
);
277 test_truth(memc_clone
);
278 memcached_free(memc_clone
);
281 /* Can we init from struct? */
283 memcached_st declared_clone
;
284 memcached_st
*memc_clone
;
285 memset(&declared_clone
, 0 , sizeof(memcached_st
));
286 memc_clone
= memcached_clone(&declared_clone
, memc
);
287 test_truth(memc_clone
);
288 memcached_free(memc_clone
);
294 static test_return_t
userdata_test(memcached_st
*memc
)
297 test_truth(memcached_set_user_data(memc
, foo
) == NULL
);
298 test_truth(memcached_get_user_data(memc
) == foo
);
299 test_truth(memcached_set_user_data(memc
, NULL
) == foo
);
304 static test_return_t
connection_test(memcached_st
*memc
)
306 memcached_return_t rc
;
308 rc
= memcached_server_add_with_weight(memc
, "localhost", 0, 0);
309 test_truth(rc
== MEMCACHED_SUCCESS
);
314 static test_return_t
error_test(memcached_st
*memc
)
316 memcached_return_t rc
;
317 uint32_t values
[] = { 851992627U, 2337886783U, 3196981036U, 4001849190U,
318 982370485U, 1263635348U, 4242906218U, 3829656100U,
319 1891735253U, 334139633U, 2257084983U, 3088286104U,
320 13199785U, 2542027183U, 1097051614U, 199566778U,
321 2748246961U, 2465192557U, 1664094137U, 2405439045U,
322 1842224848U, 692413798U, 3479807801U, 919913813U,
323 4269430871U, 610793021U, 527273862U, 1437122909U,
324 2300930706U, 2943759320U, 674306647U, 2400528935U,
325 54481931U, 4186304426U, 1741088401U, 2979625118U,
326 4159057246U, 3425930182U, 2593724503U};
328 // You have updated the memcache_error messages but not updated docs/tests.
329 test_truth(MEMCACHED_MAXIMUM_RETURN
== 39);
330 for (rc
= MEMCACHED_SUCCESS
; rc
< MEMCACHED_MAXIMUM_RETURN
; rc
++)
333 const char *msg
= memcached_strerror(memc
, rc
);
334 hash_val
= memcached_generate_hash_value(msg
, strlen(msg
),
335 MEMCACHED_HASH_JENKINS
);
336 test_truth(values
[rc
] == hash_val
);
342 static test_return_t
set_test(memcached_st
*memc
)
344 memcached_return_t rc
;
345 const char *key
= "foo";
346 const char *value
= "when we sanitize";
348 rc
= memcached_set(memc
, key
, strlen(key
),
349 value
, strlen(value
),
350 (time_t)0, (uint32_t)0);
351 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
356 static test_return_t
append_test(memcached_st
*memc
)
358 memcached_return_t rc
;
359 const char *key
= "fig";
360 const char *in_value
= "we";
361 char *out_value
= NULL
;
365 rc
= memcached_flush(memc
, 0);
366 test_truth(rc
== MEMCACHED_SUCCESS
);
368 rc
= memcached_set(memc
, key
, strlen(key
),
369 in_value
, strlen(in_value
),
370 (time_t)0, (uint32_t)0);
371 test_truth(rc
== MEMCACHED_SUCCESS
);
373 rc
= memcached_append(memc
, key
, strlen(key
),
374 " the", strlen(" the"),
375 (time_t)0, (uint32_t)0);
376 test_truth(rc
== MEMCACHED_SUCCESS
);
378 rc
= memcached_append(memc
, key
, strlen(key
),
379 " people", strlen(" people"),
380 (time_t)0, (uint32_t)0);
381 test_truth(rc
== MEMCACHED_SUCCESS
);
383 out_value
= memcached_get(memc
, key
, strlen(key
),
384 &value_length
, &flags
, &rc
);
385 test_truth(!memcmp(out_value
, "we the people", strlen("we the people")));
386 test_truth(strlen("we the people") == value_length
);
387 test_truth(rc
== MEMCACHED_SUCCESS
);
393 static test_return_t
append_binary_test(memcached_st
*memc
)
395 memcached_return_t rc
;
396 const char *key
= "numbers";
397 unsigned int *store_ptr
;
398 unsigned int store_list
[] = { 23, 56, 499, 98, 32847, 0 };
404 rc
= memcached_flush(memc
, 0);
405 test_truth(rc
== MEMCACHED_SUCCESS
);
407 rc
= memcached_set(memc
,
410 (time_t)0, (uint32_t)0);
411 test_truth(rc
== MEMCACHED_SUCCESS
);
413 for (x
= 0; store_list
[x
] ; x
++)
415 rc
= memcached_append(memc
,
417 (char *)&store_list
[x
], sizeof(unsigned int),
418 (time_t)0, (uint32_t)0);
419 test_truth(rc
== MEMCACHED_SUCCESS
);
422 value
= memcached_get(memc
, key
, strlen(key
),
423 &value_length
, &flags
, &rc
);
424 test_truth((value_length
== (sizeof(unsigned int) * x
)));
425 test_truth(rc
== MEMCACHED_SUCCESS
);
427 store_ptr
= (unsigned int *)value
;
429 while ((size_t)store_ptr
< (size_t)(value
+ value_length
))
431 test_truth(*store_ptr
== store_list
[x
++]);
439 static test_return_t
cas2_test(memcached_st
*memc
)
441 memcached_return_t rc
;
442 const char *keys
[]= {"fudge", "son", "food"};
443 size_t key_length
[]= {5, 3, 4};
444 const char *value
= "we the people";
445 size_t value_length
= strlen("we the people");
447 memcached_result_st results_obj
;
448 memcached_result_st
*results
;
451 rc
= memcached_flush(memc
, 0);
452 test_truth(rc
== MEMCACHED_SUCCESS
);
454 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
456 for (x
= 0; x
< 3; x
++)
458 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
459 keys
[x
], key_length
[x
],
460 (time_t)50, (uint32_t)9);
461 test_truth(rc
== MEMCACHED_SUCCESS
);
464 rc
= memcached_mget(memc
, keys
, key_length
, 3);
466 results
= memcached_result_create(memc
, &results_obj
);
468 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
470 test_truth(results
->cas
);
471 test_truth(rc
== MEMCACHED_SUCCESS
);
472 test_truth(memcached_result_cas(results
));
474 test_truth(!memcmp(value
, "we the people", strlen("we the people")));
475 test_truth(strlen("we the people") == value_length
);
476 test_truth(rc
== MEMCACHED_SUCCESS
);
478 memcached_result_free(&results_obj
);
483 static test_return_t
cas_test(memcached_st
*memc
)
485 memcached_return_t rc
;
486 const char *key
= "fun";
487 size_t key_length
= strlen(key
);
488 const char *value
= "we the people";
489 const char* keys
[2] = { key
, NULL
};
490 size_t keylengths
[2] = { strlen(key
), 0 };
491 size_t value_length
= strlen(value
);
492 const char *value2
= "change the value";
493 size_t value2_length
= strlen(value2
);
495 memcached_result_st results_obj
;
496 memcached_result_st
*results
;
499 rc
= memcached_flush(memc
, 0);
500 test_truth(rc
== MEMCACHED_SUCCESS
);
502 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
504 rc
= memcached_set(memc
, key
, strlen(key
),
505 value
, strlen(value
),
506 (time_t)0, (uint32_t)0);
507 test_truth(rc
== MEMCACHED_SUCCESS
);
509 rc
= memcached_mget(memc
, keys
, keylengths
, 1);
511 results
= memcached_result_create(memc
, &results_obj
);
513 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
515 test_truth(rc
== MEMCACHED_SUCCESS
);
516 test_truth(memcached_result_cas(results
));
517 test_truth(!memcmp(value
, memcached_result_value(results
), value_length
));
518 test_truth(strlen(memcached_result_value(results
)) == value_length
);
519 test_truth(rc
== MEMCACHED_SUCCESS
);
520 uint64_t cas
= memcached_result_cas(results
);
523 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
524 test_truth(rc
== MEMCACHED_END
);
525 test_truth(results
== NULL
);
528 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
529 test_truth(rc
== MEMCACHED_SUCCESS
);
532 * The item will have a new cas value, so try to set it again with the old
533 * value. This should fail!
535 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
536 test_truth(rc
== MEMCACHED_DATA_EXISTS
);
538 memcached_result_free(&results_obj
);
543 static test_return_t
prepend_test(memcached_st
*memc
)
545 memcached_return_t rc
;
546 const char *key
= "fig";
547 const char *value
= "people";
548 char *out_value
= NULL
;
552 rc
= memcached_flush(memc
, 0);
553 test_truth(rc
== MEMCACHED_SUCCESS
);
555 rc
= memcached_set(memc
, key
, strlen(key
),
556 value
, strlen(value
),
557 (time_t)0, (uint32_t)0);
558 test_truth(rc
== MEMCACHED_SUCCESS
);
560 rc
= memcached_prepend(memc
, key
, strlen(key
),
561 "the ", strlen("the "),
562 (time_t)0, (uint32_t)0);
563 test_truth(rc
== MEMCACHED_SUCCESS
);
565 rc
= memcached_prepend(memc
, key
, strlen(key
),
566 "we ", strlen("we "),
567 (time_t)0, (uint32_t)0);
568 test_truth(rc
== MEMCACHED_SUCCESS
);
570 out_value
= memcached_get(memc
, key
, strlen(key
),
571 &value_length
, &flags
, &rc
);
572 test_truth(!memcmp(out_value
, "we the people", strlen("we the people")));
573 test_truth(strlen("we the people") == value_length
);
574 test_truth(rc
== MEMCACHED_SUCCESS
);
581 Set the value, then quit to make sure it is flushed.
582 Come back in and test that add fails.
584 static test_return_t
add_test(memcached_st
*memc
)
586 memcached_return_t rc
;
587 const char *key
= "foo";
588 const char *value
= "when we sanitize";
589 unsigned long long setting_value
;
591 setting_value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
593 rc
= memcached_set(memc
, key
, strlen(key
),
594 value
, strlen(value
),
595 (time_t)0, (uint32_t)0);
596 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
597 memcached_quit(memc
);
598 rc
= memcached_add(memc
, key
, strlen(key
),
599 value
, strlen(value
),
600 (time_t)0, (uint32_t)0);
602 /* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
605 test_truth(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_STORED
);
609 test_truth(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_DATA_EXISTS
);
616 ** There was a problem of leaking filedescriptors in the initial release
617 ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
618 ** systems it seems that the kernel is slow on reclaiming the resources
619 ** because the connects starts to time out (the test doesn't do much
620 ** anyway, so just loop 10 iterations)
622 static test_return_t
add_wrapper(memcached_st
*memc
)
625 unsigned int max
= 10000;
633 for (x
= 0; x
< max
; x
++)
639 static test_return_t
replace_test(memcached_st
*memc
)
641 memcached_return_t rc
;
642 const char *key
= "foo";
643 const char *value
= "when we sanitize";
644 const char *original
= "first we insert some data";
646 rc
= memcached_set(memc
, key
, strlen(key
),
647 original
, strlen(original
),
648 (time_t)0, (uint32_t)0);
649 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
651 rc
= memcached_replace(memc
, key
, strlen(key
),
652 value
, strlen(value
),
653 (time_t)0, (uint32_t)0);
654 test_truth(rc
== MEMCACHED_SUCCESS
);
659 static test_return_t
delete_test(memcached_st
*memc
)
661 memcached_return_t rc
;
662 const char *key
= "foo";
663 const char *value
= "when we sanitize";
665 rc
= memcached_set(memc
, key
, strlen(key
),
666 value
, strlen(value
),
667 (time_t)0, (uint32_t)0);
668 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
670 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
671 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
676 static test_return_t
flush_test(memcached_st
*memc
)
678 memcached_return_t rc
;
680 rc
= memcached_flush(memc
, 0);
681 test_truth(rc
== MEMCACHED_SUCCESS
);
686 static memcached_return_t
server_function(memcached_st
*ptr
__attribute__((unused
)),
687 memcached_server_st
*server
__attribute__((unused
)),
688 void *context
__attribute__((unused
)))
692 return MEMCACHED_SUCCESS
;
695 static test_return_t
memcached_server_cursor_test(memcached_st
*memc
)
698 strcpy(context
, "foo bad");
699 memcached_server_fn callbacks
[1];
701 callbacks
[0]= server_function
;
702 memcached_server_cursor(memc
, callbacks
, context
, 1);
706 static test_return_t
bad_key_test(memcached_st
*memc
)
708 memcached_return_t rc
;
709 const char *key
= "foo bad";
711 size_t string_length
;
713 memcached_st
*memc_clone
;
715 size_t max_keylen
= 0xffff;
717 // Just skip if we are in binary mode.
718 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
))
721 memc_clone
= memcached_clone(NULL
, memc
);
722 test_truth(memc_clone
);
724 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
725 test_truth(rc
== MEMCACHED_SUCCESS
);
727 /* All keys are valid in the binary protocol (except for length) */
728 if (memcached_behavior_get(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 0)
730 string
= memcached_get(memc_clone
, key
, strlen(key
),
731 &string_length
, &flags
, &rc
);
732 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
733 test_truth(string_length
== 0);
737 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
738 test_truth(rc
== MEMCACHED_SUCCESS
);
739 string
= memcached_get(memc_clone
, key
, strlen(key
),
740 &string_length
, &flags
, &rc
);
741 test_truth(rc
== MEMCACHED_NOTFOUND
);
742 test_truth(string_length
== 0);
745 /* Test multi key for bad keys */
746 const char *keys
[] = { "GoodKey", "Bad Key", "NotMine" };
747 size_t key_lengths
[] = { 7, 7, 7 };
749 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
750 test_truth(rc
== MEMCACHED_SUCCESS
);
752 rc
= memcached_mget(memc_clone
, keys
, key_lengths
, 3);
753 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
755 rc
= memcached_mget_by_key(memc_clone
, "foo daddy", 9, keys
, key_lengths
, 1);
756 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
760 /* The following test should be moved to the end of this function when the
761 memcached server is updated to allow max size length of the keys in the
764 rc
= memcached_callback_set(memc_clone
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
765 test_truth(rc
== MEMCACHED_SUCCESS
);
767 char *longkey
= malloc(max_keylen
+ 1);
770 memset(longkey
, 'a', max_keylen
+ 1);
771 string
= memcached_get(memc_clone
, longkey
, max_keylen
,
772 &string_length
, &flags
, &rc
);
773 test_truth(rc
== MEMCACHED_NOTFOUND
);
774 test_truth(string_length
== 0);
777 string
= memcached_get(memc_clone
, longkey
, max_keylen
+ 1,
778 &string_length
, &flags
, &rc
);
779 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
780 test_truth(string_length
== 0);
787 /* Make sure zero length keys are marked as bad */
789 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
790 test_truth(rc
== MEMCACHED_SUCCESS
);
791 string
= memcached_get(memc_clone
, key
, 0,
792 &string_length
, &flags
, &rc
);
793 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
794 test_truth(string_length
== 0);
797 memcached_free(memc_clone
);
802 #define READ_THROUGH_VALUE "set for me"
803 static memcached_return_t
read_through_trigger(memcached_st
*memc
__attribute__((unused
)),
804 char *key
__attribute__((unused
)),
805 size_t key_length
__attribute__((unused
)),
806 memcached_result_st
*result
)
809 return memcached_result_set_value(result
, READ_THROUGH_VALUE
, strlen(READ_THROUGH_VALUE
));
812 static test_return_t
read_through(memcached_st
*memc
)
814 memcached_return_t rc
;
815 const char *key
= "foo";
817 size_t string_length
;
819 memcached_trigger_key_fn cb
= (memcached_trigger_key_fn
)read_through_trigger
;
821 string
= memcached_get(memc
, key
, strlen(key
),
822 &string_length
, &flags
, &rc
);
824 test_truth(rc
== MEMCACHED_NOTFOUND
);
825 test_truth(string_length
== 0);
828 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_GET_FAILURE
,
830 test_truth(rc
== MEMCACHED_SUCCESS
);
832 string
= memcached_get(memc
, key
, strlen(key
),
833 &string_length
, &flags
, &rc
);
835 test_truth(rc
== MEMCACHED_SUCCESS
);
836 test_truth(string_length
== strlen(READ_THROUGH_VALUE
));
837 test_truth(!strcmp(READ_THROUGH_VALUE
, string
));
840 string
= memcached_get(memc
, key
, strlen(key
),
841 &string_length
, &flags
, &rc
);
843 test_truth(rc
== MEMCACHED_SUCCESS
);
844 test_truth(string_length
== strlen(READ_THROUGH_VALUE
));
845 test_truth(!strcmp(READ_THROUGH_VALUE
, string
));
851 static memcached_return_t
delete_trigger(memcached_st
*ptr
__attribute__((unused
)),
853 size_t key_length
__attribute__((unused
)))
857 return MEMCACHED_SUCCESS
;
860 static test_return_t
delete_through(memcached_st
*memc
)
862 memcached_trigger_delete_key_fn callback
;
863 memcached_return_t rc
;
865 callback
= (memcached_trigger_delete_key_fn
)delete_trigger
;
867 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_DELETE_TRIGGER
, *(void**)&callback
);
868 test_truth(rc
== MEMCACHED_SUCCESS
);
873 static test_return_t
get_test(memcached_st
*memc
)
875 memcached_return_t rc
;
876 const char *key
= "foo";
878 size_t string_length
;
881 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
882 test_truth(rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_NOTFOUND
);
884 string
= memcached_get(memc
, key
, strlen(key
),
885 &string_length
, &flags
, &rc
);
887 test_truth(rc
== MEMCACHED_NOTFOUND
);
888 test_truth(string_length
== 0);
894 static test_return_t
get_test2(memcached_st
*memc
)
896 memcached_return_t rc
;
897 const char *key
= "foo";
898 const char *value
= "when we sanitize";
900 size_t string_length
;
903 rc
= memcached_set(memc
, key
, strlen(key
),
904 value
, strlen(value
),
905 (time_t)0, (uint32_t)0);
906 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
908 string
= memcached_get(memc
, key
, strlen(key
),
909 &string_length
, &flags
, &rc
);
912 test_truth(rc
== MEMCACHED_SUCCESS
);
913 test_truth(string_length
== strlen(value
));
914 test_truth(!memcmp(string
, value
, string_length
));
921 static test_return_t
set_test2(memcached_st
*memc
)
923 memcached_return_t rc
;
924 const char *key
= "foo";
925 const char *value
= "train in the brain";
926 size_t value_length
= strlen(value
);
929 for (x
= 0; x
< 10; x
++)
931 rc
= memcached_set(memc
, key
, strlen(key
),
933 (time_t)0, (uint32_t)0);
934 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
940 static test_return_t
set_test3(memcached_st
*memc
)
942 memcached_return_t rc
;
944 size_t value_length
= 8191;
947 value
= (char*)malloc(value_length
);
950 for (x
= 0; x
< value_length
; x
++)
951 value
[x
] = (char) (x
% 127);
953 /* The dump test relies on there being at least 32 items in memcached */
954 for (x
= 0; x
< 32; x
++)
958 sprintf(key
, "foo%u", x
);
960 rc
= memcached_set(memc
, key
, strlen(key
),
962 (time_t)0, (uint32_t)0);
963 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
971 static test_return_t
get_test3(memcached_st
*memc
)
973 memcached_return_t rc
;
974 const char *key
= "foo";
976 size_t value_length
= 8191;
978 size_t string_length
;
982 value
= (char*)malloc(value_length
);
985 for (x
= 0; x
< value_length
; x
++)
986 value
[x
] = (char) (x
% 127);
988 rc
= memcached_set(memc
, key
, strlen(key
),
990 (time_t)0, (uint32_t)0);
991 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
993 string
= memcached_get(memc
, key
, strlen(key
),
994 &string_length
, &flags
, &rc
);
996 test_truth(rc
== MEMCACHED_SUCCESS
);
998 test_truth(string_length
== value_length
);
999 test_truth(!memcmp(string
, value
, string_length
));
1004 return TEST_SUCCESS
;
1007 static test_return_t
get_test4(memcached_st
*memc
)
1009 memcached_return_t rc
;
1010 const char *key
= "foo";
1012 size_t value_length
= 8191;
1014 size_t string_length
;
1018 value
= (char*)malloc(value_length
);
1021 for (x
= 0; x
< value_length
; x
++)
1022 value
[x
] = (char) (x
% 127);
1024 rc
= memcached_set(memc
, key
, strlen(key
),
1025 value
, value_length
,
1026 (time_t)0, (uint32_t)0);
1027 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1029 for (x
= 0; x
< 10; x
++)
1031 string
= memcached_get(memc
, key
, strlen(key
),
1032 &string_length
, &flags
, &rc
);
1034 test_truth(rc
== MEMCACHED_SUCCESS
);
1036 test_truth(string_length
== value_length
);
1037 test_truth(!memcmp(string
, value
, string_length
));
1043 return TEST_SUCCESS
;
1047 * This test verifies that memcached_read_one_response doesn't try to
1048 * dereference a NIL-pointer if you issue a multi-get and don't read out all
1049 * responses before you execute a storage command.
1051 static test_return_t
get_test5(memcached_st
*memc
)
1054 ** Request the same key twice, to ensure that we hash to the same server
1055 ** (so that we have multiple response values queued up) ;-)
1057 const char *keys
[]= { "key", "key" };
1058 size_t lengths
[]= { 3, 3 };
1062 memcached_return_t rc
= memcached_set(memc
, keys
[0], lengths
[0],
1063 keys
[0], lengths
[0], 0, 0);
1064 test_truth(rc
== MEMCACHED_SUCCESS
);
1065 rc
= memcached_mget(memc
, keys
, lengths
, 2);
1067 memcached_result_st results_obj
;
1068 memcached_result_st
*results
;
1069 results
=memcached_result_create(memc
, &results_obj
);
1070 test_truth(results
);
1071 results
=memcached_fetch_result(memc
, &results_obj
, &rc
);
1072 test_truth(results
);
1073 memcached_result_free(&results_obj
);
1075 /* Don't read out the second result, but issue a set instead.. */
1076 rc
= memcached_set(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0);
1077 test_truth(rc
== MEMCACHED_SUCCESS
);
1079 char *val
= memcached_get_by_key(memc
, keys
[0], lengths
[0], "yek", 3,
1080 &rlen
, &flags
, &rc
);
1081 test_truth(val
== NULL
);
1082 test_truth(rc
== MEMCACHED_NOTFOUND
);
1083 val
= memcached_get(memc
, keys
[0], lengths
[0], &rlen
, &flags
, &rc
);
1084 test_truth(val
!= NULL
);
1085 test_truth(rc
== MEMCACHED_SUCCESS
);
1088 return TEST_SUCCESS
;
1091 static test_return_t
mget_end(memcached_st
*memc
)
1093 const char *keys
[]= { "foo", "foo2" };
1094 size_t lengths
[]= { 3, 4 };
1095 const char *values
[]= { "fjord", "41" };
1097 memcached_return_t rc
;
1100 for (int i
= 0; i
< 2; i
++)
1102 rc
= memcached_set(memc
, keys
[i
], lengths
[i
], values
[i
], strlen(values
[i
]),
1103 (time_t)0, (uint32_t)0);
1104 test_truth(rc
== MEMCACHED_SUCCESS
);
1108 size_t string_length
;
1111 // retrieve both via mget
1112 rc
= memcached_mget(memc
, keys
, lengths
, 2);
1113 test_truth(rc
== MEMCACHED_SUCCESS
);
1115 char key
[MEMCACHED_MAX_KEY
];
1118 // this should get both
1119 for (int i
= 0; i
< 2; i
++)
1121 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
,
1123 test_truth(rc
== MEMCACHED_SUCCESS
);
1125 if (key_length
== 4)
1127 test_truth(string_length
== strlen(values
[val
]));
1128 test_truth(strncmp(values
[val
], string
, string_length
) == 0);
1132 // this should indicate end
1133 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1134 test_truth(rc
== MEMCACHED_END
);
1137 rc
= memcached_mget(memc
, keys
, lengths
, 1);
1138 test_truth(rc
== MEMCACHED_SUCCESS
);
1140 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1141 test_truth(key_length
== lengths
[0]);
1142 test_truth(strncmp(keys
[0], key
, key_length
) == 0);
1143 test_truth(string_length
== strlen(values
[0]));
1144 test_truth(strncmp(values
[0], string
, string_length
) == 0);
1145 test_truth(rc
== MEMCACHED_SUCCESS
);
1148 // this should indicate end
1149 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1150 test_truth(rc
== MEMCACHED_END
);
1152 return TEST_SUCCESS
;
1155 /* Do not copy the style of this code, I just access hosts to testthis function */
1156 static test_return_t
stats_servername_test(memcached_st
*memc
)
1158 memcached_return_t rc
;
1159 memcached_stat_st memc_stat
;
1160 rc
= memcached_stat_servername(&memc_stat
, NULL
,
1161 memc
->hosts
[0].hostname
,
1162 memc
->hosts
[0].port
);
1164 return TEST_SUCCESS
;
1167 static test_return_t
increment_test(memcached_st
*memc
)
1169 uint64_t new_number
;
1170 memcached_return_t rc
;
1171 const char *key
= "number";
1172 const char *value
= "0";
1174 rc
= memcached_set(memc
, key
, strlen(key
),
1175 value
, strlen(value
),
1176 (time_t)0, (uint32_t)0);
1177 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1179 rc
= memcached_increment(memc
, key
, strlen(key
),
1181 test_truth(rc
== MEMCACHED_SUCCESS
);
1182 test_truth(new_number
== 1);
1184 rc
= memcached_increment(memc
, key
, strlen(key
),
1186 test_truth(rc
== MEMCACHED_SUCCESS
);
1187 test_truth(new_number
== 2);
1189 return TEST_SUCCESS
;
1192 static test_return_t
increment_with_initial_test(memcached_st
*memc
)
1194 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1196 uint64_t new_number
;
1197 memcached_return_t rc
;
1198 const char *key
= "number";
1199 uint64_t initial
= 0;
1201 rc
= memcached_increment_with_initial(memc
, key
, strlen(key
),
1202 1, initial
, 0, &new_number
);
1203 test_truth(rc
== MEMCACHED_SUCCESS
);
1204 test_truth(new_number
== initial
);
1206 rc
= memcached_increment_with_initial(memc
, key
, strlen(key
),
1207 1, initial
, 0, &new_number
);
1208 test_truth(rc
== MEMCACHED_SUCCESS
);
1209 test_truth(new_number
== (initial
+ 1));
1211 return TEST_SUCCESS
;
1214 static test_return_t
decrement_test(memcached_st
*memc
)
1216 uint64_t new_number
;
1217 memcached_return_t rc
;
1218 const char *key
= "number";
1219 const char *value
= "3";
1221 rc
= memcached_set(memc
, key
, strlen(key
),
1222 value
, strlen(value
),
1223 (time_t)0, (uint32_t)0);
1224 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1226 rc
= memcached_decrement(memc
, key
, strlen(key
),
1228 test_truth(rc
== MEMCACHED_SUCCESS
);
1229 test_truth(new_number
== 2);
1231 rc
= memcached_decrement(memc
, key
, strlen(key
),
1233 test_truth(rc
== MEMCACHED_SUCCESS
);
1234 test_truth(new_number
== 1);
1236 return TEST_SUCCESS
;
1239 static test_return_t
decrement_with_initial_test(memcached_st
*memc
)
1241 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1243 uint64_t new_number
;
1244 memcached_return_t rc
;
1245 const char *key
= "number";
1246 uint64_t initial
= 3;
1248 rc
= memcached_decrement_with_initial(memc
, key
, strlen(key
),
1249 1, initial
, 0, &new_number
);
1250 test_truth(rc
== MEMCACHED_SUCCESS
);
1251 test_truth(new_number
== initial
);
1253 rc
= memcached_decrement_with_initial(memc
, key
, strlen(key
),
1254 1, initial
, 0, &new_number
);
1255 test_truth(rc
== MEMCACHED_SUCCESS
);
1256 test_truth(new_number
== (initial
- 1));
1258 return TEST_SUCCESS
;
1261 static test_return_t
increment_by_key_test(memcached_st
*memc
)
1263 uint64_t new_number
;
1264 memcached_return_t rc
;
1265 const char *master_key
= "foo";
1266 const char *key
= "number";
1267 const char *value
= "0";
1269 rc
= memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1271 value
, strlen(value
),
1272 (time_t)0, (uint32_t)0);
1273 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1275 rc
= memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
),
1277 test_truth(rc
== MEMCACHED_SUCCESS
);
1278 test_truth(new_number
== 1);
1280 rc
= memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
),
1282 test_truth(rc
== MEMCACHED_SUCCESS
);
1283 test_truth(new_number
== 2);
1285 return TEST_SUCCESS
;
1288 static test_return_t
increment_with_initial_by_key_test(memcached_st
*memc
)
1290 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1292 uint64_t new_number
;
1293 memcached_return_t rc
;
1294 const char *master_key
= "foo";
1295 const char *key
= "number";
1296 uint64_t initial
= 0;
1298 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1300 1, initial
, 0, &new_number
);
1301 test_truth(rc
== MEMCACHED_SUCCESS
);
1302 test_truth(new_number
== initial
);
1304 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1306 1, initial
, 0, &new_number
);
1307 test_truth(rc
== MEMCACHED_SUCCESS
);
1308 test_truth(new_number
== (initial
+ 1));
1310 return TEST_SUCCESS
;
1313 static test_return_t
decrement_by_key_test(memcached_st
*memc
)
1315 uint64_t new_number
;
1316 memcached_return_t rc
;
1317 const char *master_key
= "foo";
1318 const char *key
= "number";
1319 const char *value
= "3";
1321 rc
= memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1323 value
, strlen(value
),
1324 (time_t)0, (uint32_t)0);
1325 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1327 rc
= memcached_decrement_by_key(memc
, master_key
, strlen(master_key
),
1330 test_truth(rc
== MEMCACHED_SUCCESS
);
1331 test_truth(new_number
== 2);
1333 rc
= memcached_decrement_by_key(memc
, master_key
, strlen(master_key
),
1336 test_truth(rc
== MEMCACHED_SUCCESS
);
1337 test_truth(new_number
== 1);
1339 return TEST_SUCCESS
;
1342 static test_return_t
decrement_with_initial_by_key_test(memcached_st
*memc
)
1344 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1346 uint64_t new_number
;
1347 memcached_return_t rc
;
1348 const char *master_key
= "foo";
1349 const char *key
= "number";
1350 uint64_t initial
= 3;
1352 rc
= memcached_decrement_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1354 1, initial
, 0, &new_number
);
1355 test_truth(rc
== MEMCACHED_SUCCESS
);
1356 test_truth(new_number
== initial
);
1358 rc
= memcached_decrement_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1360 1, initial
, 0, &new_number
);
1361 test_truth(rc
== MEMCACHED_SUCCESS
);
1362 test_truth(new_number
== (initial
- 1));
1364 return TEST_SUCCESS
;
1367 static test_return_t
quit_test(memcached_st
*memc
)
1369 memcached_return_t rc
;
1370 const char *key
= "fudge";
1371 const char *value
= "sanford and sun";
1373 rc
= memcached_set(memc
, key
, strlen(key
),
1374 value
, strlen(value
),
1375 (time_t)10, (uint32_t)3);
1376 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1377 memcached_quit(memc
);
1379 rc
= memcached_set(memc
, key
, strlen(key
),
1380 value
, strlen(value
),
1381 (time_t)50, (uint32_t)9);
1382 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1384 return TEST_SUCCESS
;
1387 static test_return_t
mget_result_test(memcached_st
*memc
)
1389 memcached_return_t rc
;
1390 const char *keys
[]= {"fudge", "son", "food"};
1391 size_t key_length
[]= {5, 3, 4};
1394 memcached_result_st results_obj
;
1395 memcached_result_st
*results
;
1397 results
= memcached_result_create(memc
, &results_obj
);
1398 test_truth(results
);
1399 test_truth(&results_obj
== results
);
1401 /* We need to empty the server before continueing test */
1402 rc
= memcached_flush(memc
, 0);
1403 test_truth(rc
== MEMCACHED_SUCCESS
);
1405 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1406 test_truth(rc
== MEMCACHED_SUCCESS
);
1408 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)) != NULL
)
1410 test_truth(results
);
1413 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)) != NULL
)
1414 test_truth(!results
);
1415 test_truth(rc
== MEMCACHED_END
);
1417 for (x
= 0; x
< 3; x
++)
1419 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1420 keys
[x
], key_length
[x
],
1421 (time_t)50, (uint32_t)9);
1422 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1425 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1426 test_truth(rc
== MEMCACHED_SUCCESS
);
1428 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1430 test_truth(results
);
1431 test_truth(&results_obj
== results
);
1432 test_truth(rc
== MEMCACHED_SUCCESS
);
1433 test_truth(memcached_result_key_length(results
) == memcached_result_length(results
));
1434 test_truth(!memcmp(memcached_result_key_value(results
),
1435 memcached_result_value(results
),
1436 memcached_result_length(results
)));
1439 memcached_result_free(&results_obj
);
1441 return TEST_SUCCESS
;
1444 static test_return_t
mget_result_alloc_test(memcached_st
*memc
)
1446 memcached_return_t rc
;
1447 const char *keys
[]= {"fudge", "son", "food"};
1448 size_t key_length
[]= {5, 3, 4};
1451 memcached_result_st
*results
;
1453 /* We need to empty the server before continueing test */
1454 rc
= memcached_flush(memc
, 0);
1455 test_truth(rc
== MEMCACHED_SUCCESS
);
1457 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1458 test_truth(rc
== MEMCACHED_SUCCESS
);
1460 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)) != NULL
)
1462 test_truth(results
);
1464 test_truth(!results
);
1465 test_truth(rc
== MEMCACHED_END
);
1467 for (x
= 0; x
< 3; x
++)
1469 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1470 keys
[x
], key_length
[x
],
1471 (time_t)50, (uint32_t)9);
1472 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1475 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1476 test_truth(rc
== MEMCACHED_SUCCESS
);
1479 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1481 test_truth(results
);
1482 test_truth(rc
== MEMCACHED_SUCCESS
);
1483 test_truth(memcached_result_key_length(results
) == memcached_result_length(results
));
1484 test_truth(!memcmp(memcached_result_key_value(results
),
1485 memcached_result_value(results
),
1486 memcached_result_length(results
)));
1487 memcached_result_free(results
);
1491 return TEST_SUCCESS
;
1494 /* Count the results */
1495 static memcached_return_t
callback_counter(memcached_st
*ptr
__attribute__((unused
)),
1496 memcached_result_st
*result
__attribute__((unused
)),
1499 unsigned int *counter
= (unsigned int *)context
;
1501 *counter
= *counter
+ 1;
1503 return MEMCACHED_SUCCESS
;
1506 static test_return_t
mget_result_function(memcached_st
*memc
)
1508 memcached_return_t rc
;
1509 const char *keys
[]= {"fudge", "son", "food"};
1510 size_t key_length
[]= {5, 3, 4};
1512 unsigned int counter
;
1513 memcached_execute_fn callbacks
[1];
1515 /* We need to empty the server before continueing test */
1516 rc
= memcached_flush(memc
, 0);
1517 for (x
= 0; x
< 3; x
++)
1519 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1520 keys
[x
], key_length
[x
],
1521 (time_t)50, (uint32_t)9);
1522 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1525 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1526 test_truth(rc
== MEMCACHED_SUCCESS
);
1528 callbacks
[0]= &callback_counter
;
1530 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
1532 test_truth(counter
== 3);
1534 return TEST_SUCCESS
;
1537 static test_return_t
mget_test(memcached_st
*memc
)
1539 memcached_return_t rc
;
1540 const char *keys
[]= {"fudge", "son", "food"};
1541 size_t key_length
[]= {5, 3, 4};
1545 char return_key
[MEMCACHED_MAX_KEY
];
1546 size_t return_key_length
;
1548 size_t return_value_length
;
1550 /* We need to empty the server before continueing test */
1551 rc
= memcached_flush(memc
, 0);
1552 test_truth(rc
== MEMCACHED_SUCCESS
);
1554 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1555 test_truth(rc
== MEMCACHED_SUCCESS
);
1557 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1558 &return_value_length
, &flags
, &rc
)) != NULL
)
1560 test_truth(return_value
);
1562 test_truth(!return_value
);
1563 test_truth(return_value_length
== 0);
1564 test_truth(rc
== MEMCACHED_END
);
1566 for (x
= 0; x
< 3; x
++)
1568 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1569 keys
[x
], key_length
[x
],
1570 (time_t)50, (uint32_t)9);
1571 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1574 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1575 test_truth(rc
== MEMCACHED_SUCCESS
);
1578 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1579 &return_value_length
, &flags
, &rc
)))
1581 test_truth(return_value
);
1582 test_truth(rc
== MEMCACHED_SUCCESS
);
1583 test_truth(return_key_length
== return_value_length
);
1584 test_truth(!memcmp(return_value
, return_key
, return_value_length
));
1589 return TEST_SUCCESS
;
1592 static test_return_t
mget_execute(memcached_st
*memc
)
1595 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1599 * I only want to hit _one_ server so I know the number of requests I'm
1600 * sending in the pipeline.
1602 uint32_t number_of_hosts
= memc
->number_of_hosts
;
1603 memc
->number_of_hosts
= 1;
1605 int max_keys
= binary
? 20480 : 1;
1608 char **keys
= calloc((size_t)max_keys
, sizeof(char*));
1609 size_t *key_length
=calloc((size_t)max_keys
, sizeof(size_t));
1611 /* First add all of the items.. */
1612 char blob
[1024] = {0};
1613 memcached_return_t rc
;
1614 for (int x
= 0; x
< max_keys
; ++x
)
1617 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
1619 test_truth(keys
[x
] != NULL
);
1620 rc
= memcached_add(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
1621 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1624 /* Try to get all of them with a large multiget */
1625 unsigned int counter
= 0;
1626 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
1627 rc
= memcached_mget_execute(memc
, (const char**)keys
, key_length
,
1628 (size_t)max_keys
, callbacks
, &counter
, 1);
1632 test_truth(rc
== MEMCACHED_SUCCESS
);
1634 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
1635 test_truth(rc
== MEMCACHED_END
);
1637 /* Verify that we got all of the items */
1638 test_truth(counter
== (unsigned int)max_keys
);
1642 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
1643 test_truth(counter
== 0);
1646 /* Release all allocated resources */
1647 for (int x
= 0; x
< max_keys
; ++x
)
1652 memc
->number_of_hosts
= number_of_hosts
;
1653 return TEST_SUCCESS
;
1656 static test_return_t
get_stats_keys(memcached_st
*memc
)
1660 memcached_stat_st memc_stat
;
1661 memcached_return_t rc
;
1663 stat_list
= memcached_stat_get_keys(memc
, &memc_stat
, &rc
);
1664 test_truth(rc
== MEMCACHED_SUCCESS
);
1665 for (ptr
= stat_list
; *ptr
; ptr
++)
1671 return TEST_SUCCESS
;
1674 static test_return_t
version_string_test(memcached_st
*memc
__attribute__((unused
)))
1676 const char *version_string
;
1678 version_string
= memcached_lib_version();
1680 test_truth(!strcmp(version_string
, LIBMEMCACHED_VERSION_STRING
));
1682 return TEST_SUCCESS
;
1685 static test_return_t
get_stats(memcached_st
*memc
)
1690 memcached_return_t rc
;
1691 memcached_stat_st
*memc_stat
;
1693 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
1694 test_truth(rc
== MEMCACHED_SUCCESS
);
1696 test_truth(rc
== MEMCACHED_SUCCESS
);
1697 test_truth(memc_stat
);
1699 for (x
= 0; x
< memcached_server_count(memc
); x
++)
1701 stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
1702 test_truth(rc
== MEMCACHED_SUCCESS
);
1703 for (ptr
= stat_list
; *ptr
; ptr
++);
1708 memcached_stat_free(NULL
, memc_stat
);
1710 return TEST_SUCCESS
;
1713 static test_return_t
add_host_test(memcached_st
*memc
)
1716 memcached_server_st
*servers
;
1717 memcached_return_t rc
;
1718 char servername
[]= "0.example.com";
1720 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
1721 test_truth(servers
);
1722 test_truth(1 == memcached_server_list_count(servers
));
1724 for (x
= 2; x
< 20; x
++)
1726 char buffer
[SMALL_STRING_LEN
];
1728 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
1729 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
1731 test_truth(rc
== MEMCACHED_SUCCESS
);
1732 test_truth(x
== memcached_server_list_count(servers
));
1735 rc
= memcached_server_push(memc
, servers
);
1736 test_truth(rc
== MEMCACHED_SUCCESS
);
1737 rc
= memcached_server_push(memc
, servers
);
1738 test_truth(rc
== MEMCACHED_SUCCESS
);
1740 memcached_server_list_free(servers
);
1742 return TEST_SUCCESS
;
1745 static memcached_return_t
clone_test_callback(memcached_st
*parent
__attribute__((unused
)), memcached_st
*memc_clone
__attribute__((unused
)))
1747 return MEMCACHED_SUCCESS
;
1750 static memcached_return_t
cleanup_test_callback(memcached_st
*ptr
__attribute__((unused
)))
1752 return MEMCACHED_SUCCESS
;
1755 static test_return_t
callback_test(memcached_st
*memc
)
1757 /* Test User Data */
1761 memcached_return_t rc
;
1763 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
);
1764 test_truth(rc
== MEMCACHED_SUCCESS
);
1765 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
1766 test_truth(*test_ptr
== x
);
1769 /* Test Clone Callback */
1771 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
1772 void *clone_cb_ptr
= *(void **)&clone_cb
;
1773 void *temp_function
= NULL
;
1774 memcached_return_t rc
;
1776 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1778 test_truth(rc
== MEMCACHED_SUCCESS
);
1779 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1780 test_truth(temp_function
== clone_cb_ptr
);
1783 /* Test Cleanup Callback */
1785 memcached_cleanup_fn cleanup_cb
=
1786 (memcached_cleanup_fn
)cleanup_test_callback
;
1787 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
1788 void *temp_function
= NULL
;
1789 memcached_return_t rc
;
1791 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1793 test_truth(rc
== MEMCACHED_SUCCESS
);
1794 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1795 test_truth(temp_function
== cleanup_cb_ptr
);
1798 return TEST_SUCCESS
;
1801 /* We don't test the behavior itself, we test the switches */
1802 static test_return_t
behavior_test(memcached_st
*memc
)
1807 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1808 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1809 test_truth(value
== 1);
1811 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1812 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1813 test_truth(value
== 1);
1815 set
= MEMCACHED_HASH_MD5
;
1816 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1817 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1818 test_truth(value
== MEMCACHED_HASH_MD5
);
1822 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1823 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1824 test_truth(value
== 0);
1826 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1827 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1828 test_truth(value
== 0);
1830 set
= MEMCACHED_HASH_DEFAULT
;
1831 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1832 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1833 test_truth(value
== MEMCACHED_HASH_DEFAULT
);
1835 set
= MEMCACHED_HASH_CRC
;
1836 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1837 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1838 test_truth(value
== MEMCACHED_HASH_CRC
);
1840 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1841 test_truth(value
> 0);
1843 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1844 test_truth(value
> 0);
1846 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
1847 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+ 1);
1848 test_truth((value
+ 1) == memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
));
1849 return TEST_SUCCESS
;
1852 static test_return_t
fetch_all_results(memcached_st
*memc
)
1854 memcached_return_t rc
= MEMCACHED_SUCCESS
;
1855 char return_key
[MEMCACHED_MAX_KEY
];
1856 size_t return_key_length
;
1858 size_t return_value_length
;
1861 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1862 &return_value_length
, &flags
, &rc
)))
1864 test_truth(return_value
);
1865 test_truth(rc
== MEMCACHED_SUCCESS
);
1869 return ((rc
== MEMCACHED_END
) || (rc
== MEMCACHED_SUCCESS
)) ? TEST_SUCCESS
: TEST_FAILURE
;
1872 /* Test case provided by Cal Haldenbrand */
1873 static test_return_t
user_supplied_bug1(memcached_st
*memc
)
1875 unsigned int setter
= 1;
1878 unsigned long long total
= 0;
1881 char randomstuff
[6 * 1024];
1882 memcached_return_t rc
;
1884 memset(randomstuff
, 0, 6 * 1024);
1886 /* We just keep looking at the same values over and over */
1889 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1890 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1894 for (x
= 0 ; total
< 20 * 1024576 ; x
++ )
1898 size
= (uint32_t)(rand() % ( 5 * 1024 ) ) + 400;
1899 memset(randomstuff
, 0, 6 * 1024);
1900 test_truth(size
< 6 * 1024); /* Being safe here */
1902 for (j
= 0 ; j
< size
;j
++)
1903 randomstuff
[j
] = (signed char) ((rand() % 26) + 97);
1906 sprintf(key
, "%d", x
);
1907 rc
= memcached_set(memc
, key
, strlen(key
),
1908 randomstuff
, strlen(randomstuff
), 10, 0);
1909 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1910 /* If we fail, lets try again */
1911 if (rc
!= MEMCACHED_SUCCESS
&& rc
!= MEMCACHED_BUFFERED
)
1912 rc
= memcached_set(memc
, key
, strlen(key
),
1913 randomstuff
, strlen(randomstuff
), 10, 0);
1914 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1917 return TEST_SUCCESS
;
1920 /* Test case provided by Cal Haldenbrand */
1921 static test_return_t
user_supplied_bug2(memcached_st
*memc
)
1924 unsigned int setter
;
1926 unsigned long long total
;
1929 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1930 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1932 setter
= 20 * 1024576;
1933 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
1934 setter
= 20 * 1024576;
1935 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
1936 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1937 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1939 for (x
= 0, errors
= 0, total
= 0 ; total
< 20 * 1024576 ; x
++)
1942 for (x
= 0, errors
= 0, total
= 0 ; total
< 24576 ; x
++)
1944 memcached_return_t rc
= MEMCACHED_SUCCESS
;
1945 char buffer
[SMALL_STRING_LEN
];
1950 memset(buffer
, 0, SMALL_STRING_LEN
);
1952 snprintf(buffer
, SMALL_STRING_LEN
, "%u", x
);
1953 getval
= memcached_get(memc
, buffer
, strlen(buffer
),
1954 &val_len
, &flags
, &rc
);
1955 if (rc
!= MEMCACHED_SUCCESS
)
1957 if (rc
== MEMCACHED_NOTFOUND
)
1971 return TEST_SUCCESS
;
1974 /* Do a large mget() over all the keys we think exist */
1975 #define KEY_COUNT 3000 // * 1024576
1976 static test_return_t
user_supplied_bug3(memcached_st
*memc
)
1978 memcached_return_t rc
;
1979 unsigned int setter
;
1982 size_t key_lengths
[KEY_COUNT
];
1985 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1986 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1988 setter
= 20 * 1024576;
1989 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
1990 setter
= 20 * 1024576;
1991 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
1992 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1993 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1996 keys
= calloc(KEY_COUNT
, sizeof(char *));
1998 for (x
= 0; x
< KEY_COUNT
; x
++)
2002 snprintf(buffer
, 30, "%u", x
);
2003 keys
[x
]= strdup(buffer
);
2004 key_lengths
[x
]= strlen(keys
[x
]);
2007 rc
= memcached_mget(memc
, (const char **)keys
, key_lengths
, KEY_COUNT
);
2008 test_truth(rc
== MEMCACHED_SUCCESS
);
2010 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
2012 for (x
= 0; x
< KEY_COUNT
; x
++)
2016 return TEST_SUCCESS
;
2019 /* Make sure we behave properly if server list has no values */
2020 static test_return_t
user_supplied_bug4(memcached_st
*memc
)
2022 memcached_return_t rc
;
2023 const char *keys
[]= {"fudge", "son", "food"};
2024 size_t key_length
[]= {5, 3, 4};
2027 char return_key
[MEMCACHED_MAX_KEY
];
2028 size_t return_key_length
;
2030 size_t return_value_length
;
2032 /* Here we free everything before running a bunch of mget tests */
2034 memcached_server_list_free(memc
->hosts
);
2036 memc
->number_of_hosts
= 0;
2040 /* We need to empty the server before continueing test */
2041 rc
= memcached_flush(memc
, 0);
2042 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2044 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2045 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2047 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2048 &return_value_length
, &flags
, &rc
)) != NULL
)
2050 test_truth(return_value
);
2052 test_truth(!return_value
);
2053 test_truth(return_value_length
== 0);
2054 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2056 for (x
= 0; x
< 3; x
++)
2058 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2059 keys
[x
], key_length
[x
],
2060 (time_t)50, (uint32_t)9);
2061 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2064 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2065 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2068 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2069 &return_value_length
, &flags
, &rc
)))
2071 test_truth(return_value
);
2072 test_truth(rc
== MEMCACHED_SUCCESS
);
2073 test_truth(return_key_length
== return_value_length
);
2074 test_truth(!memcmp(return_value
, return_key
, return_value_length
));
2079 return TEST_SUCCESS
;
2082 #define VALUE_SIZE_BUG5 1048064
2083 static test_return_t
user_supplied_bug5(memcached_st
*memc
)
2085 memcached_return_t rc
;
2086 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2087 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2088 char return_key
[MEMCACHED_MAX_KEY
];
2089 size_t return_key_length
;
2091 size_t value_length
;
2095 char insert_data
[VALUE_SIZE_BUG5
];
2097 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2098 insert_data
[x
]= (signed char)rand();
2100 memcached_flush(memc
, 0);
2101 value
= memcached_get(memc
, keys
[0], key_length
[0],
2102 &value_length
, &flags
, &rc
);
2103 test_truth(value
== NULL
);
2104 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2107 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2108 &value_length
, &flags
, &rc
)))
2110 test_truth(count
== 0);
2112 for (x
= 0; x
< 4; x
++)
2114 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2115 insert_data
, VALUE_SIZE_BUG5
,
2116 (time_t)0, (uint32_t)0);
2117 test_truth(rc
== MEMCACHED_SUCCESS
);
2120 for (x
= 0; x
< 10; x
++)
2122 value
= memcached_get(memc
, keys
[0], key_length
[0],
2123 &value_length
, &flags
, &rc
);
2127 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2129 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2130 &value_length
, &flags
, &rc
)))
2135 test_truth(count
== 4);
2138 return TEST_SUCCESS
;
2141 static test_return_t
user_supplied_bug6(memcached_st
*memc
)
2143 memcached_return_t rc
;
2144 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2145 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2146 char return_key
[MEMCACHED_MAX_KEY
];
2147 size_t return_key_length
;
2149 size_t value_length
;
2153 char insert_data
[VALUE_SIZE_BUG5
];
2155 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2156 insert_data
[x
]= (signed char)rand();
2158 memcached_flush(memc
, 0);
2159 value
= memcached_get(memc
, keys
[0], key_length
[0],
2160 &value_length
, &flags
, &rc
);
2161 test_truth(value
== NULL
);
2162 test_truth(rc
== MEMCACHED_NOTFOUND
);
2163 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2164 test_truth(rc
== MEMCACHED_SUCCESS
);
2167 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2168 &value_length
, &flags
, &rc
)))
2170 test_truth(count
== 0);
2171 test_truth(rc
== MEMCACHED_END
);
2173 for (x
= 0; x
< 4; x
++)
2175 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2176 insert_data
, VALUE_SIZE_BUG5
,
2177 (time_t)0, (uint32_t)0);
2178 test_truth(rc
== MEMCACHED_SUCCESS
);
2181 for (x
= 0; x
< 2; x
++)
2183 value
= memcached_get(memc
, keys
[0], key_length
[0],
2184 &value_length
, &flags
, &rc
);
2188 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2189 test_truth(rc
== MEMCACHED_SUCCESS
);
2191 /* We test for purge of partial complete fetches */
2192 for (count
= 3; count
; count
--)
2194 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2195 &value_length
, &flags
, &rc
);
2196 test_truth(rc
== MEMCACHED_SUCCESS
);
2197 test_truth(!(memcmp(value
, insert_data
, value_length
)));
2198 test_truth(value_length
);
2203 return TEST_SUCCESS
;
2206 static test_return_t
user_supplied_bug8(memcached_st
*memc
__attribute__((unused
)))
2208 memcached_return_t rc
;
2210 memcached_st
*memc_clone
;
2212 memcached_server_st
*servers
;
2213 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";
2215 servers
= memcached_servers_parse(server_list
);
2216 test_truth(servers
);
2218 mine
= memcached_create(NULL
);
2219 rc
= memcached_server_push(mine
, servers
);
2220 test_truth(rc
== MEMCACHED_SUCCESS
);
2221 memcached_server_list_free(servers
);
2224 memc_clone
= memcached_clone(NULL
, mine
);
2226 memcached_quit(mine
);
2227 memcached_quit(memc_clone
);
2230 memcached_free(mine
);
2231 memcached_free(memc_clone
);
2233 return TEST_SUCCESS
;
2236 /* Test flag store/retrieve */
2237 static test_return_t
user_supplied_bug7(memcached_st
*memc
)
2239 memcached_return_t rc
;
2240 const char *keys
= "036790384900";
2241 size_t key_length
= strlen(keys
);
2242 char return_key
[MEMCACHED_MAX_KEY
];
2243 size_t return_key_length
;
2245 size_t value_length
;
2248 char insert_data
[VALUE_SIZE_BUG5
];
2250 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2251 insert_data
[x
]= (signed char)rand();
2253 memcached_flush(memc
, 0);
2256 rc
= memcached_set(memc
, keys
, key_length
,
2257 insert_data
, VALUE_SIZE_BUG5
,
2259 test_truth(rc
== MEMCACHED_SUCCESS
);
2262 value
= memcached_get(memc
, keys
, key_length
,
2263 &value_length
, &flags
, &rc
);
2264 test_truth(flags
== 245);
2268 rc
= memcached_mget(memc
, &keys
, &key_length
, 1);
2271 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2272 &value_length
, &flags
, &rc
);
2273 test_truth(flags
== 245);
2278 return TEST_SUCCESS
;
2281 static test_return_t
user_supplied_bug9(memcached_st
*memc
)
2283 memcached_return_t rc
;
2284 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2285 size_t key_length
[3];
2290 char return_key
[MEMCACHED_MAX_KEY
];
2291 size_t return_key_length
;
2293 size_t return_value_length
;
2296 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2297 key_length
[1]= strlen("fudge&*@#");
2298 key_length
[2]= strlen("for^#@&$not");
2301 for (x
= 0; x
< 3; x
++)
2303 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2304 keys
[x
], key_length
[x
],
2305 (time_t)50, (uint32_t)9);
2306 test_truth(rc
== MEMCACHED_SUCCESS
);
2309 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2310 test_truth(rc
== MEMCACHED_SUCCESS
);
2312 /* We need to empty the server before continueing test */
2313 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2314 &return_value_length
, &flags
, &rc
)) != NULL
)
2316 test_truth(return_value
);
2320 test_truth(count
== 3);
2322 return TEST_SUCCESS
;
2325 /* We are testing with aggressive timeout to get failures */
2326 static test_return_t
user_supplied_bug10(memcached_st
*memc
)
2328 const char *key
= "foo";
2330 size_t value_length
= 512;
2333 memcached_return_t rc
;
2334 unsigned int set
= 1;
2335 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2338 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2339 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2341 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2344 value
= (char*)malloc(value_length
* sizeof(char));
2346 for (x
= 0; x
< value_length
; x
++)
2347 value
[x
]= (char) (x
% 127);
2349 for (x
= 1; x
<= 100000; ++x
)
2351 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2353 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_WRITE_FAILURE
||
2354 rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_TIMEOUT
);
2356 if (rc
== MEMCACHED_WRITE_FAILURE
|| rc
== MEMCACHED_TIMEOUT
)
2361 memcached_free(mclone
);
2363 return TEST_SUCCESS
;
2367 We are looking failures in the async protocol
2369 static test_return_t
user_supplied_bug11(memcached_st
*memc
)
2371 const char *key
= "foo";
2373 size_t value_length
= 512;
2376 memcached_return_t rc
;
2377 unsigned int set
= 1;
2379 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2381 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2382 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2384 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2387 timeout
= (int32_t)memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
2389 test_truth(timeout
== -1);
2391 value
= (char*)malloc(value_length
* sizeof(char));
2393 for (x
= 0; x
< value_length
; x
++)
2394 value
[x
]= (char) (x
% 127);
2396 for (x
= 1; x
<= 100000; ++x
)
2398 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2402 memcached_free(mclone
);
2404 return TEST_SUCCESS
;
2408 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2410 static test_return_t
user_supplied_bug12(memcached_st
*memc
)
2412 memcached_return_t rc
;
2414 size_t value_length
;
2416 uint64_t number_value
;
2418 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2419 &value_length
, &flags
, &rc
);
2420 test_truth(value
== NULL
);
2421 test_truth(rc
== MEMCACHED_NOTFOUND
);
2423 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2426 test_truth(value
== NULL
);
2427 /* The binary protocol will set the key if it doesn't exist */
2428 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2430 test_truth(rc
== MEMCACHED_SUCCESS
);
2434 test_truth(rc
== MEMCACHED_NOTFOUND
);
2437 rc
= memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
2439 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2440 &value_length
, &flags
, &rc
);
2442 test_truth(rc
== MEMCACHED_SUCCESS
);
2445 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2447 test_truth(number_value
== 2);
2448 test_truth(rc
== MEMCACHED_SUCCESS
);
2450 return TEST_SUCCESS
;
2454 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2455 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2457 static test_return_t
user_supplied_bug13(memcached_st
*memc
)
2459 char key
[] = "key34567890";
2461 memcached_return_t rc
;
2462 size_t overflowSize
;
2464 char commandFirst
[]= "set key34567890 0 0 ";
2465 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2466 size_t commandLength
;
2469 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2471 overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2473 for (testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2475 overflow
= malloc(testSize
);
2476 test_truth(overflow
!= NULL
);
2478 memset(overflow
, 'x', testSize
);
2479 rc
= memcached_set(memc
, key
, strlen(key
),
2480 overflow
, testSize
, 0, 0);
2481 test_truth(rc
== MEMCACHED_SUCCESS
);
2485 return TEST_SUCCESS
;
2490 Test values of many different sizes
2491 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2492 set key34567890 0 0 8169 \r\n
2493 is sent followed by buffer of size 8169, followed by 8169
2495 static test_return_t
user_supplied_bug14(memcached_st
*memc
)
2498 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
2499 memcached_return_t rc
;
2500 const char *key
= "foo";
2502 size_t value_length
= 18000;
2504 size_t string_length
;
2507 size_t current_length
;
2509 value
= (char*)malloc(value_length
);
2512 for (x
= 0; x
< value_length
; x
++)
2513 value
[x
] = (char) (x
% 127);
2515 for (current_length
= 0; current_length
< value_length
; current_length
++)
2517 rc
= memcached_set(memc
, key
, strlen(key
),
2518 value
, current_length
,
2519 (time_t)0, (uint32_t)0);
2520 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
2522 string
= memcached_get(memc
, key
, strlen(key
),
2523 &string_length
, &flags
, &rc
);
2525 test_truth(rc
== MEMCACHED_SUCCESS
);
2526 test_truth(string_length
== current_length
);
2527 test_truth(!memcmp(string
, value
, string_length
));
2534 return TEST_SUCCESS
;
2538 Look for zero length value problems
2540 static test_return_t
user_supplied_bug15(memcached_st
*memc
)
2543 memcached_return_t rc
;
2544 const char *key
= "mykey";
2549 for (x
= 0; x
< 2; x
++)
2551 rc
= memcached_set(memc
, key
, strlen(key
),
2553 (time_t)0, (uint32_t)0);
2555 test_truth(rc
== MEMCACHED_SUCCESS
);
2557 value
= memcached_get(memc
, key
, strlen(key
),
2558 &length
, &flags
, &rc
);
2560 test_truth(rc
== MEMCACHED_SUCCESS
);
2561 test_truth(value
== NULL
);
2562 test_truth(length
== 0);
2563 test_truth(flags
== 0);
2565 value
= memcached_get(memc
, key
, strlen(key
),
2566 &length
, &flags
, &rc
);
2568 test_truth(rc
== MEMCACHED_SUCCESS
);
2569 test_truth(value
== NULL
);
2570 test_truth(length
== 0);
2571 test_truth(flags
== 0);
2574 return TEST_SUCCESS
;
2577 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2578 static test_return_t
user_supplied_bug16(memcached_st
*memc
)
2580 memcached_return_t rc
;
2581 const char *key
= "mykey";
2586 rc
= memcached_set(memc
, key
, strlen(key
),
2588 (time_t)0, UINT32_MAX
);
2590 test_truth(rc
== MEMCACHED_SUCCESS
);
2592 value
= memcached_get(memc
, key
, strlen(key
),
2593 &length
, &flags
, &rc
);
2595 test_truth(rc
== MEMCACHED_SUCCESS
);
2596 test_truth(value
== NULL
);
2597 test_truth(length
== 0);
2598 test_truth(flags
== UINT32_MAX
);
2600 return TEST_SUCCESS
;
2604 /* Check the validity of chinese key*/
2605 static test_return_t
user_supplied_bug17(memcached_st
*memc
)
2607 memcached_return_t rc
;
2608 const char *key
= "豆瓣";
2609 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2614 rc
= memcached_set(memc
, key
, strlen(key
),
2615 value
, strlen(value
),
2618 test_truth(rc
== MEMCACHED_SUCCESS
);
2620 value2
= memcached_get(memc
, key
, strlen(key
),
2621 &length
, &flags
, &rc
);
2623 test_truth(length
==strlen(value
));
2624 test_truth(rc
== MEMCACHED_SUCCESS
);
2625 test_truth(memcmp(value
, value2
, length
)==0);
2628 return TEST_SUCCESS
;
2636 static test_return_t
user_supplied_bug19(memcached_st
*memc
)
2639 memcached_server_st
*s
;
2640 memcached_return_t res
;
2644 m
= memcached_create(NULL
);
2645 memcached_server_add_with_weight(m
, "localhost", 11311, 100);
2646 memcached_server_add_with_weight(m
, "localhost", 11312, 100);
2648 s
= memcached_server_by_key(m
, "a", 1, &res
);
2649 memcached_server_free(s
);
2653 return TEST_SUCCESS
;
2656 /* CAS test from Andei */
2657 static test_return_t
user_supplied_bug20(memcached_st
*memc
)
2659 memcached_return_t status
;
2660 memcached_result_st
*result
, result_obj
;
2661 const char *key
= "abc";
2662 size_t key_len
= strlen("abc");
2663 const char *value
= "foobar";
2664 size_t value_len
= strlen(value
);
2666 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
2668 status
= memcached_set(memc
, key
, key_len
, value
, value_len
, (time_t)0, (uint32_t)0);
2669 test_truth(status
== MEMCACHED_SUCCESS
);
2671 status
= memcached_mget(memc
, &key
, &key_len
, 1);
2672 test_truth(status
== MEMCACHED_SUCCESS
);
2674 result
= memcached_result_create(memc
, &result_obj
);
2677 memcached_result_create(memc
, &result_obj
);
2678 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2681 test_truth(status
== MEMCACHED_SUCCESS
);
2683 memcached_result_free(result
);
2685 return TEST_SUCCESS
;
2688 #include "ketama_test_cases.h"
2689 static test_return_t
user_supplied_bug18(memcached_st
*trash
)
2691 memcached_return_t rc
;
2694 memcached_server_st
*server_pool
;
2699 memc
= memcached_create(NULL
);
2702 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2703 test_truth(rc
== MEMCACHED_SUCCESS
);
2705 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2706 test_truth(value
== 1);
2708 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2709 test_truth(rc
== MEMCACHED_SUCCESS
);
2711 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2712 test_truth(value
== MEMCACHED_HASH_MD5
);
2714 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");
2715 memcached_server_push(memc
, server_pool
);
2717 /* verify that the server list was parsed okay. */
2718 test_truth(memc
->number_of_hosts
== 8);
2719 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2720 test_truth(server_pool
[0].port
== 11211);
2721 test_truth(server_pool
[0].weight
== 600);
2722 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2723 test_truth(server_pool
[2].port
== 11211);
2724 test_truth(server_pool
[2].weight
== 200);
2725 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2726 test_truth(server_pool
[7].port
== 11211);
2727 test_truth(server_pool
[7].weight
== 100);
2729 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
2730 * us test the boundary wraparound.
2732 test_truth(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
2734 /* verify the standard ketama set. */
2735 for (x
= 0; x
< 99; x
++)
2737 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2738 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2739 test_strcmp(hostname
, ketama_test_cases
[x
].server
);
2742 memcached_server_list_free(server_pool
);
2743 memcached_free(memc
);
2745 return TEST_SUCCESS
;
2748 /* Large mget() of missing keys with binary proto
2750 * If many binary quiet commands (such as getq's in an mget) fill the output
2751 * buffer and the server chooses not to respond, memcached_flush hangs. See
2752 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2755 /* sighandler_t function that always asserts false */
2756 static void fail(int unused
__attribute__((unused
)))
2762 static test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2764 memcached_return_t rc
;
2767 size_t* key_lengths
;
2768 void (*oldalarm
)(int);
2769 memcached_st
*memc_clone
;
2771 memc_clone
= memcached_clone(NULL
, memc
);
2772 test_truth(memc_clone
);
2774 /* only binproto uses getq for mget */
2775 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
2777 /* empty the cache to ensure misses (hence non-responses) */
2778 rc
= memcached_flush(memc_clone
, 0);
2779 test_truth(rc
== MEMCACHED_SUCCESS
);
2781 key_lengths
= calloc(key_count
, sizeof(size_t));
2782 keys
= calloc(key_count
, sizeof(char *));
2784 for (x
= 0; x
< key_count
; x
++)
2788 snprintf(buffer
, 30, "%u", x
);
2789 keys
[x
]= strdup(buffer
);
2790 key_lengths
[x
]= strlen(keys
[x
]);
2793 oldalarm
= signal(SIGALRM
, fail
);
2796 rc
= memcached_mget(memc_clone
, (const char **)keys
, key_lengths
, key_count
);
2797 test_truth(rc
== MEMCACHED_SUCCESS
);
2800 signal(SIGALRM
, oldalarm
);
2802 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
2804 for (x
= 0; x
< key_count
; x
++)
2809 memcached_free(memc_clone
);
2811 return TEST_SUCCESS
;
2814 static test_return_t
pre_binary(memcached_st
*memc
);
2816 static test_return_t
user_supplied_bug21(memcached_st
*memc
)
2818 test_return_t test_rc
;
2819 test_rc
= pre_binary(memc
);
2821 if (test_rc
!= TEST_SUCCESS
)
2826 /* should work as of r580 */
2827 rc
= _user_supplied_bug21(memc
, 10);
2828 test_truth(rc
== TEST_SUCCESS
);
2830 /* should fail as of r580 */
2831 rc
= _user_supplied_bug21(memc
, 1000);
2832 test_truth(rc
== TEST_SUCCESS
);
2834 return TEST_SUCCESS
;
2837 static test_return_t
auto_eject_hosts(memcached_st
*trash
)
2841 memcached_return_t rc
;
2842 memcached_st
*memc
= memcached_create(NULL
);
2845 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2846 test_truth(rc
== MEMCACHED_SUCCESS
);
2848 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2849 test_truth(value
== 1);
2851 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2852 test_truth(rc
== MEMCACHED_SUCCESS
);
2854 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2855 test_truth(value
== MEMCACHED_HASH_MD5
);
2857 /* server should be removed when in delay */
2858 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
, 1);
2859 test_truth(rc
== MEMCACHED_SUCCESS
);
2861 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
);
2862 test_truth(value
== 1);
2864 memcached_server_st
*server_pool
;
2865 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");
2866 memcached_server_push(memc
, server_pool
);
2868 /* verify that the server list was parsed okay. */
2869 test_truth(memc
->number_of_hosts
== 8);
2870 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2871 test_truth(server_pool
[0].port
== 11211);
2872 test_truth(server_pool
[0].weight
== 600);
2873 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2874 test_truth(server_pool
[2].port
== 11211);
2875 test_truth(server_pool
[2].weight
== 200);
2876 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2877 test_truth(server_pool
[7].port
== 11211);
2878 test_truth(server_pool
[7].weight
== 100);
2880 memc
->hosts
[2].next_retry
= time(NULL
) + 15;
2881 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2883 for (int x
= 0; x
< 99; x
++)
2885 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2886 test_truth(server_idx
!= 2);
2889 /* and re-added when it's back. */
2890 memc
->hosts
[2].next_retry
= time(NULL
) - 1;
2891 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2892 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
,
2893 memc
->distribution
);
2894 for (int x
= 0; x
< 99; x
++)
2896 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2897 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2898 test_truth(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
2901 memcached_server_list_free(server_pool
);
2902 memcached_free(memc
);
2904 return TEST_SUCCESS
;
2907 static test_return_t
output_ketama_weighted_keys(memcached_st
*trash
)
2911 memcached_return_t rc
;
2912 memcached_st
*memc
= memcached_create(NULL
);
2916 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2917 test_truth(rc
== MEMCACHED_SUCCESS
);
2919 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2920 test_truth(value
== 1);
2922 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2923 test_truth(rc
== MEMCACHED_SUCCESS
);
2925 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2926 test_truth(value
== MEMCACHED_HASH_MD5
);
2929 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
2931 memcached_server_st
*server_pool
;
2932 server_pool
= memcached_servers_parse("10.0.1.1:11211,10.0.1.2:11211,10.0.1.3:11211,10.0.1.4:11211,10.0.1.5:11211,10.0.1.6:11211,10.0.1.7:11211,10.0.1.8:11211,192.168.1.1:11211,192.168.100.1:11211");
2933 memcached_server_push(memc
, server_pool
);
2935 // @todo this needs to be refactored to actually test something.
2938 if ((fp
= fopen("ketama_keys.txt", "w")))
2942 printf("cannot write to file ketama_keys.txt");
2943 return TEST_FAILURE
;
2946 for (int x
= 0; x
< 10000; x
++)
2949 sprintf(key
, "%d", x
);
2951 uint32_t server_idx
= memcached_generate_hash(memc
, key
, strlen(key
));
2952 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2953 in_port_t port
= memc
->hosts
[server_idx
].port
;
2954 fprintf(fp
, "key %s is on host /%s:%u\n", key
, hostname
, port
);
2958 memcached_server_list_free(server_pool
);
2959 memcached_free(memc
);
2961 return TEST_SUCCESS
;
2965 static test_return_t
result_static(memcached_st
*memc
)
2967 memcached_result_st result
;
2968 memcached_result_st
*result_ptr
;
2970 result_ptr
= memcached_result_create(memc
, &result
);
2971 test_truth(result
.options
.is_allocated
== false);
2972 test_truth(memcached_is_initialized(&result
) == true);
2973 test_truth(result_ptr
);
2974 test_truth(result_ptr
== &result
);
2976 memcached_result_free(&result
);
2978 test_truth(result
.options
.is_allocated
== false);
2979 test_truth(memcached_is_initialized(&result
) == false);
2981 return TEST_SUCCESS
;
2984 static test_return_t
result_alloc(memcached_st
*memc
)
2986 memcached_result_st
*result_ptr
;
2988 result_ptr
= memcached_result_create(memc
, NULL
);
2989 test_truth(result_ptr
);
2990 test_truth(result_ptr
->options
.is_allocated
== true);
2991 test_truth(memcached_is_initialized(result_ptr
) == true);
2992 memcached_result_free(result_ptr
);
2994 return TEST_SUCCESS
;
2997 static test_return_t
string_static_null(memcached_st
*memc
)
2999 memcached_string_st string
;
3000 memcached_string_st
*string_ptr
;
3002 string_ptr
= memcached_string_create(memc
, &string
, 0);
3003 test_truth(string
.options
.is_initialized
== true);
3004 test_truth(string_ptr
);
3006 /* The following two better be the same! */
3007 test_truth(memcached_is_allocated(string_ptr
) == false);
3008 test_truth(memcached_is_allocated(&string
) == false);
3009 test_truth(&string
== string_ptr
);
3011 test_truth(string
.options
.is_initialized
== true);
3012 test_truth(memcached_is_initialized(&string
) == true);
3013 memcached_string_free(&string
);
3014 test_truth(memcached_is_initialized(&string
) == false);
3016 return TEST_SUCCESS
;
3019 static test_return_t
string_alloc_null(memcached_st
*memc
)
3021 memcached_string_st
*string
;
3023 string
= memcached_string_create(memc
, NULL
, 0);
3025 test_truth(memcached_is_allocated(string
) == true);
3026 test_truth(memcached_is_initialized(string
) == true);
3027 memcached_string_free(string
);
3029 return TEST_SUCCESS
;
3032 static test_return_t
string_alloc_with_size(memcached_st
*memc
)
3034 memcached_string_st
*string
;
3036 string
= memcached_string_create(memc
, NULL
, 1024);
3038 test_truth(memcached_is_allocated(string
) == true);
3039 test_truth(memcached_is_initialized(string
) == true);
3040 memcached_string_free(string
);
3042 return TEST_SUCCESS
;
3045 static test_return_t
string_alloc_with_size_toobig(memcached_st
*memc
)
3047 memcached_string_st
*string
;
3049 string
= memcached_string_create(memc
, NULL
, SIZE_MAX
);
3050 test_truth(string
== NULL
);
3052 return TEST_SUCCESS
;
3055 static test_return_t
string_alloc_append(memcached_st
*memc
)
3058 char buffer
[SMALL_STRING_LEN
];
3059 memcached_string_st
*string
;
3061 /* Ring the bell! */
3062 memset(buffer
, 6, SMALL_STRING_LEN
);
3064 string
= memcached_string_create(memc
, NULL
, 100);
3066 test_truth(memcached_is_allocated(string
) == true);
3067 test_truth(memcached_is_initialized(string
) == true);
3069 for (x
= 0; x
< 1024; x
++)
3071 memcached_return_t rc
;
3072 rc
= memcached_string_append(string
, buffer
, SMALL_STRING_LEN
);
3073 test_truth(rc
== MEMCACHED_SUCCESS
);
3075 test_truth(memcached_is_allocated(string
) == true);
3076 memcached_string_free(string
);
3078 return TEST_SUCCESS
;
3081 static test_return_t
string_alloc_append_toobig(memcached_st
*memc
)
3083 memcached_return_t rc
;
3085 char buffer
[SMALL_STRING_LEN
];
3086 memcached_string_st
*string
;
3088 /* Ring the bell! */
3089 memset(buffer
, 6, SMALL_STRING_LEN
);
3091 string
= memcached_string_create(memc
, NULL
, 100);
3093 test_truth(memcached_is_allocated(string
) == true);
3094 test_truth(memcached_is_initialized(string
) == true);
3096 for (x
= 0; x
< 1024; x
++)
3098 rc
= memcached_string_append(string
, buffer
, SMALL_STRING_LEN
);
3099 test_truth(rc
== MEMCACHED_SUCCESS
);
3101 rc
= memcached_string_append(string
, buffer
, SIZE_MAX
);
3102 test_truth(rc
== MEMCACHED_MEMORY_ALLOCATION_FAILURE
);
3103 test_truth(memcached_is_allocated(string
) == true);
3104 memcached_string_free(string
);
3106 return TEST_SUCCESS
;
3109 static test_return_t
cleanup_pairs(memcached_st
*memc
__attribute__((unused
)))
3111 pairs_free(global_pairs
);
3113 return TEST_SUCCESS
;
3116 static test_return_t
generate_pairs(memcached_st
*memc
__attribute__((unused
)))
3118 unsigned long long x
;
3119 global_pairs
= pairs_generate(GLOBAL_COUNT
, 400);
3120 global_count
= GLOBAL_COUNT
;
3122 for (x
= 0; x
< global_count
; x
++)
3124 global_keys
[x
]= global_pairs
[x
].key
;
3125 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3128 return TEST_SUCCESS
;
3131 static test_return_t
generate_large_pairs(memcached_st
*memc
__attribute__((unused
)))
3133 unsigned long long x
;
3134 global_pairs
= pairs_generate(GLOBAL2_COUNT
, MEMCACHED_MAX_BUFFER
+10);
3135 global_count
= GLOBAL2_COUNT
;
3137 for (x
= 0; x
< global_count
; x
++)
3139 global_keys
[x
]= global_pairs
[x
].key
;
3140 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3143 return TEST_SUCCESS
;
3146 static test_return_t
generate_data(memcached_st
*memc
)
3148 execute_set(memc
, global_pairs
, global_count
);
3150 return TEST_SUCCESS
;
3153 static test_return_t
generate_data_with_stats(memcached_st
*memc
)
3155 memcached_stat_st
*stat_p
;
3156 memcached_return_t rc
;
3157 uint32_t host_index
= 0;
3158 execute_set(memc
, global_pairs
, global_count
);
3160 //TODO: hosts used size stats
3161 stat_p
= memcached_stat(memc
, NULL
, &rc
);
3164 for (host_index
= 0; host_index
< SERVERS_TO_CREATE
; host_index
++)
3166 /* This test was changes so that "make test" would work properlly */
3168 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
);
3170 test_truth((unsigned long long)(stat_p
+ host_index
)->bytes
);
3173 memcached_stat_free(NULL
, stat_p
);
3175 return TEST_SUCCESS
;
3177 static test_return_t
generate_buffer_data(memcached_st
*memc
)
3182 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, latch
);
3183 generate_data(memc
);
3185 return TEST_SUCCESS
;
3188 static test_return_t
get_read_count(memcached_st
*memc
)
3191 memcached_return_t rc
;
3192 memcached_st
*memc_clone
;
3194 memc_clone
= memcached_clone(NULL
, memc
);
3195 test_truth(memc_clone
);
3197 memcached_server_add_with_weight(memc_clone
, "localhost", 6666, 0);
3201 size_t return_value_length
;
3205 for (x
= count
= 0; x
< global_count
; x
++)
3207 return_value
= memcached_get(memc_clone
, global_keys
[x
], global_keys_length
[x
],
3208 &return_value_length
, &flags
, &rc
);
3209 if (rc
== MEMCACHED_SUCCESS
)
3218 memcached_free(memc_clone
);
3220 return TEST_SUCCESS
;
3223 static test_return_t
get_read(memcached_st
*memc
)
3226 memcached_return_t rc
;
3230 size_t return_value_length
;
3233 for (x
= 0; x
< global_count
; x
++)
3235 return_value
= memcached_get(memc
, global_keys
[x
], global_keys_length
[x
],
3236 &return_value_length
, &flags
, &rc
);
3238 test_truth(return_value);
3239 test_truth(rc == MEMCACHED_SUCCESS);
3241 if (rc
== MEMCACHED_SUCCESS
&& return_value
)
3246 return TEST_SUCCESS
;
3249 static test_return_t
mget_read(memcached_st
*memc
)
3251 memcached_return_t rc
;
3253 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3254 test_truth(rc
== MEMCACHED_SUCCESS
);
3255 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
3257 return TEST_SUCCESS
;
3260 static test_return_t
mget_read_result(memcached_st
*memc
)
3262 memcached_return_t rc
;
3264 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3265 test_truth(rc
== MEMCACHED_SUCCESS
);
3266 /* Turn this into a help function */
3268 memcached_result_st results_obj
;
3269 memcached_result_st
*results
;
3271 results
= memcached_result_create(memc
, &results_obj
);
3273 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
3275 test_truth(results
);
3276 test_truth(rc
== MEMCACHED_SUCCESS
);
3279 memcached_result_free(&results_obj
);
3282 return TEST_SUCCESS
;
3285 static test_return_t
mget_read_function(memcached_st
*memc
)
3287 memcached_return_t rc
;
3288 unsigned int counter
;
3289 memcached_execute_fn callbacks
[1];
3291 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3292 test_truth(rc
== MEMCACHED_SUCCESS
);
3294 callbacks
[0]= &callback_counter
;
3296 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
3298 return TEST_SUCCESS
;
3301 static test_return_t
delete_generate(memcached_st
*memc
)
3305 for (x
= 0; x
< global_count
; x
++)
3307 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3310 return TEST_SUCCESS
;
3313 static test_return_t
delete_buffer_generate(memcached_st
*memc
)
3319 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, latch
);
3321 for (x
= 0; x
< global_count
; x
++)
3323 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3326 return TEST_SUCCESS
;
3329 static test_return_t
add_host_test1(memcached_st
*memc
)
3332 memcached_return_t rc
;
3333 char servername
[]= "0.example.com";
3334 memcached_server_st
*servers
;
3336 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
3337 test_truth(servers
);
3338 test_truth(1 == memcached_server_list_count(servers
));
3340 for (x
= 2; x
< 20; x
++)
3342 char buffer
[SMALL_STRING_LEN
];
3344 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
3345 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
3347 test_truth(rc
== MEMCACHED_SUCCESS
);
3348 test_truth(x
== memcached_server_list_count(servers
));
3351 rc
= memcached_server_push(memc
, servers
);
3352 test_truth(rc
== MEMCACHED_SUCCESS
);
3353 rc
= memcached_server_push(memc
, servers
);
3354 test_truth(rc
== MEMCACHED_SUCCESS
);
3356 memcached_server_list_free(servers
);
3358 return TEST_SUCCESS
;
3361 static test_return_t
pre_nonblock(memcached_st
*memc
)
3363 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3365 return TEST_SUCCESS
;
3368 static test_return_t
pre_nonblock_binary(memcached_st
*memc
)
3370 memcached_return_t rc
= MEMCACHED_FAILURE
;
3371 memcached_st
*memc_clone
;
3373 memc_clone
= memcached_clone(NULL
, memc
);
3375 // The memcached_version needs to be done on a clone, because the server
3376 // will not toggle protocol on an connection.
3377 memcached_version(memc_clone
);
3379 if (memc_clone
->hosts
[0].major_version
>= 1 && memc_clone
->hosts
[0].minor_version
> 2)
3381 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3382 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
3383 test_truth(rc
== MEMCACHED_SUCCESS
);
3384 assert(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1);
3388 return TEST_SKIPPED
;
3391 memcached_free(memc_clone
);
3393 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3396 static test_return_t
pre_murmur(memcached_st
*memc
)
3398 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
);
3400 return TEST_SUCCESS
;
3403 static test_return_t
pre_jenkins(memcached_st
*memc
)
3405 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_JENKINS
);
3407 return TEST_SUCCESS
;
3411 static test_return_t
pre_md5(memcached_st
*memc
)
3413 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MD5
);
3415 return TEST_SUCCESS
;
3418 static test_return_t
pre_crc(memcached_st
*memc
)
3420 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_CRC
);
3422 return TEST_SUCCESS
;
3425 static test_return_t
pre_hsieh(memcached_st
*memc
)
3427 #ifdef HAVE_HSIEH_HASH
3428 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_HSIEH
);
3429 return TEST_SUCCESS
;
3432 return TEST_SKIPPED
;
3436 static test_return_t
pre_hash_fnv1_64(memcached_st
*memc
)
3438 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
);
3440 return TEST_SUCCESS
;
3443 static test_return_t
pre_hash_fnv1a_64(memcached_st
*memc
)
3445 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_64
);
3447 return TEST_SUCCESS
;
3450 static test_return_t
pre_hash_fnv1_32(memcached_st
*memc
)
3452 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1_32
);
3454 return TEST_SUCCESS
;
3457 static test_return_t
pre_hash_fnv1a_32(memcached_st
*memc
)
3459 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_32
);
3461 return TEST_SUCCESS
;
3464 static test_return_t
pre_behavior_ketama(memcached_st
*memc
)
3466 memcached_return_t rc
;
3469 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA
, 1);
3470 test_truth(rc
== MEMCACHED_SUCCESS
);
3472 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA
);
3473 test_truth(value
== 1);
3475 return TEST_SUCCESS
;
3478 static test_return_t
pre_behavior_ketama_weighted(memcached_st
*memc
)
3480 memcached_return_t rc
;
3483 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
3484 test_truth(rc
== MEMCACHED_SUCCESS
);
3486 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
3487 test_truth(value
== 1);
3489 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
3490 test_truth(rc
== MEMCACHED_SUCCESS
);
3492 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
3493 test_truth(value
== MEMCACHED_HASH_MD5
);
3495 return TEST_SUCCESS
;
3499 @note This should be testing to see if the server really supports the binary protocol.
3501 static test_return_t
pre_binary(memcached_st
*memc
)
3503 memcached_return_t rc
= MEMCACHED_FAILURE
;
3504 memcached_st
*memc_clone
;
3506 memc_clone
= memcached_clone(NULL
, memc
);
3507 test_truth(memc_clone
);
3508 // The memcached_version needs to be done on a clone, because the server
3509 // will not toggle protocol on an connection.
3510 memcached_version(memc_clone
);
3512 if (memc_clone
->hosts
[0].major_version
>= 1 && memc_clone
->hosts
[0].minor_version
> 2)
3514 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
3515 test_truth(rc
== MEMCACHED_SUCCESS
);
3516 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1);
3519 memcached_free(memc_clone
);
3521 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3524 static test_return_t
pre_replication(memcached_st
*memc
)
3526 test_return_t test_rc
;
3527 test_rc
= pre_binary(memc
);
3529 if (test_rc
!= TEST_SUCCESS
)
3533 * Make sure that we store the item on all servers
3534 * (master + replicas == number of servers)
3536 memcached_return_t rc
;
3537 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
,
3538 memc
->number_of_hosts
- 1);
3539 test_truth(rc
== MEMCACHED_SUCCESS
);
3540 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
) == memc
->number_of_hosts
- 1);
3542 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3545 static test_return_t
pre_replication_noblock(memcached_st
*memc
)
3547 test_return_t rc
= MEMCACHED_FAILURE
;
3548 if (pre_replication(memc
) == TEST_SUCCESS
&&
3549 pre_nonblock(memc
) == TEST_SUCCESS
)
3555 static void my_free(memcached_st
*ptr
__attribute__((unused
)), void *mem
)
3557 #ifdef HARD_MALLOC_TESTS
3558 void *real_ptr
= (mem
== NULL
) ? mem
: (void*)((caddr_t
)mem
- 8);
3565 static void *my_malloc(memcached_st
*ptr
__attribute__((unused
)), const size_t size
)
3567 #ifdef HARD_MALLOC_TESTS
3568 void *ret
= malloc(size
+ 8);
3571 ret
= (void*)((caddr_t
)ret
+ 8);
3574 void *ret
= malloc(size
);
3579 memset(ret
, 0xff, size
);
3585 static void *my_realloc(memcached_st
*ptr
__attribute__((unused
)), void *mem
, const size_t size
)
3587 #ifdef HARD_MALLOC_TESTS
3588 void *real_ptr
= (mem
== NULL
) ? NULL
: (void*)((caddr_t
)mem
- 8);
3589 void *nmem
= realloc(real_ptr
, size
+ 8);
3594 ret
= (void*)((caddr_t
)nmem
+ 8);
3599 return realloc(mem
, size
);
3603 static void *my_calloc(memcached_st
*ptr
__attribute__((unused
)), size_t nelem
, const size_t size
)
3605 #ifdef HARD_MALLOC_TESTS
3606 void *mem
= my_malloc(ptr
, nelem
* size
);
3609 memset(mem
, 0, nelem
* size
);
3614 return calloc(nelem
, size
);
3618 static test_return_t
set_prefix(memcached_st
*memc
)
3620 memcached_return_t rc
;
3621 const char *key
= "mine";
3624 /* Make sure be default none exists */
3625 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3626 test_truth(rc
== MEMCACHED_FAILURE
);
3628 /* Test a clean set */
3629 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3630 test_truth(rc
== MEMCACHED_SUCCESS
);
3632 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3633 test_truth(memcmp(value
, key
, 4) == 0);
3634 test_truth(rc
== MEMCACHED_SUCCESS
);
3636 /* Test that we can turn it off */
3637 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3638 test_truth(rc
== MEMCACHED_SUCCESS
);
3640 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3641 test_truth(rc
== MEMCACHED_FAILURE
);
3643 /* Now setup for main test */
3644 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3645 test_truth(rc
== MEMCACHED_SUCCESS
);
3647 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3648 test_truth(rc
== MEMCACHED_SUCCESS
);
3649 test_truth(memcmp(value
, key
, 4) == 0);
3651 /* Set to Zero, and then Set to something too large */
3654 memset(long_key
, 0, 255);
3656 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3657 test_truth(rc
== MEMCACHED_SUCCESS
);
3659 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3660 test_truth(rc
== MEMCACHED_FAILURE
);
3661 test_truth(value
== NULL
);
3663 /* Test a long key for failure */
3664 /* TODO, extend test to determine based on setting, what result should be */
3665 strcpy(long_key
, "Thisismorethentheallottednumberofcharacters");
3666 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3667 //test_truth(rc == MEMCACHED_BAD_KEY_PROVIDED);
3668 test_truth(rc
== MEMCACHED_SUCCESS
);
3670 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3671 strcpy(long_key
, "This is more then the allotted number of characters");
3672 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3673 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3675 /* Test for a bad prefix, but with a short key */
3676 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1);
3677 test_truth(rc
== MEMCACHED_SUCCESS
);
3679 strcpy(long_key
, "dog cat");
3680 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3681 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3684 return TEST_SUCCESS
;
3687 #ifdef MEMCACHED_ENABLE_DEPRECATED
3688 static test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
3690 void *test_ptr
= NULL
;
3693 memcached_malloc_fn malloc_cb
=
3694 (memcached_malloc_fn
)my_malloc
;
3695 cb_ptr
= *(void **)&malloc_cb
;
3696 memcached_return_t rc
;
3698 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
);
3699 test_truth(rc
== MEMCACHED_SUCCESS
);
3700 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3701 test_truth(rc
== MEMCACHED_SUCCESS
);
3702 test_truth(test_ptr
== cb_ptr
);
3706 memcached_realloc_fn realloc_cb
=
3707 (memcached_realloc_fn
)my_realloc
;
3708 cb_ptr
= *(void **)&realloc_cb
;
3709 memcached_return_t rc
;
3711 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
);
3712 test_truth(rc
== MEMCACHED_SUCCESS
);
3713 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3714 test_truth(rc
== MEMCACHED_SUCCESS
);
3715 test_truth(test_ptr
== cb_ptr
);
3719 memcached_free_fn free_cb
=
3720 (memcached_free_fn
)my_free
;
3721 cb_ptr
= *(void **)&free_cb
;
3722 memcached_return_t rc
;
3724 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
);
3725 test_truth(rc
== MEMCACHED_SUCCESS
);
3726 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3727 test_truth(rc
== MEMCACHED_SUCCESS
);
3728 test_truth(test_ptr
== cb_ptr
);
3731 return TEST_SUCCESS
;
3735 static test_return_t
set_memory_alloc(memcached_st
*memc
)
3737 memcached_return_t rc
;
3738 rc
= memcached_set_memory_allocators(memc
, NULL
, my_free
,
3739 my_realloc
, my_calloc
);
3740 test_truth(rc
== MEMCACHED_FAILURE
);
3742 rc
= memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3743 my_realloc
, my_calloc
);
3745 memcached_malloc_fn mem_malloc
;
3746 memcached_free_fn mem_free
;
3747 memcached_realloc_fn mem_realloc
;
3748 memcached_calloc_fn mem_calloc
;
3749 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3750 &mem_realloc
, &mem_calloc
);
3752 test_truth(mem_malloc
== my_malloc
);
3753 test_truth(mem_realloc
== my_realloc
);
3754 test_truth(mem_calloc
== my_calloc
);
3755 test_truth(mem_free
== my_free
);
3757 return TEST_SUCCESS
;
3760 static test_return_t
enable_consistent_crc(memcached_st
*memc
)
3763 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3764 memcached_hash_t hash
;
3765 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3766 if ((rc
= pre_crc(memc
)) != TEST_SUCCESS
)
3769 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3770 test_truth(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3772 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3774 if (hash
!= MEMCACHED_HASH_CRC
)
3775 return TEST_SKIPPED
;
3777 return TEST_SUCCESS
;
3780 static test_return_t
enable_consistent_hsieh(memcached_st
*memc
)
3783 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3784 memcached_hash_t hash
;
3785 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3786 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3789 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3790 test_truth(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3792 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3794 if (hash
!= MEMCACHED_HASH_HSIEH
)
3795 return TEST_SKIPPED
;
3798 return TEST_SUCCESS
;
3801 static test_return_t
enable_cas(memcached_st
*memc
)
3803 unsigned int set
= 1;
3805 memcached_version(memc
);
3807 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3808 || memc
->hosts
[0].minor_version
> 2)
3810 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3812 return TEST_SUCCESS
;
3815 return TEST_SKIPPED
;
3818 static test_return_t
check_for_1_2_3(memcached_st
*memc
)
3820 memcached_version(memc
);
3822 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3823 || memc
->hosts
[0].minor_version
> 2)
3824 return TEST_SUCCESS
;
3826 return TEST_SKIPPED
;
3829 static test_return_t
pre_unix_socket(memcached_st
*memc
)
3831 memcached_return_t rc
;
3834 memcached_server_list_free(memc
->hosts
);
3836 memc
->number_of_hosts
= 0;
3838 if (stat("/tmp/memcached.socket", &buf
))
3839 return TEST_SKIPPED
;
3841 rc
= memcached_server_add_unix_socket_with_weight(memc
, "/tmp/memcached.socket", 0);
3843 return ( rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_FAILURE
);
3846 static test_return_t
pre_nodelay(memcached_st
*memc
)
3848 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3849 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
3851 return TEST_SUCCESS
;
3854 static test_return_t
pre_settimer(memcached_st
*memc
)
3856 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
3857 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
3859 return TEST_SUCCESS
;
3862 static test_return_t
poll_timeout(memcached_st
*memc
)
3868 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
3870 timeout
= (size_t)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
3872 test_truth(timeout
== 100);
3874 return TEST_SUCCESS
;
3877 static test_return_t
noreply_test(memcached_st
*memc
)
3879 memcached_return_t ret
;
3880 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
3881 test_truth(ret
== MEMCACHED_SUCCESS
);
3882 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
3883 test_truth(ret
== MEMCACHED_SUCCESS
);
3884 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
3885 test_truth(ret
== MEMCACHED_SUCCESS
);
3886 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
) == 1);
3887 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
) == 1);
3888 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
) == 1);
3890 for (int count
=0; count
< 5; ++count
)
3892 for (int x
=0; x
< 100; ++x
)
3895 size_t len
= (size_t)sprintf(key
, "%d", x
);
3899 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
3902 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
3905 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
3908 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
3911 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
3917 test_truth(ret
== MEMCACHED_SUCCESS
|| ret
== MEMCACHED_BUFFERED
);
3921 ** NOTE: Don't ever do this in your code! this is not a supported use of the
3922 ** API and is _ONLY_ done this way to verify that the library works the
3923 ** way it is supposed to do!!!!
3926 for (uint32_t x
=0; x
< memc
->number_of_hosts
; ++x
)
3927 no_msg
+=(int)(memc
->hosts
[x
].cursor_active
);
3929 test_truth(no_msg
== 0);
3930 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3933 ** Now validate that all items was set properly!
3935 for (int x
=0; x
< 100; ++x
)
3938 size_t len
= (size_t)sprintf(key
, "%d", x
);
3941 char* value
=memcached_get(memc
, key
, strlen(key
),
3942 &length
, &flags
, &ret
);
3943 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3946 case 0: /* FALLTHROUGH */
3947 case 1: /* FALLTHROUGH */
3949 test_truth(strncmp(value
, key
, len
) == 0);
3950 test_truth(len
== length
);
3953 test_truth(length
== len
* 2);
3956 test_truth(length
== len
* 3);
3966 /* Try setting an illegal cas value (should not return an error to
3967 * the caller (because we don't expect a return message from the server)
3969 const char* keys
[]= {"0"};
3970 size_t lengths
[]= {1};
3973 memcached_result_st results_obj
;
3974 memcached_result_st
*results
;
3975 ret
= memcached_mget(memc
, keys
, lengths
, 1);
3976 test_truth(ret
== MEMCACHED_SUCCESS
);
3978 results
= memcached_result_create(memc
, &results_obj
);
3979 test_truth(results
);
3980 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
3981 test_truth(results
);
3982 test_truth(ret
== MEMCACHED_SUCCESS
);
3983 uint64_t cas
= memcached_result_cas(results
);
3984 memcached_result_free(&results_obj
);
3986 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
3987 test_truth(ret
== MEMCACHED_SUCCESS
);
3990 * The item will have a new cas value, so try to set it again with the old
3991 * value. This should fail!
3993 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
3994 test_truth(ret
== MEMCACHED_SUCCESS
);
3995 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3996 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
3997 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
4000 return TEST_SUCCESS
;
4003 static test_return_t
analyzer_test(memcached_st
*memc
)
4005 memcached_return_t rc
;
4006 memcached_stat_st
*memc_stat
;
4007 memcached_analysis_st
*report
;
4009 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
4010 test_truth(rc
== MEMCACHED_SUCCESS
);
4011 test_truth(memc_stat
);
4013 report
= memcached_analyze(memc
, memc_stat
, &rc
);
4014 test_truth(rc
== MEMCACHED_SUCCESS
);
4018 memcached_stat_free(NULL
, memc_stat
);
4020 return TEST_SUCCESS
;
4023 /* Count the objects */
4024 static memcached_return_t
callback_dump_counter(memcached_st
*ptr
__attribute__((unused
)),
4025 const char *key
__attribute__((unused
)),
4026 size_t key_length
__attribute__((unused
)),
4029 uint32_t *counter
= (uint32_t *)context
;
4031 *counter
= *counter
+ 1;
4033 return MEMCACHED_SUCCESS
;
4036 static test_return_t
dump_test(memcached_st
*memc
)
4038 memcached_return_t rc
;
4039 uint32_t counter
= 0;
4040 memcached_dump_fn callbacks
[1];
4041 test_return_t main_rc
;
4043 callbacks
[0]= &callback_dump_counter
;
4045 /* No support for Binary protocol yet */
4046 if (memc
->flags
.binary_protocol
)
4047 return TEST_SUCCESS
;
4049 main_rc
= set_test3(memc
);
4051 test_truth (main_rc
== TEST_SUCCESS
);
4053 rc
= memcached_dump(memc
, callbacks
, (void *)&counter
, 1);
4054 test_truth(rc
== MEMCACHED_SUCCESS
);
4056 /* We may have more then 32 if our previous flush has not completed */
4057 test_truth(counter
>= 32);
4059 return TEST_SUCCESS
;
4062 #ifdef HAVE_LIBMEMCACHEDUTIL
4063 static void* connection_release(void *arg
)
4066 memcached_pool_st
* pool
;
4071 assert(memcached_pool_push(resource
->pool
, resource
->mmc
) == MEMCACHED_SUCCESS
);
4075 static test_return_t
connection_pool_test(memcached_st
*memc
)
4077 memcached_pool_st
* pool
= memcached_pool_create(memc
, 5, 10);
4078 test_truth(pool
!= NULL
);
4079 memcached_st
* mmc
[10];
4080 memcached_return_t rc
;
4082 for (int x
= 0; x
< 10; ++x
) {
4083 mmc
[x
]= memcached_pool_pop(pool
, false, &rc
);
4084 test_truth(mmc
[x
] != NULL
);
4085 test_truth(rc
== MEMCACHED_SUCCESS
);
4088 test_truth(memcached_pool_pop(pool
, false, &rc
) == NULL
);
4089 test_truth(rc
== MEMCACHED_SUCCESS
);
4093 memcached_pool_st
* pool
;
4095 } item
= { .pool
= pool
, .mmc
= mmc
[9] };
4096 pthread_create(&tid
, NULL
, connection_release
, &item
);
4097 mmc
[9]= memcached_pool_pop(pool
, true, &rc
);
4098 test_truth(rc
== MEMCACHED_SUCCESS
);
4099 pthread_join(tid
, NULL
);
4100 test_truth(mmc
[9] == item
.mmc
);
4101 const char *key
= "key";
4102 size_t keylen
= strlen(key
);
4104 // verify that I can do ops with all connections
4105 rc
= memcached_set(mmc
[0], key
, keylen
, "0", 1, 0, 0);
4106 test_truth(rc
== MEMCACHED_SUCCESS
);
4108 for (unsigned int x
= 0; x
< 10; ++x
) {
4109 uint64_t number_value
;
4110 rc
= memcached_increment(mmc
[x
], key
, keylen
, 1, &number_value
);
4111 test_truth(rc
== MEMCACHED_SUCCESS
);
4112 test_truth(number_value
== (x
+1));
4116 for (int x
= 0; x
< 10; ++x
)
4117 test_truth(memcached_pool_push(pool
, mmc
[x
]) == MEMCACHED_SUCCESS
);
4120 /* verify that I can set behaviors on the pool when I don't have all
4121 * of the connections in the pool. It should however be enabled
4122 * when I push the item into the pool
4124 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4125 test_truth(mmc
[0] != NULL
);
4127 rc
= memcached_pool_behavior_set(pool
, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
, 9999);
4128 test_truth(rc
== MEMCACHED_SUCCESS
);
4130 mmc
[1]= memcached_pool_pop(pool
, false, &rc
);
4131 test_truth(mmc
[1] != NULL
);
4133 test_truth(memcached_behavior_get(mmc
[1], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4134 test_truth(memcached_pool_push(pool
, mmc
[1]) == MEMCACHED_SUCCESS
);
4135 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4137 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4138 test_truth(memcached_behavior_get(mmc
[0], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4139 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4142 test_truth(memcached_pool_destroy(pool
) == memc
);
4143 return TEST_SUCCESS
;
4147 static test_return_t
replication_set_test(memcached_st
*memc
)
4149 memcached_return_t rc
;
4150 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4151 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4153 rc
= memcached_set(memc
, "bubba", 5, "0", 1, 0, 0);
4154 test_truth(rc
== MEMCACHED_SUCCESS
);
4157 ** We are using the quiet commands to store the replicas, so we need
4158 ** to ensure that all of them are processed before we can continue.
4159 ** In the test we go directly from storing the object to trying to
4160 ** receive the object from all of the different servers, so we
4161 ** could end up in a race condition (the memcached server hasn't yet
4162 ** processed the quiet command from the replication set when it process
4163 ** the request from the other client (created by the clone)). As a
4164 ** workaround for that we call memcached_quit to send the quit command
4165 ** to the server and wait for the response ;-) If you use the test code
4166 ** as an example for your own code, please note that you shouldn't need
4169 memcached_quit(memc
);
4172 ** "bubba" should now be stored on all of our servers. We don't have an
4173 ** easy to use API to address each individual server, so I'll just iterate
4174 ** through a bunch of "master keys" and I should most likely hit all of the
4177 for (int x
= 'a'; x
<= 'z'; ++x
)
4179 char key
[2]= { [0]= (char)x
};
4182 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4184 test_truth(rc
== MEMCACHED_SUCCESS
);
4185 test_truth(val
!= NULL
);
4189 memcached_free(memc_clone
);
4191 return TEST_SUCCESS
;
4194 static test_return_t
replication_get_test(memcached_st
*memc
)
4196 memcached_return_t rc
;
4199 * Don't do the following in your code. I am abusing the internal details
4200 * within the library, and this is not a supported interface.
4201 * This is to verify correct behavior in the library
4203 for (uint32_t host
= 0; host
< memc
->number_of_hosts
; ++host
)
4205 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4206 memc_clone
->hosts
[host
].port
= 0;
4208 for (int x
= 'a'; x
<= 'z'; ++x
)
4210 char key
[2]= { [0]= (char)x
};
4213 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4215 test_truth(rc
== MEMCACHED_SUCCESS
);
4216 test_truth(val
!= NULL
);
4220 memcached_free(memc_clone
);
4223 return TEST_SUCCESS
;
4226 static test_return_t
replication_mget_test(memcached_st
*memc
)
4228 memcached_return_t rc
;
4229 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4230 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4232 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4233 size_t len
[]= { 5, 4, 4, 4 };
4235 for (int x
=0; x
< 4; ++x
)
4237 rc
= memcached_set(memc
, keys
[x
], len
[x
], "0", 1, 0, 0);
4238 test_truth(rc
== MEMCACHED_SUCCESS
);
4242 ** We are using the quiet commands to store the replicas, so we need
4243 ** to ensure that all of them are processed before we can continue.
4244 ** In the test we go directly from storing the object to trying to
4245 ** receive the object from all of the different servers, so we
4246 ** could end up in a race condition (the memcached server hasn't yet
4247 ** processed the quiet command from the replication set when it process
4248 ** the request from the other client (created by the clone)). As a
4249 ** workaround for that we call memcached_quit to send the quit command
4250 ** to the server and wait for the response ;-) If you use the test code
4251 ** as an example for your own code, please note that you shouldn't need
4254 memcached_quit(memc
);
4257 * Don't do the following in your code. I am abusing the internal details
4258 * within the library, and this is not a supported interface.
4259 * This is to verify correct behavior in the library
4261 memcached_result_st result_obj
;
4262 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; host
++)
4264 memcached_st
*new_clone
= memcached_clone(NULL
, memc
);
4265 new_clone
->hosts
[host
].port
= 0;
4267 for (int x
= 'a'; x
<= 'z'; ++x
)
4269 const char key
[2]= { [0]= (const char)x
};
4271 rc
= memcached_mget_by_key(new_clone
, key
, 1, keys
, len
, 4);
4272 test_truth(rc
== MEMCACHED_SUCCESS
);
4274 memcached_result_st
*results
= memcached_result_create(new_clone
, &result_obj
);
4275 test_truth(results
);
4278 while ((results
= memcached_fetch_result(new_clone
, &result_obj
, &rc
)) != NULL
)
4282 test_truth(hits
== 4);
4283 memcached_result_free(&result_obj
);
4286 memcached_free(new_clone
);
4289 memcached_free(memc_clone
);
4291 return TEST_SUCCESS
;
4294 static test_return_t
replication_randomize_mget_test(memcached_st
*memc
)
4296 memcached_result_st result_obj
;
4297 memcached_return_t rc
;
4298 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4299 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 3);
4300 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
, 1);
4302 const char *keys
[]= { "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
4303 size_t len
[]= { 4, 4, 4, 4, 4, 4, 4 };
4305 for (int x
=0; x
< 7; ++x
)
4307 rc
= memcached_set(memc
, keys
[x
], len
[x
], "1", 1, 0, 0);
4308 test_truth(rc
== MEMCACHED_SUCCESS
);
4311 memcached_quit(memc
);
4313 for (int x
=0; x
< 7; ++x
) {
4314 const char key
[2]= { [0]= (const char)x
};
4316 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 7);
4317 test_truth(rc
== MEMCACHED_SUCCESS
);
4319 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4320 test_truth(results
);
4323 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4327 test_truth(hits
== 7);
4328 memcached_result_free(&result_obj
);
4330 memcached_free(memc_clone
);
4331 return TEST_SUCCESS
;
4334 static test_return_t
replication_delete_test(memcached_st
*memc
)
4336 memcached_return_t rc
;
4337 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4338 /* Delete the items from all of the servers except 1 */
4339 uint64_t repl
= memcached_behavior_get(memc
,
4340 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
4341 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, --repl
);
4343 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4344 size_t len
[]= { 5, 4, 4, 4 };
4346 for (int x
=0; x
< 4; ++x
)
4348 rc
= memcached_delete_by_key(memc
, keys
[0], len
[0], keys
[x
], len
[x
], 0);
4349 test_truth(rc
== MEMCACHED_SUCCESS
);
4353 * Don't do the following in your code. I am abusing the internal details
4354 * within the library, and this is not a supported interface.
4355 * This is to verify correct behavior in the library
4357 uint32_t hash
= memcached_generate_hash(memc
, keys
[0], len
[0]);
4358 for (uint32_t x
= 0; x
< (repl
+ 1); ++x
)
4360 memc_clone
->hosts
[hash
].port
= 0;
4361 if (++hash
== memc_clone
->number_of_hosts
)
4365 memcached_result_st result_obj
;
4366 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; ++host
)
4368 for (int x
= 'a'; x
<= 'z'; ++x
)
4370 const char key
[2]= { [0]= (const char)x
};
4372 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 4);
4373 test_truth(rc
== MEMCACHED_SUCCESS
);
4375 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4376 test_truth(results
);
4379 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4383 test_truth(hits
== 4);
4384 memcached_result_free(&result_obj
);
4387 memcached_free(memc_clone
);
4389 return TEST_SUCCESS
;
4392 static void increment_request_id(uint16_t *id
)
4395 if ((*id
& UDP_REQUEST_ID_THREAD_MASK
) != 0)
4399 static uint16_t *get_udp_request_ids(memcached_st
*memc
)
4401 uint16_t *ids
= malloc(sizeof(uint16_t) * memc
->number_of_hosts
);
4402 assert(ids
!= NULL
);
4405 for (x
= 0; x
< memc
->number_of_hosts
; x
++)
4406 ids
[x
]= get_udp_datagram_request_id((struct udp_datagram_header_st
*) memc
->hosts
[x
].write_buffer
);
4411 static test_return_t
post_udp_op_check(memcached_st
*memc
, uint16_t *expected_req_ids
)
4414 memcached_server_st
*cur_server
= memc
->hosts
;
4415 uint16_t *cur_req_ids
= get_udp_request_ids(memc
);
4417 for (x
= 0; x
< memc
->number_of_hosts
; x
++)
4419 test_truth(cur_server
[x
].cursor_active
== 0);
4420 test_truth(cur_req_ids
[x
] == expected_req_ids
[x
]);
4422 free(expected_req_ids
);
4425 return TEST_SUCCESS
;
4429 ** There is a little bit of a hack here, instead of removing
4430 ** the servers, I just set num host to 0 and them add then new udp servers
4432 static test_return_t
init_udp(memcached_st
*memc
)
4434 memcached_version(memc
);
4435 /* For the time being, only support udp test for >= 1.2.6 && < 1.3 */
4436 if (memc
->hosts
[0].major_version
!= 1 || memc
->hosts
[0].minor_version
!= 2
4437 || memc
->hosts
[0].micro_version
< 6)
4438 return TEST_SKIPPED
;
4440 uint32_t num_hosts
= memc
->number_of_hosts
;
4442 memcached_server_st servers
[num_hosts
];
4443 memcpy(servers
, memc
->hosts
, sizeof(memcached_server_st
) * num_hosts
);
4444 for (x
= 0; x
< num_hosts
; x
++)
4445 memcached_server_free(&memc
->hosts
[x
]);
4447 memc
->number_of_hosts
= 0;
4448 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1);
4449 for (x
= 0; x
< num_hosts
; x
++)
4451 test_truth(memcached_server_add_udp(memc
, servers
[x
].hostname
, servers
[x
].port
) == MEMCACHED_SUCCESS
);
4452 test_truth(memc
->hosts
[x
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4455 return TEST_SUCCESS
;
4458 static test_return_t
binary_init_udp(memcached_st
*memc
)
4460 test_return_t test_rc
;
4461 test_rc
= pre_binary(memc
);
4463 if (test_rc
!= TEST_SUCCESS
)
4466 return init_udp(memc
);
4469 /* Make sure that I cant add a tcp server to a udp client */
4470 static test_return_t
add_tcp_server_udp_client_test(memcached_st
*memc
)
4472 memcached_server_st server
;
4473 memcached_server_clone(&server
, &memc
->hosts
[0]);
4474 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4475 test_truth(memcached_server_add(memc
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4476 return TEST_SUCCESS
;
4479 /* Make sure that I cant add a udp server to a tcp client */
4480 static test_return_t
add_udp_server_tcp_client_test(memcached_st
*memc
)
4482 memcached_server_st server
;
4483 memcached_server_clone(&server
, &memc
->hosts
[0]);
4484 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4486 memcached_st tcp_client
;
4487 memcached_create(&tcp_client
);
4488 test_truth(memcached_server_add_udp(&tcp_client
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4490 return TEST_SUCCESS
;
4493 static test_return_t
set_udp_behavior_test(memcached_st
*memc
)
4496 memcached_quit(memc
);
4497 memc
->number_of_hosts
= 0;
4498 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, memc
->distribution
);
4499 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1) == MEMCACHED_SUCCESS
);
4500 test_truth(memc
->flags
.use_udp
);
4501 test_truth(memc
->flags
.no_reply
);
4503 test_truth(memc
->number_of_hosts
== 0);
4505 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
,0);
4506 test_truth(! (memc
->flags
.use_udp
));
4507 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
,0);
4508 test_truth(! (memc
->flags
.no_reply
));
4510 return TEST_SUCCESS
;
4513 static test_return_t
udp_set_test(memcached_st
*memc
)
4516 unsigned int num_iters
= 1025; //request id rolls over at 1024
4517 for (x
= 0; x
< num_iters
;x
++)
4519 memcached_return_t rc
;
4520 const char *key
= "foo";
4521 const char *value
= "when we sanitize";
4522 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4523 unsigned int server_key
= memcached_generate_hash(memc
,key
,strlen(key
));
4524 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4525 rc
= memcached_set(memc
, key
, strlen(key
),
4526 value
, strlen(value
),
4527 (time_t)0, (uint32_t)0);
4528 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4529 /** NB, the check below assumes that if new write_ptr is less than
4530 * the original write_ptr that we have flushed. For large payloads, this
4531 * maybe an invalid assumption, but for the small payload we have it is OK
4533 if (rc
== MEMCACHED_SUCCESS
||
4534 memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4535 increment_request_id(&expected_ids
[server_key
]);
4537 if (rc
== MEMCACHED_SUCCESS
)
4539 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4543 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4544 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4546 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4548 return TEST_SUCCESS
;
4551 static test_return_t
udp_buffered_set_test(memcached_st
*memc
)
4553 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4554 return udp_set_test(memc
);
4557 static test_return_t
udp_set_too_big_test(memcached_st
*memc
)
4559 memcached_return_t rc
;
4560 const char *key
= "bar";
4561 char value
[MAX_UDP_DATAGRAM_LENGTH
];
4562 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4563 rc
= memcached_set(memc
, key
, strlen(key
),
4564 value
, MAX_UDP_DATAGRAM_LENGTH
,
4565 (time_t)0, (uint32_t)0);
4566 test_truth(rc
== MEMCACHED_WRITE_FAILURE
);
4567 return post_udp_op_check(memc
,expected_ids
);
4570 static test_return_t
udp_delete_test(memcached_st
*memc
)
4573 unsigned int num_iters
= 1025; //request id rolls over at 1024
4574 for (x
= 0; x
< num_iters
;x
++)
4576 memcached_return_t rc
;
4577 const char *key
= "foo";
4578 uint16_t *expected_ids
=get_udp_request_ids(memc
);
4579 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4580 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4581 rc
= memcached_delete(memc
, key
, strlen(key
), 0);
4582 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4583 if (rc
== MEMCACHED_SUCCESS
|| memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4584 increment_request_id(&expected_ids
[server_key
]);
4585 if (rc
== MEMCACHED_SUCCESS
)
4587 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4591 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4592 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4594 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4596 return TEST_SUCCESS
;
4599 static test_return_t
udp_buffered_delete_test(memcached_st
*memc
)
4601 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4602 return udp_delete_test(memc
);
4605 static test_return_t
udp_verbosity_test(memcached_st
*memc
)
4607 memcached_return_t rc
;
4608 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4610 for (x
= 0; x
< memc
->number_of_hosts
;x
++)
4611 increment_request_id(&expected_ids
[x
]);
4613 rc
= memcached_verbosity(memc
,3);
4614 test_truth(rc
== MEMCACHED_SUCCESS
);
4615 return post_udp_op_check(memc
,expected_ids
);
4618 static test_return_t
udp_quit_test(memcached_st
*memc
)
4620 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4621 memcached_quit(memc
);
4622 return post_udp_op_check(memc
, expected_ids
);
4625 static test_return_t
udp_flush_test(memcached_st
*memc
)
4627 memcached_return_t rc
;
4628 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4630 for (x
= 0; x
< memc
->number_of_hosts
;x
++)
4631 increment_request_id(&expected_ids
[x
]);
4633 rc
= memcached_flush(memc
,0);
4634 test_truth(rc
== MEMCACHED_SUCCESS
);
4635 return post_udp_op_check(memc
,expected_ids
);
4638 static test_return_t
udp_incr_test(memcached_st
*memc
)
4640 memcached_return_t rc
;
4641 const char *key
= "incr";
4642 const char *value
= "1";
4643 rc
= memcached_set(memc
, key
, strlen(key
),
4644 value
, strlen(value
),
4645 (time_t)0, (uint32_t)0);
4647 test_truth(rc
== MEMCACHED_SUCCESS
);
4648 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4649 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4650 increment_request_id(&expected_ids
[server_key
]);
4652 rc
= memcached_increment(memc
, key
, strlen(key
), 1, &newvalue
);
4653 test_truth(rc
== MEMCACHED_SUCCESS
);
4654 return post_udp_op_check(memc
, expected_ids
);
4657 static test_return_t
udp_decr_test(memcached_st
*memc
)
4659 memcached_return_t rc
;
4660 const char *key
= "decr";
4661 const char *value
= "1";
4662 rc
= memcached_set(memc
, key
, strlen(key
),
4663 value
, strlen(value
),
4664 (time_t)0, (uint32_t)0);
4666 test_truth(rc
== MEMCACHED_SUCCESS
);
4667 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4668 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4669 increment_request_id(&expected_ids
[server_key
]);
4671 rc
= memcached_decrement(memc
, key
, strlen(key
), 1, &newvalue
);
4672 test_truth(rc
== MEMCACHED_SUCCESS
);
4673 return post_udp_op_check(memc
, expected_ids
);
4677 static test_return_t
udp_stat_test(memcached_st
*memc
)
4679 memcached_stat_st
* rv
= NULL
;
4680 memcached_return_t rc
;
4682 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4683 rv
= memcached_stat(memc
, args
, &rc
);
4685 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4686 return post_udp_op_check(memc
, expected_ids
);
4689 static test_return_t
udp_version_test(memcached_st
*memc
)
4691 memcached_return_t rc
;
4692 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4693 rc
= memcached_version(memc
);
4694 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4695 return post_udp_op_check(memc
, expected_ids
);
4698 static test_return_t
udp_get_test(memcached_st
*memc
)
4700 memcached_return_t rc
;
4701 const char *key
= "foo";
4703 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4704 char *val
= memcached_get(memc
, key
, strlen(key
), &vlen
, (uint32_t)0, &rc
);
4705 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4706 test_truth(val
== NULL
);
4707 return post_udp_op_check(memc
, expected_ids
);
4710 static test_return_t
udp_mixed_io_test(memcached_st
*memc
)
4713 test_st mixed_io_ops
[] ={
4715 (test_callback_fn
)udp_set_test
},
4716 {"udp_set_too_big_test", 0,
4717 (test_callback_fn
)udp_set_too_big_test
},
4718 {"udp_delete_test", 0,
4719 (test_callback_fn
)udp_delete_test
},
4720 {"udp_verbosity_test", 0,
4721 (test_callback_fn
)udp_verbosity_test
},
4722 {"udp_quit_test", 0,
4723 (test_callback_fn
)udp_quit_test
},
4724 {"udp_flush_test", 0,
4725 (test_callback_fn
)udp_flush_test
},
4726 {"udp_incr_test", 0,
4727 (test_callback_fn
)udp_incr_test
},
4728 {"udp_decr_test", 0,
4729 (test_callback_fn
)udp_decr_test
},
4730 {"udp_version_test", 0,
4731 (test_callback_fn
)udp_version_test
}
4734 for (x
= 0; x
< 500; x
++)
4736 current_op
= mixed_io_ops
[random() % 9];
4737 test_truth(current_op
.test_fn(memc
) == TEST_SUCCESS
);
4739 return TEST_SUCCESS
;
4743 static test_return_t
hash_sanity_test (memcached_st
*memc
)
4747 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
4748 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
4749 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
4750 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
4751 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
4752 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
4753 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
4754 #ifdef HAVE_HSIEH_HASH
4755 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
4757 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
4758 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
4759 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
4761 return TEST_SUCCESS
;
4765 static test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
4767 memcached_return_t expected_rc
= MEMCACHED_FAILURE
;
4768 #ifdef HAVE_HSIEH_HASH
4769 expected_rc
= MEMCACHED_SUCCESS
;
4771 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
4772 (uint64_t)MEMCACHED_HASH_HSIEH
);
4773 test_truth(rc
== expected_rc
);
4774 return TEST_SUCCESS
;
4777 static test_return_t
md5_run (memcached_st
*memc
__attribute__((unused
)))
4782 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4786 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
);
4787 test_truth(md5_values
[x
] == hash_val
);
4790 return TEST_SUCCESS
;
4793 static test_return_t
crc_run (memcached_st
*memc
__attribute__((unused
)))
4798 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4802 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
);
4803 test_truth(crc_values
[x
] == hash_val
);
4806 return TEST_SUCCESS
;
4809 static test_return_t
fnv1_64_run (memcached_st
*memc
__attribute__((unused
)))
4814 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4818 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
);
4819 test_truth(fnv1_64_values
[x
] == hash_val
);
4822 return TEST_SUCCESS
;
4825 static test_return_t
fnv1a_64_run (memcached_st
*memc
__attribute__((unused
)))
4830 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4834 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
);
4835 test_truth(fnv1a_64_values
[x
] == hash_val
);
4838 return TEST_SUCCESS
;
4841 static test_return_t
fnv1_32_run (memcached_st
*memc
__attribute__((unused
)))
4847 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4851 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
);
4852 test_truth(fnv1_32_values
[x
] == hash_val
);
4855 return TEST_SUCCESS
;
4858 static test_return_t
fnv1a_32_run (memcached_st
*memc
__attribute__((unused
)))
4863 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4867 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
);
4868 test_truth(fnv1a_32_values
[x
] == hash_val
);
4871 return TEST_SUCCESS
;
4874 static test_return_t
hsieh_run (memcached_st
*memc
__attribute__((unused
)))
4879 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4883 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
);
4884 test_truth(hsieh_values
[x
] == hash_val
);
4887 return TEST_SUCCESS
;
4890 static test_return_t
murmur_run (memcached_st
*memc
__attribute__((unused
)))
4893 return TEST_SKIPPED
;
4898 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4902 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
);
4903 test_truth(murmur_values
[x
] == hash_val
);
4906 return TEST_SUCCESS
;
4910 static test_return_t
jenkins_run (memcached_st
*memc
__attribute__((unused
)))
4916 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4920 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
);
4921 test_truth(jenkins_values
[x
] == hash_val
);
4924 return TEST_SUCCESS
;
4928 static test_return_t
ketama_compatibility_libmemcached(memcached_st
*trash
)
4930 memcached_return_t rc
;
4933 memcached_server_st
*server_pool
;
4938 memc
= memcached_create(NULL
);
4941 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
4942 test_truth(rc
== MEMCACHED_SUCCESS
);
4944 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
4945 test_truth(value
== 1);
4947 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
) == MEMCACHED_SUCCESS
);
4948 test_truth(memcached_behavior_get_distribution(memc
) == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
);
4951 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");
4952 memcached_server_push(memc
, server_pool
);
4954 /* verify that the server list was parsed okay. */
4955 assert(memc
->number_of_hosts
== 8);
4956 assert(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
4957 assert(server_pool
[0].port
== 11211);
4958 assert(server_pool
[0].weight
== 600);
4959 assert(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
4960 assert(server_pool
[2].port
== 11211);
4961 assert(server_pool
[2].weight
== 200);
4962 assert(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
4963 assert(server_pool
[7].port
== 11211);
4964 assert(server_pool
[7].weight
== 100);
4966 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
4967 * us test the boundary wraparound.
4969 assert(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
4971 /* verify the standard ketama set. */
4972 for (x
= 0; x
< 99; x
++)
4974 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
4975 char *hostname
= memc
->hosts
[server_idx
].hostname
;
4976 assert(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
4979 memcached_server_list_free(server_pool
);
4980 memcached_free(memc
);
4982 return TEST_SUCCESS
;
4985 static test_return_t
ketama_compatibility_spymemcached(memcached_st
*trash
)
4987 memcached_return_t rc
;
4990 memcached_server_st
*server_pool
;
4995 memc
= memcached_create(NULL
);
4998 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
4999 test_truth(rc
== MEMCACHED_SUCCESS
);
5001 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
5002 test_truth(value
== 1);
5004 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
5005 test_truth(memcached_behavior_get_distribution(memc
) == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
);
5007 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");
5008 memcached_server_push(memc
, server_pool
);
5010 /* verify that the server list was parsed okay. */
5011 assert(memc
->number_of_hosts
== 8);
5012 assert(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
5013 assert(server_pool
[0].port
== 11211);
5014 assert(server_pool
[0].weight
== 600);
5015 assert(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
5016 assert(server_pool
[2].port
== 11211);
5017 assert(server_pool
[2].weight
== 200);
5018 assert(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
5019 assert(server_pool
[7].port
== 11211);
5020 assert(server_pool
[7].weight
== 100);
5022 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
5023 * us test the boundary wraparound.
5025 assert(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
5027 /* verify the standard ketama set. */
5028 for (x
= 0; x
< 99; x
++)
5030 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases_spy
[x
].key
, strlen(ketama_test_cases_spy
[x
].key
));
5031 char *hostname
= memc
->hosts
[server_idx
].hostname
;
5032 assert(strcmp(hostname
, ketama_test_cases_spy
[x
].server
) == 0);
5035 memcached_server_list_free(server_pool
);
5036 memcached_free(memc
);
5038 return TEST_SUCCESS
;
5041 static test_return_t
regression_bug_434484(memcached_st
*memc
)
5043 test_return_t test_rc
;
5044 test_rc
= pre_binary(memc
);
5046 if (test_rc
!= TEST_SUCCESS
)
5049 memcached_return_t ret
;
5050 const char *key
= "regression_bug_434484";
5051 size_t keylen
= strlen(key
);
5053 ret
= memcached_append(memc
, key
, keylen
, key
, keylen
, 0, 0);
5054 assert(ret
== MEMCACHED_NOTSTORED
);
5056 size_t size
= 2048 * 1024;
5057 void *data
= calloc(1, size
);
5058 assert(data
!= NULL
);
5059 ret
= memcached_set(memc
, key
, keylen
, data
, size
, 0, 0);
5060 assert(ret
== MEMCACHED_E2BIG
);
5063 return TEST_SUCCESS
;
5066 static test_return_t
regression_bug_434843(memcached_st
*memc
)
5068 test_return_t test_rc
;
5069 test_rc
= pre_binary(memc
);
5071 if (test_rc
!= TEST_SUCCESS
)
5074 memcached_return_t rc
;
5075 unsigned int counter
= 0;
5076 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5079 * I only want to hit only _one_ server so I know the number of requests I'm
5080 * sending in the pipleine to the server. Let's try to do a multiget of
5081 * 1024 (that should satisfy most users don't you think?). Future versions
5082 * will include a mget_execute function call if you need a higher number.
5084 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5085 memc
->number_of_hosts
= 1;
5086 const size_t max_keys
= 1024;
5087 char **keys
= calloc(max_keys
, sizeof(char*));
5088 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5090 for (int x
= 0; x
< (int)max_keys
; ++x
)
5093 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5095 assert(keys
[x
] != NULL
);
5099 * Run two times.. the first time we should have 100% cache miss,
5100 * and the second time we should have 100% cache hits
5102 for (int y
= 0; y
< 2; ++y
)
5104 rc
= memcached_mget(memc
, (const char**)keys
, key_length
, max_keys
);
5105 assert(rc
== MEMCACHED_SUCCESS
);
5106 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5109 /* The first iteration should give me a 100% cache miss. verify that*/
5110 assert(counter
== 0);
5111 char blob
[1024]= { 0 };
5112 for (int x
= 0; x
< (int)max_keys
; ++x
)
5114 rc
= memcached_add(memc
, keys
[x
], key_length
[x
],
5115 blob
, sizeof(blob
), 0, 0);
5116 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5121 /* Verify that we received all of the key/value pairs */
5122 assert(counter
== (unsigned int)max_keys
);
5126 /* Release allocated resources */
5127 for (size_t x
= 0; x
< max_keys
; ++x
)
5132 memc
->number_of_hosts
= number_of_hosts
;
5133 return TEST_SUCCESS
;
5136 static test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
5138 memcached_return_t rc
;
5139 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
5140 assert(rc
== MEMCACHED_SUCCESS
);
5142 return regression_bug_434843(memc
);
5145 static test_return_t
regression_bug_421108(memcached_st
*memc
)
5147 memcached_return_t rc
;
5148 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
5149 assert(rc
== MEMCACHED_SUCCESS
);
5151 char *bytes
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
5152 assert(rc
== MEMCACHED_SUCCESS
);
5153 assert(bytes
!= NULL
);
5154 char *bytes_read
= memcached_stat_get_value(memc
, memc_stat
,
5156 assert(rc
== MEMCACHED_SUCCESS
);
5157 assert(bytes_read
!= NULL
);
5159 char *bytes_written
= memcached_stat_get_value(memc
, memc_stat
,
5160 "bytes_written", &rc
);
5161 assert(rc
== MEMCACHED_SUCCESS
);
5162 assert(bytes_written
!= NULL
);
5164 assert(strcmp(bytes
, bytes_read
) != 0);
5165 assert(strcmp(bytes
, bytes_written
) != 0);
5167 /* Release allocated resources */
5170 free(bytes_written
);
5171 memcached_stat_free(NULL
, memc_stat
);
5172 return TEST_SUCCESS
;
5176 * The test case isn't obvious so I should probably document why
5177 * it works the way it does. Bug 442914 was caused by a bug
5178 * in the logic in memcached_purge (it did not handle the case
5179 * where the number of bytes sent was equal to the watermark).
5180 * In this test case, create messages so that we hit that case
5181 * and then disable noreply mode and issue a new command to
5182 * verify that it isn't stuck. If we change the format for the
5183 * delete command or the watermarks, we need to update this
5186 static test_return_t
regression_bug_442914(memcached_st
*memc
)
5188 memcached_return_t rc
;
5189 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
5190 assert(rc
== MEMCACHED_SUCCESS
);
5191 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
5193 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5194 memc
->number_of_hosts
= 1;
5199 for (int x
= 0; x
< 250; ++x
)
5201 len
= (size_t)snprintf(k
, sizeof(k
), "%0250u", x
);
5202 rc
= memcached_delete(memc
, k
, len
, 0);
5203 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5206 len
= (size_t)snprintf(k
, sizeof(k
), "%037u", 251);
5207 rc
= memcached_delete(memc
, k
, len
, 0);
5208 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5210 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0);
5211 assert(rc
== MEMCACHED_SUCCESS
);
5212 rc
= memcached_delete(memc
, k
, len
, 0);
5213 assert(rc
== MEMCACHED_NOTFOUND
);
5215 memc
->number_of_hosts
= number_of_hosts
;
5217 return TEST_SUCCESS
;
5220 static test_return_t
regression_bug_447342(memcached_st
*memc
)
5222 if (memc
->number_of_hosts
< 3 || pre_replication(memc
) != MEMCACHED_SUCCESS
)
5223 return TEST_SKIPPED
;
5225 memcached_return_t rc
;
5227 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2);
5228 assert(rc
== MEMCACHED_SUCCESS
);
5230 const size_t max_keys
= 100;
5231 char **keys
= calloc(max_keys
, sizeof(char*));
5232 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5234 for (int x
= 0; x
< (int)max_keys
; ++x
)
5237 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5239 assert(keys
[x
] != NULL
);
5240 rc
= memcached_set(memc
, k
, key_length
[x
], k
, key_length
[x
], 0, 0);
5241 assert(rc
== MEMCACHED_SUCCESS
);
5245 ** We are using the quiet commands to store the replicas, so we need
5246 ** to ensure that all of them are processed before we can continue.
5247 ** In the test we go directly from storing the object to trying to
5248 ** receive the object from all of the different servers, so we
5249 ** could end up in a race condition (the memcached server hasn't yet
5250 ** processed the quiet command from the replication set when it process
5251 ** the request from the other client (created by the clone)). As a
5252 ** workaround for that we call memcached_quit to send the quit command
5253 ** to the server and wait for the response ;-) If you use the test code
5254 ** as an example for your own code, please note that you shouldn't need
5257 memcached_quit(memc
);
5259 /* Verify that all messages are stored, and we didn't stuff too much
5262 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5263 assert(rc
== MEMCACHED_SUCCESS
);
5265 unsigned int counter
= 0;
5266 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5267 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5268 /* Verify that we received all of the key/value pairs */
5269 assert(counter
== (unsigned int)max_keys
);
5271 memcached_quit(memc
);
5273 * Don't do the following in your code. I am abusing the internal details
5274 * within the library, and this is not a supported interface.
5275 * This is to verify correct behavior in the library. Fake that two servers
5278 in_port_t port0
= memc
->hosts
[0].port
;
5279 in_port_t port2
= memc
->hosts
[2].port
;
5281 memc
->hosts
[0].port
= 0;
5282 memc
->hosts
[2].port
= 0;
5284 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5285 assert(rc
== MEMCACHED_SUCCESS
);
5288 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5289 assert(counter
== (unsigned int)max_keys
);
5291 /* restore the memc handle */
5292 memc
->hosts
[0].port
= port0
;
5293 memc
->hosts
[2].port
= port2
;
5295 memcached_quit(memc
);
5297 /* Remove half of the objects */
5298 for (int x
= 0; x
< (int)max_keys
; ++x
)
5302 rc
= memcached_delete(memc
, keys
[x
], key_length
[x
], 0);
5303 assert(rc
== MEMCACHED_SUCCESS
);
5307 memcached_quit(memc
);
5308 memc
->hosts
[0].port
= 0;
5309 memc
->hosts
[2].port
= 0;
5311 /* now retry the command, this time we should have cache misses */
5312 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5313 assert(rc
== MEMCACHED_SUCCESS
);
5316 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5317 assert(counter
== (unsigned int)(max_keys
>> 1));
5319 /* Release allocated resources */
5320 for (size_t x
= 0; x
< max_keys
; ++x
)
5325 /* restore the memc handle */
5326 memc
->hosts
[0].port
= port0
;
5327 memc
->hosts
[2].port
= port2
;
5329 return TEST_SUCCESS
;
5332 static test_return_t
regression_bug_463297(memcached_st
*memc
)
5334 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
5335 assert(memc_clone
!= NULL
);
5336 assert(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
5338 if (memc_clone
->hosts
[0].major_version
> 1 ||
5339 (memc_clone
->hosts
[0].major_version
== 1 &&
5340 memc_clone
->hosts
[0].minor_version
> 2))
5342 /* Binary protocol doesn't support deferred delete */
5343 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
5344 assert(bin_clone
!= NULL
);
5345 assert(memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1) == MEMCACHED_SUCCESS
);
5346 assert(memcached_delete(bin_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5347 memcached_free(bin_clone
);
5349 memcached_quit(memc_clone
);
5351 /* If we know the server version, deferred delete should fail
5352 * with invalid arguments */
5353 assert(memcached_delete(memc_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5355 /* If we don't know the server version, we should get a protocol error */
5356 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
5357 /* but there is a bug in some of the memcached servers (1.4) that treats
5358 * the counter as noreply so it doesn't send the proper error message
5360 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5362 /* And buffered mode should be disabled and we should get protocol error */
5363 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
5364 rc
= memcached_delete(memc
, "foo", 3, 1);
5365 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5367 /* Same goes for noreply... */
5368 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1) == MEMCACHED_SUCCESS
);
5369 rc
= memcached_delete(memc
, "foo", 3, 1);
5370 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5372 /* but a normal request should go through (and be buffered) */
5373 assert((rc
= memcached_delete(memc
, "foo", 3, 0)) == MEMCACHED_BUFFERED
);
5374 assert(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
5376 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0) == MEMCACHED_SUCCESS
);
5377 /* unbuffered noreply should be success */
5378 assert(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_SUCCESS
);
5379 /* unbuffered with reply should be not found... */
5380 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0) == MEMCACHED_SUCCESS
);
5381 assert(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_NOTFOUND
);
5384 memcached_free(memc_clone
);
5385 return TEST_SUCCESS
;
5389 /* Test memcached_server_get_last_disconnect
5390 * For a working server set, shall be NULL
5391 * For a set of non existing server, shall not be NULL
5393 static test_return_t
test_get_last_disconnect(memcached_st
*memc
)
5395 memcached_return_t rc
;
5396 memcached_server_st
*disconnected_server
;
5398 /* With the working set of server */
5399 const char *key
= "marmotte";
5400 const char *value
= "milka";
5402 rc
= memcached_set(memc
, key
, strlen(key
),
5403 value
, strlen(value
),
5404 (time_t)0, (uint32_t)0);
5405 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5407 disconnected_server
= memcached_server_get_last_disconnect(memc
);
5408 assert(disconnected_server
== NULL
);
5410 /* With a non existing server */
5412 memcached_server_st
*servers
;
5414 const char *server_list
= "localhost:9";
5416 servers
= memcached_servers_parse(server_list
);
5418 mine
= memcached_create(NULL
);
5419 rc
= memcached_server_push(mine
, servers
);
5420 assert(rc
== MEMCACHED_SUCCESS
);
5421 memcached_server_list_free(servers
);
5424 rc
= memcached_set(mine
, key
, strlen(key
),
5425 value
, strlen(value
),
5426 (time_t)0, (uint32_t)0);
5427 assert(rc
!= MEMCACHED_SUCCESS
);
5429 disconnected_server
= memcached_server_get_last_disconnect(mine
);
5430 assert(disconnected_server
!= NULL
);
5431 assert(disconnected_server
->port
== 9);
5432 assert(strncmp(disconnected_server
->hostname
,"localhost",9) == 0);
5434 memcached_quit(mine
);
5435 memcached_free(mine
);
5437 return TEST_SUCCESS
;
5441 * This test ensures that the failure counter isn't incremented during
5442 * normal termination of the memcached instance.
5444 static test_return_t
wrong_failure_counter_test(memcached_st
*memc
)
5446 memcached_return_t rc
;
5448 /* Set value to force connection to the server */
5449 const char *key
= "marmotte";
5450 const char *value
= "milka";
5453 * Please note that I'm abusing the internal structures in libmemcached
5454 * in a non-portable way and you shouldn't be doing this. I'm only
5455 * doing this in order to verify that the library works the way it should
5457 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5458 memc
->number_of_hosts
= 1;
5460 /* Ensure that we are connected to the server by setting a value */
5461 rc
= memcached_set(memc
, key
, strlen(key
),
5462 value
, strlen(value
),
5463 (time_t)0, (uint32_t)0);
5464 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5467 /* The test is to see that the memcached_quit doesn't increase the
5468 * the server failure conter, so let's ensure that it is zero
5469 * before sending quit
5471 memc
->hosts
[0].server_failure_counter
= 0;
5473 memcached_quit(memc
);
5475 /* Verify that it memcached_quit didn't increment the failure counter
5476 * Please note that this isn't bullet proof, because an error could
5479 assert(memc
->hosts
[0].server_failure_counter
== 0);
5481 /* restore the instance */
5482 memc
->number_of_hosts
= number_of_hosts
;
5484 return TEST_SUCCESS
;
5487 test_st udp_setup_server_tests
[] ={
5488 {"set_udp_behavior_test", 0, (test_callback_fn
)set_udp_behavior_test
},
5489 {"add_tcp_server_udp_client_test", 0, (test_callback_fn
)add_tcp_server_udp_client_test
},
5490 {"add_udp_server_tcp_client_test", 0, (test_callback_fn
)add_udp_server_tcp_client_test
},
5494 test_st upd_io_tests
[] ={
5495 {"udp_set_test", 0, (test_callback_fn
)udp_set_test
},
5496 {"udp_buffered_set_test", 0, (test_callback_fn
)udp_buffered_set_test
},
5497 {"udp_set_too_big_test", 0, (test_callback_fn
)udp_set_too_big_test
},
5498 {"udp_delete_test", 0, (test_callback_fn
)udp_delete_test
},
5499 {"udp_buffered_delete_test", 0, (test_callback_fn
)udp_buffered_delete_test
},
5500 {"udp_verbosity_test", 0, (test_callback_fn
)udp_verbosity_test
},
5501 {"udp_quit_test", 0, (test_callback_fn
)udp_quit_test
},
5502 {"udp_flush_test", 0, (test_callback_fn
)udp_flush_test
},
5503 {"udp_incr_test", 0, (test_callback_fn
)udp_incr_test
},
5504 {"udp_decr_test", 0, (test_callback_fn
)udp_decr_test
},
5505 {"udp_stat_test", 0, (test_callback_fn
)udp_stat_test
},
5506 {"udp_version_test", 0, (test_callback_fn
)udp_version_test
},
5507 {"udp_get_test", 0, (test_callback_fn
)udp_get_test
},
5508 {"udp_mixed_io_test", 0, (test_callback_fn
)udp_mixed_io_test
},
5512 /* Clean the server before beginning testing */
5514 {"flush", 0, (test_callback_fn
)flush_test
},
5515 {"init", 0, (test_callback_fn
)init_test
},
5516 {"allocation", 0, (test_callback_fn
)allocation_test
},
5517 {"server_list_null_test", 0, (test_callback_fn
)server_list_null_test
},
5518 {"server_unsort", 0, (test_callback_fn
)server_unsort_test
},
5519 {"server_sort", 0, (test_callback_fn
)server_sort_test
},
5520 {"server_sort2", 0, (test_callback_fn
)server_sort2_test
},
5521 {"clone_test", 0, (test_callback_fn
)clone_test
},
5522 {"connection_test", 0, (test_callback_fn
)connection_test
},
5523 {"callback_test", 0, (test_callback_fn
)callback_test
},
5524 {"behavior_test", 0, (test_callback_fn
)behavior_test
},
5525 {"userdata_test", 0, (test_callback_fn
)userdata_test
},
5526 {"error", 0, (test_callback_fn
)error_test
},
5527 {"set", 0, (test_callback_fn
)set_test
},
5528 {"set2", 0, (test_callback_fn
)set_test2
},
5529 {"set3", 0, (test_callback_fn
)set_test3
},
5530 {"dump", 1, (test_callback_fn
)dump_test
},
5531 {"add", 1, (test_callback_fn
)add_test
},
5532 {"replace", 1, (test_callback_fn
)replace_test
},
5533 {"delete", 1, (test_callback_fn
)delete_test
},
5534 {"get", 1, (test_callback_fn
)get_test
},
5535 {"get2", 0, (test_callback_fn
)get_test2
},
5536 {"get3", 0, (test_callback_fn
)get_test3
},
5537 {"get4", 0, (test_callback_fn
)get_test4
},
5538 {"partial mget", 0, (test_callback_fn
)get_test5
},
5539 {"stats_servername", 0, (test_callback_fn
)stats_servername_test
},
5540 {"increment", 0, (test_callback_fn
)increment_test
},
5541 {"increment_with_initial", 1, (test_callback_fn
)increment_with_initial_test
},
5542 {"decrement", 0, (test_callback_fn
)decrement_test
},
5543 {"decrement_with_initial", 1, (test_callback_fn
)decrement_with_initial_test
},
5544 {"increment_by_key", 0, (test_callback_fn
)increment_by_key_test
},
5545 {"increment_with_initial_by_key", 1, (test_callback_fn
)increment_with_initial_by_key_test
},
5546 {"decrement_by_key", 0, (test_callback_fn
)decrement_by_key_test
},
5547 {"decrement_with_initial_by_key", 1, (test_callback_fn
)decrement_with_initial_by_key_test
},
5548 {"quit", 0, (test_callback_fn
)quit_test
},
5549 {"mget", 1, (test_callback_fn
)mget_test
},
5550 {"mget_result", 1, (test_callback_fn
)mget_result_test
},
5551 {"mget_result_alloc", 1, (test_callback_fn
)mget_result_alloc_test
},
5552 {"mget_result_function", 1, (test_callback_fn
)mget_result_function
},
5553 {"mget_execute", 1, (test_callback_fn
)mget_execute
},
5554 {"mget_end", 0, (test_callback_fn
)mget_end
},
5555 {"get_stats", 0, (test_callback_fn
)get_stats
},
5556 {"add_host_test", 0, (test_callback_fn
)add_host_test
},
5557 {"add_host_test_1", 0, (test_callback_fn
)add_host_test1
},
5558 {"get_stats_keys", 0, (test_callback_fn
)get_stats_keys
},
5559 {"behavior_test", 0, (test_callback_fn
)get_stats_keys
},
5560 {"callback_test", 0, (test_callback_fn
)get_stats_keys
},
5561 {"version_string_test", 0, (test_callback_fn
)version_string_test
},
5562 {"bad_key", 1, (test_callback_fn
)bad_key_test
},
5563 {"memcached_server_cursor", 1, (test_callback_fn
)memcached_server_cursor_test
},
5564 {"read_through", 1, (test_callback_fn
)read_through
},
5565 {"delete_through", 1, (test_callback_fn
)delete_through
},
5566 {"noreply", 1, (test_callback_fn
)noreply_test
},
5567 {"analyzer", 1, (test_callback_fn
)analyzer_test
},
5568 #ifdef HAVE_LIBMEMCACHEDUTIL
5569 {"connectionpool", 1, (test_callback_fn
)connection_pool_test
},
5571 {"test_get_last_disconnect", 1, (test_callback_fn
)test_get_last_disconnect
},
5575 test_st async_tests
[] ={
5576 {"add", 1, (test_callback_fn
)add_wrapper
},
5580 test_st string_tests
[] ={
5581 {"string static with null", 0, (test_callback_fn
)string_static_null
},
5582 {"string alloc with null", 0, (test_callback_fn
)string_alloc_null
},
5583 {"string alloc with 1K", 0, (test_callback_fn
)string_alloc_with_size
},
5584 {"string alloc with malloc failure", 0, (test_callback_fn
)string_alloc_with_size_toobig
},
5585 {"string append", 0, (test_callback_fn
)string_alloc_append
},
5586 {"string append failure (too big)", 0, (test_callback_fn
)string_alloc_append_toobig
},
5587 {0, 0, (test_callback_fn
)0}
5590 test_st result_tests
[] ={
5591 {"result static", 0, (test_callback_fn
)result_static
},
5592 {"result alloc", 0, (test_callback_fn
)result_alloc
},
5593 {0, 0, (test_callback_fn
)0}
5596 test_st version_1_2_3
[] ={
5597 {"append", 0, (test_callback_fn
)append_test
},
5598 {"prepend", 0, (test_callback_fn
)prepend_test
},
5599 {"cas", 0, (test_callback_fn
)cas_test
},
5600 {"cas2", 0, (test_callback_fn
)cas2_test
},
5601 {"append_binary", 0, (test_callback_fn
)append_binary_test
},
5602 {0, 0, (test_callback_fn
)0}
5605 test_st user_tests
[] ={
5606 {"user_supplied_bug1", 0, (test_callback_fn
)user_supplied_bug1
},
5607 {"user_supplied_bug2", 0, (test_callback_fn
)user_supplied_bug2
},
5608 {"user_supplied_bug3", 0, (test_callback_fn
)user_supplied_bug3
},
5609 {"user_supplied_bug4", 0, (test_callback_fn
)user_supplied_bug4
},
5610 {"user_supplied_bug5", 1, (test_callback_fn
)user_supplied_bug5
},
5611 {"user_supplied_bug6", 1, (test_callback_fn
)user_supplied_bug6
},
5612 {"user_supplied_bug7", 1, (test_callback_fn
)user_supplied_bug7
},
5613 {"user_supplied_bug8", 1, (test_callback_fn
)user_supplied_bug8
},
5614 {"user_supplied_bug9", 1, (test_callback_fn
)user_supplied_bug9
},
5615 {"user_supplied_bug10", 1, (test_callback_fn
)user_supplied_bug10
},
5616 {"user_supplied_bug11", 1, (test_callback_fn
)user_supplied_bug11
},
5617 {"user_supplied_bug12", 1, (test_callback_fn
)user_supplied_bug12
},
5618 {"user_supplied_bug13", 1, (test_callback_fn
)user_supplied_bug13
},
5619 {"user_supplied_bug14", 1, (test_callback_fn
)user_supplied_bug14
},
5620 {"user_supplied_bug15", 1, (test_callback_fn
)user_supplied_bug15
},
5621 {"user_supplied_bug16", 1, (test_callback_fn
)user_supplied_bug16
},
5624 ** It seems to be something weird with the character sets..
5625 ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
5626 ** guess I need to find out how this is supposed to work.. Perhaps I need
5627 ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
5628 ** so just disable the code for now...).
5630 {"user_supplied_bug17", 1, (test_callback_fn
)user_supplied_bug17
},
5632 {"user_supplied_bug18", 1, (test_callback_fn
)user_supplied_bug18
},
5633 {"user_supplied_bug19", 1, (test_callback_fn
)user_supplied_bug19
},
5634 {"user_supplied_bug20", 1, (test_callback_fn
)user_supplied_bug20
},
5635 {"user_supplied_bug21", 1, (test_callback_fn
)user_supplied_bug21
},
5636 {"wrong_failure_counter_test", 1, (test_callback_fn
)wrong_failure_counter_test
},
5637 {0, 0, (test_callback_fn
)0}
5640 test_st replication_tests
[]= {
5641 {"set", 1, (test_callback_fn
)replication_set_test
},
5642 {"get", 0, (test_callback_fn
)replication_get_test
},
5643 {"mget", 0, (test_callback_fn
)replication_mget_test
},
5644 {"delete", 0, (test_callback_fn
)replication_delete_test
},
5645 {"rand_mget", 0, (test_callback_fn
)replication_randomize_mget_test
},
5646 {0, 0, (test_callback_fn
)0}
5650 * The following test suite is used to verify that we don't introduce
5651 * regression bugs. If you want more information about the bug / test,
5652 * you should look in the bug report at
5653 * http://bugs.launchpad.net/libmemcached
5655 test_st regression_tests
[]= {
5656 {"lp:434484", 1, (test_callback_fn
)regression_bug_434484
},
5657 {"lp:434843", 1, (test_callback_fn
)regression_bug_434843
},
5658 {"lp:434843 buffered", 1, (test_callback_fn
)regression_bug_434843_buffered
},
5659 {"lp:421108", 1, (test_callback_fn
)regression_bug_421108
},
5660 {"lp:442914", 1, (test_callback_fn
)regression_bug_442914
},
5661 {"lp:447342", 1, (test_callback_fn
)regression_bug_447342
},
5662 {"lp:463297", 1, (test_callback_fn
)regression_bug_463297
},
5663 {0, 0, (test_callback_fn
)0}
5666 test_st ketama_compatibility
[]= {
5667 {"libmemcached", 1, (test_callback_fn
)ketama_compatibility_libmemcached
},
5668 {"spymemcached", 1, (test_callback_fn
)ketama_compatibility_spymemcached
},
5669 {0, 0, (test_callback_fn
)0}
5672 test_st generate_tests
[] ={
5673 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5674 {"generate_data", 1, (test_callback_fn
)generate_data
},
5675 {"get_read", 0, (test_callback_fn
)get_read
},
5676 {"delete_generate", 0, (test_callback_fn
)delete_generate
},
5677 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5678 {"delete_buffer", 0, (test_callback_fn
)delete_buffer_generate
},
5679 {"generate_data", 1, (test_callback_fn
)generate_data
},
5680 {"mget_read", 0, (test_callback_fn
)mget_read
},
5681 {"mget_read_result", 0, (test_callback_fn
)mget_read_result
},
5682 {"mget_read_function", 0, (test_callback_fn
)mget_read_function
},
5683 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5684 {"generate_large_pairs", 1, (test_callback_fn
)generate_large_pairs
},
5685 {"generate_data", 1, (test_callback_fn
)generate_data
},
5686 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5687 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5688 {0, 0, (test_callback_fn
)0}
5691 test_st consistent_tests
[] ={
5692 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5693 {"generate_data", 1, (test_callback_fn
)generate_data
},
5694 {"get_read", 0, (test_callback_fn
)get_read_count
},
5695 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5696 {0, 0, (test_callback_fn
)0}
5699 test_st consistent_weighted_tests
[] ={
5700 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5701 {"generate_data", 1, (test_callback_fn
)generate_data_with_stats
},
5702 {"get_read", 0, (test_callback_fn
)get_read_count
},
5703 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5704 {0, 0, (test_callback_fn
)0}
5707 test_st hsieh_availability
[] ={
5708 {"hsieh_avaibility_test", 0, (test_callback_fn
)hsieh_avaibility_test
},
5709 {0, 0, (test_callback_fn
)0}
5713 test_st hash_sanity
[] ={
5714 {"hash sanity", 0, (test_callback_fn
)hash_sanity_test
},
5715 {0, 0, (test_callback_fn
)0}
5719 test_st ketama_auto_eject_hosts
[] ={
5720 {"auto_eject_hosts", 1, (test_callback_fn
)auto_eject_hosts
},
5721 {"output_ketama_weighted_keys", 1, (test_callback_fn
)output_ketama_weighted_keys
},
5722 {0, 0, (test_callback_fn
)0}
5725 test_st hash_tests
[] ={
5726 {"md5", 0, (test_callback_fn
)md5_run
},
5727 {"crc", 0, (test_callback_fn
)crc_run
},
5728 {"fnv1_64", 0, (test_callback_fn
)fnv1_64_run
},
5729 {"fnv1a_64", 0, (test_callback_fn
)fnv1a_64_run
},
5730 {"fnv1_32", 0, (test_callback_fn
)fnv1_32_run
},
5731 {"fnv1a_32", 0, (test_callback_fn
)fnv1a_32_run
},
5732 {"hsieh", 0, (test_callback_fn
)hsieh_run
},
5733 {"murmur", 0, (test_callback_fn
)murmur_run
},
5734 {"jenkis", 0, (test_callback_fn
)jenkins_run
},
5735 {0, 0, (test_callback_fn
)0}
5738 collection_st collection
[] ={
5740 {"hash_sanity", 0, 0, hash_sanity
},
5742 {"hsieh_availability", 0, 0, hsieh_availability
},
5743 {"udp_setup", (test_callback_fn
)init_udp
, 0, udp_setup_server_tests
},
5744 {"udp_io", (test_callback_fn
)init_udp
, 0, upd_io_tests
},
5745 {"udp_binary_io", (test_callback_fn
)binary_init_udp
, 0, upd_io_tests
},
5746 {"block", 0, 0, tests
},
5747 {"binary", (test_callback_fn
)pre_binary
, 0, tests
},
5748 {"nonblock", (test_callback_fn
)pre_nonblock
, 0, tests
},
5749 {"nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5750 {"settimer", (test_callback_fn
)pre_settimer
, 0, tests
},
5751 {"md5", (test_callback_fn
)pre_md5
, 0, tests
},
5752 {"crc", (test_callback_fn
)pre_crc
, 0, tests
},
5753 {"hsieh", (test_callback_fn
)pre_hsieh
, 0, tests
},
5754 {"jenkins", (test_callback_fn
)pre_jenkins
, 0, tests
},
5755 {"fnv1_64", (test_callback_fn
)pre_hash_fnv1_64
, 0, tests
},
5756 {"fnv1a_64", (test_callback_fn
)pre_hash_fnv1a_64
, 0, tests
},
5757 {"fnv1_32", (test_callback_fn
)pre_hash_fnv1_32
, 0, tests
},
5758 {"fnv1a_32", (test_callback_fn
)pre_hash_fnv1a_32
, 0, tests
},
5759 {"ketama", (test_callback_fn
)pre_behavior_ketama
, 0, tests
},
5760 {"ketama_auto_eject_hosts", (test_callback_fn
)pre_behavior_ketama
, 0, ketama_auto_eject_hosts
},
5761 {"unix_socket", (test_callback_fn
)pre_unix_socket
, 0, tests
},
5762 {"unix_socket_nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5763 {"poll_timeout", (test_callback_fn
)poll_timeout
, 0, tests
},
5764 {"gets", (test_callback_fn
)enable_cas
, 0, tests
},
5765 {"consistent_crc", (test_callback_fn
)enable_consistent_crc
, 0, tests
},
5766 {"consistent_hsieh", (test_callback_fn
)enable_consistent_hsieh
, 0, tests
},
5767 #ifdef MEMCACHED_ENABLE_DEPRECATED
5768 {"deprecated_memory_allocators", (test_callback_fn
)deprecated_set_memory_alloc
, 0, tests
},
5770 {"memory_allocators", (test_callback_fn
)set_memory_alloc
, 0, tests
},
5771 {"prefix", (test_callback_fn
)set_prefix
, 0, tests
},
5772 {"version_1_2_3", (test_callback_fn
)check_for_1_2_3
, 0, version_1_2_3
},
5773 {"string", 0, 0, string_tests
},
5774 {"result", 0, 0, result_tests
},
5775 {"async", (test_callback_fn
)pre_nonblock
, 0, async_tests
},
5776 {"async_binary", (test_callback_fn
)pre_nonblock_binary
, 0, async_tests
},
5777 {"user", 0, 0, user_tests
},
5778 {"generate", 0, 0, generate_tests
},
5779 {"generate_hsieh", (test_callback_fn
)pre_hsieh
, 0, generate_tests
},
5780 {"generate_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, generate_tests
},
5781 {"generate_hsieh_consistent", (test_callback_fn
)enable_consistent_hsieh
, 0, generate_tests
},
5782 {"generate_md5", (test_callback_fn
)pre_md5
, 0, generate_tests
},
5783 {"generate_murmur", (test_callback_fn
)pre_murmur
, 0, generate_tests
},
5784 {"generate_jenkins", (test_callback_fn
)pre_jenkins
, 0, generate_tests
},
5785 {"generate_nonblock", (test_callback_fn
)pre_nonblock
, 0, generate_tests
},
5786 {"consistent_not", 0, 0, consistent_tests
},
5787 {"consistent_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, consistent_tests
},
5788 {"consistent_ketama_weighted", (test_callback_fn
)pre_behavior_ketama_weighted
, 0, consistent_weighted_tests
},
5789 {"ketama_compat", 0, 0, ketama_compatibility
},
5790 {"test_hashes", 0, 0, hash_tests
},
5791 {"replication", (test_callback_fn
)pre_replication
, 0, replication_tests
},
5792 {"replication_noblock", (test_callback_fn
)pre_replication_noblock
, 0, replication_tests
},
5793 {"regression", 0, 0, regression_tests
},
5797 #define SERVERS_TO_CREATE 5
5799 #include "libmemcached_world.h"
5801 void get_world(world_st
*world
)
5803 world
->collections
= collection
;
5804 world
->collection_startup
= (test_callback_fn
)world_collection_startup
;
5805 world
->flush
= (test_callback_fn
)world_flush
;
5806 world
->pre_run
= (test_callback_fn
)world_pre_run
;
5807 world
->create
= (test_callback_create_fn
)world_create
;
5808 world
->post_run
= (test_callback_fn
)world_post_run
;
5809 world
->on_error
= (test_callback_error_fn
)world_on_error
;
5810 world
->destroy
= (test_callback_fn
)world_destroy
;
5811 world
->runner
= &defualt_libmemcached_runner
;