1 /* libMemcached Functions Test
2 * Copyright (C) 2006-2009 Brian Aker
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
10 Sample test application.
13 #include "libmemcached/common.h"
20 #include <sys/types.h>
26 #include "clients/generator.h"
27 #include "clients/execute.h"
30 #define INT64_MAX LONG_MAX
33 #define INT32_MAX INT_MAX
39 #ifdef HAVE_LIBMEMCACHEDUTIL
41 #include "libmemcached/memcached_util.h"
44 #include "hash_results.h"
46 #define GLOBAL_COUNT 10000
47 #define GLOBAL2_COUNT 100
48 #define SERVERS_TO_CREATE 5
49 static uint32_t global_count
;
51 static pairs_st
*global_pairs
;
52 static const char *global_keys
[GLOBAL_COUNT
];
53 static size_t global_keys_length
[GLOBAL_COUNT
];
55 static test_return_t
init_test(memcached_st
*not_used
__attribute__((unused
)))
59 (void)memcached_create(&memc
);
60 memcached_free(&memc
);
65 static test_return_t
server_list_null_test(memcached_st
*ptr
__attribute__((unused
)))
67 memcached_server_st
*server_list
;
68 memcached_return_t rc
;
70 server_list
= memcached_server_list_append_with_weight(NULL
, NULL
, 0, 0, NULL
);
71 test_truth(server_list
== NULL
);
73 server_list
= memcached_server_list_append_with_weight(NULL
, "localhost", 0, 0, NULL
);
74 test_truth(server_list
== NULL
);
76 server_list
= memcached_server_list_append_with_weight(NULL
, NULL
, 0, 0, &rc
);
77 test_truth(server_list
== NULL
);
82 #define TEST_PORT_COUNT 7
83 uint32_t test_ports
[TEST_PORT_COUNT
];
85 static memcached_return_t
server_display_function(memcached_st
*ptr
__attribute__((unused
)), memcached_server_st
*server
, void *context
)
88 uint32_t bigger
= *((uint32_t *)(context
));
89 assert(bigger
<= server
->port
);
90 *((uint32_t *)(context
))= server
->port
;
92 return MEMCACHED_SUCCESS
;
95 static test_return_t
server_sort_test(memcached_st
*ptr
__attribute__((unused
)))
98 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
99 memcached_return_t rc
;
100 memcached_server_fn callbacks
[1];
101 memcached_st
*local_memc
;
103 local_memc
= memcached_create(NULL
);
104 test_truth(local_memc
);
105 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
107 for (x
= 0; x
< TEST_PORT_COUNT
; x
++)
109 test_ports
[x
]= (uint32_t)random() % 64000;
110 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
111 test_truth(local_memc
->number_of_hosts
== x
+ 1);
112 test_truth(local_memc
->hosts
[0].count
== x
+1);
113 test_truth(rc
== MEMCACHED_SUCCESS
);
116 callbacks
[0]= server_display_function
;
117 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
120 memcached_free(local_memc
);
125 static test_return_t
server_sort2_test(memcached_st
*ptr
__attribute__((unused
)))
127 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
128 memcached_return_t rc
;
129 memcached_server_fn callbacks
[1];
130 memcached_st
*local_memc
;
132 local_memc
= memcached_create(NULL
);
133 test_truth(local_memc
);
134 rc
= memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
135 test_truth(rc
== MEMCACHED_SUCCESS
);
137 rc
= memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0);
138 test_truth(rc
== MEMCACHED_SUCCESS
);
139 test_truth(local_memc
->hosts
[0].port
== 43043);
141 rc
= memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0);
142 test_truth(rc
== MEMCACHED_SUCCESS
);
143 test_truth(local_memc
->hosts
[0].port
== 43042);
144 test_truth(local_memc
->hosts
[1].port
== 43043);
146 callbacks
[0]= server_display_function
;
147 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
150 memcached_free(local_memc
);
155 static memcached_return_t
server_display_unsort_function(memcached_st
*ptr
__attribute__((unused
)), memcached_server_st
*server
, void *context
)
158 uint32_t x
= *((uint32_t *)(context
));
160 assert(test_ports
[x
] == server
->port
);
161 *((uint32_t *)(context
))= ++x
;
163 return MEMCACHED_SUCCESS
;
166 static test_return_t
server_unsort_test(memcached_st
*ptr
__attribute__((unused
)))
169 uint32_t counter
= 0; /* Prime the value for the test_truth in server_display_function */
170 uint32_t bigger
= 0; /* Prime the value for the test_truth in server_display_function */
171 memcached_return_t rc
;
172 memcached_server_fn callbacks
[1];
173 memcached_st
*local_memc
;
175 local_memc
= memcached_create(NULL
);
176 test_truth(local_memc
);
178 for (x
= 0; x
< TEST_PORT_COUNT
; x
++)
180 test_ports
[x
]= (uint32_t)(random() % 64000);
181 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
182 test_truth(local_memc
->number_of_hosts
== x
+1);
183 test_truth(local_memc
->hosts
[0].count
== x
+1);
184 test_truth(rc
== MEMCACHED_SUCCESS
);
187 callbacks
[0]= server_display_unsort_function
;
188 memcached_server_cursor(local_memc
, callbacks
, (void *)&counter
, 1);
190 /* Now we sort old data! */
191 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
192 callbacks
[0]= server_display_function
;
193 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
196 memcached_free(local_memc
);
201 static test_return_t
allocation_test(memcached_st
*not_used
__attribute__((unused
)))
204 memc
= memcached_create(NULL
);
206 memcached_free(memc
);
211 static test_return_t
clone_test(memcached_st
*memc
)
215 memcached_st
*memc_clone
;
216 memc_clone
= memcached_clone(NULL
, NULL
);
217 test_truth(memc_clone
);
218 memcached_free(memc_clone
);
221 /* Can we init from null? */
223 memcached_st
*memc_clone
;
224 memc_clone
= memcached_clone(NULL
, memc
);
225 test_truth(memc_clone
);
227 test_truth(memc_clone
->call_free
== memc
->call_free
);
228 test_truth(memc_clone
->call_malloc
== memc
->call_malloc
);
229 test_truth(memc_clone
->call_realloc
== memc
->call_realloc
);
230 test_truth(memc_clone
->call_calloc
== memc
->call_calloc
);
231 test_truth(memc_clone
->connect_timeout
== memc
->connect_timeout
);
232 test_truth(memc_clone
->delete_trigger
== memc
->delete_trigger
);
233 test_truth(memc_clone
->distribution
== memc
->distribution
);
234 { // Test all of the flags
235 test_truth(memc_clone
->flags
.no_block
== memc
->flags
.no_block
);
236 test_truth(memc_clone
->flags
.tcp_nodelay
== memc
->flags
.tcp_nodelay
);
237 test_truth(memc_clone
->flags
.reuse_memory
== memc
->flags
.reuse_memory
);
238 test_truth(memc_clone
->flags
.use_md5
== memc
->flags
.use_md5
);
239 test_truth(memc_clone
->flags
.use_crc
== memc
->flags
.use_crc
);
240 test_truth(memc_clone
->flags
.use_cache_lookups
== memc
->flags
.use_cache_lookups
);
241 test_truth(memc_clone
->flags
.support_cas
== memc
->flags
.support_cas
);
242 test_truth(memc_clone
->flags
.buffer_requests
== memc
->flags
.buffer_requests
);
243 test_truth(memc_clone
->flags
.use_sort_hosts
== memc
->flags
.use_sort_hosts
);
244 test_truth(memc_clone
->flags
.verify_key
== memc
->flags
.verify_key
);
245 test_truth(memc_clone
->flags
.ketama_weighted
== memc
->flags
.ketama_weighted
);
246 test_truth(memc_clone
->flags
.binary_protocol
== memc
->flags
.binary_protocol
);
247 test_truth(memc_clone
->flags
.hash_with_prefix_key
== memc
->flags
.hash_with_prefix_key
);
248 test_truth(memc_clone
->flags
.no_reply
== memc
->flags
.no_reply
);
249 test_truth(memc_clone
->flags
.use_udp
== memc
->flags
.use_udp
);
250 test_truth(memc_clone
->flags
.auto_eject_hosts
== memc
->flags
.auto_eject_hosts
);
251 test_truth(memc_clone
->flags
.randomize_replica_read
== memc
->flags
.randomize_replica_read
);
253 test_truth(memc_clone
->get_key_failure
== memc
->get_key_failure
);
254 test_truth(memc_clone
->hash
== memc
->hash
);
255 test_truth(memc_clone
->hash_continuum
== memc
->hash_continuum
);
256 test_truth(memc_clone
->io_bytes_watermark
== memc
->io_bytes_watermark
);
257 test_truth(memc_clone
->io_msg_watermark
== memc
->io_msg_watermark
);
258 test_truth(memc_clone
->io_key_prefetch
== memc
->io_key_prefetch
);
259 test_truth(memc_clone
->on_cleanup
== memc
->on_cleanup
);
260 test_truth(memc_clone
->on_clone
== memc
->on_clone
);
261 test_truth(memc_clone
->poll_timeout
== memc
->poll_timeout
);
262 test_truth(memc_clone
->rcv_timeout
== memc
->rcv_timeout
);
263 test_truth(memc_clone
->recv_size
== memc
->recv_size
);
264 test_truth(memc_clone
->retry_timeout
== memc
->retry_timeout
);
265 test_truth(memc_clone
->send_size
== memc
->send_size
);
266 test_truth(memc_clone
->server_failure_limit
== memc
->server_failure_limit
);
267 test_truth(memc_clone
->snd_timeout
== memc
->snd_timeout
);
268 test_truth(memc_clone
->user_data
== memc
->user_data
);
270 memcached_free(memc_clone
);
273 /* Can we init from struct? */
275 memcached_st declared_clone
;
276 memcached_st
*memc_clone
;
277 memset(&declared_clone
, 0 , sizeof(memcached_st
));
278 memc_clone
= memcached_clone(&declared_clone
, NULL
);
279 test_truth(memc_clone
);
280 memcached_free(memc_clone
);
283 /* Can we init from struct? */
285 memcached_st declared_clone
;
286 memcached_st
*memc_clone
;
287 memset(&declared_clone
, 0 , sizeof(memcached_st
));
288 memc_clone
= memcached_clone(&declared_clone
, memc
);
289 test_truth(memc_clone
);
290 memcached_free(memc_clone
);
296 static test_return_t
userdata_test(memcached_st
*memc
)
299 test_truth(memcached_set_user_data(memc
, foo
) == NULL
);
300 test_truth(memcached_get_user_data(memc
) == foo
);
301 test_truth(memcached_set_user_data(memc
, NULL
) == foo
);
306 static test_return_t
connection_test(memcached_st
*memc
)
308 memcached_return_t rc
;
310 rc
= memcached_server_add_with_weight(memc
, "localhost", 0, 0);
311 test_truth(rc
== MEMCACHED_SUCCESS
);
316 static test_return_t
error_test(memcached_st
*memc
)
318 memcached_return_t rc
;
319 uint32_t values
[] = { 851992627U, 2337886783U, 3196981036U, 4001849190U,
320 982370485U, 1263635348U, 4242906218U, 3829656100U,
321 1891735253U, 334139633U, 2257084983U, 3088286104U,
322 13199785U, 2542027183U, 1097051614U, 199566778U,
323 2748246961U, 2465192557U, 1664094137U, 2405439045U,
324 1842224848U, 692413798U, 3479807801U, 919913813U,
325 4269430871U, 610793021U, 527273862U, 1437122909U,
326 2300930706U, 2943759320U, 674306647U, 2400528935U,
327 54481931U, 4186304426U, 1741088401U, 2979625118U,
328 4159057246U, 3425930182U, 2593724503U};
330 // You have updated the memcache_error messages but not updated docs/tests.
331 test_truth(MEMCACHED_MAXIMUM_RETURN
== 39);
332 for (rc
= MEMCACHED_SUCCESS
; rc
< MEMCACHED_MAXIMUM_RETURN
; rc
++)
335 const char *msg
= memcached_strerror(memc
, rc
);
336 hash_val
= memcached_generate_hash_value(msg
, strlen(msg
),
337 MEMCACHED_HASH_JENKINS
);
338 test_truth(values
[rc
] == hash_val
);
344 static test_return_t
set_test(memcached_st
*memc
)
346 memcached_return_t rc
;
347 const char *key
= "foo";
348 const char *value
= "when we sanitize";
350 rc
= memcached_set(memc
, key
, strlen(key
),
351 value
, strlen(value
),
352 (time_t)0, (uint32_t)0);
353 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
358 static test_return_t
append_test(memcached_st
*memc
)
360 memcached_return_t rc
;
361 const char *key
= "fig";
362 const char *in_value
= "we";
363 char *out_value
= NULL
;
367 rc
= memcached_flush(memc
, 0);
368 test_truth(rc
== MEMCACHED_SUCCESS
);
370 rc
= memcached_set(memc
, key
, strlen(key
),
371 in_value
, strlen(in_value
),
372 (time_t)0, (uint32_t)0);
373 test_truth(rc
== MEMCACHED_SUCCESS
);
375 rc
= memcached_append(memc
, key
, strlen(key
),
376 " the", strlen(" the"),
377 (time_t)0, (uint32_t)0);
378 test_truth(rc
== MEMCACHED_SUCCESS
);
380 rc
= memcached_append(memc
, key
, strlen(key
),
381 " people", strlen(" people"),
382 (time_t)0, (uint32_t)0);
383 test_truth(rc
== MEMCACHED_SUCCESS
);
385 out_value
= memcached_get(memc
, key
, strlen(key
),
386 &value_length
, &flags
, &rc
);
387 test_truth(!memcmp(out_value
, "we the people", strlen("we the people")));
388 test_truth(strlen("we the people") == value_length
);
389 test_truth(rc
== MEMCACHED_SUCCESS
);
395 static test_return_t
append_binary_test(memcached_st
*memc
)
397 memcached_return_t rc
;
398 const char *key
= "numbers";
399 unsigned int *store_ptr
;
400 unsigned int store_list
[] = { 23, 56, 499, 98, 32847, 0 };
406 rc
= memcached_flush(memc
, 0);
407 test_truth(rc
== MEMCACHED_SUCCESS
);
409 rc
= memcached_set(memc
,
412 (time_t)0, (uint32_t)0);
413 test_truth(rc
== MEMCACHED_SUCCESS
);
415 for (x
= 0; store_list
[x
] ; x
++)
417 rc
= memcached_append(memc
,
419 (char *)&store_list
[x
], sizeof(unsigned int),
420 (time_t)0, (uint32_t)0);
421 test_truth(rc
== MEMCACHED_SUCCESS
);
424 value
= memcached_get(memc
, key
, strlen(key
),
425 &value_length
, &flags
, &rc
);
426 test_truth((value_length
== (sizeof(unsigned int) * x
)));
427 test_truth(rc
== MEMCACHED_SUCCESS
);
429 store_ptr
= (unsigned int *)value
;
431 while ((size_t)store_ptr
< (size_t)(value
+ value_length
))
433 test_truth(*store_ptr
== store_list
[x
++]);
441 static test_return_t
cas2_test(memcached_st
*memc
)
443 memcached_return_t rc
;
444 const char *keys
[]= {"fudge", "son", "food"};
445 size_t key_length
[]= {5, 3, 4};
446 const char *value
= "we the people";
447 size_t value_length
= strlen("we the people");
449 memcached_result_st results_obj
;
450 memcached_result_st
*results
;
453 rc
= memcached_flush(memc
, 0);
454 test_truth(rc
== MEMCACHED_SUCCESS
);
456 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
458 for (x
= 0; x
< 3; x
++)
460 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
461 keys
[x
], key_length
[x
],
462 (time_t)50, (uint32_t)9);
463 test_truth(rc
== MEMCACHED_SUCCESS
);
466 rc
= memcached_mget(memc
, keys
, key_length
, 3);
468 results
= memcached_result_create(memc
, &results_obj
);
470 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
472 test_truth(results
->cas
);
473 test_truth(rc
== MEMCACHED_SUCCESS
);
474 test_truth(memcached_result_cas(results
));
476 test_truth(!memcmp(value
, "we the people", strlen("we the people")));
477 test_truth(strlen("we the people") == value_length
);
478 test_truth(rc
== MEMCACHED_SUCCESS
);
480 memcached_result_free(&results_obj
);
485 static test_return_t
cas_test(memcached_st
*memc
)
487 memcached_return_t rc
;
488 const char *key
= "fun";
489 size_t key_length
= strlen(key
);
490 const char *value
= "we the people";
491 const char* keys
[2] = { key
, NULL
};
492 size_t keylengths
[2] = { strlen(key
), 0 };
493 size_t value_length
= strlen(value
);
494 const char *value2
= "change the value";
495 size_t value2_length
= strlen(value2
);
497 memcached_result_st results_obj
;
498 memcached_result_st
*results
;
501 rc
= memcached_flush(memc
, 0);
502 test_truth(rc
== MEMCACHED_SUCCESS
);
504 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
506 rc
= memcached_set(memc
, key
, strlen(key
),
507 value
, strlen(value
),
508 (time_t)0, (uint32_t)0);
509 test_truth(rc
== MEMCACHED_SUCCESS
);
511 rc
= memcached_mget(memc
, keys
, keylengths
, 1);
513 results
= memcached_result_create(memc
, &results_obj
);
515 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
517 test_truth(rc
== MEMCACHED_SUCCESS
);
518 test_truth(memcached_result_cas(results
));
519 test_truth(!memcmp(value
, memcached_result_value(results
), value_length
));
520 test_truth(strlen(memcached_result_value(results
)) == value_length
);
521 test_truth(rc
== MEMCACHED_SUCCESS
);
522 uint64_t cas
= memcached_result_cas(results
);
525 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
526 test_truth(rc
== MEMCACHED_END
);
527 test_truth(results
== NULL
);
530 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
531 test_truth(rc
== MEMCACHED_SUCCESS
);
534 * The item will have a new cas value, so try to set it again with the old
535 * value. This should fail!
537 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
538 test_truth(rc
== MEMCACHED_DATA_EXISTS
);
540 memcached_result_free(&results_obj
);
545 static test_return_t
prepend_test(memcached_st
*memc
)
547 memcached_return_t rc
;
548 const char *key
= "fig";
549 const char *value
= "people";
550 char *out_value
= NULL
;
554 rc
= memcached_flush(memc
, 0);
555 test_truth(rc
== MEMCACHED_SUCCESS
);
557 rc
= memcached_set(memc
, key
, strlen(key
),
558 value
, strlen(value
),
559 (time_t)0, (uint32_t)0);
560 test_truth(rc
== MEMCACHED_SUCCESS
);
562 rc
= memcached_prepend(memc
, key
, strlen(key
),
563 "the ", strlen("the "),
564 (time_t)0, (uint32_t)0);
565 test_truth(rc
== MEMCACHED_SUCCESS
);
567 rc
= memcached_prepend(memc
, key
, strlen(key
),
568 "we ", strlen("we "),
569 (time_t)0, (uint32_t)0);
570 test_truth(rc
== MEMCACHED_SUCCESS
);
572 out_value
= memcached_get(memc
, key
, strlen(key
),
573 &value_length
, &flags
, &rc
);
574 test_truth(!memcmp(out_value
, "we the people", strlen("we the people")));
575 test_truth(strlen("we the people") == value_length
);
576 test_truth(rc
== MEMCACHED_SUCCESS
);
583 Set the value, then quit to make sure it is flushed.
584 Come back in and test that add fails.
586 static test_return_t
add_test(memcached_st
*memc
)
588 memcached_return_t rc
;
589 const char *key
= "foo";
590 const char *value
= "when we sanitize";
591 unsigned long long setting_value
;
593 setting_value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
595 rc
= memcached_set(memc
, key
, strlen(key
),
596 value
, strlen(value
),
597 (time_t)0, (uint32_t)0);
598 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
599 memcached_quit(memc
);
600 rc
= memcached_add(memc
, key
, strlen(key
),
601 value
, strlen(value
),
602 (time_t)0, (uint32_t)0);
604 /* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
607 test_truth(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_STORED
);
611 test_truth(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_DATA_EXISTS
);
618 ** There was a problem of leaking filedescriptors in the initial release
619 ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
620 ** systems it seems that the kernel is slow on reclaiming the resources
621 ** because the connects starts to time out (the test doesn't do much
622 ** anyway, so just loop 10 iterations)
624 static test_return_t
add_wrapper(memcached_st
*memc
)
627 unsigned int max
= 10000;
635 for (x
= 0; x
< max
; x
++)
641 static test_return_t
replace_test(memcached_st
*memc
)
643 memcached_return_t rc
;
644 const char *key
= "foo";
645 const char *value
= "when we sanitize";
646 const char *original
= "first we insert some data";
648 rc
= memcached_set(memc
, key
, strlen(key
),
649 original
, strlen(original
),
650 (time_t)0, (uint32_t)0);
651 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
653 rc
= memcached_replace(memc
, key
, strlen(key
),
654 value
, strlen(value
),
655 (time_t)0, (uint32_t)0);
656 test_truth(rc
== MEMCACHED_SUCCESS
);
661 static test_return_t
delete_test(memcached_st
*memc
)
663 memcached_return_t rc
;
664 const char *key
= "foo";
665 const char *value
= "when we sanitize";
667 rc
= memcached_set(memc
, key
, strlen(key
),
668 value
, strlen(value
),
669 (time_t)0, (uint32_t)0);
670 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
672 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
673 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
678 static test_return_t
flush_test(memcached_st
*memc
)
680 memcached_return_t rc
;
682 rc
= memcached_flush(memc
, 0);
683 test_truth(rc
== MEMCACHED_SUCCESS
);
688 static memcached_return_t
server_function(memcached_st
*ptr
__attribute__((unused
)),
689 memcached_server_st
*server
__attribute__((unused
)),
690 void *context
__attribute__((unused
)))
694 return MEMCACHED_SUCCESS
;
697 static test_return_t
memcached_server_cursor_test(memcached_st
*memc
)
700 strcpy(context
, "foo bad");
701 memcached_server_fn callbacks
[1];
703 callbacks
[0]= server_function
;
704 memcached_server_cursor(memc
, callbacks
, context
, 1);
708 static test_return_t
bad_key_test(memcached_st
*memc
)
710 memcached_return_t rc
;
711 const char *key
= "foo bad";
713 size_t string_length
;
715 memcached_st
*memc_clone
;
717 size_t max_keylen
= 0xffff;
719 memc_clone
= memcached_clone(NULL
, memc
);
720 test_truth(memc_clone
);
722 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
723 test_truth(rc
== MEMCACHED_SUCCESS
);
725 /* All keys are valid in the binary protocol (except for length) */
726 if (memcached_behavior_get(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 0)
728 string
= memcached_get(memc_clone
, key
, strlen(key
),
729 &string_length
, &flags
, &rc
);
730 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
731 test_truth(string_length
== 0);
735 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
736 test_truth(rc
== MEMCACHED_SUCCESS
);
737 string
= memcached_get(memc_clone
, key
, strlen(key
),
738 &string_length
, &flags
, &rc
);
739 test_truth(rc
== MEMCACHED_NOTFOUND
);
740 test_truth(string_length
== 0);
743 /* Test multi key for bad keys */
744 const char *keys
[] = { "GoodKey", "Bad Key", "NotMine" };
745 size_t key_lengths
[] = { 7, 7, 7 };
747 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
748 test_truth(rc
== MEMCACHED_SUCCESS
);
750 rc
= memcached_mget(memc_clone
, keys
, key_lengths
, 3);
751 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
753 rc
= memcached_mget_by_key(memc_clone
, "foo daddy", 9, keys
, key_lengths
, 1);
754 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
758 /* The following test should be moved to the end of this function when the
759 memcached server is updated to allow max size length of the keys in the
762 rc
= memcached_callback_set(memc_clone
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
763 test_truth(rc
== MEMCACHED_SUCCESS
);
765 char *longkey
= malloc(max_keylen
+ 1);
768 memset(longkey
, 'a', max_keylen
+ 1);
769 string
= memcached_get(memc_clone
, longkey
, max_keylen
,
770 &string_length
, &flags
, &rc
);
771 test_truth(rc
== MEMCACHED_NOTFOUND
);
772 test_truth(string_length
== 0);
775 string
= memcached_get(memc_clone
, longkey
, max_keylen
+ 1,
776 &string_length
, &flags
, &rc
);
777 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
778 test_truth(string_length
== 0);
785 /* Make sure zero length keys are marked as bad */
787 rc
= memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, set
);
788 test_truth(rc
== MEMCACHED_SUCCESS
);
789 string
= memcached_get(memc_clone
, key
, 0,
790 &string_length
, &flags
, &rc
);
791 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
792 test_truth(string_length
== 0);
795 memcached_free(memc_clone
);
800 #define READ_THROUGH_VALUE "set for me"
801 static memcached_return_t
read_through_trigger(memcached_st
*memc
__attribute__((unused
)),
802 char *key
__attribute__((unused
)),
803 size_t key_length
__attribute__((unused
)),
804 memcached_result_st
*result
)
807 return memcached_result_set_value(result
, READ_THROUGH_VALUE
, strlen(READ_THROUGH_VALUE
));
810 static test_return_t
read_through(memcached_st
*memc
)
812 memcached_return_t rc
;
813 const char *key
= "foo";
815 size_t string_length
;
817 memcached_trigger_key_fn cb
= (memcached_trigger_key_fn
)read_through_trigger
;
819 string
= memcached_get(memc
, key
, strlen(key
),
820 &string_length
, &flags
, &rc
);
822 test_truth(rc
== MEMCACHED_NOTFOUND
);
823 test_truth(string_length
== 0);
826 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_GET_FAILURE
,
828 test_truth(rc
== MEMCACHED_SUCCESS
);
830 string
= memcached_get(memc
, key
, strlen(key
),
831 &string_length
, &flags
, &rc
);
833 test_truth(rc
== MEMCACHED_SUCCESS
);
834 test_truth(string_length
== strlen(READ_THROUGH_VALUE
));
835 test_truth(!strcmp(READ_THROUGH_VALUE
, string
));
838 string
= memcached_get(memc
, key
, strlen(key
),
839 &string_length
, &flags
, &rc
);
841 test_truth(rc
== MEMCACHED_SUCCESS
);
842 test_truth(string_length
== strlen(READ_THROUGH_VALUE
));
843 test_truth(!strcmp(READ_THROUGH_VALUE
, string
));
849 static memcached_return_t
delete_trigger(memcached_st
*ptr
__attribute__((unused
)),
851 size_t key_length
__attribute__((unused
)))
855 return MEMCACHED_SUCCESS
;
858 static test_return_t
delete_through(memcached_st
*memc
)
860 memcached_trigger_delete_key_fn callback
;
861 memcached_return_t rc
;
863 callback
= (memcached_trigger_delete_key_fn
)delete_trigger
;
865 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_DELETE_TRIGGER
, *(void**)&callback
);
866 test_truth(rc
== MEMCACHED_SUCCESS
);
871 static test_return_t
get_test(memcached_st
*memc
)
873 memcached_return_t rc
;
874 const char *key
= "foo";
876 size_t string_length
;
879 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
880 test_truth(rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_NOTFOUND
);
882 string
= memcached_get(memc
, key
, strlen(key
),
883 &string_length
, &flags
, &rc
);
885 test_truth(rc
== MEMCACHED_NOTFOUND
);
886 test_truth(string_length
== 0);
892 static test_return_t
get_test2(memcached_st
*memc
)
894 memcached_return_t rc
;
895 const char *key
= "foo";
896 const char *value
= "when we sanitize";
898 size_t string_length
;
901 rc
= memcached_set(memc
, key
, strlen(key
),
902 value
, strlen(value
),
903 (time_t)0, (uint32_t)0);
904 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
906 string
= memcached_get(memc
, key
, strlen(key
),
907 &string_length
, &flags
, &rc
);
910 test_truth(rc
== MEMCACHED_SUCCESS
);
911 test_truth(string_length
== strlen(value
));
912 test_truth(!memcmp(string
, value
, string_length
));
919 static test_return_t
set_test2(memcached_st
*memc
)
921 memcached_return_t rc
;
922 const char *key
= "foo";
923 const char *value
= "train in the brain";
924 size_t value_length
= strlen(value
);
927 for (x
= 0; x
< 10; x
++)
929 rc
= memcached_set(memc
, key
, strlen(key
),
931 (time_t)0, (uint32_t)0);
932 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
938 static test_return_t
set_test3(memcached_st
*memc
)
940 memcached_return_t rc
;
942 size_t value_length
= 8191;
945 value
= (char*)malloc(value_length
);
948 for (x
= 0; x
< value_length
; x
++)
949 value
[x
] = (char) (x
% 127);
951 /* The dump test relies on there being at least 32 items in memcached */
952 for (x
= 0; x
< 32; x
++)
956 sprintf(key
, "foo%u", x
);
958 rc
= memcached_set(memc
, key
, strlen(key
),
960 (time_t)0, (uint32_t)0);
961 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
969 static test_return_t
get_test3(memcached_st
*memc
)
971 memcached_return_t rc
;
972 const char *key
= "foo";
974 size_t value_length
= 8191;
976 size_t string_length
;
980 value
= (char*)malloc(value_length
);
983 for (x
= 0; x
< value_length
; x
++)
984 value
[x
] = (char) (x
% 127);
986 rc
= memcached_set(memc
, key
, strlen(key
),
988 (time_t)0, (uint32_t)0);
989 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
991 string
= memcached_get(memc
, key
, strlen(key
),
992 &string_length
, &flags
, &rc
);
994 test_truth(rc
== MEMCACHED_SUCCESS
);
996 test_truth(string_length
== value_length
);
997 test_truth(!memcmp(string
, value
, string_length
));
1002 return TEST_SUCCESS
;
1005 static test_return_t
get_test4(memcached_st
*memc
)
1007 memcached_return_t rc
;
1008 const char *key
= "foo";
1010 size_t value_length
= 8191;
1012 size_t string_length
;
1016 value
= (char*)malloc(value_length
);
1019 for (x
= 0; x
< value_length
; x
++)
1020 value
[x
] = (char) (x
% 127);
1022 rc
= memcached_set(memc
, key
, strlen(key
),
1023 value
, value_length
,
1024 (time_t)0, (uint32_t)0);
1025 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1027 for (x
= 0; x
< 10; x
++)
1029 string
= memcached_get(memc
, key
, strlen(key
),
1030 &string_length
, &flags
, &rc
);
1032 test_truth(rc
== MEMCACHED_SUCCESS
);
1034 test_truth(string_length
== value_length
);
1035 test_truth(!memcmp(string
, value
, string_length
));
1041 return TEST_SUCCESS
;
1045 * This test verifies that memcached_read_one_response doesn't try to
1046 * dereference a NIL-pointer if you issue a multi-get and don't read out all
1047 * responses before you execute a storage command.
1049 static test_return_t
get_test5(memcached_st
*memc
)
1052 ** Request the same key twice, to ensure that we hash to the same server
1053 ** (so that we have multiple response values queued up) ;-)
1055 const char *keys
[]= { "key", "key" };
1056 size_t lengths
[]= { 3, 3 };
1060 memcached_return_t rc
= memcached_set(memc
, keys
[0], lengths
[0],
1061 keys
[0], lengths
[0], 0, 0);
1062 test_truth(rc
== MEMCACHED_SUCCESS
);
1063 rc
= memcached_mget(memc
, keys
, lengths
, 2);
1065 memcached_result_st results_obj
;
1066 memcached_result_st
*results
;
1067 results
=memcached_result_create(memc
, &results_obj
);
1068 test_truth(results
);
1069 results
=memcached_fetch_result(memc
, &results_obj
, &rc
);
1070 test_truth(results
);
1071 memcached_result_free(&results_obj
);
1073 /* Don't read out the second result, but issue a set instead.. */
1074 rc
= memcached_set(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0);
1075 test_truth(rc
== MEMCACHED_SUCCESS
);
1077 char *val
= memcached_get_by_key(memc
, keys
[0], lengths
[0], "yek", 3,
1078 &rlen
, &flags
, &rc
);
1079 test_truth(val
== NULL
);
1080 test_truth(rc
== MEMCACHED_NOTFOUND
);
1081 val
= memcached_get(memc
, keys
[0], lengths
[0], &rlen
, &flags
, &rc
);
1082 test_truth(val
!= NULL
);
1083 test_truth(rc
== MEMCACHED_SUCCESS
);
1086 return TEST_SUCCESS
;
1089 static test_return_t
mget_end(memcached_st
*memc
)
1091 const char *keys
[]= { "foo", "foo2" };
1092 size_t lengths
[]= { 3, 4 };
1093 const char *values
[]= { "fjord", "41" };
1095 memcached_return_t rc
;
1098 for (int i
= 0; i
< 2; i
++)
1100 rc
= memcached_set(memc
, keys
[i
], lengths
[i
], values
[i
], strlen(values
[i
]),
1101 (time_t)0, (uint32_t)0);
1102 test_truth(rc
== MEMCACHED_SUCCESS
);
1106 size_t string_length
;
1109 // retrieve both via mget
1110 rc
= memcached_mget(memc
, keys
, lengths
, 2);
1111 test_truth(rc
== MEMCACHED_SUCCESS
);
1113 char key
[MEMCACHED_MAX_KEY
];
1116 // this should get both
1117 for (int i
= 0; i
< 2; i
++)
1119 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
,
1121 test_truth(rc
== MEMCACHED_SUCCESS
);
1123 if (key_length
== 4)
1125 test_truth(string_length
== strlen(values
[val
]));
1126 test_truth(strncmp(values
[val
], string
, string_length
) == 0);
1130 // this should indicate end
1131 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1132 test_truth(rc
== MEMCACHED_END
);
1135 rc
= memcached_mget(memc
, keys
, lengths
, 1);
1136 test_truth(rc
== MEMCACHED_SUCCESS
);
1138 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1139 test_truth(key_length
== lengths
[0]);
1140 test_truth(strncmp(keys
[0], key
, key_length
) == 0);
1141 test_truth(string_length
== strlen(values
[0]));
1142 test_truth(strncmp(values
[0], string
, string_length
) == 0);
1143 test_truth(rc
== MEMCACHED_SUCCESS
);
1146 // this should indicate end
1147 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1148 test_truth(rc
== MEMCACHED_END
);
1150 return TEST_SUCCESS
;
1153 /* Do not copy the style of this code, I just access hosts to testthis function */
1154 static test_return_t
stats_servername_test(memcached_st
*memc
)
1156 memcached_return_t rc
;
1157 memcached_stat_st memc_stat
;
1158 rc
= memcached_stat_servername(&memc_stat
, NULL
,
1159 memc
->hosts
[0].hostname
,
1160 memc
->hosts
[0].port
);
1162 return TEST_SUCCESS
;
1165 static test_return_t
increment_test(memcached_st
*memc
)
1167 uint64_t new_number
;
1168 memcached_return_t rc
;
1169 const char *key
= "number";
1170 const char *value
= "0";
1172 rc
= memcached_set(memc
, key
, strlen(key
),
1173 value
, strlen(value
),
1174 (time_t)0, (uint32_t)0);
1175 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1177 rc
= memcached_increment(memc
, key
, strlen(key
),
1179 test_truth(rc
== MEMCACHED_SUCCESS
);
1180 test_truth(new_number
== 1);
1182 rc
= memcached_increment(memc
, key
, strlen(key
),
1184 test_truth(rc
== MEMCACHED_SUCCESS
);
1185 test_truth(new_number
== 2);
1187 return TEST_SUCCESS
;
1190 static test_return_t
increment_with_initial_test(memcached_st
*memc
)
1192 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1194 uint64_t new_number
;
1195 memcached_return_t rc
;
1196 const char *key
= "number";
1197 uint64_t initial
= 0;
1199 rc
= memcached_increment_with_initial(memc
, key
, strlen(key
),
1200 1, initial
, 0, &new_number
);
1201 test_truth(rc
== MEMCACHED_SUCCESS
);
1202 test_truth(new_number
== initial
);
1204 rc
= memcached_increment_with_initial(memc
, key
, strlen(key
),
1205 1, initial
, 0, &new_number
);
1206 test_truth(rc
== MEMCACHED_SUCCESS
);
1207 test_truth(new_number
== (initial
+ 1));
1209 return TEST_SUCCESS
;
1212 static test_return_t
decrement_test(memcached_st
*memc
)
1214 uint64_t new_number
;
1215 memcached_return_t rc
;
1216 const char *key
= "number";
1217 const char *value
= "3";
1219 rc
= memcached_set(memc
, key
, strlen(key
),
1220 value
, strlen(value
),
1221 (time_t)0, (uint32_t)0);
1222 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1224 rc
= memcached_decrement(memc
, key
, strlen(key
),
1226 test_truth(rc
== MEMCACHED_SUCCESS
);
1227 test_truth(new_number
== 2);
1229 rc
= memcached_decrement(memc
, key
, strlen(key
),
1231 test_truth(rc
== MEMCACHED_SUCCESS
);
1232 test_truth(new_number
== 1);
1234 return TEST_SUCCESS
;
1237 static test_return_t
decrement_with_initial_test(memcached_st
*memc
)
1239 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1241 uint64_t new_number
;
1242 memcached_return_t rc
;
1243 const char *key
= "number";
1244 uint64_t initial
= 3;
1246 rc
= memcached_decrement_with_initial(memc
, key
, strlen(key
),
1247 1, initial
, 0, &new_number
);
1248 test_truth(rc
== MEMCACHED_SUCCESS
);
1249 test_truth(new_number
== initial
);
1251 rc
= memcached_decrement_with_initial(memc
, key
, strlen(key
),
1252 1, initial
, 0, &new_number
);
1253 test_truth(rc
== MEMCACHED_SUCCESS
);
1254 test_truth(new_number
== (initial
- 1));
1256 return TEST_SUCCESS
;
1259 static test_return_t
increment_by_key_test(memcached_st
*memc
)
1261 uint64_t new_number
;
1262 memcached_return_t rc
;
1263 const char *master_key
= "foo";
1264 const char *key
= "number";
1265 const char *value
= "0";
1267 rc
= memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1269 value
, strlen(value
),
1270 (time_t)0, (uint32_t)0);
1271 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1273 rc
= memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
),
1275 test_truth(rc
== MEMCACHED_SUCCESS
);
1276 test_truth(new_number
== 1);
1278 rc
= memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
),
1280 test_truth(rc
== MEMCACHED_SUCCESS
);
1281 test_truth(new_number
== 2);
1283 return TEST_SUCCESS
;
1286 static test_return_t
increment_with_initial_by_key_test(memcached_st
*memc
)
1288 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1290 uint64_t new_number
;
1291 memcached_return_t rc
;
1292 const char *master_key
= "foo";
1293 const char *key
= "number";
1294 uint64_t initial
= 0;
1296 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1298 1, initial
, 0, &new_number
);
1299 test_truth(rc
== MEMCACHED_SUCCESS
);
1300 test_truth(new_number
== initial
);
1302 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1304 1, initial
, 0, &new_number
);
1305 test_truth(rc
== MEMCACHED_SUCCESS
);
1306 test_truth(new_number
== (initial
+ 1));
1308 return TEST_SUCCESS
;
1311 static test_return_t
decrement_by_key_test(memcached_st
*memc
)
1313 uint64_t new_number
;
1314 memcached_return_t rc
;
1315 const char *master_key
= "foo";
1316 const char *key
= "number";
1317 const char *value
= "3";
1319 rc
= memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1321 value
, strlen(value
),
1322 (time_t)0, (uint32_t)0);
1323 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1325 rc
= memcached_decrement_by_key(memc
, master_key
, strlen(master_key
),
1328 test_truth(rc
== MEMCACHED_SUCCESS
);
1329 test_truth(new_number
== 2);
1331 rc
= memcached_decrement_by_key(memc
, master_key
, strlen(master_key
),
1334 test_truth(rc
== MEMCACHED_SUCCESS
);
1335 test_truth(new_number
== 1);
1337 return TEST_SUCCESS
;
1340 static test_return_t
decrement_with_initial_by_key_test(memcached_st
*memc
)
1342 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1344 uint64_t new_number
;
1345 memcached_return_t rc
;
1346 const char *master_key
= "foo";
1347 const char *key
= "number";
1348 uint64_t initial
= 3;
1350 rc
= memcached_decrement_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1352 1, initial
, 0, &new_number
);
1353 test_truth(rc
== MEMCACHED_SUCCESS
);
1354 test_truth(new_number
== initial
);
1356 rc
= memcached_decrement_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1358 1, initial
, 0, &new_number
);
1359 test_truth(rc
== MEMCACHED_SUCCESS
);
1360 test_truth(new_number
== (initial
- 1));
1362 return TEST_SUCCESS
;
1365 static test_return_t
quit_test(memcached_st
*memc
)
1367 memcached_return_t rc
;
1368 const char *key
= "fudge";
1369 const char *value
= "sanford and sun";
1371 rc
= memcached_set(memc
, key
, strlen(key
),
1372 value
, strlen(value
),
1373 (time_t)10, (uint32_t)3);
1374 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1375 memcached_quit(memc
);
1377 rc
= memcached_set(memc
, key
, strlen(key
),
1378 value
, strlen(value
),
1379 (time_t)50, (uint32_t)9);
1380 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1382 return TEST_SUCCESS
;
1385 static test_return_t
mget_result_test(memcached_st
*memc
)
1387 memcached_return_t rc
;
1388 const char *keys
[]= {"fudge", "son", "food"};
1389 size_t key_length
[]= {5, 3, 4};
1392 memcached_result_st results_obj
;
1393 memcached_result_st
*results
;
1395 results
= memcached_result_create(memc
, &results_obj
);
1396 test_truth(results
);
1397 test_truth(&results_obj
== results
);
1399 /* We need to empty the server before continueing test */
1400 rc
= memcached_flush(memc
, 0);
1401 test_truth(rc
== MEMCACHED_SUCCESS
);
1403 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1404 test_truth(rc
== MEMCACHED_SUCCESS
);
1406 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)) != NULL
)
1408 test_truth(results
);
1411 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)) != NULL
)
1412 test_truth(!results
);
1413 test_truth(rc
== MEMCACHED_END
);
1415 for (x
= 0; x
< 3; x
++)
1417 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1418 keys
[x
], key_length
[x
],
1419 (time_t)50, (uint32_t)9);
1420 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1423 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1424 test_truth(rc
== MEMCACHED_SUCCESS
);
1426 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1428 test_truth(results
);
1429 test_truth(&results_obj
== results
);
1430 test_truth(rc
== MEMCACHED_SUCCESS
);
1431 test_truth(memcached_result_key_length(results
) == memcached_result_length(results
));
1432 test_truth(!memcmp(memcached_result_key_value(results
),
1433 memcached_result_value(results
),
1434 memcached_result_length(results
)));
1437 memcached_result_free(&results_obj
);
1439 return TEST_SUCCESS
;
1442 static test_return_t
mget_result_alloc_test(memcached_st
*memc
)
1444 memcached_return_t rc
;
1445 const char *keys
[]= {"fudge", "son", "food"};
1446 size_t key_length
[]= {5, 3, 4};
1449 memcached_result_st
*results
;
1451 /* We need to empty the server before continueing test */
1452 rc
= memcached_flush(memc
, 0);
1453 test_truth(rc
== MEMCACHED_SUCCESS
);
1455 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1456 test_truth(rc
== MEMCACHED_SUCCESS
);
1458 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)) != NULL
)
1460 test_truth(results
);
1462 test_truth(!results
);
1463 test_truth(rc
== MEMCACHED_END
);
1465 for (x
= 0; x
< 3; x
++)
1467 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1468 keys
[x
], key_length
[x
],
1469 (time_t)50, (uint32_t)9);
1470 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1473 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1474 test_truth(rc
== MEMCACHED_SUCCESS
);
1477 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1479 test_truth(results
);
1480 test_truth(rc
== MEMCACHED_SUCCESS
);
1481 test_truth(memcached_result_key_length(results
) == memcached_result_length(results
));
1482 test_truth(!memcmp(memcached_result_key_value(results
),
1483 memcached_result_value(results
),
1484 memcached_result_length(results
)));
1485 memcached_result_free(results
);
1489 return TEST_SUCCESS
;
1492 /* Count the results */
1493 static memcached_return_t
callback_counter(memcached_st
*ptr
__attribute__((unused
)),
1494 memcached_result_st
*result
__attribute__((unused
)),
1497 unsigned int *counter
= (unsigned int *)context
;
1499 *counter
= *counter
+ 1;
1501 return MEMCACHED_SUCCESS
;
1504 static test_return_t
mget_result_function(memcached_st
*memc
)
1506 memcached_return_t rc
;
1507 const char *keys
[]= {"fudge", "son", "food"};
1508 size_t key_length
[]= {5, 3, 4};
1510 unsigned int counter
;
1511 memcached_execute_fn callbacks
[1];
1513 /* We need to empty the server before continueing test */
1514 rc
= memcached_flush(memc
, 0);
1515 for (x
= 0; x
< 3; x
++)
1517 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1518 keys
[x
], key_length
[x
],
1519 (time_t)50, (uint32_t)9);
1520 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1523 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1524 test_truth(rc
== MEMCACHED_SUCCESS
);
1526 callbacks
[0]= &callback_counter
;
1528 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
1530 test_truth(counter
== 3);
1532 return TEST_SUCCESS
;
1535 static test_return_t
mget_test(memcached_st
*memc
)
1537 memcached_return_t rc
;
1538 const char *keys
[]= {"fudge", "son", "food"};
1539 size_t key_length
[]= {5, 3, 4};
1543 char return_key
[MEMCACHED_MAX_KEY
];
1544 size_t return_key_length
;
1546 size_t return_value_length
;
1548 /* We need to empty the server before continueing test */
1549 rc
= memcached_flush(memc
, 0);
1550 test_truth(rc
== MEMCACHED_SUCCESS
);
1552 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1553 test_truth(rc
== MEMCACHED_SUCCESS
);
1555 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1556 &return_value_length
, &flags
, &rc
)) != NULL
)
1558 test_truth(return_value
);
1560 test_truth(!return_value
);
1561 test_truth(return_value_length
== 0);
1562 test_truth(rc
== MEMCACHED_END
);
1564 for (x
= 0; x
< 3; x
++)
1566 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1567 keys
[x
], key_length
[x
],
1568 (time_t)50, (uint32_t)9);
1569 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1572 rc
= memcached_mget(memc
, keys
, key_length
, 3);
1573 test_truth(rc
== MEMCACHED_SUCCESS
);
1576 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1577 &return_value_length
, &flags
, &rc
)))
1579 test_truth(return_value
);
1580 test_truth(rc
== MEMCACHED_SUCCESS
);
1581 test_truth(return_key_length
== return_value_length
);
1582 test_truth(!memcmp(return_value
, return_key
, return_value_length
));
1587 return TEST_SUCCESS
;
1590 static test_return_t
mget_execute(memcached_st
*memc
)
1593 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1597 * I only want to hit _one_ server so I know the number of requests I'm
1598 * sending in the pipeline.
1600 uint32_t number_of_hosts
= memc
->number_of_hosts
;
1601 memc
->number_of_hosts
= 1;
1603 int max_keys
= binary
? 20480 : 1;
1606 char **keys
= calloc((size_t)max_keys
, sizeof(char*));
1607 size_t *key_length
=calloc((size_t)max_keys
, sizeof(size_t));
1609 /* First add all of the items.. */
1610 char blob
[1024] = {0};
1611 memcached_return_t rc
;
1612 for (int x
= 0; x
< max_keys
; ++x
)
1615 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
1617 test_truth(keys
[x
] != NULL
);
1618 rc
= memcached_add(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
1619 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1622 /* Try to get all of them with a large multiget */
1623 unsigned int counter
= 0;
1624 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
1625 rc
= memcached_mget_execute(memc
, (const char**)keys
, key_length
,
1626 (size_t)max_keys
, callbacks
, &counter
, 1);
1630 test_truth(rc
== MEMCACHED_SUCCESS
);
1632 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
1633 test_truth(rc
== MEMCACHED_END
);
1635 /* Verify that we got all of the items */
1636 test_truth(counter
== (unsigned int)max_keys
);
1640 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
1641 test_truth(counter
== 0);
1644 /* Release all allocated resources */
1645 for (int x
= 0; x
< max_keys
; ++x
)
1650 memc
->number_of_hosts
= number_of_hosts
;
1651 return TEST_SUCCESS
;
1654 static test_return_t
get_stats_keys(memcached_st
*memc
)
1658 memcached_stat_st memc_stat
;
1659 memcached_return_t rc
;
1661 stat_list
= memcached_stat_get_keys(memc
, &memc_stat
, &rc
);
1662 test_truth(rc
== MEMCACHED_SUCCESS
);
1663 for (ptr
= stat_list
; *ptr
; ptr
++)
1669 return TEST_SUCCESS
;
1672 static test_return_t
version_string_test(memcached_st
*memc
__attribute__((unused
)))
1674 const char *version_string
;
1676 version_string
= memcached_lib_version();
1678 test_truth(!strcmp(version_string
, LIBMEMCACHED_VERSION_STRING
));
1680 return TEST_SUCCESS
;
1683 static test_return_t
get_stats(memcached_st
*memc
)
1688 memcached_return_t rc
;
1689 memcached_stat_st
*memc_stat
;
1691 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
1692 test_truth(rc
== MEMCACHED_SUCCESS
);
1694 test_truth(rc
== MEMCACHED_SUCCESS
);
1695 test_truth(memc_stat
);
1697 for (x
= 0; x
< memcached_server_count(memc
); x
++)
1699 stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
1700 test_truth(rc
== MEMCACHED_SUCCESS
);
1701 for (ptr
= stat_list
; *ptr
; ptr
++);
1706 memcached_stat_free(NULL
, memc_stat
);
1708 return TEST_SUCCESS
;
1711 static test_return_t
add_host_test(memcached_st
*memc
)
1714 memcached_server_st
*servers
;
1715 memcached_return_t rc
;
1716 char servername
[]= "0.example.com";
1718 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
1719 test_truth(servers
);
1720 test_truth(1 == memcached_server_list_count(servers
));
1722 for (x
= 2; x
< 20; x
++)
1724 char buffer
[SMALL_STRING_LEN
];
1726 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
1727 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
1729 test_truth(rc
== MEMCACHED_SUCCESS
);
1730 test_truth(x
== memcached_server_list_count(servers
));
1733 rc
= memcached_server_push(memc
, servers
);
1734 test_truth(rc
== MEMCACHED_SUCCESS
);
1735 rc
= memcached_server_push(memc
, servers
);
1736 test_truth(rc
== MEMCACHED_SUCCESS
);
1738 memcached_server_list_free(servers
);
1740 return TEST_SUCCESS
;
1743 static memcached_return_t
clone_test_callback(memcached_st
*parent
__attribute__((unused
)), memcached_st
*memc_clone
__attribute__((unused
)))
1745 return MEMCACHED_SUCCESS
;
1748 static memcached_return_t
cleanup_test_callback(memcached_st
*ptr
__attribute__((unused
)))
1750 return MEMCACHED_SUCCESS
;
1753 static test_return_t
callback_test(memcached_st
*memc
)
1755 /* Test User Data */
1759 memcached_return_t rc
;
1761 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
);
1762 test_truth(rc
== MEMCACHED_SUCCESS
);
1763 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
1764 test_truth(*test_ptr
== x
);
1767 /* Test Clone Callback */
1769 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
1770 void *clone_cb_ptr
= *(void **)&clone_cb
;
1771 void *temp_function
= NULL
;
1772 memcached_return_t rc
;
1774 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1776 test_truth(rc
== MEMCACHED_SUCCESS
);
1777 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1778 test_truth(temp_function
== clone_cb_ptr
);
1781 /* Test Cleanup Callback */
1783 memcached_cleanup_fn cleanup_cb
=
1784 (memcached_cleanup_fn
)cleanup_test_callback
;
1785 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
1786 void *temp_function
= NULL
;
1787 memcached_return_t rc
;
1789 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
1791 test_truth(rc
== MEMCACHED_SUCCESS
);
1792 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1793 test_truth(temp_function
== cleanup_cb_ptr
);
1796 return TEST_SUCCESS
;
1799 /* We don't test the behavior itself, we test the switches */
1800 static test_return_t
behavior_test(memcached_st
*memc
)
1805 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1806 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1807 test_truth(value
== 1);
1809 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1810 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1811 test_truth(value
== 1);
1813 set
= MEMCACHED_HASH_MD5
;
1814 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1815 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1816 test_truth(value
== MEMCACHED_HASH_MD5
);
1820 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
1821 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
1822 test_truth(value
== 0);
1824 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
1825 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
1826 test_truth(value
== 0);
1828 set
= MEMCACHED_HASH_DEFAULT
;
1829 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1830 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1831 test_truth(value
== MEMCACHED_HASH_DEFAULT
);
1833 set
= MEMCACHED_HASH_CRC
;
1834 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
1835 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
1836 test_truth(value
== MEMCACHED_HASH_CRC
);
1838 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1839 test_truth(value
> 0);
1841 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1842 test_truth(value
> 0);
1844 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
1845 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+ 1);
1846 test_truth((value
+ 1) == memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
));
1847 return TEST_SUCCESS
;
1850 static test_return_t
fetch_all_results(memcached_st
*memc
)
1852 memcached_return_t rc
= MEMCACHED_SUCCESS
;
1853 char return_key
[MEMCACHED_MAX_KEY
];
1854 size_t return_key_length
;
1856 size_t return_value_length
;
1859 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1860 &return_value_length
, &flags
, &rc
)))
1862 test_truth(return_value
);
1863 test_truth(rc
== MEMCACHED_SUCCESS
);
1867 return ((rc
== MEMCACHED_END
) || (rc
== MEMCACHED_SUCCESS
)) ? TEST_SUCCESS
: TEST_FAILURE
;
1870 /* Test case provided by Cal Haldenbrand */
1871 static test_return_t
user_supplied_bug1(memcached_st
*memc
)
1873 unsigned int setter
= 1;
1876 unsigned long long total
= 0;
1879 char randomstuff
[6 * 1024];
1880 memcached_return_t rc
;
1882 memset(randomstuff
, 0, 6 * 1024);
1884 /* We just keep looking at the same values over and over */
1887 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1888 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1892 for (x
= 0 ; total
< 20 * 1024576 ; x
++ )
1896 size
= (uint32_t)(rand() % ( 5 * 1024 ) ) + 400;
1897 memset(randomstuff
, 0, 6 * 1024);
1898 test_truth(size
< 6 * 1024); /* Being safe here */
1900 for (j
= 0 ; j
< size
;j
++)
1901 randomstuff
[j
] = (signed char) ((rand() % 26) + 97);
1904 sprintf(key
, "%d", x
);
1905 rc
= memcached_set(memc
, key
, strlen(key
),
1906 randomstuff
, strlen(randomstuff
), 10, 0);
1907 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1908 /* If we fail, lets try again */
1909 if (rc
!= MEMCACHED_SUCCESS
&& rc
!= MEMCACHED_BUFFERED
)
1910 rc
= memcached_set(memc
, key
, strlen(key
),
1911 randomstuff
, strlen(randomstuff
), 10, 0);
1912 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1915 return TEST_SUCCESS
;
1918 /* Test case provided by Cal Haldenbrand */
1919 static test_return_t
user_supplied_bug2(memcached_st
*memc
)
1922 unsigned int setter
;
1924 unsigned long long total
;
1927 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1928 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1930 setter
= 20 * 1024576;
1931 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
1932 setter
= 20 * 1024576;
1933 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
1934 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1935 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1937 for (x
= 0, errors
= 0, total
= 0 ; total
< 20 * 1024576 ; x
++)
1940 for (x
= 0, errors
= 0, total
= 0 ; total
< 24576 ; x
++)
1942 memcached_return_t rc
= MEMCACHED_SUCCESS
;
1943 char buffer
[SMALL_STRING_LEN
];
1948 memset(buffer
, 0, SMALL_STRING_LEN
);
1950 snprintf(buffer
, SMALL_STRING_LEN
, "%u", x
);
1951 getval
= memcached_get(memc
, buffer
, strlen(buffer
),
1952 &val_len
, &flags
, &rc
);
1953 if (rc
!= MEMCACHED_SUCCESS
)
1955 if (rc
== MEMCACHED_NOTFOUND
)
1969 return TEST_SUCCESS
;
1972 /* Do a large mget() over all the keys we think exist */
1973 #define KEY_COUNT 3000 // * 1024576
1974 static test_return_t
user_supplied_bug3(memcached_st
*memc
)
1976 memcached_return_t rc
;
1977 unsigned int setter
;
1980 size_t key_lengths
[KEY_COUNT
];
1983 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
1984 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
1986 setter
= 20 * 1024576;
1987 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
1988 setter
= 20 * 1024576;
1989 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
1990 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
1991 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
1994 keys
= calloc(KEY_COUNT
, sizeof(char *));
1996 for (x
= 0; x
< KEY_COUNT
; x
++)
2000 snprintf(buffer
, 30, "%u", x
);
2001 keys
[x
]= strdup(buffer
);
2002 key_lengths
[x
]= strlen(keys
[x
]);
2005 rc
= memcached_mget(memc
, (const char **)keys
, key_lengths
, KEY_COUNT
);
2006 test_truth(rc
== MEMCACHED_SUCCESS
);
2008 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
2010 for (x
= 0; x
< KEY_COUNT
; x
++)
2014 return TEST_SUCCESS
;
2017 /* Make sure we behave properly if server list has no values */
2018 static test_return_t
user_supplied_bug4(memcached_st
*memc
)
2020 memcached_return_t rc
;
2021 const char *keys
[]= {"fudge", "son", "food"};
2022 size_t key_length
[]= {5, 3, 4};
2025 char return_key
[MEMCACHED_MAX_KEY
];
2026 size_t return_key_length
;
2028 size_t return_value_length
;
2030 /* Here we free everything before running a bunch of mget tests */
2032 memcached_server_list_free(memc
->hosts
);
2034 memc
->number_of_hosts
= 0;
2038 /* We need to empty the server before continueing test */
2039 rc
= memcached_flush(memc
, 0);
2040 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2042 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2043 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2045 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2046 &return_value_length
, &flags
, &rc
)) != NULL
)
2048 test_truth(return_value
);
2050 test_truth(!return_value
);
2051 test_truth(return_value_length
== 0);
2052 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2054 for (x
= 0; x
< 3; x
++)
2056 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2057 keys
[x
], key_length
[x
],
2058 (time_t)50, (uint32_t)9);
2059 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2062 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2063 test_truth(rc
== MEMCACHED_NO_SERVERS
);
2066 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2067 &return_value_length
, &flags
, &rc
)))
2069 test_truth(return_value
);
2070 test_truth(rc
== MEMCACHED_SUCCESS
);
2071 test_truth(return_key_length
== return_value_length
);
2072 test_truth(!memcmp(return_value
, return_key
, return_value_length
));
2077 return TEST_SUCCESS
;
2080 #define VALUE_SIZE_BUG5 1048064
2081 static test_return_t
user_supplied_bug5(memcached_st
*memc
)
2083 memcached_return_t rc
;
2084 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2085 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2086 char return_key
[MEMCACHED_MAX_KEY
];
2087 size_t return_key_length
;
2089 size_t value_length
;
2093 char insert_data
[VALUE_SIZE_BUG5
];
2095 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2096 insert_data
[x
]= (signed char)rand();
2098 memcached_flush(memc
, 0);
2099 value
= memcached_get(memc
, keys
[0], key_length
[0],
2100 &value_length
, &flags
, &rc
);
2101 test_truth(value
== NULL
);
2102 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2105 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2106 &value_length
, &flags
, &rc
)))
2108 test_truth(count
== 0);
2110 for (x
= 0; x
< 4; x
++)
2112 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2113 insert_data
, VALUE_SIZE_BUG5
,
2114 (time_t)0, (uint32_t)0);
2115 test_truth(rc
== MEMCACHED_SUCCESS
);
2118 for (x
= 0; x
< 10; x
++)
2120 value
= memcached_get(memc
, keys
[0], key_length
[0],
2121 &value_length
, &flags
, &rc
);
2125 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2127 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2128 &value_length
, &flags
, &rc
)))
2133 test_truth(count
== 4);
2136 return TEST_SUCCESS
;
2139 static test_return_t
user_supplied_bug6(memcached_st
*memc
)
2141 memcached_return_t rc
;
2142 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2143 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2144 char return_key
[MEMCACHED_MAX_KEY
];
2145 size_t return_key_length
;
2147 size_t value_length
;
2151 char insert_data
[VALUE_SIZE_BUG5
];
2153 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2154 insert_data
[x
]= (signed char)rand();
2156 memcached_flush(memc
, 0);
2157 value
= memcached_get(memc
, keys
[0], key_length
[0],
2158 &value_length
, &flags
, &rc
);
2159 test_truth(value
== NULL
);
2160 test_truth(rc
== MEMCACHED_NOTFOUND
);
2161 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2162 test_truth(rc
== MEMCACHED_SUCCESS
);
2165 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2166 &value_length
, &flags
, &rc
)))
2168 test_truth(count
== 0);
2169 test_truth(rc
== MEMCACHED_END
);
2171 for (x
= 0; x
< 4; x
++)
2173 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2174 insert_data
, VALUE_SIZE_BUG5
,
2175 (time_t)0, (uint32_t)0);
2176 test_truth(rc
== MEMCACHED_SUCCESS
);
2179 for (x
= 0; x
< 2; x
++)
2181 value
= memcached_get(memc
, keys
[0], key_length
[0],
2182 &value_length
, &flags
, &rc
);
2186 rc
= memcached_mget(memc
, keys
, key_length
, 4);
2187 test_truth(rc
== MEMCACHED_SUCCESS
);
2189 /* We test for purge of partial complete fetches */
2190 for (count
= 3; count
; count
--)
2192 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2193 &value_length
, &flags
, &rc
);
2194 test_truth(rc
== MEMCACHED_SUCCESS
);
2195 test_truth(!(memcmp(value
, insert_data
, value_length
)));
2196 test_truth(value_length
);
2201 return TEST_SUCCESS
;
2204 static test_return_t
user_supplied_bug8(memcached_st
*memc
__attribute__((unused
)))
2206 memcached_return_t rc
;
2208 memcached_st
*memc_clone
;
2210 memcached_server_st
*servers
;
2211 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";
2213 servers
= memcached_servers_parse(server_list
);
2214 test_truth(servers
);
2216 mine
= memcached_create(NULL
);
2217 rc
= memcached_server_push(mine
, servers
);
2218 test_truth(rc
== MEMCACHED_SUCCESS
);
2219 memcached_server_list_free(servers
);
2222 memc_clone
= memcached_clone(NULL
, mine
);
2224 memcached_quit(mine
);
2225 memcached_quit(memc_clone
);
2228 memcached_free(mine
);
2229 memcached_free(memc_clone
);
2231 return TEST_SUCCESS
;
2234 /* Test flag store/retrieve */
2235 static test_return_t
user_supplied_bug7(memcached_st
*memc
)
2237 memcached_return_t rc
;
2238 const char *keys
= "036790384900";
2239 size_t key_length
= strlen(keys
);
2240 char return_key
[MEMCACHED_MAX_KEY
];
2241 size_t return_key_length
;
2243 size_t value_length
;
2246 char insert_data
[VALUE_SIZE_BUG5
];
2248 for (x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2249 insert_data
[x
]= (signed char)rand();
2251 memcached_flush(memc
, 0);
2254 rc
= memcached_set(memc
, keys
, key_length
,
2255 insert_data
, VALUE_SIZE_BUG5
,
2257 test_truth(rc
== MEMCACHED_SUCCESS
);
2260 value
= memcached_get(memc
, keys
, key_length
,
2261 &value_length
, &flags
, &rc
);
2262 test_truth(flags
== 245);
2266 rc
= memcached_mget(memc
, &keys
, &key_length
, 1);
2269 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2270 &value_length
, &flags
, &rc
);
2271 test_truth(flags
== 245);
2276 return TEST_SUCCESS
;
2279 static test_return_t
user_supplied_bug9(memcached_st
*memc
)
2281 memcached_return_t rc
;
2282 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2283 size_t key_length
[3];
2288 char return_key
[MEMCACHED_MAX_KEY
];
2289 size_t return_key_length
;
2291 size_t return_value_length
;
2294 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2295 key_length
[1]= strlen("fudge&*@#");
2296 key_length
[2]= strlen("for^#@&$not");
2299 for (x
= 0; x
< 3; x
++)
2301 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2302 keys
[x
], key_length
[x
],
2303 (time_t)50, (uint32_t)9);
2304 test_truth(rc
== MEMCACHED_SUCCESS
);
2307 rc
= memcached_mget(memc
, keys
, key_length
, 3);
2308 test_truth(rc
== MEMCACHED_SUCCESS
);
2310 /* We need to empty the server before continueing test */
2311 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2312 &return_value_length
, &flags
, &rc
)) != NULL
)
2314 test_truth(return_value
);
2318 test_truth(count
== 3);
2320 return TEST_SUCCESS
;
2323 /* We are testing with aggressive timeout to get failures */
2324 static test_return_t
user_supplied_bug10(memcached_st
*memc
)
2326 const char *key
= "foo";
2328 size_t value_length
= 512;
2331 memcached_return_t rc
;
2332 unsigned int set
= 1;
2333 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2336 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2337 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2339 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2342 value
= (char*)malloc(value_length
* sizeof(char));
2344 for (x
= 0; x
< value_length
; x
++)
2345 value
[x
]= (char) (x
% 127);
2347 for (x
= 1; x
<= 100000; ++x
)
2349 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2351 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_WRITE_FAILURE
||
2352 rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_TIMEOUT
);
2354 if (rc
== MEMCACHED_WRITE_FAILURE
|| rc
== MEMCACHED_TIMEOUT
)
2359 memcached_free(mclone
);
2361 return TEST_SUCCESS
;
2365 We are looking failures in the async protocol
2367 static test_return_t
user_supplied_bug11(memcached_st
*memc
)
2369 const char *key
= "foo";
2371 size_t value_length
= 512;
2374 memcached_return_t rc
;
2375 unsigned int set
= 1;
2377 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2379 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2380 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2382 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
,
2385 timeout
= (int32_t)memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
2387 test_truth(timeout
== -1);
2389 value
= (char*)malloc(value_length
* sizeof(char));
2391 for (x
= 0; x
< value_length
; x
++)
2392 value
[x
]= (char) (x
% 127);
2394 for (x
= 1; x
<= 100000; ++x
)
2396 rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2400 memcached_free(mclone
);
2402 return TEST_SUCCESS
;
2406 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2408 static test_return_t
user_supplied_bug12(memcached_st
*memc
)
2410 memcached_return_t rc
;
2412 size_t value_length
;
2414 uint64_t number_value
;
2416 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2417 &value_length
, &flags
, &rc
);
2418 test_truth(value
== NULL
);
2419 test_truth(rc
== MEMCACHED_NOTFOUND
);
2421 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2424 test_truth(value
== NULL
);
2425 /* The binary protocol will set the key if it doesn't exist */
2426 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2428 test_truth(rc
== MEMCACHED_SUCCESS
);
2432 test_truth(rc
== MEMCACHED_NOTFOUND
);
2435 rc
= memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
2437 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2438 &value_length
, &flags
, &rc
);
2440 test_truth(rc
== MEMCACHED_SUCCESS
);
2443 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2445 test_truth(number_value
== 2);
2446 test_truth(rc
== MEMCACHED_SUCCESS
);
2448 return TEST_SUCCESS
;
2452 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2453 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2455 static test_return_t
user_supplied_bug13(memcached_st
*memc
)
2457 char key
[] = "key34567890";
2459 memcached_return_t rc
;
2460 size_t overflowSize
;
2462 char commandFirst
[]= "set key34567890 0 0 ";
2463 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2464 size_t commandLength
;
2467 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2469 overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2471 for (testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2473 overflow
= malloc(testSize
);
2474 test_truth(overflow
!= NULL
);
2476 memset(overflow
, 'x', testSize
);
2477 rc
= memcached_set(memc
, key
, strlen(key
),
2478 overflow
, testSize
, 0, 0);
2479 test_truth(rc
== MEMCACHED_SUCCESS
);
2483 return TEST_SUCCESS
;
2488 Test values of many different sizes
2489 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2490 set key34567890 0 0 8169 \r\n
2491 is sent followed by buffer of size 8169, followed by 8169
2493 static test_return_t
user_supplied_bug14(memcached_st
*memc
)
2496 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
2497 memcached_return_t rc
;
2498 const char *key
= "foo";
2500 size_t value_length
= 18000;
2502 size_t string_length
;
2505 size_t current_length
;
2507 value
= (char*)malloc(value_length
);
2510 for (x
= 0; x
< value_length
; x
++)
2511 value
[x
] = (char) (x
% 127);
2513 for (current_length
= 0; current_length
< value_length
; current_length
++)
2515 rc
= memcached_set(memc
, key
, strlen(key
),
2516 value
, current_length
,
2517 (time_t)0, (uint32_t)0);
2518 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
2520 string
= memcached_get(memc
, key
, strlen(key
),
2521 &string_length
, &flags
, &rc
);
2523 test_truth(rc
== MEMCACHED_SUCCESS
);
2524 test_truth(string_length
== current_length
);
2525 test_truth(!memcmp(string
, value
, string_length
));
2532 return TEST_SUCCESS
;
2536 Look for zero length value problems
2538 static test_return_t
user_supplied_bug15(memcached_st
*memc
)
2541 memcached_return_t rc
;
2542 const char *key
= "mykey";
2547 for (x
= 0; x
< 2; x
++)
2549 rc
= memcached_set(memc
, key
, strlen(key
),
2551 (time_t)0, (uint32_t)0);
2553 test_truth(rc
== MEMCACHED_SUCCESS
);
2555 value
= memcached_get(memc
, key
, strlen(key
),
2556 &length
, &flags
, &rc
);
2558 test_truth(rc
== MEMCACHED_SUCCESS
);
2559 test_truth(value
== NULL
);
2560 test_truth(length
== 0);
2561 test_truth(flags
== 0);
2563 value
= memcached_get(memc
, key
, strlen(key
),
2564 &length
, &flags
, &rc
);
2566 test_truth(rc
== MEMCACHED_SUCCESS
);
2567 test_truth(value
== NULL
);
2568 test_truth(length
== 0);
2569 test_truth(flags
== 0);
2572 return TEST_SUCCESS
;
2575 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2576 static test_return_t
user_supplied_bug16(memcached_st
*memc
)
2578 memcached_return_t rc
;
2579 const char *key
= "mykey";
2584 rc
= memcached_set(memc
, key
, strlen(key
),
2586 (time_t)0, UINT32_MAX
);
2588 test_truth(rc
== MEMCACHED_SUCCESS
);
2590 value
= memcached_get(memc
, key
, strlen(key
),
2591 &length
, &flags
, &rc
);
2593 test_truth(rc
== MEMCACHED_SUCCESS
);
2594 test_truth(value
== NULL
);
2595 test_truth(length
== 0);
2596 test_truth(flags
== UINT32_MAX
);
2598 return TEST_SUCCESS
;
2602 /* Check the validity of chinese key*/
2603 static test_return_t
user_supplied_bug17(memcached_st
*memc
)
2605 memcached_return_t rc
;
2606 const char *key
= "豆瓣";
2607 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2612 rc
= memcached_set(memc
, key
, strlen(key
),
2613 value
, strlen(value
),
2616 test_truth(rc
== MEMCACHED_SUCCESS
);
2618 value2
= memcached_get(memc
, key
, strlen(key
),
2619 &length
, &flags
, &rc
);
2621 test_truth(length
==strlen(value
));
2622 test_truth(rc
== MEMCACHED_SUCCESS
);
2623 test_truth(memcmp(value
, value2
, length
)==0);
2626 return TEST_SUCCESS
;
2634 static test_return_t
user_supplied_bug19(memcached_st
*memc
)
2637 memcached_server_st
*s
;
2638 memcached_return_t res
;
2642 m
= memcached_create(NULL
);
2643 memcached_server_add_with_weight(m
, "localhost", 11311, 100);
2644 memcached_server_add_with_weight(m
, "localhost", 11312, 100);
2646 s
= memcached_server_by_key(m
, "a", 1, &res
);
2647 memcached_server_free(s
);
2651 return TEST_SUCCESS
;
2654 /* CAS test from Andei */
2655 static test_return_t
user_supplied_bug20(memcached_st
*memc
)
2657 memcached_return_t status
;
2658 memcached_result_st
*result
, result_obj
;
2659 const char *key
= "abc";
2660 size_t key_len
= strlen("abc");
2661 const char *value
= "foobar";
2662 size_t value_len
= strlen(value
);
2664 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
2666 status
= memcached_set(memc
, key
, key_len
, value
, value_len
, (time_t)0, (uint32_t)0);
2667 test_truth(status
== MEMCACHED_SUCCESS
);
2669 status
= memcached_mget(memc
, &key
, &key_len
, 1);
2670 test_truth(status
== MEMCACHED_SUCCESS
);
2672 result
= memcached_result_create(memc
, &result_obj
);
2675 memcached_result_create(memc
, &result_obj
);
2676 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2679 test_truth(status
== MEMCACHED_SUCCESS
);
2681 memcached_result_free(result
);
2683 return TEST_SUCCESS
;
2686 #include "ketama_test_cases.h"
2687 static test_return_t
user_supplied_bug18(memcached_st
*trash
)
2689 memcached_return_t rc
;
2692 memcached_server_st
*server_pool
;
2697 memc
= memcached_create(NULL
);
2700 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2701 test_truth(rc
== MEMCACHED_SUCCESS
);
2703 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2704 test_truth(value
== 1);
2706 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2707 test_truth(rc
== MEMCACHED_SUCCESS
);
2709 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2710 test_truth(value
== MEMCACHED_HASH_MD5
);
2712 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");
2713 memcached_server_push(memc
, server_pool
);
2715 /* verify that the server list was parsed okay. */
2716 test_truth(memc
->number_of_hosts
== 8);
2717 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2718 test_truth(server_pool
[0].port
== 11211);
2719 test_truth(server_pool
[0].weight
== 600);
2720 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2721 test_truth(server_pool
[2].port
== 11211);
2722 test_truth(server_pool
[2].weight
== 200);
2723 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2724 test_truth(server_pool
[7].port
== 11211);
2725 test_truth(server_pool
[7].weight
== 100);
2727 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
2728 * us test the boundary wraparound.
2730 test_truth(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
2732 /* verify the standard ketama set. */
2733 for (x
= 0; x
< 99; x
++)
2735 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2736 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2737 test_truth(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
2740 memcached_server_list_free(server_pool
);
2741 memcached_free(memc
);
2743 return TEST_SUCCESS
;
2746 /* Large mget() of missing keys with binary proto
2748 * If many binary quiet commands (such as getq's in an mget) fill the output
2749 * buffer and the server chooses not to respond, memcached_flush hangs. See
2750 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2753 /* sighandler_t function that always asserts false */
2754 static void fail(int unused
__attribute__((unused
)))
2760 static test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2762 memcached_return_t rc
;
2765 size_t* key_lengths
;
2766 void (*oldalarm
)(int);
2767 memcached_st
*memc_clone
;
2769 memc_clone
= memcached_clone(NULL
, memc
);
2770 test_truth(memc_clone
);
2772 /* only binproto uses getq for mget */
2773 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
2775 /* empty the cache to ensure misses (hence non-responses) */
2776 rc
= memcached_flush(memc_clone
, 0);
2777 test_truth(rc
== MEMCACHED_SUCCESS
);
2779 key_lengths
= calloc(key_count
, sizeof(size_t));
2780 keys
= calloc(key_count
, sizeof(char *));
2782 for (x
= 0; x
< key_count
; x
++)
2786 snprintf(buffer
, 30, "%u", x
);
2787 keys
[x
]= strdup(buffer
);
2788 key_lengths
[x
]= strlen(keys
[x
]);
2791 oldalarm
= signal(SIGALRM
, fail
);
2794 rc
= memcached_mget(memc_clone
, (const char **)keys
, key_lengths
, key_count
);
2795 test_truth(rc
== MEMCACHED_SUCCESS
);
2798 signal(SIGALRM
, oldalarm
);
2800 test_truth(fetch_all_results(memc
) == TEST_SUCCESS
);
2802 for (x
= 0; x
< key_count
; x
++)
2807 memcached_free(memc_clone
);
2809 return TEST_SUCCESS
;
2812 static test_return_t
pre_binary(memcached_st
*memc
);
2814 static test_return_t
user_supplied_bug21(memcached_st
*memc
)
2816 if (pre_binary(memc
) != MEMCACHED_SUCCESS
)
2817 return TEST_SKIPPED
;
2821 /* should work as of r580 */
2822 rc
= _user_supplied_bug21(memc
, 10);
2823 test_truth(rc
== TEST_SUCCESS
);
2825 /* should fail as of r580 */
2826 rc
= _user_supplied_bug21(memc
, 1000);
2827 test_truth(rc
== TEST_SUCCESS
);
2829 return TEST_SUCCESS
;
2832 static test_return_t
auto_eject_hosts(memcached_st
*trash
)
2836 memcached_return_t rc
;
2837 memcached_st
*memc
= memcached_create(NULL
);
2840 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2841 test_truth(rc
== MEMCACHED_SUCCESS
);
2843 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2844 test_truth(value
== 1);
2846 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2847 test_truth(rc
== MEMCACHED_SUCCESS
);
2849 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2850 test_truth(value
== MEMCACHED_HASH_MD5
);
2852 /* server should be removed when in delay */
2853 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
, 1);
2854 test_truth(rc
== MEMCACHED_SUCCESS
);
2856 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS
);
2857 test_truth(value
== 1);
2859 memcached_server_st
*server_pool
;
2860 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");
2861 memcached_server_push(memc
, server_pool
);
2863 /* verify that the server list was parsed okay. */
2864 test_truth(memc
->number_of_hosts
== 8);
2865 test_truth(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
2866 test_truth(server_pool
[0].port
== 11211);
2867 test_truth(server_pool
[0].weight
== 600);
2868 test_truth(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
2869 test_truth(server_pool
[2].port
== 11211);
2870 test_truth(server_pool
[2].weight
== 200);
2871 test_truth(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
2872 test_truth(server_pool
[7].port
== 11211);
2873 test_truth(server_pool
[7].weight
== 100);
2875 memc
->hosts
[2].next_retry
= time(NULL
) + 15;
2876 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2878 for (int x
= 0; x
< 99; x
++)
2880 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2881 test_truth(server_idx
!= 2);
2884 /* and re-added when it's back. */
2885 memc
->hosts
[2].next_retry
= time(NULL
) - 1;
2886 memc
->next_distribution_rebuild
= time(NULL
) - 1;
2887 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
,
2888 memc
->distribution
);
2889 for (int x
= 0; x
< 99; x
++)
2891 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
2892 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2893 test_truth(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
2896 memcached_server_list_free(server_pool
);
2897 memcached_free(memc
);
2899 return TEST_SUCCESS
;
2902 static test_return_t
output_ketama_weighted_keys(memcached_st
*trash
)
2906 memcached_return_t rc
;
2907 memcached_st
*memc
= memcached_create(NULL
);
2911 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
2912 test_truth(rc
== MEMCACHED_SUCCESS
);
2914 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2915 test_truth(value
== 1);
2917 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
);
2918 test_truth(rc
== MEMCACHED_SUCCESS
);
2920 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2921 test_truth(value
== MEMCACHED_HASH_MD5
);
2924 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
,
2925 MEMCACHED_KETAMA_COMPAT_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 unsigned int 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
);
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 assert(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
;
3520 static test_return_t
pre_replication(memcached_st
*memc
)
3522 if (pre_binary(memc
) != TEST_SUCCESS
)
3523 return TEST_FAILURE
;
3526 * Make sure that we store the item on all servers
3527 * (master + replicas == number of servers)
3529 memcached_return_t rc
;
3530 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
,
3531 memc
->number_of_hosts
- 1);
3532 test_truth(rc
== MEMCACHED_SUCCESS
);
3533 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
) == memc
->number_of_hosts
- 1);
3535 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3538 static test_return_t
pre_replication_noblock(memcached_st
*memc
)
3540 test_return_t rc
= MEMCACHED_FAILURE
;
3541 if (pre_replication(memc
) == TEST_SUCCESS
&&
3542 pre_nonblock(memc
) == TEST_SUCCESS
)
3548 static void my_free(memcached_st
*ptr
__attribute__((unused
)), void *mem
)
3553 static void *my_malloc(memcached_st
*ptr
__attribute__((unused
)), const size_t size
)
3555 void *ret
= malloc(size
);
3557 memset(ret
, 0xff, size
);
3562 static void *my_realloc(memcached_st
*ptr
__attribute__((unused
)), void *mem
, const size_t size
)
3564 return realloc(mem
, size
);
3567 static void *my_calloc(memcached_st
*ptr
__attribute__((unused
)), size_t nelem
, const size_t size
)
3569 return calloc(nelem
, size
);
3572 static test_return_t
set_prefix(memcached_st
*memc
)
3574 memcached_return_t rc
;
3575 const char *key
= "mine";
3578 /* Make sure be default none exists */
3579 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3580 test_truth(rc
== MEMCACHED_FAILURE
);
3582 /* Test a clean set */
3583 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3584 test_truth(rc
== MEMCACHED_SUCCESS
);
3586 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3587 test_truth(memcmp(value
, key
, 4) == 0);
3588 test_truth(rc
== MEMCACHED_SUCCESS
);
3590 /* Test that we can turn it off */
3591 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3592 test_truth(rc
== MEMCACHED_SUCCESS
);
3594 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3595 test_truth(rc
== MEMCACHED_FAILURE
);
3597 /* Now setup for main test */
3598 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)key
);
3599 test_truth(rc
== MEMCACHED_SUCCESS
);
3601 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3602 test_truth(rc
== MEMCACHED_SUCCESS
);
3603 test_truth(memcmp(value
, key
, 4) == 0);
3605 /* Set to Zero, and then Set to something too large */
3608 memset(long_key
, 0, 255);
3610 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, NULL
);
3611 test_truth(rc
== MEMCACHED_SUCCESS
);
3613 value
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, &rc
);
3614 test_truth(rc
== MEMCACHED_FAILURE
);
3615 test_truth(value
== NULL
);
3617 /* Test a long key for failure */
3618 /* TODO, extend test to determine based on setting, what result should be */
3619 strcpy(long_key
, "Thisismorethentheallottednumberofcharacters");
3620 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3621 //test_truth(rc == MEMCACHED_BAD_KEY_PROVIDED);
3622 test_truth(rc
== MEMCACHED_SUCCESS
);
3624 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3625 strcpy(long_key
, "This is more then the allotted number of characters");
3626 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3627 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3629 /* Test for a bad prefix, but with a short key */
3630 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1);
3631 test_truth(rc
== MEMCACHED_SUCCESS
);
3633 strcpy(long_key
, "dog cat");
3634 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, long_key
);
3635 test_truth(rc
== MEMCACHED_BAD_KEY_PROVIDED
);
3638 return TEST_SUCCESS
;
3641 #ifdef MEMCACHED_ENABLE_DEPRECATED
3642 static test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
3644 void *test_ptr
= NULL
;
3647 memcached_malloc_fn malloc_cb
=
3648 (memcached_malloc_fn
)my_malloc
;
3649 cb_ptr
= *(void **)&malloc_cb
;
3650 memcached_return_t rc
;
3652 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
);
3653 test_truth(rc
== MEMCACHED_SUCCESS
);
3654 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3655 test_truth(rc
== MEMCACHED_SUCCESS
);
3656 test_truth(test_ptr
== cb_ptr
);
3660 memcached_realloc_fn realloc_cb
=
3661 (memcached_realloc_fn
)my_realloc
;
3662 cb_ptr
= *(void **)&realloc_cb
;
3663 memcached_return_t rc
;
3665 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
);
3666 test_truth(rc
== MEMCACHED_SUCCESS
);
3667 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3668 test_truth(rc
== MEMCACHED_SUCCESS
);
3669 test_truth(test_ptr
== cb_ptr
);
3673 memcached_free_fn free_cb
=
3674 (memcached_free_fn
)my_free
;
3675 cb_ptr
= *(void **)&free_cb
;
3676 memcached_return_t rc
;
3678 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
);
3679 test_truth(rc
== MEMCACHED_SUCCESS
);
3680 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3681 test_truth(rc
== MEMCACHED_SUCCESS
);
3682 test_truth(test_ptr
== cb_ptr
);
3685 return TEST_SUCCESS
;
3689 static test_return_t
set_memory_alloc(memcached_st
*memc
)
3691 memcached_return_t rc
;
3692 rc
= memcached_set_memory_allocators(memc
, NULL
, my_free
,
3693 my_realloc
, my_calloc
);
3694 test_truth(rc
== MEMCACHED_FAILURE
);
3696 rc
= memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3697 my_realloc
, my_calloc
);
3699 memcached_malloc_fn mem_malloc
;
3700 memcached_free_fn mem_free
;
3701 memcached_realloc_fn mem_realloc
;
3702 memcached_calloc_fn mem_calloc
;
3703 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3704 &mem_realloc
, &mem_calloc
);
3706 test_truth(mem_malloc
== my_malloc
);
3707 test_truth(mem_realloc
== my_realloc
);
3708 test_truth(mem_calloc
== my_calloc
);
3709 test_truth(mem_free
== my_free
);
3711 return TEST_SUCCESS
;
3714 static test_return_t
enable_consistent(memcached_st
*memc
)
3717 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3718 memcached_hash_t hash
;
3719 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3720 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3723 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3724 test_truth(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3726 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3728 if (hash
!= MEMCACHED_HASH_HSIEH
)
3729 return TEST_SKIPPED
;
3732 return TEST_SUCCESS
;
3735 static test_return_t
enable_cas(memcached_st
*memc
)
3737 unsigned int set
= 1;
3739 memcached_version(memc
);
3741 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3742 || memc
->hosts
[0].minor_version
> 2)
3744 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3746 return TEST_SUCCESS
;
3749 return TEST_SKIPPED
;
3752 static test_return_t
check_for_1_2_3(memcached_st
*memc
)
3754 memcached_version(memc
);
3756 if ((memc
->hosts
[0].major_version
>= 1 && (memc
->hosts
[0].minor_version
== 2 && memc
->hosts
[0].micro_version
>= 4))
3757 || memc
->hosts
[0].minor_version
> 2)
3758 return TEST_SUCCESS
;
3760 return TEST_SKIPPED
;
3763 static test_return_t
pre_unix_socket(memcached_st
*memc
)
3765 memcached_return_t rc
;
3768 memcached_server_list_free(memc
->hosts
);
3770 memc
->number_of_hosts
= 0;
3772 if (stat("/tmp/memcached.socket", &buf
))
3773 return TEST_SKIPPED
;
3775 rc
= memcached_server_add_unix_socket_with_weight(memc
, "/tmp/memcached.socket", 0);
3777 return ( rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_FAILURE
);
3780 static test_return_t
pre_nodelay(memcached_st
*memc
)
3782 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3783 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
3785 return TEST_SUCCESS
;
3788 static test_return_t
pre_settimer(memcached_st
*memc
)
3790 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
3791 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
3793 return TEST_SUCCESS
;
3796 static test_return_t
poll_timeout(memcached_st
*memc
)
3802 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
3804 timeout
= (size_t)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
3806 test_truth(timeout
== 100);
3808 return TEST_SUCCESS
;
3811 static test_return_t
noreply_test(memcached_st
*memc
)
3813 memcached_return_t ret
;
3814 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
3815 test_truth(ret
== MEMCACHED_SUCCESS
);
3816 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
3817 test_truth(ret
== MEMCACHED_SUCCESS
);
3818 ret
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1);
3819 test_truth(ret
== MEMCACHED_SUCCESS
);
3820 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
) == 1);
3821 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
) == 1);
3822 test_truth(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
) == 1);
3824 for (int count
=0; count
< 5; ++count
)
3826 for (int x
=0; x
< 100; ++x
)
3829 size_t len
= (size_t)sprintf(key
, "%d", x
);
3833 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
3836 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
3839 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
3842 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
3845 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
3851 test_truth(ret
== MEMCACHED_SUCCESS
|| ret
== MEMCACHED_BUFFERED
);
3855 ** NOTE: Don't ever do this in your code! this is not a supported use of the
3856 ** API and is _ONLY_ done this way to verify that the library works the
3857 ** way it is supposed to do!!!!
3860 for (uint32_t x
=0; x
< memc
->number_of_hosts
; ++x
)
3861 no_msg
+=(int)(memc
->hosts
[x
].cursor_active
);
3863 test_truth(no_msg
== 0);
3864 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3867 ** Now validate that all items was set properly!
3869 for (int x
=0; x
< 100; ++x
)
3872 size_t len
= (size_t)sprintf(key
, "%d", x
);
3875 char* value
=memcached_get(memc
, key
, strlen(key
),
3876 &length
, &flags
, &ret
);
3877 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3880 case 0: /* FALLTHROUGH */
3881 case 1: /* FALLTHROUGH */
3883 test_truth(strncmp(value
, key
, len
) == 0);
3884 test_truth(len
== length
);
3887 test_truth(length
== len
* 2);
3890 test_truth(length
== len
* 3);
3900 /* Try setting an illegal cas value (should not return an error to
3901 * the caller (because we don't expect a return message from the server)
3903 const char* keys
[]= {"0"};
3904 size_t lengths
[]= {1};
3907 memcached_result_st results_obj
;
3908 memcached_result_st
*results
;
3909 ret
= memcached_mget(memc
, keys
, lengths
, 1);
3910 test_truth(ret
== MEMCACHED_SUCCESS
);
3912 results
= memcached_result_create(memc
, &results_obj
);
3913 test_truth(results
);
3914 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
3915 test_truth(results
);
3916 test_truth(ret
== MEMCACHED_SUCCESS
);
3917 uint64_t cas
= memcached_result_cas(results
);
3918 memcached_result_free(&results_obj
);
3920 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
3921 test_truth(ret
== MEMCACHED_SUCCESS
);
3924 * The item will have a new cas value, so try to set it again with the old
3925 * value. This should fail!
3927 ret
= memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
);
3928 test_truth(ret
== MEMCACHED_SUCCESS
);
3929 test_truth(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3930 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
3931 test_truth(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3934 return TEST_SUCCESS
;
3937 static test_return_t
analyzer_test(memcached_st
*memc
)
3939 memcached_return_t rc
;
3940 memcached_stat_st
*memc_stat
;
3941 memcached_analysis_st
*report
;
3943 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
3944 test_truth(rc
== MEMCACHED_SUCCESS
);
3945 test_truth(memc_stat
);
3947 report
= memcached_analyze(memc
, memc_stat
, &rc
);
3948 test_truth(rc
== MEMCACHED_SUCCESS
);
3952 memcached_stat_free(NULL
, memc_stat
);
3954 return TEST_SUCCESS
;
3957 /* Count the objects */
3958 static memcached_return_t
callback_dump_counter(memcached_st
*ptr
__attribute__((unused
)),
3959 const char *key
__attribute__((unused
)),
3960 size_t key_length
__attribute__((unused
)),
3963 uint32_t *counter
= (uint32_t *)context
;
3965 *counter
= *counter
+ 1;
3967 return MEMCACHED_SUCCESS
;
3970 static test_return_t
dump_test(memcached_st
*memc
)
3972 memcached_return_t rc
;
3973 uint32_t counter
= 0;
3974 memcached_dump_fn callbacks
[1];
3975 test_return_t main_rc
;
3977 callbacks
[0]= &callback_dump_counter
;
3979 /* No support for Binary protocol yet */
3980 if (memc
->flags
.binary_protocol
)
3981 return TEST_SUCCESS
;
3983 main_rc
= set_test3(memc
);
3985 test_truth (main_rc
== TEST_SUCCESS
);
3987 rc
= memcached_dump(memc
, callbacks
, (void *)&counter
, 1);
3988 test_truth(rc
== MEMCACHED_SUCCESS
);
3990 /* We may have more then 32 if our previous flush has not completed */
3991 test_truth(counter
>= 32);
3993 return TEST_SUCCESS
;
3996 #ifdef HAVE_LIBMEMCACHEDUTIL
3997 static void* connection_release(void *arg
)
4000 memcached_pool_st
* pool
;
4005 assert(memcached_pool_push(resource
->pool
, resource
->mmc
) == MEMCACHED_SUCCESS
);
4009 static test_return_t
connection_pool_test(memcached_st
*memc
)
4011 memcached_pool_st
* pool
= memcached_pool_create(memc
, 5, 10);
4012 test_truth(pool
!= NULL
);
4013 memcached_st
* mmc
[10];
4014 memcached_return_t rc
;
4016 for (int x
= 0; x
< 10; ++x
) {
4017 mmc
[x
]= memcached_pool_pop(pool
, false, &rc
);
4018 test_truth(mmc
[x
] != NULL
);
4019 test_truth(rc
== MEMCACHED_SUCCESS
);
4022 test_truth(memcached_pool_pop(pool
, false, &rc
) == NULL
);
4023 test_truth(rc
== MEMCACHED_SUCCESS
);
4027 memcached_pool_st
* pool
;
4029 } item
= { .pool
= pool
, .mmc
= mmc
[9] };
4030 pthread_create(&tid
, NULL
, connection_release
, &item
);
4031 mmc
[9]= memcached_pool_pop(pool
, true, &rc
);
4032 test_truth(rc
== MEMCACHED_SUCCESS
);
4033 pthread_join(tid
, NULL
);
4034 test_truth(mmc
[9] == item
.mmc
);
4035 const char *key
= "key";
4036 size_t keylen
= strlen(key
);
4038 // verify that I can do ops with all connections
4039 rc
= memcached_set(mmc
[0], key
, keylen
, "0", 1, 0, 0);
4040 test_truth(rc
== MEMCACHED_SUCCESS
);
4042 for (unsigned int x
= 0; x
< 10; ++x
) {
4043 uint64_t number_value
;
4044 rc
= memcached_increment(mmc
[x
], key
, keylen
, 1, &number_value
);
4045 test_truth(rc
== MEMCACHED_SUCCESS
);
4046 test_truth(number_value
== (x
+1));
4050 for (int x
= 0; x
< 10; ++x
)
4051 test_truth(memcached_pool_push(pool
, mmc
[x
]) == MEMCACHED_SUCCESS
);
4054 /* verify that I can set behaviors on the pool when I don't have all
4055 * of the connections in the pool. It should however be enabled
4056 * when I push the item into the pool
4058 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4059 test_truth(mmc
[0] != NULL
);
4061 rc
= memcached_pool_behavior_set(pool
, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
, 9999);
4062 test_truth(rc
== MEMCACHED_SUCCESS
);
4064 mmc
[1]= memcached_pool_pop(pool
, false, &rc
);
4065 test_truth(mmc
[1] != NULL
);
4067 test_truth(memcached_behavior_get(mmc
[1], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4068 test_truth(memcached_pool_push(pool
, mmc
[1]) == MEMCACHED_SUCCESS
);
4069 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4071 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4072 test_truth(memcached_behavior_get(mmc
[0], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
) == 9999);
4073 test_truth(memcached_pool_push(pool
, mmc
[0]) == MEMCACHED_SUCCESS
);
4076 test_truth(memcached_pool_destroy(pool
) == memc
);
4077 return TEST_SUCCESS
;
4081 static test_return_t
replication_set_test(memcached_st
*memc
)
4083 memcached_return_t rc
;
4084 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4085 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4087 rc
= memcached_set(memc
, "bubba", 5, "0", 1, 0, 0);
4088 test_truth(rc
== MEMCACHED_SUCCESS
);
4091 ** We are using the quiet commands to store the replicas, so we need
4092 ** to ensure that all of them are processed before we can continue.
4093 ** In the test we go directly from storing the object to trying to
4094 ** receive the object from all of the different servers, so we
4095 ** could end up in a race condition (the memcached server hasn't yet
4096 ** processed the quiet command from the replication set when it process
4097 ** the request from the other client (created by the clone)). As a
4098 ** workaround for that we call memcached_quit to send the quit command
4099 ** to the server and wait for the response ;-) If you use the test code
4100 ** as an example for your own code, please note that you shouldn't need
4103 memcached_quit(memc
);
4106 ** "bubba" should now be stored on all of our servers. We don't have an
4107 ** easy to use API to address each individual server, so I'll just iterate
4108 ** through a bunch of "master keys" and I should most likely hit all of the
4111 for (int x
= 'a'; x
<= 'z'; ++x
)
4113 char key
[2]= { [0]= (char)x
};
4116 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4118 test_truth(rc
== MEMCACHED_SUCCESS
);
4119 test_truth(val
!= NULL
);
4123 memcached_free(memc_clone
);
4125 return TEST_SUCCESS
;
4128 static test_return_t
replication_get_test(memcached_st
*memc
)
4130 memcached_return_t rc
;
4133 * Don't do the following in your code. I am abusing the internal details
4134 * within the library, and this is not a supported interface.
4135 * This is to verify correct behavior in the library
4137 for (uint32_t host
= 0; host
< memc
->number_of_hosts
; ++host
)
4139 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4140 memc_clone
->hosts
[host
].port
= 0;
4142 for (int x
= 'a'; x
<= 'z'; ++x
)
4144 char key
[2]= { [0]= (char)x
};
4147 char *val
= memcached_get_by_key(memc_clone
, key
, 1, "bubba", 5,
4149 test_truth(rc
== MEMCACHED_SUCCESS
);
4150 test_truth(val
!= NULL
);
4154 memcached_free(memc_clone
);
4157 return TEST_SUCCESS
;
4160 static test_return_t
replication_mget_test(memcached_st
*memc
)
4162 memcached_return_t rc
;
4163 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4164 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 0);
4166 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4167 size_t len
[]= { 5, 4, 4, 4 };
4169 for (int x
=0; x
< 4; ++x
)
4171 rc
= memcached_set(memc
, keys
[x
], len
[x
], "0", 1, 0, 0);
4172 test_truth(rc
== MEMCACHED_SUCCESS
);
4176 ** We are using the quiet commands to store the replicas, so we need
4177 ** to ensure that all of them are processed before we can continue.
4178 ** In the test we go directly from storing the object to trying to
4179 ** receive the object from all of the different servers, so we
4180 ** could end up in a race condition (the memcached server hasn't yet
4181 ** processed the quiet command from the replication set when it process
4182 ** the request from the other client (created by the clone)). As a
4183 ** workaround for that we call memcached_quit to send the quit command
4184 ** to the server and wait for the response ;-) If you use the test code
4185 ** as an example for your own code, please note that you shouldn't need
4188 memcached_quit(memc
);
4191 * Don't do the following in your code. I am abusing the internal details
4192 * within the library, and this is not a supported interface.
4193 * This is to verify correct behavior in the library
4195 memcached_result_st result_obj
;
4196 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; host
++)
4198 memcached_st
*new_clone
= memcached_clone(NULL
, memc
);
4199 new_clone
->hosts
[host
].port
= 0;
4201 for (int x
= 'a'; x
<= 'z'; ++x
)
4203 const char key
[2]= { [0]= (const char)x
};
4205 rc
= memcached_mget_by_key(new_clone
, key
, 1, keys
, len
, 4);
4206 test_truth(rc
== MEMCACHED_SUCCESS
);
4208 memcached_result_st
*results
= memcached_result_create(new_clone
, &result_obj
);
4209 test_truth(results
);
4212 while ((results
= memcached_fetch_result(new_clone
, &result_obj
, &rc
)) != NULL
)
4216 test_truth(hits
== 4);
4217 memcached_result_free(&result_obj
);
4220 memcached_free(new_clone
);
4223 memcached_free(memc_clone
);
4225 return TEST_SUCCESS
;
4228 static test_return_t
replication_randomize_mget_test(memcached_st
*memc
)
4230 memcached_result_st result_obj
;
4231 memcached_return_t rc
;
4232 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4233 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 3);
4234 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
, 1);
4236 const char *keys
[]= { "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
4237 size_t len
[]= { 4, 4, 4, 4, 4, 4, 4 };
4239 for (int x
=0; x
< 7; ++x
)
4241 rc
= memcached_set(memc
, keys
[x
], len
[x
], "1", 1, 0, 0);
4242 test_truth(rc
== MEMCACHED_SUCCESS
);
4245 memcached_quit(memc
);
4247 for (int x
=0; x
< 7; ++x
) {
4248 const char key
[2]= { [0]= (const char)x
};
4250 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 7);
4251 test_truth(rc
== MEMCACHED_SUCCESS
);
4253 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4254 test_truth(results
);
4257 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4261 test_truth(hits
== 7);
4262 memcached_result_free(&result_obj
);
4264 memcached_free(memc_clone
);
4265 return TEST_SUCCESS
;
4268 static test_return_t
replication_delete_test(memcached_st
*memc
)
4270 memcached_return_t rc
;
4271 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4272 /* Delete the items from all of the servers except 1 */
4273 uint64_t repl
= memcached_behavior_get(memc
,
4274 MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
4275 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, --repl
);
4277 const char *keys
[]= { "bubba", "key1", "key2", "key3" };
4278 size_t len
[]= { 5, 4, 4, 4 };
4280 for (int x
=0; x
< 4; ++x
)
4282 rc
= memcached_delete_by_key(memc
, keys
[0], len
[0], keys
[x
], len
[x
], 0);
4283 test_truth(rc
== MEMCACHED_SUCCESS
);
4287 * Don't do the following in your code. I am abusing the internal details
4288 * within the library, and this is not a supported interface.
4289 * This is to verify correct behavior in the library
4291 uint32_t hash
= memcached_generate_hash(memc
, keys
[0], len
[0]);
4292 for (uint32_t x
= 0; x
< (repl
+ 1); ++x
)
4294 memc_clone
->hosts
[hash
].port
= 0;
4295 if (++hash
== memc_clone
->number_of_hosts
)
4299 memcached_result_st result_obj
;
4300 for (uint32_t host
= 0; host
< memc_clone
->number_of_hosts
; ++host
)
4302 for (int x
= 'a'; x
<= 'z'; ++x
)
4304 const char key
[2]= { [0]= (const char)x
};
4306 rc
= memcached_mget_by_key(memc_clone
, key
, 1, keys
, len
, 4);
4307 test_truth(rc
== MEMCACHED_SUCCESS
);
4309 memcached_result_st
*results
= memcached_result_create(memc_clone
, &result_obj
);
4310 test_truth(results
);
4313 while ((results
= memcached_fetch_result(memc_clone
, &result_obj
, &rc
)) != NULL
)
4317 test_truth(hits
== 4);
4318 memcached_result_free(&result_obj
);
4321 memcached_free(memc_clone
);
4323 return TEST_SUCCESS
;
4326 static void increment_request_id(uint16_t *id
)
4329 if ((*id
& UDP_REQUEST_ID_THREAD_MASK
) != 0)
4333 static uint16_t *get_udp_request_ids(memcached_st
*memc
)
4335 uint16_t *ids
= malloc(sizeof(uint16_t) * memc
->number_of_hosts
);
4336 assert(ids
!= NULL
);
4339 for (x
= 0; x
< memc
->number_of_hosts
; x
++)
4340 ids
[x
]= get_udp_datagram_request_id((struct udp_datagram_header_st
*) memc
->hosts
[x
].write_buffer
);
4345 static test_return_t
post_udp_op_check(memcached_st
*memc
, uint16_t *expected_req_ids
)
4348 memcached_server_st
*cur_server
= memc
->hosts
;
4349 uint16_t *cur_req_ids
= get_udp_request_ids(memc
);
4351 for (x
= 0; x
< memc
->number_of_hosts
; x
++)
4353 test_truth(cur_server
[x
].cursor_active
== 0);
4354 test_truth(cur_req_ids
[x
] == expected_req_ids
[x
]);
4356 free(expected_req_ids
);
4359 return TEST_SUCCESS
;
4363 ** There is a little bit of a hack here, instead of removing
4364 ** the servers, I just set num host to 0 and them add then new udp servers
4366 static test_return_t
init_udp(memcached_st
*memc
)
4368 memcached_version(memc
);
4369 /* For the time being, only support udp test for >= 1.2.6 && < 1.3 */
4370 if (memc
->hosts
[0].major_version
!= 1 || memc
->hosts
[0].minor_version
!= 2
4371 || memc
->hosts
[0].micro_version
< 6)
4372 return TEST_SKIPPED
;
4374 uint32_t num_hosts
= memc
->number_of_hosts
;
4376 memcached_server_st servers
[num_hosts
];
4377 memcpy(servers
, memc
->hosts
, sizeof(memcached_server_st
) * num_hosts
);
4378 for (x
= 0; x
< num_hosts
; x
++)
4379 memcached_server_free(&memc
->hosts
[x
]);
4381 memc
->number_of_hosts
= 0;
4382 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1);
4383 for (x
= 0; x
< num_hosts
; x
++)
4385 test_truth(memcached_server_add_udp(memc
, servers
[x
].hostname
, servers
[x
].port
) == MEMCACHED_SUCCESS
);
4386 test_truth(memc
->hosts
[x
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4389 return TEST_SUCCESS
;
4392 static test_return_t
binary_init_udp(memcached_st
*memc
)
4395 return init_udp(memc
);
4398 /* Make sure that I cant add a tcp server to a udp client */
4399 static test_return_t
add_tcp_server_udp_client_test(memcached_st
*memc
)
4401 memcached_server_st server
;
4402 memcached_server_clone(&server
, &memc
->hosts
[0]);
4403 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4404 test_truth(memcached_server_add(memc
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4405 return TEST_SUCCESS
;
4408 /* Make sure that I cant add a udp server to a tcp client */
4409 static test_return_t
add_udp_server_tcp_client_test(memcached_st
*memc
)
4411 memcached_server_st server
;
4412 memcached_server_clone(&server
, &memc
->hosts
[0]);
4413 test_truth(memcached_server_remove(&(memc
->hosts
[0])) == MEMCACHED_SUCCESS
);
4415 memcached_st tcp_client
;
4416 memcached_create(&tcp_client
);
4417 test_truth(memcached_server_add_udp(&tcp_client
, server
.hostname
, server
.port
) == MEMCACHED_INVALID_HOST_PROTOCOL
);
4419 return TEST_SUCCESS
;
4422 static test_return_t
set_udp_behavior_test(memcached_st
*memc
)
4425 memcached_quit(memc
);
4426 memc
->number_of_hosts
= 0;
4427 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, memc
->distribution
);
4428 test_truth(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
, 1) == MEMCACHED_SUCCESS
);
4429 test_truth(memc
->flags
.use_udp
);
4430 test_truth(memc
->flags
.no_reply
);
4432 test_truth(memc
->number_of_hosts
== 0);
4434 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_USE_UDP
,0);
4435 test_truth(! (memc
->flags
.use_udp
));
4436 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
,0);
4437 test_truth(! (memc
->flags
.no_reply
));
4439 return TEST_SUCCESS
;
4442 static test_return_t
udp_set_test(memcached_st
*memc
)
4445 unsigned int num_iters
= 1025; //request id rolls over at 1024
4446 for (x
= 0; x
< num_iters
;x
++)
4448 memcached_return_t rc
;
4449 const char *key
= "foo";
4450 const char *value
= "when we sanitize";
4451 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4452 unsigned int server_key
= memcached_generate_hash(memc
,key
,strlen(key
));
4453 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4454 rc
= memcached_set(memc
, key
, strlen(key
),
4455 value
, strlen(value
),
4456 (time_t)0, (uint32_t)0);
4457 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4458 /** NB, the check below assumes that if new write_ptr is less than
4459 * the original write_ptr that we have flushed. For large payloads, this
4460 * maybe an invalid assumption, but for the small payload we have it is OK
4462 if (rc
== MEMCACHED_SUCCESS
||
4463 memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4464 increment_request_id(&expected_ids
[server_key
]);
4466 if (rc
== MEMCACHED_SUCCESS
)
4468 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4472 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4473 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4475 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4477 return TEST_SUCCESS
;
4480 static test_return_t
udp_buffered_set_test(memcached_st
*memc
)
4482 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4483 return udp_set_test(memc
);
4486 static test_return_t
udp_set_too_big_test(memcached_st
*memc
)
4488 memcached_return_t rc
;
4489 const char *key
= "bar";
4490 char value
[MAX_UDP_DATAGRAM_LENGTH
];
4491 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4492 rc
= memcached_set(memc
, key
, strlen(key
),
4493 value
, MAX_UDP_DATAGRAM_LENGTH
,
4494 (time_t)0, (uint32_t)0);
4495 test_truth(rc
== MEMCACHED_WRITE_FAILURE
);
4496 return post_udp_op_check(memc
,expected_ids
);
4499 static test_return_t
udp_delete_test(memcached_st
*memc
)
4502 unsigned int num_iters
= 1025; //request id rolls over at 1024
4503 for (x
= 0; x
< num_iters
;x
++)
4505 memcached_return_t rc
;
4506 const char *key
= "foo";
4507 uint16_t *expected_ids
=get_udp_request_ids(memc
);
4508 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4509 size_t init_offset
= memc
->hosts
[server_key
].write_buffer_offset
;
4510 rc
= memcached_delete(memc
, key
, strlen(key
), 0);
4511 test_truth(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4512 if (rc
== MEMCACHED_SUCCESS
|| memc
->hosts
[server_key
].write_buffer_offset
< init_offset
)
4513 increment_request_id(&expected_ids
[server_key
]);
4514 if (rc
== MEMCACHED_SUCCESS
)
4516 test_truth(memc
->hosts
[server_key
].write_buffer_offset
== UDP_DATAGRAM_HEADER_LENGTH
);
4520 test_truth(memc
->hosts
[server_key
].write_buffer_offset
!= UDP_DATAGRAM_HEADER_LENGTH
);
4521 test_truth(memc
->hosts
[server_key
].write_buffer_offset
<= MAX_UDP_DATAGRAM_LENGTH
);
4523 test_truth(post_udp_op_check(memc
,expected_ids
) == TEST_SUCCESS
);
4525 return TEST_SUCCESS
;
4528 static test_return_t
udp_buffered_delete_test(memcached_st
*memc
)
4530 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4531 return udp_delete_test(memc
);
4534 static test_return_t
udp_verbosity_test(memcached_st
*memc
)
4536 memcached_return_t rc
;
4537 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4539 for (x
= 0; x
< memc
->number_of_hosts
;x
++)
4540 increment_request_id(&expected_ids
[x
]);
4542 rc
= memcached_verbosity(memc
,3);
4543 test_truth(rc
== MEMCACHED_SUCCESS
);
4544 return post_udp_op_check(memc
,expected_ids
);
4547 static test_return_t
udp_quit_test(memcached_st
*memc
)
4549 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4550 memcached_quit(memc
);
4551 return post_udp_op_check(memc
, expected_ids
);
4554 static test_return_t
udp_flush_test(memcached_st
*memc
)
4556 memcached_return_t rc
;
4557 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4559 for (x
= 0; x
< memc
->number_of_hosts
;x
++)
4560 increment_request_id(&expected_ids
[x
]);
4562 rc
= memcached_flush(memc
,0);
4563 test_truth(rc
== MEMCACHED_SUCCESS
);
4564 return post_udp_op_check(memc
,expected_ids
);
4567 static test_return_t
udp_incr_test(memcached_st
*memc
)
4569 memcached_return_t rc
;
4570 const char *key
= "incr";
4571 const char *value
= "1";
4572 rc
= memcached_set(memc
, key
, strlen(key
),
4573 value
, strlen(value
),
4574 (time_t)0, (uint32_t)0);
4576 test_truth(rc
== MEMCACHED_SUCCESS
);
4577 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4578 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4579 increment_request_id(&expected_ids
[server_key
]);
4581 rc
= memcached_increment(memc
, key
, strlen(key
), 1, &newvalue
);
4582 test_truth(rc
== MEMCACHED_SUCCESS
);
4583 return post_udp_op_check(memc
, expected_ids
);
4586 static test_return_t
udp_decr_test(memcached_st
*memc
)
4588 memcached_return_t rc
;
4589 const char *key
= "decr";
4590 const char *value
= "1";
4591 rc
= memcached_set(memc
, key
, strlen(key
),
4592 value
, strlen(value
),
4593 (time_t)0, (uint32_t)0);
4595 test_truth(rc
== MEMCACHED_SUCCESS
);
4596 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4597 unsigned int server_key
= memcached_generate_hash(memc
, key
, strlen(key
));
4598 increment_request_id(&expected_ids
[server_key
]);
4600 rc
= memcached_decrement(memc
, key
, strlen(key
), 1, &newvalue
);
4601 test_truth(rc
== MEMCACHED_SUCCESS
);
4602 return post_udp_op_check(memc
, expected_ids
);
4606 static test_return_t
udp_stat_test(memcached_st
*memc
)
4608 memcached_stat_st
* rv
= NULL
;
4609 memcached_return_t rc
;
4611 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4612 rv
= memcached_stat(memc
, args
, &rc
);
4614 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4615 return post_udp_op_check(memc
, expected_ids
);
4618 static test_return_t
udp_version_test(memcached_st
*memc
)
4620 memcached_return_t rc
;
4621 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4622 rc
= memcached_version(memc
);
4623 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4624 return post_udp_op_check(memc
, expected_ids
);
4627 static test_return_t
udp_get_test(memcached_st
*memc
)
4629 memcached_return_t rc
;
4630 const char *key
= "foo";
4632 uint16_t *expected_ids
= get_udp_request_ids(memc
);
4633 char *val
= memcached_get(memc
, key
, strlen(key
), &vlen
, (uint32_t)0, &rc
);
4634 test_truth(rc
== MEMCACHED_NOT_SUPPORTED
);
4635 test_truth(val
== NULL
);
4636 return post_udp_op_check(memc
, expected_ids
);
4639 static test_return_t
udp_mixed_io_test(memcached_st
*memc
)
4642 test_st mixed_io_ops
[] ={
4644 (test_callback_fn
)udp_set_test
},
4645 {"udp_set_too_big_test", 0,
4646 (test_callback_fn
)udp_set_too_big_test
},
4647 {"udp_delete_test", 0,
4648 (test_callback_fn
)udp_delete_test
},
4649 {"udp_verbosity_test", 0,
4650 (test_callback_fn
)udp_verbosity_test
},
4651 {"udp_quit_test", 0,
4652 (test_callback_fn
)udp_quit_test
},
4653 {"udp_flush_test", 0,
4654 (test_callback_fn
)udp_flush_test
},
4655 {"udp_incr_test", 0,
4656 (test_callback_fn
)udp_incr_test
},
4657 {"udp_decr_test", 0,
4658 (test_callback_fn
)udp_decr_test
},
4659 {"udp_version_test", 0,
4660 (test_callback_fn
)udp_version_test
}
4663 for (x
= 0; x
< 500; x
++)
4665 current_op
= mixed_io_ops
[random() % 9];
4666 test_truth(current_op
.test_fn(memc
) == TEST_SUCCESS
);
4668 return TEST_SUCCESS
;
4672 static test_return_t
hash_sanity_test (memcached_st
*memc
)
4676 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
4677 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
4678 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
4679 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
4680 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
4681 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
4682 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
4683 #ifdef HAVE_HSIEH_HASH
4684 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
4686 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
4687 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
4688 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
4690 return TEST_SUCCESS
;
4694 static test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
4696 memcached_return_t expected_rc
= MEMCACHED_FAILURE
;
4697 #ifdef HAVE_HSIEH_HASH
4698 expected_rc
= MEMCACHED_SUCCESS
;
4700 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
4701 (uint64_t)MEMCACHED_HASH_HSIEH
);
4702 test_truth(rc
== expected_rc
);
4703 return TEST_SUCCESS
;
4706 static test_return_t
md5_run (memcached_st
*memc
__attribute__((unused
)))
4711 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4715 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
);
4716 test_truth(md5_values
[x
] == hash_val
);
4719 return TEST_SUCCESS
;
4722 static test_return_t
crc_run (memcached_st
*memc
__attribute__((unused
)))
4727 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4731 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
);
4732 test_truth(crc_values
[x
] == hash_val
);
4735 return TEST_SUCCESS
;
4738 static test_return_t
fnv1_64_run (memcached_st
*memc
__attribute__((unused
)))
4743 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4747 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
);
4748 test_truth(fnv1_64_values
[x
] == hash_val
);
4751 return TEST_SUCCESS
;
4754 static test_return_t
fnv1a_64_run (memcached_st
*memc
__attribute__((unused
)))
4759 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4763 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
);
4764 test_truth(fnv1a_64_values
[x
] == hash_val
);
4767 return TEST_SUCCESS
;
4770 static test_return_t
fnv1_32_run (memcached_st
*memc
__attribute__((unused
)))
4776 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4780 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
);
4781 test_truth(fnv1_32_values
[x
] == hash_val
);
4784 return TEST_SUCCESS
;
4787 static test_return_t
fnv1a_32_run (memcached_st
*memc
__attribute__((unused
)))
4792 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4796 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
);
4797 test_truth(fnv1a_32_values
[x
] == hash_val
);
4800 return TEST_SUCCESS
;
4803 static test_return_t
hsieh_run (memcached_st
*memc
__attribute__((unused
)))
4808 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4812 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
);
4813 test_truth(hsieh_values
[x
] == hash_val
);
4816 return TEST_SUCCESS
;
4819 static test_return_t
murmur_run (memcached_st
*memc
__attribute__((unused
)))
4822 return TEST_SKIPPED
;
4827 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4831 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
);
4832 test_truth(murmur_values
[x
] == hash_val
);
4835 return TEST_SUCCESS
;
4839 static test_return_t
jenkins_run (memcached_st
*memc
__attribute__((unused
)))
4845 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4849 hash_val
= memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
);
4850 test_truth(jenkins_values
[x
] == hash_val
);
4853 return TEST_SUCCESS
;
4857 static test_return_t
ketama_compatibility_libmemcached(memcached_st
*trash
)
4859 memcached_return_t rc
;
4862 memcached_server_st
*server_pool
;
4867 memc
= memcached_create(NULL
);
4870 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
4871 assert(rc
== MEMCACHED_SUCCESS
);
4873 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
4876 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
,
4877 MEMCACHED_KETAMA_COMPAT_LIBMEMCACHED
) == MEMCACHED_SUCCESS
);
4879 assert(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
) ==
4880 MEMCACHED_KETAMA_COMPAT_LIBMEMCACHED
);
4882 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");
4883 memcached_server_push(memc
, server_pool
);
4885 /* verify that the server list was parsed okay. */
4886 assert(memc
->number_of_hosts
== 8);
4887 assert(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
4888 assert(server_pool
[0].port
== 11211);
4889 assert(server_pool
[0].weight
== 600);
4890 assert(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
4891 assert(server_pool
[2].port
== 11211);
4892 assert(server_pool
[2].weight
== 200);
4893 assert(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
4894 assert(server_pool
[7].port
== 11211);
4895 assert(server_pool
[7].weight
== 100);
4897 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
4898 * us test the boundary wraparound.
4900 assert(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
4902 /* verify the standard ketama set. */
4903 for (x
= 0; x
< 99; x
++)
4905 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases
[x
].key
, strlen(ketama_test_cases
[x
].key
));
4906 char *hostname
= memc
->hosts
[server_idx
].hostname
;
4907 assert(strcmp(hostname
, ketama_test_cases
[x
].server
) == 0);
4910 memcached_server_list_free(server_pool
);
4911 memcached_free(memc
);
4913 return TEST_SUCCESS
;
4916 static test_return_t
ketama_compatibility_spymemcached(memcached_st
*trash
)
4918 memcached_return_t rc
;
4921 memcached_server_st
*server_pool
;
4926 memc
= memcached_create(NULL
);
4929 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
4930 assert(rc
== MEMCACHED_SUCCESS
);
4932 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
4935 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
,
4936 MEMCACHED_KETAMA_COMPAT_SPY
) == MEMCACHED_SUCCESS
);
4938 assert(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
) ==
4939 MEMCACHED_KETAMA_COMPAT_SPY
);
4941 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");
4942 memcached_server_push(memc
, server_pool
);
4944 /* verify that the server list was parsed okay. */
4945 assert(memc
->number_of_hosts
== 8);
4946 assert(strcmp(server_pool
[0].hostname
, "10.0.1.1") == 0);
4947 assert(server_pool
[0].port
== 11211);
4948 assert(server_pool
[0].weight
== 600);
4949 assert(strcmp(server_pool
[2].hostname
, "10.0.1.3") == 0);
4950 assert(server_pool
[2].port
== 11211);
4951 assert(server_pool
[2].weight
== 200);
4952 assert(strcmp(server_pool
[7].hostname
, "10.0.1.8") == 0);
4953 assert(server_pool
[7].port
== 11211);
4954 assert(server_pool
[7].weight
== 100);
4956 /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
4957 * us test the boundary wraparound.
4959 assert(memcached_generate_hash(memc
, (char *)"VDEAAAAA", 8) == memc
->continuum
[0].index
);
4961 /* verify the standard ketama set. */
4962 for (x
= 0; x
< 99; x
++)
4964 uint32_t server_idx
= memcached_generate_hash(memc
, ketama_test_cases_spy
[x
].key
, strlen(ketama_test_cases_spy
[x
].key
));
4965 char *hostname
= memc
->hosts
[server_idx
].hostname
;
4966 assert(strcmp(hostname
, ketama_test_cases_spy
[x
].server
) == 0);
4969 memcached_server_list_free(server_pool
);
4970 memcached_free(memc
);
4972 return TEST_SUCCESS
;
4975 static test_return_t
regression_bug_434484(memcached_st
*memc
)
4977 if (pre_binary(memc
) != MEMCACHED_SUCCESS
)
4978 return TEST_SKIPPED
;
4980 memcached_return_t ret
;
4981 const char *key
= "regression_bug_434484";
4982 size_t keylen
= strlen(key
);
4984 ret
= memcached_append(memc
, key
, keylen
, key
, keylen
, 0, 0);
4985 assert(ret
== MEMCACHED_NOTSTORED
);
4987 size_t size
= 2048 * 1024;
4988 void *data
= calloc(1, size
);
4989 assert(data
!= NULL
);
4990 ret
= memcached_set(memc
, key
, keylen
, data
, size
, 0, 0);
4991 assert(ret
== MEMCACHED_E2BIG
);
4994 return TEST_SUCCESS
;
4997 static test_return_t
regression_bug_434843(memcached_st
*memc
)
4999 if (pre_binary(memc
) != MEMCACHED_SUCCESS
)
5000 return TEST_SKIPPED
;
5002 memcached_return_t rc
;
5003 unsigned int counter
= 0;
5004 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5007 * I only want to hit only _one_ server so I know the number of requests I'm
5008 * sending in the pipleine to the server. Let's try to do a multiget of
5009 * 1024 (that should satisfy most users don't you think?). Future versions
5010 * will include a mget_execute function call if you need a higher number.
5012 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5013 memc
->number_of_hosts
= 1;
5014 const size_t max_keys
= 1024;
5015 char **keys
= calloc(max_keys
, sizeof(char*));
5016 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5018 for (int x
= 0; x
< (int)max_keys
; ++x
)
5021 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5023 assert(keys
[x
] != NULL
);
5027 * Run two times.. the first time we should have 100% cache miss,
5028 * and the second time we should have 100% cache hits
5030 for (int y
= 0; y
< 2; ++y
)
5032 rc
= memcached_mget(memc
, (const char**)keys
, key_length
, max_keys
);
5033 assert(rc
== MEMCACHED_SUCCESS
);
5034 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5037 /* The first iteration should give me a 100% cache miss. verify that*/
5038 assert(counter
== 0);
5039 char blob
[1024]= { 0 };
5040 for (int x
= 0; x
< (int)max_keys
; ++x
)
5042 rc
= memcached_add(memc
, keys
[x
], key_length
[x
],
5043 blob
, sizeof(blob
), 0, 0);
5044 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5049 /* Verify that we received all of the key/value pairs */
5050 assert(counter
== (unsigned int)max_keys
);
5054 /* Release allocated resources */
5055 for (size_t x
= 0; x
< max_keys
; ++x
)
5060 memc
->number_of_hosts
= number_of_hosts
;
5061 return TEST_SUCCESS
;
5064 static test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
5066 memcached_return_t rc
;
5067 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
5068 assert(rc
== MEMCACHED_SUCCESS
);
5070 return regression_bug_434843(memc
);
5073 static test_return_t
regression_bug_421108(memcached_st
*memc
)
5075 memcached_return_t rc
;
5076 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
5077 assert(rc
== MEMCACHED_SUCCESS
);
5079 char *bytes
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
5080 assert(rc
== MEMCACHED_SUCCESS
);
5081 assert(bytes
!= NULL
);
5082 char *bytes_read
= memcached_stat_get_value(memc
, memc_stat
,
5084 assert(rc
== MEMCACHED_SUCCESS
);
5085 assert(bytes_read
!= NULL
);
5087 char *bytes_written
= memcached_stat_get_value(memc
, memc_stat
,
5088 "bytes_written", &rc
);
5089 assert(rc
== MEMCACHED_SUCCESS
);
5090 assert(bytes_written
!= NULL
);
5092 assert(strcmp(bytes
, bytes_read
) != 0);
5093 assert(strcmp(bytes
, bytes_written
) != 0);
5095 /* Release allocated resources */
5098 free(bytes_written
);
5099 memcached_stat_free(NULL
, memc_stat
);
5100 return TEST_SUCCESS
;
5104 * The test case isn't obvious so I should probably document why
5105 * it works the way it does. Bug 442914 was caused by a bug
5106 * in the logic in memcached_purge (it did not handle the case
5107 * where the number of bytes sent was equal to the watermark).
5108 * In this test case, create messages so that we hit that case
5109 * and then disable noreply mode and issue a new command to
5110 * verify that it isn't stuck. If we change the format for the
5111 * delete command or the watermarks, we need to update this
5114 static test_return_t
regression_bug_442914(memcached_st
*memc
)
5116 memcached_return_t rc
;
5117 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1);
5118 assert(rc
== MEMCACHED_SUCCESS
);
5119 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
5121 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5122 memc
->number_of_hosts
= 1;
5127 for (int x
= 0; x
< 250; ++x
)
5129 len
= (size_t)snprintf(k
, sizeof(k
), "%0250u", x
);
5130 rc
= memcached_delete(memc
, k
, len
, 0);
5131 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5134 len
= (size_t)snprintf(k
, sizeof(k
), "%037u", 251);
5135 rc
= memcached_delete(memc
, k
, len
, 0);
5136 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5138 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0);
5139 assert(rc
== MEMCACHED_SUCCESS
);
5140 rc
= memcached_delete(memc
, k
, len
, 0);
5141 assert(rc
== MEMCACHED_NOTFOUND
);
5143 memc
->number_of_hosts
= number_of_hosts
;
5145 return TEST_SUCCESS
;
5148 static test_return_t
regression_bug_447342(memcached_st
*memc
)
5150 if (memc
->number_of_hosts
< 3 || pre_replication(memc
) != MEMCACHED_SUCCESS
)
5151 return TEST_SKIPPED
;
5153 memcached_return_t rc
;
5155 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2);
5156 assert(rc
== MEMCACHED_SUCCESS
);
5158 const size_t max_keys
= 100;
5159 char **keys
= calloc(max_keys
, sizeof(char*));
5160 size_t *key_length
=calloc(max_keys
, sizeof(size_t));
5162 for (int x
= 0; x
< (int)max_keys
; ++x
)
5165 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5167 assert(keys
[x
] != NULL
);
5168 rc
= memcached_set(memc
, k
, key_length
[x
], k
, key_length
[x
], 0, 0);
5169 assert(rc
== MEMCACHED_SUCCESS
);
5173 ** We are using the quiet commands to store the replicas, so we need
5174 ** to ensure that all of them are processed before we can continue.
5175 ** In the test we go directly from storing the object to trying to
5176 ** receive the object from all of the different servers, so we
5177 ** could end up in a race condition (the memcached server hasn't yet
5178 ** processed the quiet command from the replication set when it process
5179 ** the request from the other client (created by the clone)). As a
5180 ** workaround for that we call memcached_quit to send the quit command
5181 ** to the server and wait for the response ;-) If you use the test code
5182 ** as an example for your own code, please note that you shouldn't need
5185 memcached_quit(memc
);
5187 /* Verify that all messages are stored, and we didn't stuff too much
5190 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5191 assert(rc
== MEMCACHED_SUCCESS
);
5193 unsigned int counter
= 0;
5194 memcached_execute_fn callbacks
[1]= { [0]= &callback_counter
};
5195 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5196 /* Verify that we received all of the key/value pairs */
5197 assert(counter
== (unsigned int)max_keys
);
5199 memcached_quit(memc
);
5201 * Don't do the following in your code. I am abusing the internal details
5202 * within the library, and this is not a supported interface.
5203 * This is to verify correct behavior in the library. Fake that two servers
5206 unsigned int port0
= memc
->hosts
[0].port
;
5207 unsigned int port2
= memc
->hosts
[2].port
;
5208 memc
->hosts
[0].port
= 0;
5209 memc
->hosts
[2].port
= 0;
5211 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5212 assert(rc
== MEMCACHED_SUCCESS
);
5215 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5216 assert(counter
== (unsigned int)max_keys
);
5218 /* restore the memc handle */
5219 memc
->hosts
[0].port
= port0
;
5220 memc
->hosts
[2].port
= port2
;
5222 memcached_quit(memc
);
5224 /* Remove half of the objects */
5225 for (int x
= 0; x
< (int)max_keys
; ++x
)
5228 rc
= memcached_delete(memc
, keys
[x
], key_length
[x
], 0);
5229 assert(rc
== MEMCACHED_SUCCESS
);
5232 memcached_quit(memc
);
5233 memc
->hosts
[0].port
= 0;
5234 memc
->hosts
[2].port
= 0;
5236 /* now retry the command, this time we should have cache misses */
5237 rc
= memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
);
5238 assert(rc
== MEMCACHED_SUCCESS
);
5241 rc
= memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1);
5242 assert(counter
== (unsigned int)(max_keys
>> 1));
5244 /* Release allocated resources */
5245 for (size_t x
= 0; x
< max_keys
; ++x
)
5250 /* restore the memc handle */
5251 memc
->hosts
[0].port
= port0
;
5252 memc
->hosts
[2].port
= port2
;
5253 return TEST_SUCCESS
;
5256 static test_return_t
regression_bug_463297(memcached_st
*memc
)
5258 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
5259 assert(memc_clone
!= NULL
);
5260 assert(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
5262 if (memc_clone
->hosts
[0].major_version
> 1 ||
5263 (memc_clone
->hosts
[0].major_version
== 1 &&
5264 memc_clone
->hosts
[0].minor_version
> 2))
5266 /* Binary protocol doesn't support deferred delete */
5267 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
5268 assert(bin_clone
!= NULL
);
5269 assert(memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1) == MEMCACHED_SUCCESS
);
5270 assert(memcached_delete(bin_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5271 memcached_free(bin_clone
);
5273 memcached_quit(memc_clone
);
5275 /* If we know the server version, deferred delete should fail
5276 * with invalid arguments */
5277 assert(memcached_delete(memc_clone
, "foo", 3, 1) == MEMCACHED_INVALID_ARGUMENTS
);
5279 /* If we don't know the server version, we should get a protocol error */
5280 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
5281 /* but there is a bug in some of the memcached servers (1.4) that treats
5282 * the counter as noreply so it doesn't send the proper error message
5284 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5286 /* And buffered mode should be disabled and we should get protocol error */
5287 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
5288 rc
= memcached_delete(memc
, "foo", 3, 1);
5289 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5291 /* Same goes for noreply... */
5292 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1) == MEMCACHED_SUCCESS
);
5293 rc
= memcached_delete(memc
, "foo", 3, 1);
5294 assert(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
);
5296 /* but a normal request should go through (and be buffered) */
5297 assert((rc
= memcached_delete(memc
, "foo", 3, 0)) == MEMCACHED_BUFFERED
);
5298 assert(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
5300 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0) == MEMCACHED_SUCCESS
);
5301 /* unbuffered noreply should be success */
5302 assert(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_SUCCESS
);
5303 /* unbuffered with reply should be not found... */
5304 assert(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0) == MEMCACHED_SUCCESS
);
5305 assert(memcached_delete(memc
, "foo", 3, 0) == MEMCACHED_NOTFOUND
);
5308 memcached_free(memc_clone
);
5309 return TEST_SUCCESS
;
5313 /* Test memcached_server_get_last_disconnect
5314 * For a working server set, shall be NULL
5315 * For a set of non existing server, shall not be NULL
5317 static test_return_t
test_get_last_disconnect(memcached_st
*memc
)
5319 memcached_return_t rc
;
5320 memcached_server_st
*disconnected_server
;
5322 /* With the working set of server */
5323 const char *key
= "marmotte";
5324 const char *value
= "milka";
5326 rc
= memcached_set(memc
, key
, strlen(key
),
5327 value
, strlen(value
),
5328 (time_t)0, (uint32_t)0);
5329 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5331 disconnected_server
= memcached_server_get_last_disconnect(memc
);
5332 assert(disconnected_server
== NULL
);
5334 /* With a non existing server */
5336 memcached_server_st
*servers
;
5338 const char *server_list
= "localhost:9";
5340 servers
= memcached_servers_parse(server_list
);
5342 mine
= memcached_create(NULL
);
5343 rc
= memcached_server_push(mine
, servers
);
5344 assert(rc
== MEMCACHED_SUCCESS
);
5345 memcached_server_list_free(servers
);
5348 rc
= memcached_set(mine
, key
, strlen(key
),
5349 value
, strlen(value
),
5350 (time_t)0, (uint32_t)0);
5351 assert(rc
!= MEMCACHED_SUCCESS
);
5353 disconnected_server
= memcached_server_get_last_disconnect(mine
);
5354 assert(disconnected_server
!= NULL
);
5355 assert(disconnected_server
->port
== 9);
5356 assert(strncmp(disconnected_server
->hostname
,"localhost",9) == 0);
5358 memcached_quit(mine
);
5359 memcached_free(mine
);
5361 return TEST_SUCCESS
;
5365 * This test ensures that the failure counter isn't incremented during
5366 * normal termination of the memcached instance.
5368 static test_return_t
wrong_failure_counter_test(memcached_st
*memc
)
5370 memcached_return_t rc
;
5372 /* Set value to force connection to the server */
5373 const char *key
= "marmotte";
5374 const char *value
= "milka";
5377 * Please note that I'm abusing the internal structures in libmemcached
5378 * in a non-portable way and you shouldn't be doing this. I'm only
5379 * doing this in order to verify that the library works the way it should
5381 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5382 memc
->number_of_hosts
= 1;
5384 /* Ensure that we are connected to the server by setting a value */
5385 rc
= memcached_set(memc
, key
, strlen(key
),
5386 value
, strlen(value
),
5387 (time_t)0, (uint32_t)0);
5388 assert(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5391 /* The test is to see that the memcached_quit doesn't increase the
5392 * the server failure conter, so let's ensure that it is zero
5393 * before sending quit
5395 memc
->hosts
[0].server_failure_counter
= 0;
5397 memcached_quit(memc
);
5399 /* Verify that it memcached_quit didn't increment the failure counter
5400 * Please note that this isn't bullet proof, because an error could
5403 assert(memc
->hosts
[0].server_failure_counter
== 0);
5405 /* restore the instance */
5406 memc
->number_of_hosts
= number_of_hosts
;
5408 return TEST_SUCCESS
;
5411 test_st udp_setup_server_tests
[] ={
5412 {"set_udp_behavior_test", 0, (test_callback_fn
)set_udp_behavior_test
},
5413 {"add_tcp_server_udp_client_test", 0, (test_callback_fn
)add_tcp_server_udp_client_test
},
5414 {"add_udp_server_tcp_client_test", 0, (test_callback_fn
)add_udp_server_tcp_client_test
},
5418 test_st upd_io_tests
[] ={
5419 {"udp_set_test", 0, (test_callback_fn
)udp_set_test
},
5420 {"udp_buffered_set_test", 0, (test_callback_fn
)udp_buffered_set_test
},
5421 {"udp_set_too_big_test", 0, (test_callback_fn
)udp_set_too_big_test
},
5422 {"udp_delete_test", 0, (test_callback_fn
)udp_delete_test
},
5423 {"udp_buffered_delete_test", 0, (test_callback_fn
)udp_buffered_delete_test
},
5424 {"udp_verbosity_test", 0, (test_callback_fn
)udp_verbosity_test
},
5425 {"udp_quit_test", 0, (test_callback_fn
)udp_quit_test
},
5426 {"udp_flush_test", 0, (test_callback_fn
)udp_flush_test
},
5427 {"udp_incr_test", 0, (test_callback_fn
)udp_incr_test
},
5428 {"udp_decr_test", 0, (test_callback_fn
)udp_decr_test
},
5429 {"udp_stat_test", 0, (test_callback_fn
)udp_stat_test
},
5430 {"udp_version_test", 0, (test_callback_fn
)udp_version_test
},
5431 {"udp_get_test", 0, (test_callback_fn
)udp_get_test
},
5432 {"udp_mixed_io_test", 0, (test_callback_fn
)udp_mixed_io_test
},
5436 /* Clean the server before beginning testing */
5438 {"flush", 0, (test_callback_fn
)flush_test
},
5439 {"init", 0, (test_callback_fn
)init_test
},
5440 {"allocation", 0, (test_callback_fn
)allocation_test
},
5441 {"server_list_null_test", 0, (test_callback_fn
)server_list_null_test
},
5442 {"server_unsort", 0, (test_callback_fn
)server_unsort_test
},
5443 {"server_sort", 0, (test_callback_fn
)server_sort_test
},
5444 {"server_sort2", 0, (test_callback_fn
)server_sort2_test
},
5445 {"clone_test", 0, (test_callback_fn
)clone_test
},
5446 {"connection_test", 0, (test_callback_fn
)connection_test
},
5447 {"callback_test", 0, (test_callback_fn
)callback_test
},
5448 {"behavior_test", 0, (test_callback_fn
)behavior_test
},
5449 {"userdata_test", 0, (test_callback_fn
)userdata_test
},
5450 {"error", 0, (test_callback_fn
)error_test
},
5451 {"set", 0, (test_callback_fn
)set_test
},
5452 {"set2", 0, (test_callback_fn
)set_test2
},
5453 {"set3", 0, (test_callback_fn
)set_test3
},
5454 {"dump", 1, (test_callback_fn
)dump_test
},
5455 {"add", 1, (test_callback_fn
)add_test
},
5456 {"replace", 1, (test_callback_fn
)replace_test
},
5457 {"delete", 1, (test_callback_fn
)delete_test
},
5458 {"get", 1, (test_callback_fn
)get_test
},
5459 {"get2", 0, (test_callback_fn
)get_test2
},
5460 {"get3", 0, (test_callback_fn
)get_test3
},
5461 {"get4", 0, (test_callback_fn
)get_test4
},
5462 {"partial mget", 0, (test_callback_fn
)get_test5
},
5463 {"stats_servername", 0, (test_callback_fn
)stats_servername_test
},
5464 {"increment", 0, (test_callback_fn
)increment_test
},
5465 {"increment_with_initial", 1, (test_callback_fn
)increment_with_initial_test
},
5466 {"decrement", 0, (test_callback_fn
)decrement_test
},
5467 {"decrement_with_initial", 1, (test_callback_fn
)decrement_with_initial_test
},
5468 {"increment_by_key", 0, (test_callback_fn
)increment_by_key_test
},
5469 {"increment_with_initial_by_key", 1, (test_callback_fn
)increment_with_initial_by_key_test
},
5470 {"decrement_by_key", 0, (test_callback_fn
)decrement_by_key_test
},
5471 {"decrement_with_initial_by_key", 1, (test_callback_fn
)decrement_with_initial_by_key_test
},
5472 {"quit", 0, (test_callback_fn
)quit_test
},
5473 {"mget", 1, (test_callback_fn
)mget_test
},
5474 {"mget_result", 1, (test_callback_fn
)mget_result_test
},
5475 {"mget_result_alloc", 1, (test_callback_fn
)mget_result_alloc_test
},
5476 {"mget_result_function", 1, (test_callback_fn
)mget_result_function
},
5477 {"mget_execute", 1, (test_callback_fn
)mget_execute
},
5478 {"mget_end", 0, (test_callback_fn
)mget_end
},
5479 {"get_stats", 0, (test_callback_fn
)get_stats
},
5480 {"add_host_test", 0, (test_callback_fn
)add_host_test
},
5481 {"add_host_test_1", 0, (test_callback_fn
)add_host_test1
},
5482 {"get_stats_keys", 0, (test_callback_fn
)get_stats_keys
},
5483 {"behavior_test", 0, (test_callback_fn
)get_stats_keys
},
5484 {"callback_test", 0, (test_callback_fn
)get_stats_keys
},
5485 {"version_string_test", 0, (test_callback_fn
)version_string_test
},
5486 {"bad_key", 1, (test_callback_fn
)bad_key_test
},
5487 {"memcached_server_cursor", 1, (test_callback_fn
)memcached_server_cursor_test
},
5488 {"read_through", 1, (test_callback_fn
)read_through
},
5489 {"delete_through", 1, (test_callback_fn
)delete_through
},
5490 {"noreply", 1, (test_callback_fn
)noreply_test
},
5491 {"analyzer", 1, (test_callback_fn
)analyzer_test
},
5492 #ifdef HAVE_LIBMEMCACHEDUTIL
5493 {"connectionpool", 1, (test_callback_fn
)connection_pool_test
},
5495 {"test_get_last_disconnect", 1, (test_callback_fn
)test_get_last_disconnect
},
5499 test_st async_tests
[] ={
5500 {"add", 1, (test_callback_fn
)add_wrapper
},
5504 test_st string_tests
[] ={
5505 {"string static with null", 0, (test_callback_fn
)string_static_null
},
5506 {"string alloc with null", 0, (test_callback_fn
)string_alloc_null
},
5507 {"string alloc with 1K", 0, (test_callback_fn
)string_alloc_with_size
},
5508 {"string alloc with malloc failure", 0, (test_callback_fn
)string_alloc_with_size_toobig
},
5509 {"string append", 0, (test_callback_fn
)string_alloc_append
},
5510 {"string append failure (too big)", 0, (test_callback_fn
)string_alloc_append_toobig
},
5511 {0, 0, (test_callback_fn
)0}
5514 test_st result_tests
[] ={
5515 {"result static", 0, (test_callback_fn
)result_static
},
5516 {"result alloc", 0, (test_callback_fn
)result_alloc
},
5517 {0, 0, (test_callback_fn
)0}
5520 test_st version_1_2_3
[] ={
5521 {"append", 0, (test_callback_fn
)append_test
},
5522 {"prepend", 0, (test_callback_fn
)prepend_test
},
5523 {"cas", 0, (test_callback_fn
)cas_test
},
5524 {"cas2", 0, (test_callback_fn
)cas2_test
},
5525 {"append_binary", 0, (test_callback_fn
)append_binary_test
},
5526 {0, 0, (test_callback_fn
)0}
5529 test_st user_tests
[] ={
5530 {"user_supplied_bug1", 0, (test_callback_fn
)user_supplied_bug1
},
5531 {"user_supplied_bug2", 0, (test_callback_fn
)user_supplied_bug2
},
5532 {"user_supplied_bug3", 0, (test_callback_fn
)user_supplied_bug3
},
5533 {"user_supplied_bug4", 0, (test_callback_fn
)user_supplied_bug4
},
5534 {"user_supplied_bug5", 1, (test_callback_fn
)user_supplied_bug5
},
5535 {"user_supplied_bug6", 1, (test_callback_fn
)user_supplied_bug6
},
5536 {"user_supplied_bug7", 1, (test_callback_fn
)user_supplied_bug7
},
5537 {"user_supplied_bug8", 1, (test_callback_fn
)user_supplied_bug8
},
5538 {"user_supplied_bug9", 1, (test_callback_fn
)user_supplied_bug9
},
5539 {"user_supplied_bug10", 1, (test_callback_fn
)user_supplied_bug10
},
5540 {"user_supplied_bug11", 1, (test_callback_fn
)user_supplied_bug11
},
5541 {"user_supplied_bug12", 1, (test_callback_fn
)user_supplied_bug12
},
5542 {"user_supplied_bug13", 1, (test_callback_fn
)user_supplied_bug13
},
5543 {"user_supplied_bug14", 1, (test_callback_fn
)user_supplied_bug14
},
5544 {"user_supplied_bug15", 1, (test_callback_fn
)user_supplied_bug15
},
5545 {"user_supplied_bug16", 1, (test_callback_fn
)user_supplied_bug16
},
5548 ** It seems to be something weird with the character sets..
5549 ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
5550 ** guess I need to find out how this is supposed to work.. Perhaps I need
5551 ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
5552 ** so just disable the code for now...).
5554 {"user_supplied_bug17", 1, (test_callback_fn
)user_supplied_bug17
},
5556 {"user_supplied_bug18", 1, (test_callback_fn
)user_supplied_bug18
},
5557 {"user_supplied_bug19", 1, (test_callback_fn
)user_supplied_bug19
},
5558 {"user_supplied_bug20", 1, (test_callback_fn
)user_supplied_bug20
},
5559 {"user_supplied_bug21", 1, (test_callback_fn
)user_supplied_bug21
},
5560 {"wrong_failure_counter_test", 1, (test_callback_fn
)wrong_failure_counter_test
},
5561 {0, 0, (test_callback_fn
)0}
5564 test_st replication_tests
[]= {
5565 {"set", 1, (test_callback_fn
)replication_set_test
},
5566 {"get", 0, (test_callback_fn
)replication_get_test
},
5567 {"mget", 0, (test_callback_fn
)replication_mget_test
},
5568 {"delete", 0, (test_callback_fn
)replication_delete_test
},
5569 {"rand_mget", 0, (test_callback_fn
)replication_randomize_mget_test
},
5570 {0, 0, (test_callback_fn
)0}
5574 * The following test suite is used to verify that we don't introduce
5575 * regression bugs. If you want more information about the bug / test,
5576 * you should look in the bug report at
5577 * http://bugs.launchpad.net/libmemcached
5579 test_st regression_tests
[]= {
5580 {"lp:434484", 1, (test_callback_fn
)regression_bug_434484
},
5581 {"lp:434843", 1, (test_callback_fn
)regression_bug_434843
},
5582 {"lp:434843 buffered", 1, (test_callback_fn
)regression_bug_434843_buffered
},
5583 {"lp:421108", 1, (test_callback_fn
)regression_bug_421108
},
5584 {"lp:442914", 1, (test_callback_fn
)regression_bug_442914
},
5585 {"lp:447342", 1, (test_callback_fn
)regression_bug_447342
},
5586 {"lp:463297", 1, (test_callback_fn
)regression_bug_463297
},
5587 {0, 0, (test_callback_fn
)0}
5590 test_st ketama_compatibility
[]= {
5591 {"libmemcached", 1, (test_callback_fn
)ketama_compatibility_libmemcached
},
5592 {"spymemcached", 1, (test_callback_fn
)ketama_compatibility_spymemcached
},
5593 {0, 0, (test_callback_fn
)0}
5596 test_st generate_tests
[] ={
5597 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5598 {"generate_data", 1, (test_callback_fn
)generate_data
},
5599 {"get_read", 0, (test_callback_fn
)get_read
},
5600 {"delete_generate", 0, (test_callback_fn
)delete_generate
},
5601 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5602 {"delete_buffer", 0, (test_callback_fn
)delete_buffer_generate
},
5603 {"generate_data", 1, (test_callback_fn
)generate_data
},
5604 {"mget_read", 0, (test_callback_fn
)mget_read
},
5605 {"mget_read_result", 0, (test_callback_fn
)mget_read_result
},
5606 {"mget_read_function", 0, (test_callback_fn
)mget_read_function
},
5607 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5608 {"generate_large_pairs", 1, (test_callback_fn
)generate_large_pairs
},
5609 {"generate_data", 1, (test_callback_fn
)generate_data
},
5610 {"generate_buffer_data", 1, (test_callback_fn
)generate_buffer_data
},
5611 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5612 {0, 0, (test_callback_fn
)0}
5615 test_st consistent_tests
[] ={
5616 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5617 {"generate_data", 1, (test_callback_fn
)generate_data
},
5618 {"get_read", 0, (test_callback_fn
)get_read_count
},
5619 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5620 {0, 0, (test_callback_fn
)0}
5623 test_st consistent_weighted_tests
[] ={
5624 {"generate_pairs", 1, (test_callback_fn
)generate_pairs
},
5625 {"generate_data", 1, (test_callback_fn
)generate_data_with_stats
},
5626 {"get_read", 0, (test_callback_fn
)get_read_count
},
5627 {"cleanup", 1, (test_callback_fn
)cleanup_pairs
},
5628 {0, 0, (test_callback_fn
)0}
5631 test_st hsieh_availability
[] ={
5632 {"hsieh_avaibility_test", 0, (test_callback_fn
)hsieh_avaibility_test
},
5633 {0, 0, (test_callback_fn
)0}
5637 test_st hash_sanity
[] ={
5638 {"hash sanity", 0, (test_callback_fn
)hash_sanity_test
},
5639 {0, 0, (test_callback_fn
)0}
5643 test_st ketama_auto_eject_hosts
[] ={
5644 {"auto_eject_hosts", 1, (test_callback_fn
)auto_eject_hosts
},
5645 {"output_ketama_weighted_keys", 1, (test_callback_fn
)output_ketama_weighted_keys
},
5646 {0, 0, (test_callback_fn
)0}
5649 test_st hash_tests
[] ={
5650 {"md5", 0, (test_callback_fn
)md5_run
},
5651 {"crc", 0, (test_callback_fn
)crc_run
},
5652 {"fnv1_64", 0, (test_callback_fn
)fnv1_64_run
},
5653 {"fnv1a_64", 0, (test_callback_fn
)fnv1a_64_run
},
5654 {"fnv1_32", 0, (test_callback_fn
)fnv1_32_run
},
5655 {"fnv1a_32", 0, (test_callback_fn
)fnv1a_32_run
},
5656 {"hsieh", 0, (test_callback_fn
)hsieh_run
},
5657 {"murmur", 0, (test_callback_fn
)murmur_run
},
5658 {"jenkis", 0, (test_callback_fn
)jenkins_run
},
5659 {0, 0, (test_callback_fn
)0}
5662 collection_st collection
[] ={
5664 {"hash_sanity", 0, 0, hash_sanity
},
5666 {"hsieh_availability", 0, 0, hsieh_availability
},
5667 {"udp_setup", (test_callback_fn
)init_udp
, 0, udp_setup_server_tests
},
5668 {"udp_io", (test_callback_fn
)init_udp
, 0, upd_io_tests
},
5669 {"udp_binary_io", (test_callback_fn
)binary_init_udp
, 0, upd_io_tests
},
5670 {"block", 0, 0, tests
},
5671 {"binary", (test_callback_fn
)pre_binary
, 0, tests
},
5672 {"nonblock", (test_callback_fn
)pre_nonblock
, 0, tests
},
5673 {"nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5674 {"settimer", (test_callback_fn
)pre_settimer
, 0, tests
},
5675 {"md5", (test_callback_fn
)pre_md5
, 0, tests
},
5676 {"crc", (test_callback_fn
)pre_crc
, 0, tests
},
5677 {"hsieh", (test_callback_fn
)pre_hsieh
, 0, tests
},
5678 {"jenkins", (test_callback_fn
)pre_jenkins
, 0, tests
},
5679 {"fnv1_64", (test_callback_fn
)pre_hash_fnv1_64
, 0, tests
},
5680 {"fnv1a_64", (test_callback_fn
)pre_hash_fnv1a_64
, 0, tests
},
5681 {"fnv1_32", (test_callback_fn
)pre_hash_fnv1_32
, 0, tests
},
5682 {"fnv1a_32", (test_callback_fn
)pre_hash_fnv1a_32
, 0, tests
},
5683 {"ketama", (test_callback_fn
)pre_behavior_ketama
, 0, tests
},
5684 {"ketama_auto_eject_hosts", (test_callback_fn
)pre_behavior_ketama
, 0, ketama_auto_eject_hosts
},
5685 {"unix_socket", (test_callback_fn
)pre_unix_socket
, 0, tests
},
5686 {"unix_socket_nodelay", (test_callback_fn
)pre_nodelay
, 0, tests
},
5687 {"poll_timeout", (test_callback_fn
)poll_timeout
, 0, tests
},
5688 {"gets", (test_callback_fn
)enable_cas
, 0, tests
},
5689 {"consistent", (test_callback_fn
)enable_consistent
, 0, tests
},
5690 #ifdef MEMCACHED_ENABLE_DEPRECATED
5691 {"deprecated_memory_allocators", (test_callback_fn
)deprecated_set_memory_alloc
, 0, tests
},
5693 {"memory_allocators", (test_callback_fn
)set_memory_alloc
, 0, tests
},
5694 {"prefix", (test_callback_fn
)set_prefix
, 0, tests
},
5695 {"version_1_2_3", (test_callback_fn
)check_for_1_2_3
, 0, version_1_2_3
},
5696 {"string", 0, 0, string_tests
},
5697 {"result", 0, 0, result_tests
},
5698 {"async", (test_callback_fn
)pre_nonblock
, 0, async_tests
},
5699 {"async_binary", (test_callback_fn
)pre_nonblock_binary
, 0, async_tests
},
5700 {"user", 0, 0, user_tests
},
5701 {"generate", 0, 0, generate_tests
},
5702 {"generate_hsieh", (test_callback_fn
)pre_hsieh
, 0, generate_tests
},
5703 {"generate_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, generate_tests
},
5704 {"generate_hsieh_consistent", (test_callback_fn
)enable_consistent
, 0, generate_tests
},
5705 {"generate_md5", (test_callback_fn
)pre_md5
, 0, generate_tests
},
5706 {"generate_murmur", (test_callback_fn
)pre_murmur
, 0, generate_tests
},
5707 {"generate_jenkins", (test_callback_fn
)pre_jenkins
, 0, generate_tests
},
5708 {"generate_nonblock", (test_callback_fn
)pre_nonblock
, 0, generate_tests
},
5709 {"consistent_not", 0, 0, consistent_tests
},
5710 {"consistent_ketama", (test_callback_fn
)pre_behavior_ketama
, 0, consistent_tests
},
5711 {"consistent_ketama_weighted", (test_callback_fn
)pre_behavior_ketama_weighted
, 0, consistent_weighted_tests
},
5712 {"ketama_compat", 0, 0, ketama_compatibility
},
5713 {"test_hashes", 0, 0, hash_tests
},
5714 {"replication", (test_callback_fn
)pre_replication
, 0, replication_tests
},
5715 {"replication_noblock", (test_callback_fn
)pre_replication_noblock
, 0, replication_tests
},
5716 {"regression", 0, 0, regression_tests
},
5720 #define SERVERS_TO_CREATE 5
5722 #include "libmemcached_world.h"
5724 void get_world(world_st
*world
)
5726 world
->collections
= collection
;
5727 world
->collection_startup
= (test_callback_fn
)world_collection_startup
;
5728 world
->flush
= (test_callback_fn
)world_flush
;
5729 world
->pre_run
= (test_callback_fn
)world_pre_run
;
5730 world
->create
= (test_callback_create_fn
)world_create
;
5731 world
->post_run
= (test_callback_fn
)world_post_run
;
5732 world
->on_error
= (test_callback_error_fn
)world_on_error
;
5733 world
->destroy
= (test_callback_fn
)world_destroy
;
5734 world
->runner
= &defualt_libmemcached_runner
;