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(memcached_server_count(local_memc
) == x
+ 1);
112 test_truth(memcached_servers_count(local_memc
->hosts
) == 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(memcached_server_count(local_memc
) == x
+1);
183 test_truth(memcached_servers_count(local_memc
->hosts
) == 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_false(string_length
);
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_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_false(string_length
);
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
++)
1670 return TEST_SUCCESS
;
1673 static test_return_t
version_string_test(memcached_st
*memc
__attribute__((unused
)))
1675 const char *version_string
;
1677 version_string
= memcached_lib_version();
1679 test_truth(!strcmp(version_string
, LIBMEMCACHED_VERSION_STRING
));
1681 return TEST_SUCCESS
;
1684 static test_return_t
get_stats(memcached_st
*memc
)
1689 memcached_return_t rc
;
1690 memcached_stat_st
*memc_stat
;
1692 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
1693 test_truth(rc
== MEMCACHED_SUCCESS
);
1695 test_truth(rc
== MEMCACHED_SUCCESS
);
1696 test_truth(memc_stat
);
1698 for (x
= 0; x
< memcached_server_count(memc
); x
++)
1700 stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
1701 test_truth(rc
== MEMCACHED_SUCCESS
);
1702 for (ptr
= stat_list
; *ptr
; ptr
++);
1707 memcached_stat_free(NULL
, memc_stat
);
1709 return TEST_SUCCESS
;
1712 static test_return_t
add_host_test(memcached_st
*memc
)
1715 memcached_server_st
*servers
;
1716 memcached_return_t rc
;
1717 char servername
[]= "0.example.com";
1719 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
1720 test_truth(servers
);
1721 test_truth(1 == memcached_server_list_count(servers
));
1723 for (x
= 2; x
< 20; x
++)
1725 char buffer
[SMALL_STRING_LEN
];
1727 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
1728 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
1730 test_truth(rc
== MEMCACHED_SUCCESS
);
1731 test_truth(x
== memcached_server_list_count(servers
));
1734 rc
= memcached_server_push(memc
, servers
);
1735 test_truth(rc
== MEMCACHED_SUCCESS
);
1736 rc
= memcached_server_push(memc
, servers
);
1737 test_truth(rc
== MEMCACHED_SUCCESS
);
1739 memcached_server_list_free(servers
);
1741 return TEST_SUCCESS
;
1744 static memcached_return_t
clone_test_callback(memcached_st
*parent
__attribute__((unused
)), memcached_st
*memc_clone
__attribute__((unused
)))
1746 return MEMCACHED_SUCCESS
;
1749 static memcached_return_t
cleanup_test_callback(memcached_st
*ptr
__attribute__((unused
)))
1751 return MEMCACHED_SUCCESS
;
1754 static test_return_t
callback_test(memcached_st
*memc
)
1756 /* Test User Data */
1760 memcached_return_t rc
;
1762 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
);
1763 test_truth(rc
== MEMCACHED_SUCCESS
);
1764 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
1765 test_truth(*test_ptr
== x
);
1768 /* Test Clone Callback */
1770 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
1771 void *clone_cb_ptr
= *(void **)&clone_cb
;
1772 void *temp_function
= NULL
;
1773 memcached_return_t rc
;
1775 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1777 test_truth(rc
== MEMCACHED_SUCCESS
);
1778 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1779 test_truth(temp_function
== clone_cb_ptr
);
1782 /* Test Cleanup Callback */
1784 memcached_cleanup_fn cleanup_cb
=
1785 (memcached_cleanup_fn
)cleanup_test_callback
;
1786 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
1787 void *temp_function
= NULL
;
1788 memcached_return_t rc
;
1790 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1792 test_truth(rc
== MEMCACHED_SUCCESS
);
1793 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1794 test_truth(temp_function
== cleanup_cb_ptr
);
1797 return TEST_SUCCESS
;
1800 /* We don't test the behavior itself, we test the switches */
1801 static test_return_t
behavior_test(memcached_st
*memc
)
1806 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1807 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1808 test_truth(value
== 1);
1810 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1811 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1812 test_truth(value
== 1);
1814 set
= MEMCACHED_HASH_MD5
;
1815 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1816 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1817 test_truth(value
== MEMCACHED_HASH_MD5
);
1821 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1822 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1823 test_truth(value
== 0);
1825 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1826 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1827 test_truth(value
== 0);
1829 set
= MEMCACHED_HASH_DEFAULT
;
1830 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1831 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1832 test_truth(value
== MEMCACHED_HASH_DEFAULT
);
1834 set
= MEMCACHED_HASH_CRC
;
1835 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1836 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1837 test_truth(value
== MEMCACHED_HASH_CRC
);
1839 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1840 test_truth(value
> 0);
1842 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1843 test_truth(value
> 0);
1845 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
1846 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+ 1);
1847 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 */
2033 memcached_servers_reset(memc
);
2036 /* We need to empty the server before continueing test */
2037 rc
= memcached_flush(memc
, 0);
2038 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2040 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2041 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2043 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2044 &return_value_length
, &flags
, &rc
)) != NULL
)
2046 test_truth(return_value
);
2048 test_truth(!return_value
);
2049 test_truth(return_value_length
== 0);
2050 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2052 for (x
= 0; x
< 3; x
++)
2054 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2055 keys
[x
], key_length
[x
],
2056 (time_t)50, (uint32_t)9);
2057 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2060 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2061 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2064 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2065 &return_value_length
, &flags
, &rc
)))
2067 test_truth(return_value
);
2068 test_truth(rc
== MEMCACHED_SUCCESS
);
2069 test_truth(return_key_length
== return_value_length
);
2070 test_truth(!memcmp(return_value
, return_key
, return_value_length
));
2075 return TEST_SUCCESS
;
2078 #define VALUE_SIZE_BUG5 1048064
2079 static test_return_t
user_supplied_bug5(memcached_st
*memc
)
2081 memcached_return_t rc
;
2082 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2083 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2084 char return_key
[MEMCACHED_MAX_KEY
];
2085 size_t return_key_length
;
2087 size_t value_length
;
2091 char insert_data
[VALUE_SIZE_BUG5
];
2093 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2094 insert_data
[x
]= (signed char)rand();
2096 memcached_flush(memc
, 0);
2097 value
= memcached_get(memc
, keys
[0], key_length
[0],
2098 &value_length
, &flags
, &rc
);
2099 test_truth(value
== NULL
);
2100 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2103 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2104 &value_length
, &flags
, &rc
)))
2106 test_truth(count
== 0);
2108 for (x
= 0; x
< 4; x
++)
2110 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2111 insert_data
, VALUE_SIZE_BUG5
,
2112 (time_t)0, (uint32_t)0);
2113 test_truth(rc
== MEMCACHED_SUCCESS
);
2116 for (x
= 0; x
< 10; x
++)
2118 value
= memcached_get(memc
, keys
[0], key_length
[0],
2119 &value_length
, &flags
, &rc
);
2123 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2125 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2126 &value_length
, &flags
, &rc
)))
2131 test_truth(count
== 4);
2134 return TEST_SUCCESS
;
2137 static test_return_t
user_supplied_bug6(memcached_st
*memc
)
2139 memcached_return_t rc
;
2140 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2141 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2142 char return_key
[MEMCACHED_MAX_KEY
];
2143 size_t return_key_length
;
2145 size_t value_length
;
2149 char insert_data
[VALUE_SIZE_BUG5
];
2151 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2152 insert_data
[x
]= (signed char)rand();
2154 memcached_flush(memc
, 0);
2155 value
= memcached_get(memc
, keys
[0], key_length
[0],
2156 &value_length
, &flags
, &rc
);
2157 test_truth(value
== NULL
);
2158 test_truth(rc
== MEMCACHED_NOTFOUND
);
2159 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2160 test_truth(rc
== MEMCACHED_SUCCESS
);
2163 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2164 &value_length
, &flags
, &rc
)))
2166 test_truth(count
== 0);
2167 test_truth(rc
== MEMCACHED_END
);
2169 for (x
= 0; x
< 4; x
++)
2171 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2172 insert_data
, VALUE_SIZE_BUG5
,
2173 (time_t)0, (uint32_t)0);
2174 test_truth(rc
== MEMCACHED_SUCCESS
);
2177 for (x
= 0; x
< 2; x
++)
2179 value
= memcached_get(memc
, keys
[0], key_length
[0],
2180 &value_length
, &flags
, &rc
);
2184 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2185 test_truth(rc
== MEMCACHED_SUCCESS
);
2187 /* We test for purge of partial complete fetches */
2188 for (count
= 3; count
; count
--)
2190 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2191 &value_length
, &flags
, &rc
);
2192 test_truth(rc
== MEMCACHED_SUCCESS
);
2193 test_truth(!(memcmp(value
, insert_data
, value_length
)));
2194 test_truth(value_length
);
2199 return TEST_SUCCESS
;
2202 static test_return_t
user_supplied_bug8(memcached_st
*memc
__attribute__((unused
)))
2204 memcached_return_t rc
;
2206 memcached_st
*memc_clone
;
2208 memcached_server_st
*servers
;
2209 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";
2211 servers
= memcached_servers_parse(server_list
);
2212 test_truth(servers
);
2214 mine
= memcached_create(NULL
);
2215 rc
= memcached_server_push(mine
, servers
);
2216 test_truth(rc
== MEMCACHED_SUCCESS
);
2217 memcached_server_list_free(servers
);
2220 memc_clone
= memcached_clone(NULL
, mine
);
2222 memcached_quit(mine
);
2223 memcached_quit(memc_clone
);
2226 memcached_free(mine
);
2227 memcached_free(memc_clone
);
2229 return TEST_SUCCESS
;
2232 /* Test flag store/retrieve */
2233 static test_return_t
user_supplied_bug7(memcached_st
*memc
)
2235 memcached_return_t rc
;
2236 const char *keys
= "036790384900";
2237 size_t key_length
= strlen(keys
);
2238 char return_key
[MEMCACHED_MAX_KEY
];
2239 size_t return_key_length
;
2241 size_t value_length
;
2244 char insert_data
[VALUE_SIZE_BUG5
];
2246 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2247 insert_data
[x
]= (signed char)rand();
2249 memcached_flush(memc
, 0);
2252 rc
= memcached_set(memc
, keys
, key_length
,
2253 insert_data
, VALUE_SIZE_BUG5
,
2255 test_truth(rc
== MEMCACHED_SUCCESS
);
2258 value
= memcached_get(memc
, keys
, key_length
,
2259 &value_length
, &flags
, &rc
);
2260 test_truth(flags
== 245);
2264 rc
= memcached_mget(memc
, &keys
, &key_length
, 1);
2267 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2268 &value_length
, &flags
, &rc
);
2269 test_truth(flags
== 245);
2274 return TEST_SUCCESS
;
2277 static test_return_t
user_supplied_bug9(memcached_st
*memc
)
2279 memcached_return_t rc
;
2280 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2281 size_t key_length
[3];
2286 char return_key
[MEMCACHED_MAX_KEY
];
2287 size_t return_key_length
;
2289 size_t return_value_length
;
2292 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2293 key_length
[1]= strlen("fudge&*@#");
2294 key_length
[2]= strlen("for^#@&$not");
2297 for (x
= 0; x
< 3; x
++)
2299 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2300 keys
[x
], key_length
[x
],
2301 (time_t)50, (uint32_t)9);
2302 test_truth(rc
== MEMCACHED_SUCCESS
);
2305 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2306 test_truth(rc
== MEMCACHED_SUCCESS
);
2308 /* We need to empty the server before continueing test */
2309 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2310 &return_value_length
, &flags
, &rc
)) != NULL
)
2312 test_truth(return_value
);
2316 test_truth(count
== 3);
2318 return TEST_SUCCESS
;
2321 /* We are testing with aggressive timeout to get failures */
2322 static test_return_t
user_supplied_bug10(memcached_st
*memc
)
2324 const char *key
= "foo";
2326 size_t value_length
= 512;
2329 memcached_return_t rc
;
2330 unsigned int set
= 1;
2331 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2334 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2335 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2337 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2340 value
= (char*)malloc(value_length
* sizeof(char));
2342 for (x
= 0; x
< value_length
; x
++)
2343 value
[x
]= (char) (x
% 127);
2345 for (x
= 1; x
<= 100000; ++x
)
2347 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2349 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_WRITE_FAILURE
||
2350 rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_TIMEOUT
);
2352 if (rc
== MEMCACHED_WRITE_FAILURE
|| rc
== MEMCACHED_TIMEOUT
)
2357 memcached_free(mclone
);
2359 return TEST_SUCCESS
;
2363 We are looking failures in the async protocol
2365 static test_return_t
user_supplied_bug11(memcached_st
*memc
)
2367 const char *key
= "foo";
2369 size_t value_length
= 512;
2372 memcached_return_t rc
;
2373 unsigned int set
= 1;
2375 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2377 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2378 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2380 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2383 timeout
= (int32_t)memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
2385 test_truth(timeout
== -1);
2387 value
= (char*)malloc(value_length
* sizeof(char));
2389 for (x
= 0; x
< value_length
; x
++)
2390 value
[x
]= (char) (x
% 127);
2392 for (x
= 1; x
<= 100000; ++x
)
2394 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2398 memcached_free(mclone
);
2400 return TEST_SUCCESS
;
2404 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2406 static test_return_t
user_supplied_bug12(memcached_st
*memc
)
2408 memcached_return_t rc
;
2410 size_t value_length
;
2412 uint64_t number_value
;
2414 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2415 &value_length
, &flags
, &rc
);
2416 test_truth(value
== NULL
);
2417 test_truth(rc
== MEMCACHED_NOTFOUND
);
2419 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2422 test_truth(value
== NULL
);
2423 /* The binary protocol will set the key if it doesn't exist */
2424 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2426 test_truth(rc
== MEMCACHED_SUCCESS
);
2430 test_truth(rc
== MEMCACHED_NOTFOUND
);
2433 rc
= memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
2435 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2436 &value_length
, &flags
, &rc
);
2438 test_truth(rc
== MEMCACHED_SUCCESS
);
2441 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2443 test_truth(number_value
== 2);
2444 test_truth(rc
== MEMCACHED_SUCCESS
);
2446 return TEST_SUCCESS
;
2450 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2451 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2453 static test_return_t
user_supplied_bug13(memcached_st
*memc
)
2455 char key
[] = "key34567890";
2457 memcached_return_t rc
;
2458 size_t overflowSize
;
2460 char commandFirst
[]= "set key34567890 0 0 ";
2461 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2462 size_t commandLength
;
2465 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2467 overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2469 for (testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2471 overflow
= malloc(testSize
);
2472 test_truth(overflow
!= NULL
);
2474 memset(overflow
, 'x', testSize
);
2475 rc
= memcached_set(memc
, key
, strlen(key
),
2476 overflow
, testSize
, 0, 0);
2477 test_truth(rc
== MEMCACHED_SUCCESS
);
2481 return TEST_SUCCESS
;
2486 Test values of many different sizes
2487 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2488 set key34567890 0 0 8169 \r\n
2489 is sent followed by buffer of size 8169, followed by 8169
2491 static test_return_t
user_supplied_bug14(memcached_st
*memc
)
2494 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
2495 memcached_return_t rc
;
2496 const char *key
= "foo";
2498 size_t value_length
= 18000;
2500 size_t string_length
;
2503 size_t current_length
;
2505 value
= (char*)malloc(value_length
);
2508 for (x
= 0; x
< value_length
; x
++)
2509 value
[x
] = (char) (x
% 127);
2511 for (current_length
= 0; current_length
< value_length
; current_length
++)
2513 rc
= memcached_set(memc
, key
, strlen(key
),
2514 value
, current_length
,
2515 (time_t)0, (uint32_t)0);
2516 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
2518 string
= memcached_get(memc
, key
, strlen(key
),
2519 &string_length
, &flags
, &rc
);
2521 test_truth(rc
== MEMCACHED_SUCCESS
);
2522 test_truth(string_length
== current_length
);
2523 test_truth(!memcmp(string
, value
, string_length
));
2530 return TEST_SUCCESS
;
2534 Look for zero length value problems
2536 static test_return_t
user_supplied_bug15(memcached_st
*memc
)
2539 memcached_return_t rc
;
2540 const char *key
= "mykey";
2545 for (x
= 0; x
< 2; x
++)
2547 rc
= memcached_set(memc
, key
, strlen(key
),
2549 (time_t)0, (uint32_t)0);
2551 test_truth(rc
== MEMCACHED_SUCCESS
);
2553 value
= memcached_get(memc
, key
, strlen(key
),
2554 &length
, &flags
, &rc
);
2556 test_truth(rc
== MEMCACHED_SUCCESS
);
2557 test_truth(value
== NULL
);
2558 test_truth(length
== 0);
2559 test_truth(flags
== 0);
2561 value
= memcached_get(memc
, key
, strlen(key
),
2562 &length
, &flags
, &rc
);
2564 test_truth(rc
== MEMCACHED_SUCCESS
);
2565 test_truth(value
== NULL
);
2566 test_truth(length
== 0);
2567 test_truth(flags
== 0);
2570 return TEST_SUCCESS
;
2573 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2574 static test_return_t
user_supplied_bug16(memcached_st
*memc
)
2576 memcached_return_t rc
;
2577 const char *key
= "mykey";
2582 rc
= memcached_set(memc
, key
, strlen(key
),
2584 (time_t)0, UINT32_MAX
);
2586 test_truth(rc
== MEMCACHED_SUCCESS
);
2588 value
= memcached_get(memc
, key
, strlen(key
),
2589 &length
, &flags
, &rc
);
2591 test_truth(rc
== MEMCACHED_SUCCESS
);
2592 test_truth(value
== NULL
);
2593 test_truth(length
== 0);
2594 test_truth(flags
== UINT32_MAX
);
2596 return TEST_SUCCESS
;
2600 /* Check the validity of chinese key*/
2601 static test_return_t
user_supplied_bug17(memcached_st
*memc
)
2603 memcached_return_t rc
;
2604 const char *key
= "豆瓣";
2605 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2610 rc
= memcached_set(memc
, key
, strlen(key
),
2611 value
, strlen(value
),
2614 test_truth(rc
== MEMCACHED_SUCCESS
);
2616 value2
= memcached_get(memc
, key
, strlen(key
),
2617 &length
, &flags
, &rc
);
2619 test_truth(length
==strlen(value
));
2620 test_truth(rc
== MEMCACHED_SUCCESS
);
2621 test_truth(memcmp(value
, value2
, length
)==0);
2624 return TEST_SUCCESS
;
2632 static test_return_t
user_supplied_bug19(memcached_st
*memc
)
2635 memcached_server_st
*s
;
2636 memcached_return_t res
;
2640 m
= memcached_create(NULL
);
2641 memcached_server_add_with_weight(m
, "localhost", 11311, 100);
2642 memcached_server_add_with_weight(m
, "localhost", 11312, 100);
2644 s
= memcached_server_by_key(m
, "a", 1, &res
);
2645 memcached_server_free(s
);
2649 return TEST_SUCCESS
;
2652 /* CAS test from Andei */
2653 static test_return_t
user_supplied_bug20(memcached_st
*memc
)
2655 memcached_return_t status
;
2656 memcached_result_st
*result
, result_obj
;
2657 const char *key
= "abc";
2658 size_t key_len
= strlen("abc");
2659 const char *value
= "foobar";
2660 size_t value_len
= strlen(value
);
2662 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
2664 status
= memcached_set(memc
, key
, key_len
, value
, value_len
, (time_t)0, (uint32_t)0);
2665 test_truth(status
== MEMCACHED_SUCCESS
);
2667 status
= memcached_mget(memc
, &key
, &key_len
, 1);
2668 test_truth(status
== MEMCACHED_SUCCESS
);
2670 result
= memcached_result_create(memc
, &result_obj
);
2673 memcached_result_create(memc
, &result_obj
);
2674 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2677 test_truth(status
== MEMCACHED_SUCCESS
);
2679 memcached_result_free(result
);
2681 return TEST_SUCCESS
;
2684 #include "ketama_test_cases.h"
2685 static test_return_t
user_supplied_bug18(memcached_st
*trash
)
2687 memcached_return_t rc
;
2690 memcached_server_st
*server_pool
;
2695 memc
= memcached_create(NULL
);
2698 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2699 test_truth(rc
== MEMCACHED_SUCCESS
);
2701 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2702 test_truth(value
== 1);
2704 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2705 test_truth(rc
== MEMCACHED_SUCCESS
);
2707 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2708 test_truth(value
== MEMCACHED_HASH_MD5
);
2710 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");
2711 memcached_server_push(memc
, server_pool
);
2713 /* verify that the server list was parsed okay. */
2714 test_truth(memcached_server_count(memc
) == 8);
2715 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2716 test_truth(server_pool
[0].port
== 11211);
2717 test_truth(server_pool
[0].weight
== 600);
2718 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2719 test_truth(server_pool
[2].port
== 11211);
2720 test_truth(server_pool
[2].weight
== 200);
2721 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2722 test_truth(server_pool
[7].port
== 11211);
2723 test_truth(server_pool
[7].weight
== 100);
2725 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
2726 * us test the boundary wraparound.
2728 test_truth(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
2730 /* verify the standard ketama set. */
2731 for (x
= 0; x
< 99; x
++)
2733 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2734 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2735 test_strcmp(hostname
, ketama_test_cases
[x
].server
);
2738 memcached_server_list_free(server_pool
);
2739 memcached_free(memc
);
2741 return TEST_SUCCESS
;
2744 /* Large mget() of missing keys with binary proto
2746 * If many binary quiet commands (such as getq's in an mget) fill the output
2747 * buffer and the server chooses not to respond, memcached_flush hangs. See
2748 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2751 /* sighandler_t function that always asserts false */
2752 static void fail(int unused
__attribute__((unused
)))
2758 static test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2760 memcached_return_t rc
;
2763 size_t* key_lengths
;
2764 void (*oldalarm
)(int);
2765 memcached_st
*memc_clone
;
2767 memc_clone
= memcached_clone(NULL
, memc
);
2768 test_truth(memc_clone
);
2770 /* only binproto uses getq for mget */
2771 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
2773 /* empty the cache to ensure misses (hence non-responses) */
2774 rc
= memcached_flush(memc_clone
, 0);
2775 test_truth(rc
== MEMCACHED_SUCCESS
);
2777 key_lengths
= calloc(key_count
, sizeof(size_t));
2778 keys
= calloc(key_count
, sizeof(char *));
2780 for (x
= 0; x
< key_count
; x
++)
2784 snprintf(buffer
, 30, "%u", x
);
2785 keys
[x
]= strdup(buffer
);
2786 key_lengths
[x
]= strlen(keys
[x
]);
2789 oldalarm
= signal(SIGALRM
, fail
);
2792 rc
= memcached_mget(memc_clone
, (const char **)keys
, key_lengths
, key_count
);
2793 test_truth(rc
== MEMCACHED_SUCCESS
);
2796 signal(SIGALRM
, oldalarm
);
2798 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
2800 for (x
= 0; x
< key_count
; x
++)
2805 memcached_free(memc_clone
);
2807 return TEST_SUCCESS
;
2810 static test_return_t
pre_binary(memcached_st
*memc
);
2812 static test_return_t
user_supplied_bug21(memcached_st
*memc
)
2814 test_return_t test_rc
;
2815 test_rc
= pre_binary(memc
);
2817 if (test_rc
!= TEST_SUCCESS
)
2822 /* should work as of r580 */
2823 rc
= _user_supplied_bug21(memc
, 10);
2824 test_truth(rc
== TEST_SUCCESS
);
2826 /* should fail as of r580 */
2827 rc
= _user_supplied_bug21(memc
, 1000);
2828 test_truth(rc
== TEST_SUCCESS
);
2830 return TEST_SUCCESS
;
2833 static test_return_t
auto_eject_hosts(memcached_st
*trash
)
2837 memcached_return_t rc
;
2838 memcached_st
*memc
= memcached_create(NULL
);
2841 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2842 test_truth(rc
== MEMCACHED_SUCCESS
);
2844 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2845 test_truth(value
== 1);
2847 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2848 test_truth(rc
== MEMCACHED_SUCCESS
);
2850 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2851 test_truth(value
== MEMCACHED_HASH_MD5
);
2853 /* server should be removed when in delay */
2854 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
, 1);
2855 test_truth(rc
== MEMCACHED_SUCCESS
);
2857 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
);
2858 test_truth(value
== 1);
2860 memcached_server_st
*server_pool
;
2861 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");
2862 memcached_server_push(memc
, server_pool
);
2864 /* verify that the server list was parsed okay. */
2865 test_truth(memcached_server_count(memc
) == 8);
2866 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2867 test_truth(server_pool
[0].port
== 11211);
2868 test_truth(server_pool
[0].weight
== 600);
2869 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2870 test_truth(server_pool
[2].port
== 11211);
2871 test_truth(server_pool
[2].weight
== 200);
2872 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2873 test_truth(server_pool
[7].port
== 11211);
2874 test_truth(server_pool
[7].weight
== 100);
2876 memc
->hosts
[2].next_retry
= time(NULL
) + 15;
2877 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2879 for (int x
= 0; x
< 99; x
++)
2881 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2882 test_truth(server_idx
!= 2);
2885 /* and re-added when it's back. */
2886 memc
->hosts
[2].next_retry
= time(NULL
) - 1;
2887 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2888 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
,
2889 memc
->distribution
);
2890 for (int x
= 0; x
< 99; x
++)
2892 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2893 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2894 test_truth(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
2897 memcached_server_list_free(server_pool
);
2898 memcached_free(memc
);
2900 return TEST_SUCCESS
;
2903 static test_return_t
output_ketama_weighted_keys(memcached_st
*trash
)
2907 memcached_return_t rc
;
2908 memcached_st
*memc
= memcached_create(NULL
);
2912 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2913 test_truth(rc
== MEMCACHED_SUCCESS
);
2915 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2916 test_truth(value
== 1);
2918 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2919 test_truth(rc
== MEMCACHED_SUCCESS
);
2921 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2922 test_truth(value
== MEMCACHED_HASH_MD5
);
2925 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
2927 memcached_server_st
*server_pool
;
2928 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");
2929 memcached_server_push(memc
, server_pool
);
2931 // @todo this needs to be refactored to actually test something.
2934 if ((fp
= fopen("ketama_keys.txt", "w")))
2938 printf("cannot write to file ketama_keys.txt");
2939 return TEST_FAILURE
;
2942 for (int x
= 0; x
< 10000; x
++)
2945 sprintf(key
, "%d", x
);
2947 uint32_t server_idx
= memcached_generate_hash(memc
, key
, strlen(key
));
2948 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2949 in_port_t port
= memc
->hosts
[server_idx
].port
;
2950 fprintf(fp
, "key %s is on host /%s:%u\n", key
, hostname
, port
);
2954 memcached_server_list_free(server_pool
);
2955 memcached_free(memc
);
2957 return TEST_SUCCESS
;
2961 static test_return_t
result_static(memcached_st
*memc
)
2963 memcached_result_st result
;
2964 memcached_result_st
*result_ptr
;
2966 result_ptr
= memcached_result_create(memc
, &result
);
2967 test_truth(result
.options
.is_allocated
== false);
2968 test_truth(memcached_is_initialized(&result
) == true);
2969 test_truth(result_ptr
);
2970 test_truth(result_ptr
== &result
);
2972 memcached_result_free(&result
);
2974 test_truth(result
.options
.is_allocated
== false);
2975 test_truth(memcached_is_initialized(&result
) == false);
2977 return TEST_SUCCESS
;
2980 static test_return_t
result_alloc(memcached_st
*memc
)
2982 memcached_result_st
*result_ptr
;
2984 result_ptr
= memcached_result_create(memc
, NULL
);
2985 test_truth(result_ptr
);
2986 test_truth(result_ptr
->options
.is_allocated
== true);
2987 test_truth(memcached_is_initialized(result_ptr
) == true);
2988 memcached_result_free(result_ptr
);
2990 return TEST_SUCCESS
;
2993 static test_return_t
string_static_null(memcached_st
*memc
)
2995 memcached_string_st string
;
2996 memcached_string_st
*string_ptr
;
2998 string_ptr
= memcached_string_create(memc
, &string
, 0);
2999 test_truth(string
.options
.is_initialized
== true);
3000 test_truth(string_ptr
);
3002 /* The following two better be the same! */
3003 test_truth(memcached_is_allocated(string_ptr
) == false);
3004 test_truth(memcached_is_allocated(&string
) == false);
3005 test_truth(&string
== string_ptr
);
3007 test_truth(string
.options
.is_initialized
== true);
3008 test_truth(memcached_is_initialized(&string
) == true);
3009 memcached_string_free(&string
);
3010 test_truth(memcached_is_initialized(&string
) == false);
3012 return TEST_SUCCESS
;
3015 static test_return_t
string_alloc_null(memcached_st
*memc
)
3017 memcached_string_st
*string
;
3019 string
= memcached_string_create(memc
, NULL
, 0);
3021 test_truth(memcached_is_allocated(string
) == true);
3022 test_truth(memcached_is_initialized(string
) == true);
3023 memcached_string_free(string
);
3025 return TEST_SUCCESS
;
3028 static test_return_t
string_alloc_with_size(memcached_st
*memc
)
3030 memcached_string_st
*string
;
3032 string
= memcached_string_create(memc
, NULL
, 1024);
3034 test_truth(memcached_is_allocated(string
) == true);
3035 test_truth(memcached_is_initialized(string
) == true);
3036 memcached_string_free(string
);
3038 return TEST_SUCCESS
;
3041 static test_return_t
string_alloc_with_size_toobig(memcached_st
*memc
)
3043 memcached_string_st
*string
;
3045 string
= memcached_string_create(memc
, NULL
, SIZE_MAX
);
3046 test_truth(string
== NULL
);
3048 return TEST_SUCCESS
;
3051 static test_return_t
string_alloc_append(memcached_st
*memc
)
3054 char buffer
[SMALL_STRING_LEN
];
3055 memcached_string_st
*string
;
3057 /* Ring the bell! */
3058 memset(buffer
, 6, SMALL_STRING_LEN
);
3060 string
= memcached_string_create(memc
, NULL
, 100);
3062 test_truth(memcached_is_allocated(string
) == true);
3063 test_truth(memcached_is_initialized(string
) == true);
3065 for (x
= 0; x
< 1024; x
++)
3067 memcached_return_t rc
;
3068 rc
= memcached_string_append(string
, buffer
, SMALL_STRING_LEN
);
3069 test_truth(rc
== MEMCACHED_SUCCESS
);
3071 test_truth(memcached_is_allocated(string
) == true);
3072 memcached_string_free(string
);
3074 return TEST_SUCCESS
;
3077 static test_return_t
string_alloc_append_toobig(memcached_st
*memc
)
3079 memcached_return_t rc
;
3081 char buffer
[SMALL_STRING_LEN
];
3082 memcached_string_st
*string
;
3084 /* Ring the bell! */
3085 memset(buffer
, 6, SMALL_STRING_LEN
);
3087 string
= memcached_string_create(memc
, NULL
, 100);
3089 test_truth(memcached_is_allocated(string
) == true);
3090 test_truth(memcached_is_initialized(string
) == true);
3092 for (x
= 0; x
< 1024; x
++)
3094 rc
= memcached_string_append(string
, buffer
, SMALL_STRING_LEN
);
3095 test_truth(rc
== MEMCACHED_SUCCESS
);
3097 rc
= memcached_string_append(string
, buffer
, SIZE_MAX
);
3098 test_truth(rc
== MEMCACHED_MEMORY_ALLOCATION_FAILURE
);
3099 test_truth(memcached_is_allocated(string
) == true);
3100 memcached_string_free(string
);
3102 return TEST_SUCCESS
;
3105 static test_return_t
cleanup_pairs(memcached_st
*memc
__attribute__((unused
)))
3107 pairs_free(global_pairs
);
3109 return TEST_SUCCESS
;
3112 static test_return_t
generate_pairs(memcached_st
*memc
__attribute__((unused
)))
3114 unsigned long long x
;
3115 global_pairs
= pairs_generate(GLOBAL_COUNT
, 400);
3116 global_count
= GLOBAL_COUNT
;
3118 for (x
= 0; x
< global_count
; x
++)
3120 global_keys
[x
]= global_pairs
[x
].key
;
3121 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3124 return TEST_SUCCESS
;
3127 static test_return_t
generate_large_pairs(memcached_st
*memc
__attribute__((unused
)))
3129 unsigned long long x
;
3130 global_pairs
= pairs_generate(GLOBAL2_COUNT
, MEMCACHED_MAX_BUFFER
+10);
3131 global_count
= GLOBAL2_COUNT
;
3133 for (x
= 0; x
< global_count
; x
++)
3135 global_keys
[x
]= global_pairs
[x
].key
;
3136 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3139 return TEST_SUCCESS
;
3142 static test_return_t
generate_data(memcached_st
*memc
)
3144 execute_set(memc
, global_pairs
, global_count
);
3146 return TEST_SUCCESS
;
3149 static test_return_t
generate_data_with_stats(memcached_st
*memc
)
3151 memcached_stat_st
*stat_p
;
3152 memcached_return_t rc
;
3153 uint32_t host_index
= 0;
3154 execute_set(memc
, global_pairs
, global_count
);
3156 //TODO: hosts used size stats
3157 stat_p
= memcached_stat(memc
, NULL
, &rc
);
3160 for (host_index
= 0; host_index
< SERVERS_TO_CREATE
; host_index
++)
3162 /* This test was changes so that "make test" would work properlly */
3164 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
);
3166 test_truth((unsigned long long)(stat_p
+ host_index
)->bytes
);
3169 memcached_stat_free(NULL
, stat_p
);
3171 return TEST_SUCCESS
;
3173 static test_return_t
generate_buffer_data(memcached_st
*memc
)
3178 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, latch
);
3179 generate_data(memc
);
3181 return TEST_SUCCESS
;
3184 static test_return_t
get_read_count(memcached_st
*memc
)
3187 memcached_return_t rc
;
3188 memcached_st
*memc_clone
;
3190 memc_clone
= memcached_clone(NULL
, memc
);
3191 test_truth(memc_clone
);
3193 memcached_server_add_with_weight(memc_clone
, "localhost", 6666, 0);
3197 size_t return_value_length
;
3201 for (x
= count
= 0; x
< global_count
; x
++)
3203 return_value
= memcached_get(memc_clone
, global_keys
[x
], global_keys_length
[x
],
3204 &return_value_length
, &flags
, &rc
);
3205 if (rc
== MEMCACHED_SUCCESS
)
3214 memcached_free(memc_clone
);
3216 return TEST_SUCCESS
;
3219 static test_return_t
get_read(memcached_st
*memc
)
3222 memcached_return_t rc
;
3226 size_t return_value_length
;
3229 for (x
= 0; x
< global_count
; x
++)
3231 return_value
= memcached_get(memc
, global_keys
[x
], global_keys_length
[x
],
3232 &return_value_length
, &flags
, &rc
);
3234 test_truth(return_value);
3235 test_truth(rc == MEMCACHED_SUCCESS);
3237 if (rc
== MEMCACHED_SUCCESS
&& return_value
)
3242 return TEST_SUCCESS
;
3245 static test_return_t
mget_read(memcached_st
*memc
)
3247 memcached_return_t rc
;
3249 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3250 test_truth(rc
== MEMCACHED_SUCCESS
);
3251 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
3253 return TEST_SUCCESS
;
3256 static test_return_t
mget_read_result(memcached_st
*memc
)
3258 memcached_return_t rc
;
3260 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3261 test_truth(rc
== MEMCACHED_SUCCESS
);
3262 /* Turn this into a help function */
3264 memcached_result_st results_obj
;
3265 memcached_result_st
*results
;
3267 results
= memcached_result_create(memc
, &results_obj
);
3269 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
3271 test_truth(results
);
3272 test_truth(rc
== MEMCACHED_SUCCESS
);
3275 memcached_result_free(&results_obj
);
3278 return TEST_SUCCESS
;
3281 static test_return_t
mget_read_function(memcached_st
*memc
)
3283 memcached_return_t rc
;
3284 unsigned int counter
;
3285 memcached_execute_fn callbacks
[1];
3287 rc
= memcached_mget(memc
, global_keys
, global_keys_length
, global_count
);
3288 test_truth(rc
== MEMCACHED_SUCCESS
);
3290 callbacks
[0]= &callback_counter
;
3292 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
3294 return TEST_SUCCESS
;
3297 static test_return_t
delete_generate(memcached_st
*memc
)
3301 for (x
= 0; x
< global_count
; x
++)
3303 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3306 return TEST_SUCCESS
;
3309 static test_return_t
delete_buffer_generate(memcached_st
*memc
)
3315 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, latch
);
3317 for (x
= 0; x
< global_count
; x
++)
3319 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3322 return TEST_SUCCESS
;
3325 static test_return_t
add_host_test1(memcached_st
*memc
)
3328 memcached_return_t rc
;
3329 char servername
[]= "0.example.com";
3330 memcached_server_st
*servers
;
3332 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
3333 test_truth(servers
);
3334 test_truth(1 == memcached_server_list_count(servers
));
3336 for (x
= 2; x
< 20; x
++)
3338 char buffer
[SMALL_STRING_LEN
];
3340 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
3341 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
3343 test_truth(rc
== MEMCACHED_SUCCESS
);
3344 test_truth(x
== memcached_server_list_count(servers
));
3347 rc
= memcached_server_push(memc
, servers
);
3348 test_truth(rc
== MEMCACHED_SUCCESS
);
3349 rc
= memcached_server_push(memc
, servers
);
3350 test_truth(rc
== MEMCACHED_SUCCESS
);
3352 memcached_server_list_free(servers
);
3354 return TEST_SUCCESS
;
3357 static test_return_t
pre_nonblock(memcached_st
*memc
)
3359 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3361 return TEST_SUCCESS
;
3364 static test_return_t
pre_nonblock_binary(memcached_st
*memc
)
3366 memcached_return_t rc
= MEMCACHED_FAILURE
;
3367 memcached_st
*memc_clone
;
3369 memc_clone
= memcached_clone(NULL
, memc
);
3370 test_truth(memc_clone
);
3371 // The memcached_version needs to be done on a clone, because the server
3372 // will not toggle protocol on an connection.
3373 memcached_version(memc_clone
);
3375 if (memc_clone
->hosts
[0].major_version
>= 1 && memc_clone
->hosts
[0].minor_version
> 2)
3377 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3378 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
3379 test_truth(rc
== MEMCACHED_SUCCESS
);
3380 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1);
3384 return TEST_SKIPPED
;
3387 memcached_free(memc_clone
);
3389 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3392 static test_return_t
pre_murmur(memcached_st
*memc
)
3394 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
);
3396 return TEST_SUCCESS
;
3399 static test_return_t
pre_jenkins(memcached_st
*memc
)
3401 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_JENKINS
);
3403 return TEST_SUCCESS
;
3407 static test_return_t
pre_md5(memcached_st
*memc
)
3409 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MD5
);
3411 return TEST_SUCCESS
;
3414 static test_return_t
pre_crc(memcached_st
*memc
)
3416 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_CRC
);
3418 return TEST_SUCCESS
;
3421 static test_return_t
pre_hsieh(memcached_st
*memc
)
3423 #ifdef HAVE_HSIEH_HASH
3424 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_HSIEH
);
3425 return TEST_SUCCESS
;
3428 return TEST_SKIPPED
;
3432 static test_return_t
pre_hash_fnv1_64(memcached_st
*memc
)
3434 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
);
3436 return TEST_SUCCESS
;
3439 static test_return_t
pre_hash_fnv1a_64(memcached_st
*memc
)
3441 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_64
);
3443 return TEST_SUCCESS
;
3446 static test_return_t
pre_hash_fnv1_32(memcached_st
*memc
)
3448 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1_32
);
3450 return TEST_SUCCESS
;
3453 static test_return_t
pre_hash_fnv1a_32(memcached_st
*memc
)
3455 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_32
);
3457 return TEST_SUCCESS
;
3460 static test_return_t
pre_behavior_ketama(memcached_st
*memc
)
3462 memcached_return_t rc
;
3465 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA
, 1);
3466 test_truth(rc
== MEMCACHED_SUCCESS
);
3468 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA
);
3469 test_truth(value
== 1);
3471 return TEST_SUCCESS
;
3474 static test_return_t
pre_behavior_ketama_weighted(memcached_st
*memc
)
3476 memcached_return_t rc
;
3479 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
3480 test_truth(rc
== MEMCACHED_SUCCESS
);
3482 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
3483 test_truth(value
== 1);
3485 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
3486 test_truth(rc
== MEMCACHED_SUCCESS
);
3488 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
3489 test_truth(value
== MEMCACHED_HASH_MD5
);
3491 return TEST_SUCCESS
;
3495 @note This should be testing to see if the server really supports the binary protocol.
3497 static test_return_t
pre_binary(memcached_st
*memc
)
3499 memcached_return_t rc
= MEMCACHED_FAILURE
;
3500 memcached_st
*memc_clone
;
3502 memc_clone
= memcached_clone(NULL
, memc
);
3503 test_truth(memc_clone
);
3504 // The memcached_version needs to be done on a clone, because the server
3505 // will not toggle protocol on an connection.
3506 memcached_version(memc_clone
);
3508 if (memc_clone
->hosts
[0].major_version
>= 1 && memc_clone
->hosts
[0].minor_version
> 2)
3510 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
3511 test_truth(rc
== MEMCACHED_SUCCESS
);
3512 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1);
3515 memcached_free(memc_clone
);
3517 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3521 static test_return_t
pre_replication(memcached_st
*memc
)
3523 test_return_t test_rc
;
3524 test_rc
= pre_binary(memc
);
3526 if (test_rc
!= TEST_SUCCESS
)
3530 * Make sure that we store the item on all servers
3531 * (master + replicas == number of servers)
3533 memcached_return_t rc
;
3534 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
,
3535 memcached_server_count(memc
) - 1);
3536 test_truth(rc
== MEMCACHED_SUCCESS
);
3537 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
) == memcached_server_count(memc
) - 1);
3539 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3543 static test_return_t
pre_replication_noblock(memcached_st
*memc
)
3547 rc
= pre_replication(memc
);
3548 if (rc
!= TEST_SUCCESS
)
3551 rc
= pre_nonblock(memc
);
3557 static void my_free(memcached_st
*ptr
__attribute__((unused
)), void *mem
)
3559 #ifdef HARD_MALLOC_TESTS
3560 void *real_ptr
= (mem
== NULL
) ? mem
: (void*)((caddr_t
)mem
- 8);
3568 static void *my_malloc(memcached_st
*ptr
__attribute__((unused
)), const size_t size
)
3570 #ifdef HARD_MALLOC_TESTS
3571 void *ret
= malloc(size
+ 8);
3574 ret
= (void*)((caddr_t
)ret
+ 8);
3577 void *ret
= malloc(size
);
3582 memset(ret
, 0xff, size
);
3589 static void *my_realloc(memcached_st
*ptr
__attribute__((unused
)), void *mem
, const size_t size
)
3591 #ifdef HARD_MALLOC_TESTS
3592 void *real_ptr
= (mem
== NULL
) ? NULL
: (void*)((caddr_t
)mem
- 8);
3593 void *nmem
= realloc(real_ptr
, size
+ 8);
3598 ret
= (void*)((caddr_t
)nmem
+ 8);
3603 return realloc(mem
, size
);
3608 static void *my_calloc(memcached_st
*ptr
__attribute__((unused
)), size_t nelem
, const size_t size
)
3610 #ifdef HARD_MALLOC_TESTS
3611 void *mem
= my_malloc(ptr
, nelem
* size
);
3614 memset(mem
, 0, nelem
* size
);
3619 return calloc(nelem
, size
);
3624 static test_return_t
set_prefix(memcached_st
*memc
)
3626 memcached_return_t rc
;
3627 const char *key
= "mine";
3630 /* Make sure be default none exists */
3631 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3632 test_truth(rc
== MEMCACHED_FAILURE
);
3634 /* Test a clean set */
3635 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3636 test_truth(rc
== MEMCACHED_SUCCESS
);
3638 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3639 test_truth(memcmp(value
, key
, 4) == 0);
3640 test_truth(rc
== MEMCACHED_SUCCESS
);
3642 /* Test that we can turn it off */
3643 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3644 test_truth(rc
== MEMCACHED_SUCCESS
);
3646 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3647 test_truth(rc
== MEMCACHED_FAILURE
);
3649 /* Now setup for main test */
3650 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3651 test_truth(rc
== MEMCACHED_SUCCESS
);
3653 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3654 test_truth(rc
== MEMCACHED_SUCCESS
);
3655 test_truth(memcmp(value
, key
, 4) == 0);
3657 /* Set to Zero, and then Set to something too large */
3660 memset(long_key
, 0, 255);
3662 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3663 test_truth(rc
== MEMCACHED_SUCCESS
);
3665 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3666 test_truth(rc
== MEMCACHED_FAILURE
);
3667 test_truth(value
== NULL
);
3669 /* Test a long key for failure */
3670 /* TODO, extend test to determine based on setting, what result should be */
3671 strcpy(long_key
, "Thisismorethentheallottednumberofcharacters");
3672 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3673 //test_truth(rc == MEMCACHED_BAD_KEY_PROVIDED);
3674 test_truth(rc
== MEMCACHED_SUCCESS
);
3676 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3677 strcpy(long_key
, "This is more then the allotted number of characters");
3678 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3679 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3681 /* Test for a bad prefix, but with a short key */
3682 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1);
3683 test_truth(rc
== MEMCACHED_SUCCESS
);
3685 strcpy(long_key
, "dog cat");
3686 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3687 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3690 return TEST_SUCCESS
;
3694 #ifdef MEMCACHED_ENABLE_DEPRECATED
3695 static test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
3697 void *test_ptr
= NULL
;
3700 memcached_malloc_fn malloc_cb
=
3701 (memcached_malloc_fn
)my_malloc
;
3702 cb_ptr
= *(void **)&malloc_cb
;
3703 memcached_return_t rc
;
3705 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
);
3706 test_truth(rc
== MEMCACHED_SUCCESS
);
3707 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3708 test_truth(rc
== MEMCACHED_SUCCESS
);
3709 test_truth(test_ptr
== cb_ptr
);
3713 memcached_realloc_fn realloc_cb
=
3714 (memcached_realloc_fn
)my_realloc
;
3715 cb_ptr
= *(void **)&realloc_cb
;
3716 memcached_return_t rc
;
3718 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
);
3719 test_truth(rc
== MEMCACHED_SUCCESS
);
3720 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3721 test_truth(rc
== MEMCACHED_SUCCESS
);
3722 test_truth(test_ptr
== cb_ptr
);
3726 memcached_free_fn free_cb
=
3727 (memcached_free_fn
)my_free
;
3728 cb_ptr
= *(void **)&free_cb
;
3729 memcached_return_t rc
;
3731 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
);
3732 test_truth(rc
== MEMCACHED_SUCCESS
);
3733 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3734 test_truth(rc
== MEMCACHED_SUCCESS
);
3735 test_truth(test_ptr
== cb_ptr
);
3738 return TEST_SUCCESS
;
3743 static test_return_t
set_memory_alloc(memcached_st
*memc
)
3745 memcached_return_t rc
;
3746 rc
= memcached_set_memory_allocators(memc
, NULL
, my_free
,
3747 my_realloc
, my_calloc
);
3748 test_truth(rc
== MEMCACHED_FAILURE
);
3750 rc
= memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3751 my_realloc
, my_calloc
);
3753 memcached_malloc_fn mem_malloc
;
3754 memcached_free_fn mem_free
;
3755 memcached_realloc_fn mem_realloc
;
3756 memcached_calloc_fn mem_calloc
;
3757 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3758 &mem_realloc
, &mem_calloc
);
3760 test_truth(mem_malloc
== my_malloc
);
3761 test_truth(mem_realloc
== my_realloc
);
3762 test_truth(mem_calloc
== my_calloc
);
3763 test_truth(mem_free
== my_free
);
3765 return TEST_SUCCESS
;
3768 static test_return_t
enable_consistent_crc(memcached_st
*memc
)
3771 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3772 memcached_hash_t hash
;
3773 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3774 if ((rc
= pre_crc(memc
)) != TEST_SUCCESS
)
3777 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3778 test_truth(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3780 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3782 if (hash
!= MEMCACHED_HASH_CRC
)
3783 return TEST_SKIPPED
;
3785 return TEST_SUCCESS
;
3788 static test_return_t
enable_consistent_hsieh(memcached_st
*memc
)
3791 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3792 memcached_hash_t hash
;
3793 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3794 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3797 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3798 test_truth(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3800 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3802 if (hash
!= MEMCACHED_HASH_HSIEH
)
3803 return TEST_SKIPPED
;
3806 return TEST_SUCCESS
;
3809 static test_return_t
enable_cas(memcached_st
*memc
)
3811 unsigned int set
= 1;
3813 memcached_version(memc
);
3815 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3816 || memc
->hosts
[0].minor_version
> 2)
3818 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3820 return TEST_SUCCESS
;
3823 return TEST_SKIPPED
;
3826 static test_return_t
check_for_1_2_3(memcached_st
*memc
)
3828 memcached_version(memc
);
3830 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3831 || memc
->hosts
[0].minor_version
> 2)
3832 return TEST_SUCCESS
;
3834 return TEST_SKIPPED
;
3837 static test_return_t
pre_unix_socket(memcached_st
*memc
)
3839 memcached_return_t rc
;
3842 memcached_servers_reset(memc
);
3844 if (stat("/tmp/memcached.socket", &buf
))
3845 return TEST_SKIPPED
;
3847 rc
= memcached_server_add_unix_socket_with_weight(memc
, "/tmp/memcached.socket", 0);
3849 return ( rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_FAILURE
);
3852 static test_return_t
pre_nodelay(memcached_st
*memc
)
3854 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3855 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
3857 return TEST_SUCCESS
;
3860 static test_return_t
pre_settimer(memcached_st
*memc
)
3862 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
3863 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
3865 return TEST_SUCCESS
;
3868 static test_return_t
poll_timeout(memcached_st
*memc
)
3874 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
3876 timeout
= (size_t)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
3878 test_truth(timeout
== 100);
3880 return TEST_SUCCESS
;
3883 static test_return_t
noreply_test(memcached_st
*memc
)
3885 memcached_return_t ret
;
3886 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
3887 test_truth(ret
== MEMCACHED_SUCCESS
);
3888 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
3889 test_truth(ret
== MEMCACHED_SUCCESS
);
3890 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
3891 test_truth(ret
== MEMCACHED_SUCCESS
);
3892 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
) == 1);
3893 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
) == 1);
3894 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
) == 1);
3896 for (int count
=0; count
< 5; ++count
)
3898 for (int x
=0; x
< 100; ++x
)
3901 size_t len
= (size_t)sprintf(key
, "%d", x
);
3905 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
3908 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
3911 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
3914 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
3917 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
3923 test_truth(ret
== MEMCACHED_SUCCESS
|| ret
== MEMCACHED_BUFFERED
);
3927 ** NOTE: Don't ever do this in your code! this is not a supported use of the
3928 ** API and is _ONLY_ done this way to verify that the library works the
3929 ** way it is supposed to do!!!!
3932 for (uint32_t x
=0; x
< memcached_server_count(memc
); ++x
)
3933 no_msg
+=(int)(memc
->hosts
[x
].cursor_active
);
3935 test_truth(no_msg
== 0);
3936 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3939 ** Now validate that all items was set properly!
3941 for (int x
=0; x
< 100; ++x
)
3944 size_t len
= (size_t)sprintf(key
, "%d", x
);
3947 char* value
=memcached_get(memc
, key
, strlen(key
),
3948 &length
, &flags
, &ret
);
3949 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3952 case 0: /* FALLTHROUGH */
3953 case 1: /* FALLTHROUGH */
3955 test_truth(strncmp(value
, key
, len
) == 0);
3956 test_truth(len
== length
);
3959 test_truth(length
== len
* 2);
3962 test_truth(length
== len
* 3);
3972 /* Try setting an illegal cas value (should not return an error to
3973 * the caller (because we don't expect a return message from the server)
3975 const char* keys
[]= {"0"};
3976 size_t lengths
[]= {1};
3979 memcached_result_st results_obj
;
3980 memcached_result_st
*results
;
3981 ret
= memcached_mget(memc
, keys
, lengths
, 1);
3982 test_truth(ret
== MEMCACHED_SUCCESS
);
3984 results
= memcached_result_create(memc
, &results_obj
);
3985 test_truth(results
);
3986 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
3987 test_truth(results
);
3988 test_truth(ret
== MEMCACHED_SUCCESS
);
3989 uint64_t cas
= memcached_result_cas(results
);
3990 memcached_result_free(&results_obj
);
3992 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
3993 test_truth(ret
== MEMCACHED_SUCCESS
);
3996 * The item will have a new cas value, so try to set it again with the old
3997 * value. This should fail!
3999 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
4000 test_truth(ret
== MEMCACHED_SUCCESS
);
4001 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
4002 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
4003 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
4006 return TEST_SUCCESS
;
4009 static test_return_t
analyzer_test(memcached_st
*memc
)
4011 memcached_return_t rc
;
4012 memcached_stat_st
*memc_stat
;
4013 memcached_analysis_st
*report
;
4015 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
4016 test_truth(rc
== MEMCACHED_SUCCESS
);
4017 test_truth(memc_stat
);
4019 report
= memcached_analyze(memc
, memc_stat
, &rc
);
4020 test_truth(rc
== MEMCACHED_SUCCESS
);
4024 memcached_stat_free(NULL
, memc_stat
);
4026 return TEST_SUCCESS
;
4029 /* Count the objects */
4030 static memcached_return_t
callback_dump_counter(memcached_st
*ptr
__attribute__((unused
)),
4031 const char *key
__attribute__((unused
)),
4032 size_t key_length
__attribute__((unused
)),
4035 uint32_t *counter
= (uint32_t *)context
;
4037 *counter
= *counter
+ 1;
4039 return MEMCACHED_SUCCESS
;
4042 static test_return_t
dump_test(memcached_st
*memc
)
4044 memcached_return_t rc
;
4045 uint32_t counter
= 0;
4046 memcached_dump_fn callbacks
[1];
4047 test_return_t main_rc
;
4049 callbacks
[0]= &callback_dump_counter
;
4051 /* No support for Binary protocol yet */
4052 if (memc
->flags
.binary_protocol
)
4053 return TEST_SUCCESS
;
4055 main_rc
= set_test3(memc
);
4057 test_truth (main_rc
== TEST_SUCCESS
);
4059 rc
= memcached_dump(memc
, callbacks
, (void *)&counter
, 1);
4060 test_truth(rc
== MEMCACHED_SUCCESS
);
4062 /* We may have more then 32 if our previous flush has not completed */
4063 test_truth(counter
>= 32);
4065 return TEST_SUCCESS
;
4068 #ifdef HAVE_LIBMEMCACHEDUTIL
4069 static void* connection_release(void *arg
)
4072 memcached_pool_st
* pool
;
4077 assert(memcached_pool_push(resource
->pool
, resource
->mmc
) == MEMCACHED_SUCCESS
);
4081 static test_return_t
connection_pool_test(memcached_st
*memc
)
4083 memcached_pool_st
* pool
= memcached_pool_create(memc
, 5, 10);
4084 test_truth(pool
!= NULL
);
4085 memcached_st
* mmc
[10];
4086 memcached_return_t rc
;
4088 for (int x
= 0; x
< 10; ++x
) {
4089 mmc
[x
]= memcached_pool_pop(pool
, false, &rc
);
4090 test_truth(mmc
[x
] != NULL
);
4091 test_truth(rc
== MEMCACHED_SUCCESS
);
4094 test_truth(memcached_pool_pop(pool
, false, &rc
) == NULL
);
4095 test_truth(rc
== MEMCACHED_SUCCESS
);
4099 memcached_pool_st
* pool
;
4101 } item
= { .pool
= pool
, .mmc
= mmc
[9] };
4102 pthread_create(&tid
, NULL
, connection_release
, &item
);
4103 mmc
[9]= memcached_pool_pop(pool
, true, &rc
);
4104 test_truth(rc
== MEMCACHED_SUCCESS
);
4105 pthread_join(tid
, NULL
);
4106 test_truth(mmc
[9] == item
.mmc
);
4107 const char *key
= "key";
4108 size_t keylen
= strlen(key
);
4110 // verify that I can do ops with all connections
4111 rc
= memcached_set(mmc
[0], key
, keylen
, "0", 1, 0, 0);
4112 test_truth(rc
== MEMCACHED_SUCCESS
);
4114 for (unsigned int x
= 0; x
< 10; ++x
) {
4115 uint64_t number_value
;
4116 rc
= memcached_increment(mmc
[x
], key
, keylen
, 1, &number_value
);
4117 test_truth(rc
== MEMCACHED_SUCCESS
);
4118 test_truth(number_value
== (x
+1));
4122 for (int x
= 0; x
< 10; ++x
)
4123 test_truth(memcached_pool_push(pool
, mmc
[x
]) == MEMCACHED_SUCCESS
);
4126 /* verify that I can set behaviors on the pool when I don't have all
4127 * of the connections in the pool. It should however be enabled
4128 * when I push the item into the pool
4130 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4131 test_truth(mmc
[0] != NULL
);
4133 rc
= memcached_pool_behavior_set(pool
, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
, 9999);
4134 test_truth(rc
== MEMCACHED_SUCCESS
);
4136 mmc
[1]= memcached_pool_pop(pool
, false, &rc
);
4137 test_truth(mmc
[1] != NULL
);
4139 test_truth(memcached_behavior_get(mmc
[1], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4140 test_truth(memcached_pool_push(pool
, mmc
[1]) == MEMCACHED_SUCCESS
);
4141 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4143 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4144 test_truth(memcached_behavior_get(mmc
[0], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4145 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4148 test_truth(memcached_pool_destroy(pool
) == memc
);
4149 return TEST_SUCCESS
;
4153 static test_return_t
replication_set_test(memcached_st
*memc
)
4155 memcached_return_t rc
;
4156 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4157 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4159 rc
= memcached_set(memc
, "bubba", 5, "0", 1, 0, 0);
4160 test_truth(rc
== MEMCACHED_SUCCESS
);
4163 ** We are using the quiet commands to store the replicas, so we need
4164 ** to ensure that all of them are processed before we can continue.
4165 ** In the test we go directly from storing the object to trying to
4166 ** receive the object from all of the different servers, so we
4167 ** could end up in a race condition (the memcached server hasn't yet
4168 ** processed the quiet command from the replication set when it process
4169 ** the request from the other client (created by the clone)). As a
4170 ** workaround for that we call memcached_quit to send the quit command
4171 ** to the server and wait for the response ;-) If you use the test code
4172 ** as an example for your own code, please note that you shouldn't need
4175 memcached_quit(memc
);
4178 ** "bubba" should now be stored on all of our servers. We don't have an
4179 ** easy to use API to address each individual server, so I'll just iterate
4180 ** through a bunch of "master keys" and I should most likely hit all of the
4183 for (int x
= 'a'; x
<= 'z'; ++x
)
4185 char key
[2]= { [0]= (char)x
};
4188 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4190 test_truth(rc
== MEMCACHED_SUCCESS
);
4191 test_truth(val
!= NULL
);
4195 memcached_free(memc_clone
);
4197 return TEST_SUCCESS
;
4200 static test_return_t
replication_get_test(memcached_st
*memc
)
4202 memcached_return_t rc
;
4205 * Don't do the following in your code. I am abusing the internal details
4206 * within the library, and this is not a supported interface.
4207 * This is to verify correct behavior in the library
4209 for (uint32_t host
= 0; host
< memcached_server_count(memc
); ++host
)
4211 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4212 memc_clone
->hosts
[host
].port
= 0;
4214 for (int x
= 'a'; x
<= 'z'; ++x
)
4216 char key
[2]= { [0]= (char)x
};
4219 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4221 test_truth(rc
== MEMCACHED_SUCCESS
);
4222 test_truth(val
!= NULL
);
4226 memcached_free(memc_clone
);
4229 return TEST_SUCCESS
;
4232 static test_return_t
replication_mget_test(memcached_st
*memc
)
4234 memcached_return_t rc
;
4235 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4236 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4238 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4239 size_t len
[]= { 5, 4, 4, 4 };
4241 for (int x
=0; x
< 4; ++x
)
4243 rc
= memcached_set(memc
, keys
[x
], len
[x
], "0", 1, 0, 0);
4244 test_truth(rc
== MEMCACHED_SUCCESS
);
4248 ** We are using the quiet commands to store the replicas, so we need
4249 ** to ensure that all of them are processed before we can continue.
4250 ** In the test we go directly from storing the object to trying to
4251 ** receive the object from all of the different servers, so we
4252 ** could end up in a race condition (the memcached server hasn't yet
4253 ** processed the quiet command from the replication set when it process
4254 ** the request from the other client (created by the clone)). As a
4255 ** workaround for that we call memcached_quit to send the quit command
4256 ** to the server and wait for the response ;-) If you use the test code
4257 ** as an example for your own code, please note that you shouldn't need
4260 memcached_quit(memc
);
4263 * Don't do the following in your code. I am abusing the internal details
4264 * within the library, and this is not a supported interface.
4265 * This is to verify correct behavior in the library
4267 memcached_result_st result_obj
;
4268 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; host
++)
4270 memcached_st
*new_clone
= memcached_clone(NULL
, memc
);
4271 new_clone
->hosts
[host
].port
= 0;
4273 for (int x
= 'a'; x
<= 'z'; ++x
)
4275 const char key
[2]= { [0]= (const char)x
};
4277 rc
= memcached_mget_by_key(new_clone
, key
, 1, keys
, len
, 4);
4278 test_truth(rc
== MEMCACHED_SUCCESS
);
4280 memcached_result_st
*results
= memcached_result_create(new_clone
, &result_obj
);
4281 test_truth(results
);
4284 while ((results
= memcached_fetch_result(new_clone
, &result_obj
, &rc
)) != NULL
)
4288 test_truth(hits
== 4);
4289 memcached_result_free(&result_obj
);
4292 memcached_free(new_clone
);
4295 memcached_free(memc_clone
);
4297 return TEST_SUCCESS
;
4300 static test_return_t
replication_randomize_mget_test(memcached_st
*memc
)
4302 memcached_result_st result_obj
;
4303 memcached_return_t rc
;
4304 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4305 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 3);
4306 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
, 1);
4308 const char *keys
[]= { "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
4309 size_t len
[]= { 4, 4, 4, 4, 4, 4, 4 };
4311 for (int x
=0; x
< 7; ++x
)
4313 rc
= memcached_set(memc
, keys
[x
], len
[x
], "1", 1, 0, 0);
4314 test_truth(rc
== MEMCACHED_SUCCESS
);
4317 memcached_quit(memc
);
4319 for (int x
=0; x
< 7; ++x
) {
4320 const char key
[2]= { [0]= (const char)x
};
4322 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 7);
4323 test_truth(rc
== MEMCACHED_SUCCESS
);
4325 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4326 test_truth(results
);
4329 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4333 test_truth(hits
== 7);
4334 memcached_result_free(&result_obj
);
4336 memcached_free(memc_clone
);
4337 return TEST_SUCCESS
;
4340 static test_return_t
replication_delete_test(memcached_st
*memc
)
4342 memcached_return_t rc
;
4343 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4344 /* Delete the items from all of the servers except 1 */
4345 uint64_t repl
= memcached_behavior_get(memc
,
4346 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
4347 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, --repl
);
4349 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4350 size_t len
[]= { 5, 4, 4, 4 };
4352 for (int x
=0; x
< 4; ++x
)
4354 rc
= memcached_delete_by_key(memc
, keys
[0], len
[0], keys
[x
], len
[x
], 0);
4355 test_truth(rc
== MEMCACHED_SUCCESS
);
4359 * Don't do the following in your code. I am abusing the internal details
4360 * within the library, and this is not a supported interface.
4361 * This is to verify correct behavior in the library
4363 uint32_t hash
= memcached_generate_hash(memc
, keys
[0], len
[0]);
4364 for (uint32_t x
= 0; x
< (repl
+ 1); ++x
)
4366 memc_clone
->hosts
[hash
].port
= 0;
4367 if (++hash
== memc_clone
->number_of_hosts
)
4371 memcached_result_st result_obj
;
4372 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; ++host
)
4374 for (int x
= 'a'; x
<= 'z'; ++x
)
4376 const char key
[2]= { [0]= (const char)x
};
4378 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 4);
4379 test_truth(rc
== MEMCACHED_SUCCESS
);
4381 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4382 test_truth(results
);
4385 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4389 test_truth(hits
== 4);
4390 memcached_result_free(&result_obj
);
4393 memcached_free(memc_clone
);
4395 return TEST_SUCCESS
;
4398 static void increment_request_id(uint16_t *id
)
4401 if ((*id
& UDP_REQUEST_ID_THREAD_MASK
) != 0)
4405 static uint16_t *get_udp_request_ids(memcached_st
*memc
)
4407 uint16_t *ids
= malloc(sizeof(uint16_t) * memcached_server_count(memc
));
4408 assert(ids
!= NULL
);
4411 for (x
= 0; x
< memcached_server_count(memc
); x
++)
4412 ids
[x
]= get_udp_datagram_request_id((struct udp_datagram_header_st
*) memc
->hosts
[x
].write_buffer
);
4417 static test_return_t
post_udp_op_check(memcached_st
*memc
, uint16_t *expected_req_ids
)
4420 memcached_server_st
*cur_server
= memc
->hosts
;
4421 uint16_t *cur_req_ids
= get_udp_request_ids(memc
);
4423 for (x
= 0; x
< memcached_server_count(memc
); x
++)
4425 test_truth(cur_server
[x
].cursor_active
== 0);
4426 test_truth(cur_req_ids
[x
] == expected_req_ids
[x
]);
4428 free(expected_req_ids
);
4431 return TEST_SUCCESS
;
4435 ** There is a little bit of a hack here, instead of removing
4436 ** the servers, I just set num host to 0 and them add then new udp servers
4438 static test_return_t
init_udp(memcached_st
*memc
)
4440 memcached_version(memc
);
4441 /* For the time being, only support udp test for >= 1.2.6 && < 1.3 */
4442 if (memc
->hosts
[0].major_version
!= 1 || memc
->hosts
[0].minor_version
!= 2
4443 || memc
->hosts
[0].micro_version
< 6)
4444 return TEST_SKIPPED
;
4446 uint32_t num_hosts
= memcached_server_count(memc
);
4448 memcached_server_st servers
[num_hosts
];
4449 memcpy(servers
, memc
->hosts
, sizeof(memcached_server_st
) * num_hosts
);
4450 for (x
= 0; x
< num_hosts
; x
++)
4451 memcached_server_free(&memc
->hosts
[x
]);
4453 memc
->number_of_hosts
= 0;
4454 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1);
4455 for (x
= 0; x
< num_hosts
; x
++)
4457 test_truth(memcached_server_add_udp(memc
, servers
[x
].hostname
, servers
[x
].port
) == MEMCACHED_SUCCESS
);
4458 test_truth(memc
->hosts
[x
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4461 return TEST_SUCCESS
;
4464 static test_return_t
binary_init_udp(memcached_st
*memc
)
4466 test_return_t test_rc
;
4467 test_rc
= pre_binary(memc
);
4469 if (test_rc
!= TEST_SUCCESS
)
4472 return init_udp(memc
);
4475 /* Make sure that I cant add a tcp server to a udp client */
4476 static test_return_t
add_tcp_server_udp_client_test(memcached_st
*memc
)
4478 memcached_server_st server
;
4479 memcached_server_clone(&server
, &memc
->hosts
[0]);
4480 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4481 test_truth(memcached_server_add(memc
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4482 return TEST_SUCCESS
;
4485 /* Make sure that I cant add a udp server to a tcp client */
4486 static test_return_t
add_udp_server_tcp_client_test(memcached_st
*memc
)
4488 memcached_server_st server
;
4489 memcached_server_clone(&server
, &memc
->hosts
[0]);
4490 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4492 memcached_st tcp_client
;
4493 memcached_create(&tcp_client
);
4494 test_truth(memcached_server_add_udp(&tcp_client
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4496 return TEST_SUCCESS
;
4499 static test_return_t
set_udp_behavior_test(memcached_st
*memc
)
4502 memcached_quit(memc
);
4503 memc
->number_of_hosts
= 0;
4504 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, memc
->distribution
);
4505 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1) == MEMCACHED_SUCCESS
);
4506 test_truth(memc
->flags
.use_udp
);
4507 test_truth(memc
->flags
.no_reply
);
4509 test_truth(memcached_server_count(memc
) == 0);
4511 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
,0);
4512 test_truth(! (memc
->flags
.use_udp
));
4513 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
,0);
4514 test_truth(! (memc
->flags
.no_reply
));
4516 return TEST_SUCCESS
;
4519 static test_return_t
udp_set_test(memcached_st
*memc
)
4522 unsigned int num_iters
= 1025; //request id rolls over at 1024
4523 for (x
= 0; x
< num_iters
;x
++)
4525 memcached_return_t rc
;
4526 const char *key
= "foo";
4527 const char *value
= "when we sanitize";
4528 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4529 unsigned int server_key
= memcached_generate_hash(memc
,key
,strlen(key
));
4530 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4531 rc
= memcached_set(memc
, key
, strlen(key
),
4532 value
, strlen(value
),
4533 (time_t)0, (uint32_t)0);
4534 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4535 /** NB, the check below assumes that if new write_ptr is less than
4536 * the original write_ptr that we have flushed. For large payloads, this
4537 * maybe an invalid assumption, but for the small payload we have it is OK
4539 if (rc
== MEMCACHED_SUCCESS
||
4540 memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4541 increment_request_id(&expected_ids
[server_key
]);
4543 if (rc
== MEMCACHED_SUCCESS
)
4545 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4549 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4550 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4552 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4554 return TEST_SUCCESS
;
4557 static test_return_t
udp_buffered_set_test(memcached_st
*memc
)
4559 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4560 return udp_set_test(memc
);
4563 static test_return_t
udp_set_too_big_test(memcached_st
*memc
)
4565 memcached_return_t rc
;
4566 const char *key
= "bar";
4567 char value
[MAX_UDP_DATAGRAM_LENGTH
];
4568 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4569 rc
= memcached_set(memc
, key
, strlen(key
),
4570 value
, MAX_UDP_DATAGRAM_LENGTH
,
4571 (time_t)0, (uint32_t)0);
4572 test_truth(rc
== MEMCACHED_WRITE_FAILURE
);
4573 return post_udp_op_check(memc
,expected_ids
);
4576 static test_return_t
udp_delete_test(memcached_st
*memc
)
4579 unsigned int num_iters
= 1025; //request id rolls over at 1024
4580 for (x
= 0; x
< num_iters
;x
++)
4582 memcached_return_t rc
;
4583 const char *key
= "foo";
4584 uint16_t *expected_ids
=get_udp_request_ids(memc
);
4585 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4586 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4587 rc
= memcached_delete(memc
, key
, strlen(key
), 0);
4588 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4589 if (rc
== MEMCACHED_SUCCESS
|| memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4590 increment_request_id(&expected_ids
[server_key
]);
4591 if (rc
== MEMCACHED_SUCCESS
)
4593 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4597 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4598 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4600 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4602 return TEST_SUCCESS
;
4605 static test_return_t
udp_buffered_delete_test(memcached_st
*memc
)
4607 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4608 return udp_delete_test(memc
);
4611 static test_return_t
udp_verbosity_test(memcached_st
*memc
)
4613 memcached_return_t rc
;
4614 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4616 for (x
= 0; x
< memcached_server_count(memc
); x
++)
4617 increment_request_id(&expected_ids
[x
]);
4619 rc
= memcached_verbosity(memc
,3);
4620 test_truth(rc
== MEMCACHED_SUCCESS
);
4621 return post_udp_op_check(memc
,expected_ids
);
4624 static test_return_t
udp_quit_test(memcached_st
*memc
)
4626 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4627 memcached_quit(memc
);
4628 return post_udp_op_check(memc
, expected_ids
);
4631 static test_return_t
udp_flush_test(memcached_st
*memc
)
4633 memcached_return_t rc
;
4634 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4636 for (x
= 0; x
< memcached_server_count(memc
);x
++)
4637 increment_request_id(&expected_ids
[x
]);
4639 rc
= memcached_flush(memc
,0);
4640 test_truth(rc
== MEMCACHED_SUCCESS
);
4641 return post_udp_op_check(memc
,expected_ids
);
4644 static test_return_t
udp_incr_test(memcached_st
*memc
)
4646 memcached_return_t rc
;
4647 const char *key
= "incr";
4648 const char *value
= "1";
4649 rc
= memcached_set(memc
, key
, strlen(key
),
4650 value
, strlen(value
),
4651 (time_t)0, (uint32_t)0);
4653 test_truth(rc
== MEMCACHED_SUCCESS
);
4654 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4655 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4656 increment_request_id(&expected_ids
[server_key
]);
4658 rc
= memcached_increment(memc
, key
, strlen(key
), 1, &newvalue
);
4659 test_truth(rc
== MEMCACHED_SUCCESS
);
4660 return post_udp_op_check(memc
, expected_ids
);
4663 static test_return_t
udp_decr_test(memcached_st
*memc
)
4665 memcached_return_t rc
;
4666 const char *key
= "decr";
4667 const char *value
= "1";
4668 rc
= memcached_set(memc
, key
, strlen(key
),
4669 value
, strlen(value
),
4670 (time_t)0, (uint32_t)0);
4672 test_truth(rc
== MEMCACHED_SUCCESS
);
4673 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4674 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4675 increment_request_id(&expected_ids
[server_key
]);
4677 rc
= memcached_decrement(memc
, key
, strlen(key
), 1, &newvalue
);
4678 test_truth(rc
== MEMCACHED_SUCCESS
);
4679 return post_udp_op_check(memc
, expected_ids
);
4683 static test_return_t
udp_stat_test(memcached_st
*memc
)
4685 memcached_stat_st
* rv
= NULL
;
4686 memcached_return_t rc
;
4688 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4689 rv
= memcached_stat(memc
, args
, &rc
);
4691 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4692 return post_udp_op_check(memc
, expected_ids
);
4695 static test_return_t
udp_version_test(memcached_st
*memc
)
4697 memcached_return_t rc
;
4698 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4699 rc
= memcached_version(memc
);
4700 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4701 return post_udp_op_check(memc
, expected_ids
);
4704 static test_return_t
udp_get_test(memcached_st
*memc
)
4706 memcached_return_t rc
;
4707 const char *key
= "foo";
4709 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4710 char *val
= memcached_get(memc
, key
, strlen(key
), &vlen
, (uint32_t)0, &rc
);
4711 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4712 test_truth(val
== NULL
);
4713 return post_udp_op_check(memc
, expected_ids
);
4716 static test_return_t
udp_mixed_io_test(memcached_st
*memc
)
4719 test_st mixed_io_ops
[] ={
4721 (test_callback_fn
)udp_set_test
},
4722 {"udp_set_too_big_test", 0,
4723 (test_callback_fn
)udp_set_too_big_test
},
4724 {"udp_delete_test", 0,
4725 (test_callback_fn
)udp_delete_test
},
4726 {"udp_verbosity_test", 0,
4727 (test_callback_fn
)udp_verbosity_test
},
4728 {"udp_quit_test", 0,
4729 (test_callback_fn
)udp_quit_test
},
4730 {"udp_flush_test", 0,
4731 (test_callback_fn
)udp_flush_test
},
4732 {"udp_incr_test", 0,
4733 (test_callback_fn
)udp_incr_test
},
4734 {"udp_decr_test", 0,
4735 (test_callback_fn
)udp_decr_test
},
4736 {"udp_version_test", 0,
4737 (test_callback_fn
)udp_version_test
}
4740 for (x
= 0; x
< 500; x
++)
4742 current_op
= mixed_io_ops
[random() % 9];
4743 test_truth(current_op
.test_fn(memc
) == TEST_SUCCESS
);
4745 return TEST_SUCCESS
;
4749 static test_return_t
hash_sanity_test (memcached_st
*memc
)
4753 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
4754 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
4755 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
4756 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
4757 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
4758 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
4759 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
4760 #ifdef HAVE_HSIEH_HASH
4761 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
4763 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
4764 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
4765 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
4767 return TEST_SUCCESS
;
4771 static test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
4773 memcached_return_t expected_rc
= MEMCACHED_FAILURE
;
4774 #ifdef HAVE_HSIEH_HASH
4775 expected_rc
= MEMCACHED_SUCCESS
;
4777 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
4778 (uint64_t)MEMCACHED_HASH_HSIEH
);
4779 test_truth(rc
== expected_rc
);
4780 return TEST_SUCCESS
;
4783 static test_return_t
md5_run (memcached_st
*memc
__attribute__((unused
)))
4788 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4792 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
);
4793 test_truth(md5_values
[x
] == hash_val
);
4796 return TEST_SUCCESS
;
4799 static test_return_t
crc_run (memcached_st
*memc
__attribute__((unused
)))
4804 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4808 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
);
4809 test_truth(crc_values
[x
] == hash_val
);
4812 return TEST_SUCCESS
;
4815 static test_return_t
fnv1_64_run (memcached_st
*memc
__attribute__((unused
)))
4820 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4824 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
);
4825 test_truth(fnv1_64_values
[x
] == hash_val
);
4828 return TEST_SUCCESS
;
4831 static test_return_t
fnv1a_64_run (memcached_st
*memc
__attribute__((unused
)))
4836 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4840 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
);
4841 test_truth(fnv1a_64_values
[x
] == hash_val
);
4844 return TEST_SUCCESS
;
4847 static test_return_t
fnv1_32_run (memcached_st
*memc
__attribute__((unused
)))
4853 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4857 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
);
4858 test_truth(fnv1_32_values
[x
] == hash_val
);
4861 return TEST_SUCCESS
;
4864 static test_return_t
fnv1a_32_run (memcached_st
*memc
__attribute__((unused
)))
4869 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4873 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
);
4874 test_truth(fnv1a_32_values
[x
] == hash_val
);
4877 return TEST_SUCCESS
;
4880 static test_return_t
hsieh_run (memcached_st
*memc
__attribute__((unused
)))
4885 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4889 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
);
4890 test_truth(hsieh_values
[x
] == hash_val
);
4893 return TEST_SUCCESS
;
4896 static test_return_t
murmur_run (memcached_st
*memc
__attribute__((unused
)))
4899 return TEST_SKIPPED
;
4904 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4908 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
);
4909 test_truth(murmur_values
[x
] == hash_val
);
4912 return TEST_SUCCESS
;
4916 static test_return_t
jenkins_run (memcached_st
*memc
__attribute__((unused
)))
4922 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4926 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
);
4927 test_truth(jenkins_values
[x
] == hash_val
);
4930 return TEST_SUCCESS
;
4934 static test_return_t
ketama_compatibility_libmemcached(memcached_st
*trash
)
4936 memcached_return_t rc
;
4939 memcached_server_st
*server_pool
;
4944 memc
= memcached_create(NULL
);
4947 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
4948 test_truth(rc
== MEMCACHED_SUCCESS
);
4950 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
4951 test_truth(value
== 1);
4953 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
) == MEMCACHED_SUCCESS
);
4954 test_truth(memcached_behavior_get_distribution(memc
) == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
);
4957 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");
4958 memcached_server_push(memc
, server_pool
);
4960 /* verify that the server list was parsed okay. */
4961 test_truth(memcached_server_count(memc
) == 8);
4962 test_strcmp(server_pool
[0].hostname
, "10.0.1.1");
4963 test_truth(server_pool
[0].port
== 11211);
4964 test_truth(server_pool
[0].weight
== 600);
4965 test_strcmp(server_pool
[2].hostname
, "10.0.1.3");
4966 test_truth(server_pool
[2].port
== 11211);
4967 test_truth(server_pool
[2].weight
== 200);
4968 test_strcmp(server_pool
[7].hostname
, "10.0.1.8");
4969 test_truth(server_pool
[7].port
== 11211);
4970 test_truth(server_pool
[7].weight
== 100);
4972 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
4973 * us test the boundary wraparound.
4975 test_truth(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
4977 /* verify the standard ketama set. */
4978 for (x
= 0; x
< 99; x
++)
4980 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
4981 char *hostname
= memc
->hosts
[server_idx
].hostname
;
4983 test_strcmp(hostname
, ketama_test_cases
[x
].server
);
4986 memcached_server_list_free(server_pool
);
4987 memcached_free(memc
);
4989 return TEST_SUCCESS
;
4992 static test_return_t
ketama_compatibility_spymemcached(memcached_st
*trash
)
4994 memcached_return_t rc
;
4997 memcached_server_st
*server_pool
;
5002 memc
= memcached_create(NULL
);
5005 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
5006 test_truth(rc
== MEMCACHED_SUCCESS
);
5008 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
5009 test_truth(value
== 1);
5011 test_truth(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
5012 test_truth(memcached_behavior_get_distribution(memc
) == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
);
5014 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");
5015 memcached_server_push(memc
, server_pool
);
5017 /* verify that the server list was parsed okay. */
5018 test_truth(memcached_server_count(memc
) == 8);
5019 test_strcmp(server_pool
[0].hostname
, "10.0.1.1");
5020 test_truth(server_pool
[0].port
== 11211);
5021 test_truth(server_pool
[0].weight
== 600);
5022 test_strcmp(server_pool
[2].hostname
, "10.0.1.3");
5023 test_truth(server_pool
[2].port
== 11211);
5024 test_truth(server_pool
[2].weight
== 200);
5025 test_strcmp(server_pool
[7].hostname
, "10.0.1.8");
5026 test_truth(server_pool
[7].port
== 11211);
5027 test_truth(server_pool
[7].weight
== 100);
5029 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
5030 * us test the boundary wraparound.
5032 test_truth(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
5034 /* verify the standard ketama set. */
5035 for (x
= 0; x
< 99; x
++)
5037 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases_spy
[x
].key
, strlen(ketama_test_cases_spy
[x
].key
));
5038 char *hostname
= memc
->hosts
[server_idx
].hostname
;
5039 test_strcmp(hostname
, ketama_test_cases_spy
[x
].server
);
5042 memcached_server_list_free(server_pool
);
5043 memcached_free(memc
);
5045 return TEST_SUCCESS
;
5048 static test_return_t
regression_bug_434484(memcached_st
*memc
)
5050 test_return_t test_rc
;
5051 test_rc
= pre_binary(memc
);
5053 if (test_rc
!= TEST_SUCCESS
)
5056 memcached_return_t ret
;
5057 const char *key
= "regression_bug_434484";
5058 size_t keylen
= strlen(key
);
5060 ret
= memcached_append(memc
, key
, keylen
, key
, keylen
, 0, 0);
5061 test_truth(ret
== MEMCACHED_NOTSTORED
);
5063 size_t size
= 2048 * 1024;
5064 void *data
= calloc(1, size
);
5065 test_truth(data
!= NULL
);
5066 ret
= memcached_set(memc
, key
, keylen
, data
, size
, 0, 0);
5067 test_truth(ret
== MEMCACHED_E2BIG
);
5070 return TEST_SUCCESS
;
5073 static test_return_t
regression_bug_434843(memcached_st
*memc
)
5075 test_return_t test_rc
;
5076 test_rc
= pre_binary(memc
);
5078 if (test_rc
!= TEST_SUCCESS
)
5081 memcached_return_t rc
;
5082 unsigned int counter
= 0;
5083 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5086 * I only want to hit only _one_ server so I know the number of requests I'm
5087 * sending in the pipleine to the server. Let's try to do a multiget of
5088 * 1024 (that should satisfy most users don't you think?). Future versions
5089 * will include a mget_execute function call if you need a higher number.
5091 uint32_t number_of_hosts
= memcached_server_count(memc
);
5092 memc
->number_of_hosts
= 1;
5093 const size_t max_keys
= 1024;
5094 char **keys
= calloc(max_keys
, sizeof(char*));
5095 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5097 for (int x
= 0; x
< (int)max_keys
; ++x
)
5100 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5102 test_truth(keys
[x
] != NULL
);
5106 * Run two times.. the first time we should have 100% cache miss,
5107 * and the second time we should have 100% cache hits
5109 for (int y
= 0; y
< 2; ++y
)
5111 rc
= memcached_mget(memc
, (const char**)keys
, key_length
, max_keys
);
5112 test_truth(rc
== MEMCACHED_SUCCESS
);
5113 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5116 /* The first iteration should give me a 100% cache miss. verify that*/
5117 test_truth(counter
== 0);
5118 char blob
[1024]= { 0 };
5119 for (int x
= 0; x
< (int)max_keys
; ++x
)
5121 rc
= memcached_add(memc
, keys
[x
], key_length
[x
],
5122 blob
, sizeof(blob
), 0, 0);
5123 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5128 /* Verify that we received all of the key/value pairs */
5129 test_truth(counter
== (unsigned int)max_keys
);
5133 /* Release allocated resources */
5134 for (size_t x
= 0; x
< max_keys
; ++x
)
5139 memc
->number_of_hosts
= number_of_hosts
;
5141 return TEST_SUCCESS
;
5144 static test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
5146 memcached_return_t rc
;
5147 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
5148 test_truth(rc
== MEMCACHED_SUCCESS
);
5150 return regression_bug_434843(memc
);
5153 static test_return_t
regression_bug_421108(memcached_st
*memc
)
5155 memcached_return_t rc
;
5156 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
5157 test_truth(rc
== MEMCACHED_SUCCESS
);
5159 char *bytes
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
5160 test_truth(rc
== MEMCACHED_SUCCESS
);
5161 test_truth(bytes
!= NULL
);
5162 char *bytes_read
= memcached_stat_get_value(memc
, memc_stat
,
5164 test_truth(rc
== MEMCACHED_SUCCESS
);
5165 test_truth(bytes_read
!= NULL
);
5167 char *bytes_written
= memcached_stat_get_value(memc
, memc_stat
,
5168 "bytes_written", &rc
);
5169 test_truth(rc
== MEMCACHED_SUCCESS
);
5170 test_truth(bytes_written
!= NULL
);
5172 test_truth(strcmp(bytes
, bytes_read
) != 0);
5173 test_truth(strcmp(bytes
, bytes_written
) != 0);
5175 /* Release allocated resources */
5178 free(bytes_written
);
5179 memcached_stat_free(NULL
, memc_stat
);
5181 return TEST_SUCCESS
;
5185 * The test case isn't obvious so I should probably document why
5186 * it works the way it does. Bug 442914 was caused by a bug
5187 * in the logic in memcached_purge (it did not handle the case
5188 * where the number of bytes sent was equal to the watermark).
5189 * In this test case, create messages so that we hit that case
5190 * and then disable noreply mode and issue a new command to
5191 * verify that it isn't stuck. If we change the format for the
5192 * delete command or the watermarks, we need to update this
5195 static test_return_t
regression_bug_442914(memcached_st
*memc
)
5197 memcached_return_t rc
;
5198 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
5199 test_truth(rc
== MEMCACHED_SUCCESS
);
5200 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
5202 uint32_t number_of_hosts
= memcached_server_count(memc
);
5203 memc
->number_of_hosts
= 1;
5208 for (int x
= 0; x
< 250; ++x
)
5210 len
= (size_t)snprintf(k
, sizeof(k
), "%0250u", x
);
5211 rc
= memcached_delete(memc
, k
, len
, 0);
5212 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5215 len
= (size_t)snprintf(k
, sizeof(k
), "%037u", 251);
5216 rc
= memcached_delete(memc
, k
, len
, 0);
5217 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5219 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0);
5220 test_truth(rc
== MEMCACHED_SUCCESS
);
5221 rc
= memcached_delete(memc
, k
, len
, 0);
5222 test_truth(rc
== MEMCACHED_NOTFOUND
);
5224 memc
->number_of_hosts
= number_of_hosts
;
5226 return TEST_SUCCESS
;
5229 static test_return_t
regression_bug_447342(memcached_st
*memc
)
5231 if (memcached_server_count(memc
) < 3 || pre_replication(memc
) != MEMCACHED_SUCCESS
)
5232 return TEST_SKIPPED
;
5234 memcached_return_t rc
;
5236 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2);
5237 test_truth(rc
== MEMCACHED_SUCCESS
);
5239 const size_t max_keys
= 100;
5240 char **keys
= calloc(max_keys
, sizeof(char*));
5241 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5243 for (int x
= 0; x
< (int)max_keys
; ++x
)
5246 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5248 test_truth(keys
[x
] != NULL
);
5249 rc
= memcached_set(memc
, k
, key_length
[x
], k
, key_length
[x
], 0, 0);
5250 test_truth(rc
== MEMCACHED_SUCCESS
);
5254 ** We are using the quiet commands to store the replicas, so we need
5255 ** to ensure that all of them are processed before we can continue.
5256 ** In the test we go directly from storing the object to trying to
5257 ** receive the object from all of the different servers, so we
5258 ** could end up in a race condition (the memcached server hasn't yet
5259 ** processed the quiet command from the replication set when it process
5260 ** the request from the other client (created by the clone)). As a
5261 ** workaround for that we call memcached_quit to send the quit command
5262 ** to the server and wait for the response ;-) If you use the test code
5263 ** as an example for your own code, please note that you shouldn't need
5266 memcached_quit(memc
);
5268 /* Verify that all messages are stored, and we didn't stuff too much
5271 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5272 test_truth(rc
== MEMCACHED_SUCCESS
);
5274 unsigned int counter
= 0;
5275 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5276 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5277 /* Verify that we received all of the key/value pairs */
5278 test_truth(counter
== (unsigned int)max_keys
);
5280 memcached_quit(memc
);
5282 * Don't do the following in your code. I am abusing the internal details
5283 * within the library, and this is not a supported interface.
5284 * This is to verify correct behavior in the library. Fake that two servers
5287 in_port_t port0
= memc
->hosts
[0].port
;
5288 in_port_t port2
= memc
->hosts
[2].port
;
5290 memc
->hosts
[0].port
= 0;
5291 memc
->hosts
[2].port
= 0;
5293 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5294 test_truth(rc
== MEMCACHED_SUCCESS
);
5297 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5298 test_truth(counter
== (unsigned int)max_keys
);
5300 /* restore the memc handle */
5301 memc
->hosts
[0].port
= port0
;
5302 memc
->hosts
[2].port
= port2
;
5304 memcached_quit(memc
);
5306 /* Remove half of the objects */
5307 for (int x
= 0; x
< (int)max_keys
; ++x
)
5311 rc
= memcached_delete(memc
, keys
[x
], key_length
[x
], 0);
5312 test_truth(rc
== MEMCACHED_SUCCESS
);
5316 memcached_quit(memc
);
5317 memc
->hosts
[0].port
= 0;
5318 memc
->hosts
[2].port
= 0;
5320 /* now retry the command, this time we should have cache misses */
5321 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5322 test_truth(rc
== MEMCACHED_SUCCESS
);
5325 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5326 test_truth(counter
== (unsigned int)(max_keys
>> 1));
5328 /* Release allocated resources */
5329 for (size_t x
= 0; x
< max_keys
; ++x
)
5334 /* restore the memc handle */
5335 memc
->hosts
[0].port
= port0
;
5336 memc
->hosts
[2].port
= port2
;
5338 return TEST_SUCCESS
;
5341 static test_return_t
regression_bug_463297(memcached_st
*memc
)
5343 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
5344 test_truth(memc_clone
!= NULL
);
5345 test_truth(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
5347 if (memc_clone
->hosts
[0].major_version
> 1 ||
5348 (memc_clone
->hosts
[0].major_version
== 1 &&
5349 memc_clone
->hosts
[0].minor_version
> 2))
5351 /* Binary protocol doesn't support deferred delete */
5352 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
5353 test_truth(bin_clone
!= NULL
);
5354 test_truth(memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1) == MEMCACHED_SUCCESS
);
5355 test_truth(memcached_delete(bin_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5356 memcached_free(bin_clone
);
5358 memcached_quit(memc_clone
);
5360 /* If we know the server version, deferred delete should fail
5361 * with invalid arguments */
5362 test_truth(memcached_delete(memc_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5364 /* If we don't know the server version, we should get a protocol error */
5365 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
5367 /* but there is a bug in some of the memcached servers (1.4) that treats
5368 * the counter as noreply so it doesn't send the proper error message
5370 test_truth(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5372 /* And buffered mode should be disabled and we should get protocol error */
5373 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
5374 rc
= memcached_delete(memc
, "foo", 3, 1);
5375 test_truth(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5377 /* Same goes for noreply... */
5378 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1) == MEMCACHED_SUCCESS
);
5379 rc
= memcached_delete(memc
, "foo", 3, 1);
5380 test_truth(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5382 /* but a normal request should go through (and be buffered) */
5383 test_truth((rc
= memcached_delete(memc
, "foo", 3, 0)) == MEMCACHED_BUFFERED
);
5384 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
5386 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0) == MEMCACHED_SUCCESS
);
5387 /* unbuffered noreply should be success */
5388 test_truth(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_SUCCESS
);
5389 /* unbuffered with reply should be not found... */
5390 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0) == MEMCACHED_SUCCESS
);
5391 test_truth(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_NOTFOUND
);
5394 memcached_free(memc_clone
);
5395 return TEST_SUCCESS
;
5399 /* Test memcached_server_get_last_disconnect
5400 * For a working server set, shall be NULL
5401 * For a set of non existing server, shall not be NULL
5403 static test_return_t
test_get_last_disconnect(memcached_st
*memc
)
5405 memcached_return_t rc
;
5406 memcached_server_st
*disconnected_server
;
5408 /* With the working set of server */
5409 const char *key
= "marmotte";
5410 const char *value
= "milka";
5412 rc
= memcached_set(memc
, key
, strlen(key
),
5413 value
, strlen(value
),
5414 (time_t)0, (uint32_t)0);
5415 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5417 disconnected_server
= memcached_server_get_last_disconnect(memc
);
5418 test_truth(disconnected_server
== NULL
);
5420 /* With a non existing server */
5422 memcached_server_st
*servers
;
5424 const char *server_list
= "localhost:9";
5426 servers
= memcached_servers_parse(server_list
);
5427 test_truth(servers
);
5428 mine
= memcached_create(NULL
);
5429 rc
= memcached_server_push(mine
, servers
);
5430 test_truth(rc
== MEMCACHED_SUCCESS
);
5431 memcached_server_list_free(servers
);
5434 rc
= memcached_set(mine
, key
, strlen(key
),
5435 value
, strlen(value
),
5436 (time_t)0, (uint32_t)0);
5437 test_truth(rc
!= MEMCACHED_SUCCESS
);
5439 disconnected_server
= memcached_server_get_last_disconnect(mine
);
5440 test_truth(disconnected_server
!= NULL
);
5441 test_truth(disconnected_server
->port
== 9);
5442 test_truth(strncmp(disconnected_server
->hostname
,"localhost",9) == 0);
5444 memcached_quit(mine
);
5445 memcached_free(mine
);
5447 return TEST_SUCCESS
;
5451 * This test ensures that the failure counter isn't incremented during
5452 * normal termination of the memcached instance.
5454 static test_return_t
wrong_failure_counter_test(memcached_st
*memc
)
5456 memcached_return_t rc
;
5458 /* Set value to force connection to the server */
5459 const char *key
= "marmotte";
5460 const char *value
= "milka";
5463 * Please note that I'm abusing the internal structures in libmemcached
5464 * in a non-portable way and you shouldn't be doing this. I'm only
5465 * doing this in order to verify that the library works the way it should
5467 uint32_t number_of_hosts
= memcached_server_count(memc
);
5468 memc
->number_of_hosts
= 1;
5470 /* Ensure that we are connected to the server by setting a value */
5471 rc
= memcached_set(memc
, key
, strlen(key
),
5472 value
, strlen(value
),
5473 (time_t)0, (uint32_t)0);
5474 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5477 /* The test is to see that the memcached_quit doesn't increase the
5478 * the server failure conter, so let's ensure that it is zero
5479 * before sending quit
5481 memc
->hosts
[0].server_failure_counter
= 0;
5483 memcached_quit(memc
);
5485 /* Verify that it memcached_quit didn't increment the failure counter
5486 * Please note that this isn't bullet proof, because an error could
5489 test_truth(memc
->hosts
[0].server_failure_counter
== 0);
5491 /* restore the instance */
5492 memc
->number_of_hosts
= number_of_hosts
;
5494 return TEST_SUCCESS
;
5497 test_st udp_setup_server_tests
[] ={
5498 {"set_udp_behavior_test", 0, (test_callback_fn
)set_udp_behavior_test
},
5499 {"add_tcp_server_udp_client_test", 0, (test_callback_fn
)add_tcp_server_udp_client_test
},
5500 {"add_udp_server_tcp_client_test", 0, (test_callback_fn
)add_udp_server_tcp_client_test
},
5504 test_st upd_io_tests
[] ={
5505 {"udp_set_test", 0, (test_callback_fn
)udp_set_test
},
5506 {"udp_buffered_set_test", 0, (test_callback_fn
)udp_buffered_set_test
},
5507 {"udp_set_too_big_test", 0, (test_callback_fn
)udp_set_too_big_test
},
5508 {"udp_delete_test", 0, (test_callback_fn
)udp_delete_test
},
5509 {"udp_buffered_delete_test", 0, (test_callback_fn
)udp_buffered_delete_test
},
5510 {"udp_verbosity_test", 0, (test_callback_fn
)udp_verbosity_test
},
5511 {"udp_quit_test", 0, (test_callback_fn
)udp_quit_test
},
5512 {"udp_flush_test", 0, (test_callback_fn
)udp_flush_test
},
5513 {"udp_incr_test", 0, (test_callback_fn
)udp_incr_test
},
5514 {"udp_decr_test", 0, (test_callback_fn
)udp_decr_test
},
5515 {"udp_stat_test", 0, (test_callback_fn
)udp_stat_test
},
5516 {"udp_version_test", 0, (test_callback_fn
)udp_version_test
},
5517 {"udp_get_test", 0, (test_callback_fn
)udp_get_test
},
5518 {"udp_mixed_io_test", 0, (test_callback_fn
)udp_mixed_io_test
},
5522 /* Clean the server before beginning testing */
5524 {"flush", 0, (test_callback_fn
)flush_test
},
5525 {"init", 0, (test_callback_fn
)init_test
},
5526 {"allocation", 0, (test_callback_fn
)allocation_test
},
5527 {"server_list_null_test", 0, (test_callback_fn
)server_list_null_test
},
5528 {"server_unsort", 0, (test_callback_fn
)server_unsort_test
},
5529 {"server_sort", 0, (test_callback_fn
)server_sort_test
},
5530 {"server_sort2", 0, (test_callback_fn
)server_sort2_test
},
5531 {"clone_test", 0, (test_callback_fn
)clone_test
},
5532 {"connection_test", 0, (test_callback_fn
)connection_test
},
5533 {"callback_test", 0, (test_callback_fn
)callback_test
},
5534 {"userdata_test", 0, (test_callback_fn
)userdata_test
},
5535 {"error", 0, (test_callback_fn
)error_test
},
5536 {"set", 0, (test_callback_fn
)set_test
},
5537 {"set2", 0, (test_callback_fn
)set_test2
},
5538 {"set3", 0, (test_callback_fn
)set_test3
},
5539 {"dump", 1, (test_callback_fn
)dump_test
},
5540 {"add", 1, (test_callback_fn
)add_test
},
5541 {"replace", 1, (test_callback_fn
)replace_test
},
5542 {"delete", 1, (test_callback_fn
)delete_test
},
5543 {"get", 1, (test_callback_fn
)get_test
},
5544 {"get2", 0, (test_callback_fn
)get_test2
},
5545 {"get3", 0, (test_callback_fn
)get_test3
},
5546 {"get4", 0, (test_callback_fn
)get_test4
},
5547 {"partial mget", 0, (test_callback_fn
)get_test5
},
5548 {"stats_servername", 0, (test_callback_fn
)stats_servername_test
},
5549 {"increment", 0, (test_callback_fn
)increment_test
},
5550 {"increment_with_initial", 1, (test_callback_fn
)increment_with_initial_test
},
5551 {"decrement", 0, (test_callback_fn
)decrement_test
},
5552 {"decrement_with_initial", 1, (test_callback_fn
)decrement_with_initial_test
},
5553 {"increment_by_key", 0, (test_callback_fn
)increment_by_key_test
},
5554 {"increment_with_initial_by_key", 1, (test_callback_fn
)increment_with_initial_by_key_test
},
5555 {"decrement_by_key", 0, (test_callback_fn
)decrement_by_key_test
},
5556 {"decrement_with_initial_by_key", 1, (test_callback_fn
)decrement_with_initial_by_key_test
},
5557 {"quit", 0, (test_callback_fn
)quit_test
},
5558 {"mget", 1, (test_callback_fn
)mget_test
},
5559 {"mget_result", 1, (test_callback_fn
)mget_result_test
},
5560 {"mget_result_alloc", 1, (test_callback_fn
)mget_result_alloc_test
},
5561 {"mget_result_function", 1, (test_callback_fn
)mget_result_function
},
5562 {"mget_execute", 1, (test_callback_fn
)mget_execute
},
5563 {"mget_end", 0, (test_callback_fn
)mget_end
},
5564 {"get_stats", 0, (test_callback_fn
)get_stats
},
5565 {"add_host_test", 0, (test_callback_fn
)add_host_test
},
5566 {"add_host_test_1", 0, (test_callback_fn
)add_host_test1
},
5567 {"get_stats_keys", 0, (test_callback_fn
)get_stats_keys
},
5568 {"version_string_test", 0, (test_callback_fn
)version_string_test
},
5569 {"bad_key", 1, (test_callback_fn
)bad_key_test
},
5570 {"memcached_server_cursor", 1, (test_callback_fn
)memcached_server_cursor_test
},
5571 {"read_through", 1, (test_callback_fn
)read_through
},
5572 {"delete_through", 1, (test_callback_fn
)delete_through
},
5573 {"noreply", 1, (test_callback_fn
)noreply_test
},
5574 {"analyzer", 1, (test_callback_fn
)analyzer_test
},
5575 #ifdef HAVE_LIBMEMCACHEDUTIL
5576 {"connectionpool", 1, (test_callback_fn
)connection_pool_test
},
5578 {"test_get_last_disconnect", 1, (test_callback_fn
)test_get_last_disconnect
},
5582 test_st behavior_tests
[] ={
5583 {"behavior_test", 0, (test_callback_fn
)behavior_test
},
5587 test_st async_tests
[] ={
5588 {"add", 1, (test_callback_fn
)add_wrapper
},
5592 test_st string_tests
[] ={
5593 {"string static with null", 0, (test_callback_fn
)string_static_null
},
5594 {"string alloc with null", 0, (test_callback_fn
)string_alloc_null
},
5595 {"string alloc with 1K", 0, (test_callback_fn
)string_alloc_with_size
},
5596 {"string alloc with malloc failure", 0, (test_callback_fn
)string_alloc_with_size_toobig
},
5597 {"string append", 0, (test_callback_fn
)string_alloc_append
},
5598 {"string append failure (too big)", 0, (test_callback_fn
)string_alloc_append_toobig
},
5599 {0, 0, (test_callback_fn
)0}
5602 test_st result_tests
[] ={
5603 {"result static", 0, (test_callback_fn
)result_static
},
5604 {"result alloc", 0, (test_callback_fn
)result_alloc
},
5605 {0, 0, (test_callback_fn
)0}
5608 test_st version_1_2_3
[] ={
5609 {"append", 0, (test_callback_fn
)append_test
},
5610 {"prepend", 0, (test_callback_fn
)prepend_test
},
5611 {"cas", 0, (test_callback_fn
)cas_test
},
5612 {"cas2", 0, (test_callback_fn
)cas2_test
},
5613 {"append_binary", 0, (test_callback_fn
)append_binary_test
},
5614 {0, 0, (test_callback_fn
)0}
5617 test_st user_tests
[] ={
5618 {"user_supplied_bug1", 0, (test_callback_fn
)user_supplied_bug1
},
5619 {"user_supplied_bug2", 0, (test_callback_fn
)user_supplied_bug2
},
5620 {"user_supplied_bug3", 0, (test_callback_fn
)user_supplied_bug3
},
5621 {"user_supplied_bug4", 0, (test_callback_fn
)user_supplied_bug4
},
5622 {"user_supplied_bug5", 1, (test_callback_fn
)user_supplied_bug5
},
5623 {"user_supplied_bug6", 1, (test_callback_fn
)user_supplied_bug6
},
5624 {"user_supplied_bug7", 1, (test_callback_fn
)user_supplied_bug7
},
5625 {"user_supplied_bug8", 1, (test_callback_fn
)user_supplied_bug8
},
5626 {"user_supplied_bug9", 1, (test_callback_fn
)user_supplied_bug9
},
5627 {"user_supplied_bug10", 1, (test_callback_fn
)user_supplied_bug10
},
5628 {"user_supplied_bug11", 1, (test_callback_fn
)user_supplied_bug11
},
5629 {"user_supplied_bug12", 1, (test_callback_fn
)user_supplied_bug12
},
5630 {"user_supplied_bug13", 1, (test_callback_fn
)user_supplied_bug13
},
5631 {"user_supplied_bug14", 1, (test_callback_fn
)user_supplied_bug14
},
5632 {"user_supplied_bug15", 1, (test_callback_fn
)user_supplied_bug15
},
5633 {"user_supplied_bug16", 1, (test_callback_fn
)user_supplied_bug16
},
5636 ** It seems to be something weird with the character sets..
5637 ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
5638 ** guess I need to find out how this is supposed to work.. Perhaps I need
5639 ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
5640 ** so just disable the code for now...).
5642 {"user_supplied_bug17", 1, (test_callback_fn
)user_supplied_bug17
},
5644 {"user_supplied_bug18", 1, (test_callback_fn
)user_supplied_bug18
},
5645 {"user_supplied_bug19", 1, (test_callback_fn
)user_supplied_bug19
},
5646 {"user_supplied_bug20", 1, (test_callback_fn
)user_supplied_bug20
},
5647 {"user_supplied_bug21", 1, (test_callback_fn
)user_supplied_bug21
},
5648 {"wrong_failure_counter_test", 1, (test_callback_fn
)wrong_failure_counter_test
},
5649 {0, 0, (test_callback_fn
)0}
5652 test_st replication_tests
[]= {
5653 {"set", 1, (test_callback_fn
)replication_set_test
},
5654 {"get", 0, (test_callback_fn
)replication_get_test
},
5655 {"mget", 0, (test_callback_fn
)replication_mget_test
},
5656 {"delete", 0, (test_callback_fn
)replication_delete_test
},
5657 {"rand_mget", 0, (test_callback_fn
)replication_randomize_mget_test
},
5658 {0, 0, (test_callback_fn
)0}
5662 * The following test suite is used to verify that we don't introduce
5663 * regression bugs. If you want more information about the bug / test,
5664 * you should look in the bug report at
5665 * http://bugs.launchpad.net/libmemcached
5667 test_st regression_tests
[]= {
5668 {"lp:434484", 1, (test_callback_fn
)regression_bug_434484
},
5669 {"lp:434843", 1, (test_callback_fn
)regression_bug_434843
},
5670 {"lp:434843 buffered", 1, (test_callback_fn
)regression_bug_434843_buffered
},
5671 {"lp:421108", 1, (test_callback_fn
)regression_bug_421108
},
5672 {"lp:442914", 1, (test_callback_fn
)regression_bug_442914
},
5673 {"lp:447342", 1, (test_callback_fn
)regression_bug_447342
},
5674 {"lp:463297", 1, (test_callback_fn
)regression_bug_463297
},
5675 {0, 0, (test_callback_fn
)0}
5678 test_st ketama_compatibility
[]= {
5679 {"libmemcached", 1, (test_callback_fn
)ketama_compatibility_libmemcached
},
5680 {"spymemcached", 1, (test_callback_fn
)ketama_compatibility_spymemcached
},
5681 {0, 0, (test_callback_fn
)0}
5684 test_st generate_tests
[] ={
5685 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5686 {"generate_data", 1, (test_callback_fn
)generate_data
},
5687 {"get_read", 0, (test_callback_fn
)get_read
},
5688 {"delete_generate", 0, (test_callback_fn
)delete_generate
},
5689 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5690 {"delete_buffer", 0, (test_callback_fn
)delete_buffer_generate
},
5691 {"generate_data", 1, (test_callback_fn
)generate_data
},
5692 {"mget_read", 0, (test_callback_fn
)mget_read
},
5693 {"mget_read_result", 0, (test_callback_fn
)mget_read_result
},
5694 {"mget_read_function", 0, (test_callback_fn
)mget_read_function
},
5695 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5696 {"generate_large_pairs", 1, (test_callback_fn
)generate_large_pairs
},
5697 {"generate_data", 1, (test_callback_fn
)generate_data
},
5698 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5699 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5700 {0, 0, (test_callback_fn
)0}
5703 test_st consistent_tests
[] ={
5704 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5705 {"generate_data", 1, (test_callback_fn
)generate_data
},
5706 {"get_read", 0, (test_callback_fn
)get_read_count
},
5707 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5708 {0, 0, (test_callback_fn
)0}
5711 test_st consistent_weighted_tests
[] ={
5712 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5713 {"generate_data", 1, (test_callback_fn
)generate_data_with_stats
},
5714 {"get_read", 0, (test_callback_fn
)get_read_count
},
5715 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5716 {0, 0, (test_callback_fn
)0}
5719 test_st hsieh_availability
[] ={
5720 {"hsieh_avaibility_test", 0, (test_callback_fn
)hsieh_avaibility_test
},
5721 {0, 0, (test_callback_fn
)0}
5725 test_st hash_sanity
[] ={
5726 {"hash sanity", 0, (test_callback_fn
)hash_sanity_test
},
5727 {0, 0, (test_callback_fn
)0}
5731 test_st ketama_auto_eject_hosts
[] ={
5732 {"auto_eject_hosts", 1, (test_callback_fn
)auto_eject_hosts
},
5733 {"output_ketama_weighted_keys", 1, (test_callback_fn
)output_ketama_weighted_keys
},
5734 {0, 0, (test_callback_fn
)0}
5737 test_st hash_tests
[] ={
5738 {"md5", 0, (test_callback_fn
)md5_run
},
5739 {"crc", 0, (test_callback_fn
)crc_run
},
5740 {"fnv1_64", 0, (test_callback_fn
)fnv1_64_run
},
5741 {"fnv1a_64", 0, (test_callback_fn
)fnv1a_64_run
},
5742 {"fnv1_32", 0, (test_callback_fn
)fnv1_32_run
},
5743 {"fnv1a_32", 0, (test_callback_fn
)fnv1a_32_run
},
5744 {"hsieh", 0, (test_callback_fn
)hsieh_run
},
5745 {"murmur", 0, (test_callback_fn
)murmur_run
},
5746 {"jenkis", 0, (test_callback_fn
)jenkins_run
},
5747 {0, 0, (test_callback_fn
)0}
5750 collection_st collection
[] ={
5752 {"hash_sanity", 0, 0, hash_sanity
},
5754 {"hsieh_availability", 0, 0, hsieh_availability
},
5755 {"udp_setup", (test_callback_fn
)init_udp
, 0, udp_setup_server_tests
},
5756 {"udp_io", (test_callback_fn
)init_udp
, 0, upd_io_tests
},
5757 {"udp_binary_io", (test_callback_fn
)binary_init_udp
, 0, upd_io_tests
},
5758 {"block", 0, 0, tests
},
5759 {"binary", (test_callback_fn
)pre_binary
, 0, tests
},
5760 {"nonblock", (test_callback_fn
)pre_nonblock
, 0, tests
},
5761 {"nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5762 {"settimer", (test_callback_fn
)pre_settimer
, 0, tests
},
5763 {"md5", (test_callback_fn
)pre_md5
, 0, tests
},
5764 {"crc", (test_callback_fn
)pre_crc
, 0, tests
},
5765 {"hsieh", (test_callback_fn
)pre_hsieh
, 0, tests
},
5766 {"jenkins", (test_callback_fn
)pre_jenkins
, 0, tests
},
5767 {"fnv1_64", (test_callback_fn
)pre_hash_fnv1_64
, 0, tests
},
5768 {"fnv1a_64", (test_callback_fn
)pre_hash_fnv1a_64
, 0, tests
},
5769 {"fnv1_32", (test_callback_fn
)pre_hash_fnv1_32
, 0, tests
},
5770 {"fnv1a_32", (test_callback_fn
)pre_hash_fnv1a_32
, 0, tests
},
5771 {"ketama", (test_callback_fn
)pre_behavior_ketama
, 0, tests
},
5772 {"ketama_auto_eject_hosts", (test_callback_fn
)pre_behavior_ketama
, 0, ketama_auto_eject_hosts
},
5773 {"unix_socket", (test_callback_fn
)pre_unix_socket
, 0, tests
},
5774 {"unix_socket_nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5775 {"poll_timeout", (test_callback_fn
)poll_timeout
, 0, tests
},
5776 {"gets", (test_callback_fn
)enable_cas
, 0, tests
},
5777 {"consistent_crc", (test_callback_fn
)enable_consistent_crc
, 0, tests
},
5778 {"consistent_hsieh", (test_callback_fn
)enable_consistent_hsieh
, 0, tests
},
5779 #ifdef MEMCACHED_ENABLE_DEPRECATED
5780 {"deprecated_memory_allocators", (test_callback_fn
)deprecated_set_memory_alloc
, 0, tests
},
5782 {"memory_allocators", (test_callback_fn
)set_memory_alloc
, 0, tests
},
5783 {"prefix", (test_callback_fn
)set_prefix
, 0, tests
},
5784 {"version_1_2_3", (test_callback_fn
)check_for_1_2_3
, 0, version_1_2_3
},
5785 {"string", 0, 0, string_tests
},
5786 {"result", 0, 0, result_tests
},
5787 {"async", (test_callback_fn
)pre_nonblock
, 0, async_tests
},
5788 {"async_binary", (test_callback_fn
)pre_nonblock_binary
, 0, async_tests
},
5789 {"user", 0, 0, user_tests
},
5790 {"generate", 0, 0, generate_tests
},
5791 {"generate_hsieh", (test_callback_fn
)pre_hsieh
, 0, generate_tests
},
5792 {"generate_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, generate_tests
},
5793 {"generate_hsieh_consistent", (test_callback_fn
)enable_consistent_hsieh
, 0, generate_tests
},
5794 {"generate_md5", (test_callback_fn
)pre_md5
, 0, generate_tests
},
5795 {"generate_murmur", (test_callback_fn
)pre_murmur
, 0, generate_tests
},
5796 {"generate_jenkins", (test_callback_fn
)pre_jenkins
, 0, generate_tests
},
5797 {"generate_nonblock", (test_callback_fn
)pre_nonblock
, 0, generate_tests
},
5798 {"consistent_not", 0, 0, consistent_tests
},
5799 {"consistent_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, consistent_tests
},
5800 {"consistent_ketama_weighted", (test_callback_fn
)pre_behavior_ketama_weighted
, 0, consistent_weighted_tests
},
5801 {"ketama_compat", 0, 0, ketama_compatibility
},
5802 {"test_hashes", 0, 0, hash_tests
},
5803 {"replication", (test_callback_fn
)pre_replication
, 0, replication_tests
},
5804 {"replication_noblock", (test_callback_fn
)pre_replication_noblock
, 0, replication_tests
},
5805 {"regression", 0, 0, regression_tests
},
5806 {"behaviors", 0, 0, behavior_tests
},
5810 #define SERVERS_TO_CREATE 5
5812 #include "libmemcached_world.h"
5814 void get_world(world_st
*world
)
5816 world
->collections
= collection
;
5818 world
->create
= (test_callback_create_fn
)world_create
;
5819 world
->destroy
= (test_callback_fn
)world_destroy
;
5821 world
->test
.startup
= (test_callback_fn
)world_test_startup
;
5822 world
->test
.flush
= (test_callback_fn
)world_flush
;
5823 world
->test
.pre_run
= (test_callback_fn
)world_pre_run
;
5824 world
->test
.post_run
= (test_callback_fn
)world_post_run
;
5825 world
->test
.on_error
= (test_callback_error_fn
)world_on_error
;
5827 world
->collection
.startup
= (test_callback_fn
)world_container_startup
;
5828 world
->collection
.shutdown
= (test_callback_fn
)world_container_shutdown
;
5830 world
->runner
= &defualt_libmemcached_runner
;