1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5 * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6 * Copyright (C) 2006-2009 Brian Aker All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following disclaimer
17 * in the documentation and/or other materials provided with the
20 * * The names of its contributors may not be used to endorse or
21 * promote products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include <libtest/test.hpp>
45 #include <libmemcached/memcached.h>
46 #include <libmemcached/is.h>
47 #include <libmemcached/server_instance.h>
49 #include <libhashkit/hashkit.h>
58 #include <sys/types.h>
63 #include <libtest/server.h>
65 #include "clients/generator.h"
66 #include "clients/execute.h"
68 #define SMALL_STRING_LEN 1024
70 #include <libtest/test.hpp>
72 #include "tests/basic.h"
73 #include "tests/debug.h"
74 #include "tests/deprecated.h"
75 #include "tests/error_conditions.h"
76 #include "tests/exist.h"
77 #include "tests/ketama.h"
78 #include "tests/namespace.h"
79 #include "tests/parser.h"
80 #include "tests/pool.h"
81 #include "tests/print.h"
82 #include "tests/replication.h"
83 #include "tests/server_add.h"
84 #include "tests/virtual_buckets.h"
86 using namespace libtest
;
88 #include <libmemcached/memcached_util.h>
90 #include "hash_results.h"
92 #define GLOBAL_COUNT 10000
93 #define GLOBAL2_COUNT 100
94 #define SERVERS_TO_CREATE 5
95 static uint32_t global_count
;
97 static pairs_st
*global_pairs
;
98 static const char *global_keys
[GLOBAL_COUNT
];
99 static size_t global_keys_length
[GLOBAL_COUNT
];
102 static test_return_t
pre_binary(memcached_st
*memc
);
105 static test_return_t
init_test(memcached_st
*not_used
)
110 (void)memcached_create(&memc
);
111 memcached_free(&memc
);
116 #define TEST_PORT_COUNT 7
117 in_port_t test_ports
[TEST_PORT_COUNT
];
119 static memcached_return_t
server_display_function(const memcached_st
*ptr
,
120 const memcached_server_st
*server
,
124 size_t bigger
= *((size_t *)(context
));
126 assert(bigger
<= memcached_server_port(server
));
127 *((size_t *)(context
))= memcached_server_port(server
);
129 return MEMCACHED_SUCCESS
;
132 static memcached_return_t
dump_server_information(const memcached_st
*ptr
,
133 const memcached_server_st
*instance
,
137 FILE *stream
= (FILE *)context
;
140 fprintf(stream
, "Memcached Server: %s %u Version %u.%u.%u\n",
141 memcached_server_name(instance
),
142 memcached_server_port(instance
),
143 instance
->major_version
,
144 instance
->minor_version
,
145 instance
->micro_version
);
147 return MEMCACHED_SUCCESS
;
150 static test_return_t
server_sort_test(memcached_st
*ptr
)
152 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
154 memcached_return_t rc
;
155 memcached_server_fn callbacks
[1];
156 memcached_st
*local_memc
;
159 local_memc
= memcached_create(NULL
);
160 test_true(local_memc
);
161 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
163 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
165 test_ports
[x
]= (in_port_t
)random() % 64000;
166 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
167 test_compare(memcached_server_count(local_memc
), x
+1);
169 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
171 test_compare(MEMCACHED_SUCCESS
, rc
);
174 callbacks
[0]= server_display_function
;
175 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
178 memcached_free(local_memc
);
183 static test_return_t
server_sort2_test(memcached_st
*ptr
)
185 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
186 memcached_server_fn callbacks
[1];
187 memcached_st
*local_memc
;
188 memcached_server_instance_st instance
;
191 local_memc
= memcached_create(NULL
);
192 test_true(local_memc
);
193 test_compare(MEMCACHED_SUCCESS
,
194 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1));
196 test_compare(MEMCACHED_SUCCESS
,
197 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0));
198 instance
= memcached_server_instance_by_position(local_memc
, 0);
199 test_compare(in_port_t(43043), memcached_server_port(instance
));
201 test_compare(MEMCACHED_SUCCESS
,
202 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0));
204 instance
= memcached_server_instance_by_position(local_memc
, 0);
205 test_compare(in_port_t(43042), memcached_server_port(instance
));
207 instance
= memcached_server_instance_by_position(local_memc
, 1);
208 test_compare(in_port_t(43043), memcached_server_port(instance
));
210 callbacks
[0]= server_display_function
;
211 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
214 memcached_free(local_memc
);
219 static test_return_t
memcached_server_remove_test(memcached_st
*)
221 const char *server_string
= "--server=localhost:4444 --server=localhost:4445 --server=localhost:4446 --server=localhost:4447 --server=localhost --server=memcache1.memcache.bk.sapo.pt:11211 --server=memcache1.memcache.bk.sapo.pt:11212 --server=memcache1.memcache.bk.sapo.pt:11213 --server=memcache1.memcache.bk.sapo.pt:11214 --server=memcache2.memcache.bk.sapo.pt:11211 --server=memcache2.memcache.bk.sapo.pt:11212 --server=memcache2.memcache.bk.sapo.pt:11213 --server=memcache2.memcache.bk.sapo.pt:11214";
224 test_compare(MEMCACHED_SUCCESS
,
225 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
226 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
229 memcached_server_fn callbacks
[1];
230 callbacks
[0]= server_print_callback
;
231 memcached_server_cursor(memc
, callbacks
, NULL
, 1);
233 memcached_free(memc
);
238 static memcached_return_t
server_display_unsort_function(const memcached_st
*,
239 const memcached_server_st
*server
,
243 uint32_t x
= *((uint32_t *)(context
));
245 if (! (test_ports
[x
] == server
->port
))
247 fprintf(stderr
, "%lu -> %lu\n", (unsigned long)test_ports
[x
], (unsigned long)server
->port
);
248 return MEMCACHED_FAILURE
;
251 *((uint32_t *)(context
))= ++x
;
253 return MEMCACHED_SUCCESS
;
256 static test_return_t
server_unsort_test(memcached_st
*ptr
)
258 size_t counter
= 0; /* Prime the value for the test_true in server_display_function */
259 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
260 memcached_server_fn callbacks
[1];
261 memcached_st
*local_memc
;
264 local_memc
= memcached_create(NULL
);
265 test_true(local_memc
);
267 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
269 test_ports
[x
]= (in_port_t
)(random() % 64000);
270 test_compare(MEMCACHED_SUCCESS
,
271 memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0));
272 test_compare(memcached_server_count(local_memc
), x
+1);
274 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
278 callbacks
[0]= server_display_unsort_function
;
279 memcached_server_cursor(local_memc
, callbacks
, (void *)&counter
, 1);
281 /* Now we sort old data! */
282 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
283 callbacks
[0]= server_display_function
;
284 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
287 memcached_free(local_memc
);
292 static test_return_t
allocation_test(memcached_st
*not_used
)
296 memc
= memcached_create(NULL
);
298 memcached_free(memc
);
303 static test_return_t
clone_test(memcached_st
*memc
)
307 memcached_st
*memc_clone
;
308 memc_clone
= memcached_clone(NULL
, NULL
);
309 test_true(memc_clone
);
310 memcached_free(memc_clone
);
313 /* Can we init from null? */
315 memcached_st
*memc_clone
;
316 memc_clone
= memcached_clone(NULL
, memc
);
317 test_true(memc_clone
);
320 test_true(memc_clone
->allocators
.free
== memc
->allocators
.free
);
321 test_true(memc_clone
->allocators
.malloc
== memc
->allocators
.malloc
);
322 test_true(memc_clone
->allocators
.realloc
== memc
->allocators
.realloc
);
323 test_true(memc_clone
->allocators
.calloc
== memc
->allocators
.calloc
);
326 test_true(memc_clone
->connect_timeout
== memc
->connect_timeout
);
327 test_true(memc_clone
->delete_trigger
== memc
->delete_trigger
);
328 test_true(memc_clone
->distribution
== memc
->distribution
);
329 { // Test all of the flags
330 test_true(memc_clone
->flags
.no_block
== memc
->flags
.no_block
);
331 test_true(memc_clone
->flags
.tcp_nodelay
== memc
->flags
.tcp_nodelay
);
332 test_true(memc_clone
->flags
.support_cas
== memc
->flags
.support_cas
);
333 test_true(memc_clone
->flags
.buffer_requests
== memc
->flags
.buffer_requests
);
334 test_true(memc_clone
->flags
.use_sort_hosts
== memc
->flags
.use_sort_hosts
);
335 test_true(memc_clone
->flags
.verify_key
== memc
->flags
.verify_key
);
336 test_true(memc_clone
->ketama
.weighted
== memc
->ketama
.weighted
);
337 test_true(memc_clone
->flags
.binary_protocol
== memc
->flags
.binary_protocol
);
338 test_true(memc_clone
->flags
.hash_with_namespace
== memc
->flags
.hash_with_namespace
);
339 test_true(memc_clone
->flags
.no_reply
== memc
->flags
.no_reply
);
340 test_true(memc_clone
->flags
.use_udp
== memc
->flags
.use_udp
);
341 test_true(memc_clone
->flags
.auto_eject_hosts
== memc
->flags
.auto_eject_hosts
);
342 test_true(memc_clone
->flags
.randomize_replica_read
== memc
->flags
.randomize_replica_read
);
344 test_true(memc_clone
->get_key_failure
== memc
->get_key_failure
);
345 test_true(hashkit_compare(&memc_clone
->hashkit
, &memc
->hashkit
));
346 test_true(memc_clone
->io_bytes_watermark
== memc
->io_bytes_watermark
);
347 test_true(memc_clone
->io_msg_watermark
== memc
->io_msg_watermark
);
348 test_true(memc_clone
->io_key_prefetch
== memc
->io_key_prefetch
);
349 test_true(memc_clone
->on_cleanup
== memc
->on_cleanup
);
350 test_true(memc_clone
->on_clone
== memc
->on_clone
);
351 test_true(memc_clone
->poll_timeout
== memc
->poll_timeout
);
352 test_true(memc_clone
->rcv_timeout
== memc
->rcv_timeout
);
353 test_true(memc_clone
->recv_size
== memc
->recv_size
);
354 test_true(memc_clone
->retry_timeout
== memc
->retry_timeout
);
355 test_true(memc_clone
->send_size
== memc
->send_size
);
356 test_true(memc_clone
->server_failure_limit
== memc
->server_failure_limit
);
357 test_true(memc_clone
->snd_timeout
== memc
->snd_timeout
);
358 test_true(memc_clone
->user_data
== memc
->user_data
);
360 memcached_free(memc_clone
);
363 /* Can we init from struct? */
365 memcached_st declared_clone
;
366 memcached_st
*memc_clone
;
367 memset(&declared_clone
, 0 , sizeof(memcached_st
));
368 memc_clone
= memcached_clone(&declared_clone
, NULL
);
369 test_true(memc_clone
);
370 memcached_free(memc_clone
);
373 /* Can we init from struct? */
375 memcached_st declared_clone
;
376 memcached_st
*memc_clone
;
377 memset(&declared_clone
, 0 , sizeof(memcached_st
));
378 memc_clone
= memcached_clone(&declared_clone
, memc
);
379 test_true(memc_clone
);
380 memcached_free(memc_clone
);
386 static test_return_t
userdata_test(memcached_st
*memc
)
389 test_false(memcached_set_user_data(memc
, foo
));
390 test_true(memcached_get_user_data(memc
) == foo
);
391 test_true(memcached_set_user_data(memc
, NULL
) == foo
);
396 static test_return_t
connection_test(memcached_st
*memc
)
398 test_compare(MEMCACHED_SUCCESS
,
399 memcached_server_add_with_weight(memc
, "localhost", 0, 0));
404 static test_return_t
libmemcached_string_behavior_test(memcached_st
*)
406 for (int x
= MEMCACHED_BEHAVIOR_NO_BLOCK
; x
< int(MEMCACHED_BEHAVIOR_MAX
); ++x
)
408 test_true(libmemcached_string_behavior(memcached_behavior_t(x
)));
410 test_compare(36, int(MEMCACHED_BEHAVIOR_MAX
));
415 static test_return_t
libmemcached_string_distribution_test(memcached_st
*)
417 for (int x
= MEMCACHED_DISTRIBUTION_MODULA
; x
< int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
); ++x
)
419 test_true(libmemcached_string_distribution(memcached_server_distribution_t(x
)));
421 test_compare(7, int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
));
426 static test_return_t
memcached_return_t_TEST(memcached_st
*memc
)
428 uint32_t values
[] = { 851992627U, 2337886783U, 4109241422U, 4001849190U,
429 982370485U, 1263635348U, 4242906218U, 3829656100U,
430 1891735253U, 334139633U, 2257084983U, 3088286104U,
431 13199785U, 2542027183U, 1097051614U, 199566778U,
432 2748246961U, 2465192557U, 1664094137U, 2405439045U,
433 1842224848U, 692413798U, 3479807801U, 919913813U,
434 4269430871U, 610793021U, 527273862U, 1437122909U,
435 2300930706U, 2943759320U, 674306647U, 2400528935U,
436 54481931U, 4186304426U, 1741088401U, 2979625118U,
437 4159057246U, 3425930182U, 2593724503U, 1868899624U,
438 1769812374U, 2302537950U, 1110330676U, 3365377466U,
439 1336171666U, 3021258493U, 2334992265U, 3861994737U,
442 // You have updated the memcache_error messages but not updated docs/tests.
443 for (int rc
= int(MEMCACHED_SUCCESS
); rc
< int(MEMCACHED_MAXIMUM_RETURN
); ++rc
)
446 const char *msg
= memcached_strerror(memc
, memcached_return_t(rc
));
447 hash_val
= memcached_generate_hash_value(msg
, strlen(msg
),
448 MEMCACHED_HASH_JENKINS
);
449 if (values
[rc
] != hash_val
)
451 fprintf(stderr
, "\n\nYou have updated memcached_return_t without updating the memcached_return_t_TEST\n");
452 fprintf(stderr
, "%u, %s, (%u)\n\n", (uint32_t)rc
, memcached_strerror(memc
, memcached_return_t(rc
)), hash_val
);
454 test_compare(values
[rc
], hash_val
);
456 test_compare(48, int(MEMCACHED_MAXIMUM_RETURN
));
461 static test_return_t
set_test(memcached_st
*memc
)
463 memcached_return_t rc
= memcached_set(memc
,
464 test_literal_param("foo"),
465 test_literal_param("when we sanitize"),
466 time_t(0), (uint32_t)0);
467 test_true_got(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
472 static test_return_t
append_test(memcached_st
*memc
)
474 memcached_return_t rc
;
475 const char *key
= "fig";
476 const char *in_value
= "we";
477 char *out_value
= NULL
;
481 rc
= memcached_flush(memc
, 0);
482 test_compare(MEMCACHED_SUCCESS
, rc
);
484 rc
= memcached_set(memc
, key
, strlen(key
),
485 in_value
, strlen(in_value
),
486 (time_t)0, (uint32_t)0);
487 test_compare(MEMCACHED_SUCCESS
, rc
);
489 rc
= memcached_append(memc
, key
, strlen(key
),
490 " the", strlen(" the"),
491 (time_t)0, (uint32_t)0);
492 test_compare(MEMCACHED_SUCCESS
, rc
);
494 rc
= memcached_append(memc
, key
, strlen(key
),
495 " people", strlen(" people"),
496 (time_t)0, (uint32_t)0);
497 test_compare(MEMCACHED_SUCCESS
, rc
);
499 out_value
= memcached_get(memc
, key
, strlen(key
),
500 &value_length
, &flags
, &rc
);
501 test_memcmp(out_value
, "we the people", strlen("we the people"));
502 test_compare(strlen("we the people"), value_length
);
503 test_compare(MEMCACHED_SUCCESS
, rc
);
509 static test_return_t
append_binary_test(memcached_st
*memc
)
511 memcached_return_t rc
;
512 const char *key
= "numbers";
513 uint32_t store_list
[] = { 23, 56, 499, 98, 32847, 0 };
519 rc
= memcached_flush(memc
, 0);
520 test_compare(MEMCACHED_SUCCESS
, rc
);
522 rc
= memcached_set(memc
,
525 (time_t)0, (uint32_t)0);
526 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
528 for (x
= 0; store_list
[x
] ; x
++)
530 rc
= memcached_append(memc
,
532 (char *)&store_list
[x
], sizeof(uint32_t),
533 (time_t)0, (uint32_t)0);
534 test_compare(MEMCACHED_SUCCESS
, rc
);
537 value
= (uint32_t *)memcached_get(memc
, key
, strlen(key
),
538 &value_length
, &flags
, &rc
);
539 test_compare(value_length
, sizeof(uint32_t) * x
);
540 test_compare(MEMCACHED_SUCCESS
, rc
);
542 for (uint32_t counter
= x
, *ptr
= value
; counter
; counter
--)
544 test_compare(*ptr
, store_list
[x
- counter
]);
552 static test_return_t
cas2_test(memcached_st
*memc
)
554 memcached_return_t rc
;
555 const char *keys
[]= {"fudge", "son", "food"};
556 size_t key_length
[]= {5, 3, 4};
557 const char *value
= "we the people";
558 size_t value_length
= strlen("we the people");
559 memcached_result_st results_obj
;
560 memcached_result_st
*results
;
563 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
565 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
567 for (uint32_t x
= 0; x
< 3; x
++)
569 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
570 keys
[x
], key_length
[x
],
571 (time_t)50, (uint32_t)9);
572 test_compare(MEMCACHED_SUCCESS
, rc
);
575 test_compare(MEMCACHED_SUCCESS
,
576 memcached_mget(memc
, keys
, key_length
, 3));
578 results
= memcached_result_create(memc
, &results_obj
);
581 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
583 test_true(results
->item_cas
);
584 test_compare(MEMCACHED_SUCCESS
, rc
);
585 test_true(memcached_result_cas(results
));
587 test_memcmp(value
, "we the people", strlen("we the people"));
588 test_compare(strlen("we the people"), value_length
);
589 test_compare(MEMCACHED_SUCCESS
, rc
);
591 memcached_result_free(&results_obj
);
596 static test_return_t
cas_test(memcached_st
*memc
)
598 memcached_return_t rc
;
599 const char *key
= "fun";
600 size_t key_length
= strlen(key
);
601 const char *value
= "we the people";
602 const char* keys
[2] = { key
, NULL
};
603 size_t keylengths
[2] = { strlen(key
), 0 };
604 size_t value_length
= strlen(value
);
605 const char *value2
= "change the value";
606 size_t value2_length
= strlen(value2
);
608 memcached_result_st results_obj
;
609 memcached_result_st
*results
;
612 rc
= memcached_flush(memc
, 0);
613 test_compare(MEMCACHED_SUCCESS
, rc
);
615 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
617 rc
= memcached_set(memc
, key
, strlen(key
),
618 value
, strlen(value
),
619 (time_t)0, (uint32_t)0);
620 test_compare(MEMCACHED_SUCCESS
, rc
);
622 test_compare(MEMCACHED_SUCCESS
,
623 memcached_mget(memc
, keys
, keylengths
, 1));
625 results
= memcached_result_create(memc
, &results_obj
);
628 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
630 test_compare(MEMCACHED_SUCCESS
, rc
);
631 test_true(memcached_result_cas(results
));
632 test_memcmp(value
, memcached_result_value(results
), value_length
);
633 test_compare(strlen(memcached_result_value(results
)), value_length
);
634 test_compare(MEMCACHED_SUCCESS
, rc
);
635 uint64_t cas
= memcached_result_cas(results
);
638 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
639 test_true(rc
== MEMCACHED_END
);
640 test_true(results
== NULL
);
643 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
644 test_compare(MEMCACHED_SUCCESS
, rc
);
647 * The item will have a new cas value, so try to set it again with the old
648 * value. This should fail!
650 rc
= memcached_cas(memc
, key
, key_length
, value2
, value2_length
, 0, 0, cas
);
651 test_compare(MEMCACHED_DATA_EXISTS
, rc
);
653 memcached_result_free(&results_obj
);
658 static test_return_t
prepend_test(memcached_st
*memc
)
660 memcached_return_t rc
;
661 const char *key
= "fig";
662 const char *value
= "people";
663 char *out_value
= NULL
;
667 rc
= memcached_flush(memc
, 0);
668 test_compare(MEMCACHED_SUCCESS
, rc
);
670 rc
= memcached_set(memc
, key
, strlen(key
),
671 value
, strlen(value
),
672 (time_t)0, (uint32_t)0);
673 test_compare(MEMCACHED_SUCCESS
, rc
);
675 rc
= memcached_prepend(memc
, key
, strlen(key
),
676 "the ", strlen("the "),
677 (time_t)0, (uint32_t)0);
678 test_compare(MEMCACHED_SUCCESS
, rc
);
680 rc
= memcached_prepend(memc
, key
, strlen(key
),
681 "we ", strlen("we "),
682 (time_t)0, (uint32_t)0);
683 test_compare(MEMCACHED_SUCCESS
, rc
);
685 out_value
= memcached_get(memc
, key
, strlen(key
),
686 &value_length
, &flags
, &rc
);
687 test_memcmp(out_value
, "we the people", strlen("we the people"));
688 test_compare(strlen("we the people"), value_length
);
689 test_compare(MEMCACHED_SUCCESS
, rc
);
696 Set the value, then quit to make sure it is flushed.
697 Come back in and test that add fails.
699 static test_return_t
add_test(memcached_st
*memc
)
701 memcached_return_t rc
;
702 const char *key
= "foo";
703 const char *value
= "when we sanitize";
704 unsigned long long setting_value
;
706 setting_value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
708 rc
= memcached_set(memc
, key
, strlen(key
),
709 value
, strlen(value
),
710 (time_t)0, (uint32_t)0);
711 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
712 memcached_quit(memc
);
713 rc
= memcached_add(memc
, key
, strlen(key
),
714 value
, strlen(value
),
715 (time_t)0, (uint32_t)0);
717 /* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
720 test_true(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_STORED
);
724 test_true(rc
== MEMCACHED_NOTSTORED
|| rc
== MEMCACHED_DATA_EXISTS
);
731 ** There was a problem of leaking filedescriptors in the initial release
732 ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
733 ** systems it seems that the kernel is slow on reclaiming the resources
734 ** because the connects starts to time out (the test doesn't do much
735 ** anyway, so just loop 10 iterations)
737 static test_return_t
add_wrapper(memcached_st
*memc
)
739 unsigned int max
= 10000;
747 for (uint32_t x
= 0; x
< max
; x
++)
753 static test_return_t
replace_test(memcached_st
*memc
)
755 memcached_return_t rc
;
756 const char *key
= "foo";
757 const char *value
= "when we sanitize";
758 const char *original
= "first we insert some data";
760 rc
= memcached_set(memc
, key
, strlen(key
),
761 original
, strlen(original
),
762 (time_t)0, (uint32_t)0);
763 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
765 test_compare(MEMCACHED_SUCCESS
,
766 memcached_replace(memc
, key
, strlen(key
),
767 value
, strlen(value
),
768 (time_t)0, (uint32_t)0));
773 static test_return_t
delete_test(memcached_st
*memc
)
775 memcached_return_t rc
;
776 const char *key
= "foo";
777 const char *value
= "when we sanitize";
779 rc
= memcached_set(memc
, key
, strlen(key
),
780 value
, strlen(value
),
781 (time_t)0, (uint32_t)0);
782 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
784 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
785 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
790 static test_return_t
flush_test(memcached_st
*memc
)
792 uint64_t query_id
= memcached_query_id(memc
);
793 test_compare(MEMCACHED_SUCCESS
,
794 memcached_flush(memc
, 0));
795 test_compare(query_id
+1, memcached_query_id(memc
));
800 static memcached_return_t
server_function(const memcached_st
*ptr
,
801 const memcached_server_st
*server
,
804 (void)ptr
; (void)server
; (void)context
;
807 return MEMCACHED_SUCCESS
;
810 static test_return_t
memcached_server_cursor_test(memcached_st
*memc
)
813 strncpy(context
, "foo bad", sizeof(context
));
814 memcached_server_fn callbacks
[1];
816 callbacks
[0]= server_function
;
817 memcached_server_cursor(memc
, callbacks
, context
, 1);
821 static test_return_t
bad_key_test(memcached_st
*memc
)
823 memcached_return_t rc
;
824 const char *key
= "foo bad";
826 memcached_st
*memc_clone
;
827 size_t max_keylen
= 0xffff;
829 uint64_t query_id
= memcached_query_id(memc
);
831 // Just skip if we are in binary mode.
832 test_skip(false, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
834 test_compare(query_id
, memcached_query_id(memc
)); // We should not increase the query_id for memcached_behavior_get()
836 memc_clone
= memcached_clone(NULL
, memc
);
837 test_true(memc_clone
);
839 query_id
= memcached_query_id(memc_clone
);
840 test_compare(MEMCACHED_SUCCESS
,
841 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
842 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
844 /* All keys are valid in the binary protocol (except for length) */
845 if (not memcached_behavior_get(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
))
847 uint64_t before_query_id
= memcached_query_id(memc_clone
);
849 size_t string_length
;
850 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
851 &string_length
, &flags
, &rc
);
852 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
853 test_zero(string_length
);
856 test_compare(before_query_id
+1, memcached_query_id(memc_clone
));
858 query_id
= memcached_query_id(memc_clone
);
859 test_compare(MEMCACHED_SUCCESS
,
860 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, false));
861 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
863 size_t string_length
;
864 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
865 &string_length
, &flags
, &rc
);
866 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
867 test_zero(string_length
);
871 /* Test multi key for bad keys */
872 const char *keys
[] = { "GoodKey", "Bad Key", "NotMine" };
873 size_t key_lengths
[] = { 7, 7, 7 };
874 query_id
= memcached_query_id(memc_clone
);
875 test_compare(MEMCACHED_SUCCESS
,
876 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
877 test_compare(query_id
, memcached_query_id(memc_clone
));
879 query_id
= memcached_query_id(memc_clone
);
880 test_compare(MEMCACHED_BAD_KEY_PROVIDED
,
881 memcached_mget(memc_clone
, keys
, key_lengths
, 3));
882 test_compare(query_id
+1, memcached_query_id(memc_clone
));
884 query_id
= memcached_query_id(memc_clone
);
885 test_compare(MEMCACHED_BAD_KEY_PROVIDED
,
886 memcached_mget_by_key(memc_clone
, "foo daddy", 9, keys
, key_lengths
, 1));
887 test_compare(query_id
+1, memcached_query_id(memc_clone
));
891 /* The following test should be moved to the end of this function when the
892 memcached server is updated to allow max size length of the keys in the
895 test_compare(MEMCACHED_SUCCESS
,
896 memcached_callback_set(memc_clone
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
898 std::vector
<char> longkey
;
899 longkey
.insert(longkey
.end(), max_keylen
+1, 'a');
900 test_compare(longkey
.size(), max_keylen
+1);
902 size_t string_length
;
903 test_null(memcached_get(memc_clone
, &longkey
[0], max_keylen
, &string_length
, &flags
, &rc
));
904 test_compare(MEMCACHED_NOTFOUND
, rc
);
905 test_zero(string_length
);
907 test_null(memcached_get(memc_clone
, &longkey
[0], max_keylen
+1, &string_length
, &flags
, &rc
));
908 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
909 test_zero(string_length
);
913 /* Make sure zero length keys are marked as bad */
915 test_compare(MEMCACHED_SUCCESS
,
916 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
917 size_t string_length
;
918 char *string
= memcached_get(memc_clone
, key
, 0,
919 &string_length
, &flags
, &rc
);
920 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
921 test_zero(string_length
);
925 memcached_free(memc_clone
);
930 #define READ_THROUGH_VALUE "set for me"
931 static memcached_return_t
read_through_trigger(memcached_st
*memc
,
934 memcached_result_st
*result
)
936 (void)memc
;(void)key
;(void)key_length
;
937 return memcached_result_set_value(result
, READ_THROUGH_VALUE
, strlen(READ_THROUGH_VALUE
));
940 #ifndef __INTEL_COMPILER
941 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
944 static test_return_t
read_through(memcached_st
*memc
)
946 memcached_return_t rc
;
947 const char *key
= "foo";
949 size_t string_length
;
951 memcached_trigger_key_fn cb
= (memcached_trigger_key_fn
)read_through_trigger
;
953 string
= memcached_get(memc
, key
, strlen(key
),
954 &string_length
, &flags
, &rc
);
956 test_compare(MEMCACHED_NOTFOUND
, rc
);
957 test_false(string_length
);
960 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_GET_FAILURE
, *(void **)&cb
);
961 test_compare(MEMCACHED_SUCCESS
, rc
);
963 string
= memcached_get(memc
, key
, strlen(key
),
964 &string_length
, &flags
, &rc
);
966 test_compare(MEMCACHED_SUCCESS
, rc
);
967 test_compare(string_length
, sizeof(READ_THROUGH_VALUE
) -1);
968 test_true(string
[sizeof(READ_THROUGH_VALUE
) -1] == 0);
969 test_strcmp(READ_THROUGH_VALUE
, string
);
972 string
= memcached_get(memc
, key
, strlen(key
),
973 &string_length
, &flags
, &rc
);
975 test_compare(MEMCACHED_SUCCESS
, rc
);
977 test_compare(string_length
, sizeof(READ_THROUGH_VALUE
) -1);
978 test_true(string
[sizeof(READ_THROUGH_VALUE
) -1] == 0);
979 test_strcmp(READ_THROUGH_VALUE
, string
);
985 static memcached_return_t
delete_trigger(memcached_st
*,
992 return MEMCACHED_SUCCESS
;
995 static test_return_t
delete_through(memcached_st
*memc
)
997 memcached_trigger_delete_key_fn callback
;
999 callback
= (memcached_trigger_delete_key_fn
)delete_trigger
;
1001 test_compare(MEMCACHED_SUCCESS
,
1002 memcached_callback_set(memc
, MEMCACHED_CALLBACK_DELETE_TRIGGER
, *(void**)&callback
));
1004 return TEST_SUCCESS
;
1007 static test_return_t
get_test(memcached_st
*memc
)
1009 memcached_return_t rc
;
1010 const char *key
= "foo";
1012 size_t string_length
;
1015 uint64_t query_id
= memcached_query_id(memc
);
1016 rc
= memcached_delete(memc
, key
, strlen(key
), (time_t)0);
1017 test_true(rc
== MEMCACHED_BUFFERED
|| rc
== MEMCACHED_NOTFOUND
);
1018 test_compare(query_id
+1, memcached_query_id(memc
));
1020 string
= memcached_get(memc
, key
, strlen(key
),
1021 &string_length
, &flags
, &rc
);
1023 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1024 test_false(string_length
);
1027 return TEST_SUCCESS
;
1030 static test_return_t
get_test2(memcached_st
*memc
)
1032 const char *key
= "foo";
1033 const char *value
= "when we sanitize";
1035 uint64_t query_id
= memcached_query_id(memc
);
1036 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
1037 value
, strlen(value
),
1038 (time_t)0, (uint32_t)0);
1039 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1040 test_compare(query_id
+1, memcached_query_id(memc
));
1042 query_id
= memcached_query_id(memc
);
1043 test_true(query_id
);
1046 size_t string_length
;
1047 char *string
= memcached_get(memc
, key
, strlen(key
),
1048 &string_length
, &flags
, &rc
);
1049 test_compare(query_id
+1, memcached_query_id(memc
));
1051 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
1052 test_compare_got(MEMCACHED_SUCCESS
, memcached_last_error(memc
), memcached_last_error_message(memc
));
1054 test_compare(strlen(value
), string_length
);
1055 test_memcmp(string
, value
, string_length
);
1059 return TEST_SUCCESS
;
1062 static test_return_t
set_test2(memcached_st
*memc
)
1064 const char *key
= "foo";
1065 const char *value
= "train in the brain";
1066 size_t value_length
= strlen(value
);
1068 for (uint32_t x
= 0; x
< 10; x
++)
1070 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
1071 value
, value_length
,
1072 (time_t)0, (uint32_t)0);
1073 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1076 return TEST_SUCCESS
;
1079 static test_return_t
set_test3(memcached_st
*memc
)
1081 size_t value_length
= 8191;
1083 char *value
= (char*)malloc(value_length
);
1086 for (uint32_t x
= 0; x
< value_length
; x
++)
1088 value
[x
] = (char) (x
% 127);
1091 /* The dump test relies on there being at least 32 items in memcached */
1092 for (uint32_t x
= 0; x
< 32; x
++)
1096 snprintf(key
, sizeof(key
), "foo%u", x
);
1098 uint64_t query_id
= memcached_query_id(memc
);
1099 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
1100 value
, value_length
,
1101 (time_t)0, (uint32_t)0);
1102 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1103 test_compare(query_id
+1, memcached_query_id(memc
));
1108 return TEST_SUCCESS
;
1111 static test_return_t
get_test3(memcached_st
*memc
)
1113 const char *key
= "foo";
1114 size_t value_length
= 8191;
1116 char *value
= (char*)malloc(value_length
);
1119 for (uint32_t x
= 0; x
< value_length
; x
++)
1121 value
[x
] = (char) (x
% 127);
1124 memcached_return_t rc
;
1125 rc
= memcached_set(memc
, key
, strlen(key
),
1126 value
, value_length
,
1127 (time_t)0, (uint32_t)0);
1128 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1130 size_t string_length
;
1132 char *string
= memcached_get(memc
, key
, strlen(key
),
1133 &string_length
, &flags
, &rc
);
1135 test_compare(MEMCACHED_SUCCESS
, rc
);
1137 test_compare(string_length
, value_length
);
1138 test_memcmp(string
, value
, string_length
);
1143 return TEST_SUCCESS
;
1146 static test_return_t
get_test4(memcached_st
*memc
)
1148 const char *key
= "foo";
1149 size_t value_length
= 8191;
1151 char *value
= (char*)malloc(value_length
);
1154 for (uint32_t x
= 0; x
< value_length
; x
++)
1156 value
[x
] = (char) (x
% 127);
1159 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
1160 value
, value_length
,
1161 (time_t)0, (uint32_t)0);
1162 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1164 for (uint32_t x
= 0; x
< 10; x
++)
1167 size_t string_length
;
1168 char *string
= memcached_get(memc
, key
, strlen(key
),
1169 &string_length
, &flags
, &rc
);
1171 test_compare(MEMCACHED_SUCCESS
, rc
);
1173 test_compare(string_length
, value_length
);
1174 test_memcmp(string
, value
, string_length
);
1180 return TEST_SUCCESS
;
1184 * This test verifies that memcached_read_one_response doesn't try to
1185 * dereference a NIL-pointer if you issue a multi-get and don't read out all
1186 * responses before you execute a storage command.
1188 static test_return_t
get_test5(memcached_st
*memc
)
1191 ** Request the same key twice, to ensure that we hash to the same server
1192 ** (so that we have multiple response values queued up) ;-)
1194 const char *keys
[]= { "key", "key" };
1195 size_t lengths
[]= { 3, 3 };
1199 memcached_return_t rc
= memcached_set(memc
, keys
[0], lengths
[0],
1200 keys
[0], lengths
[0], 0, 0);
1201 test_compare(MEMCACHED_SUCCESS
, memcached_mget(memc
, keys
, lengths
, test_array_length(keys
)));
1203 memcached_result_st results_obj
;
1204 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
1207 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
1210 memcached_result_free(&results_obj
);
1212 /* Don't read out the second result, but issue a set instead.. */
1213 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0));
1215 char *val
= memcached_get_by_key(memc
, keys
[0], lengths
[0], "yek", 3,
1216 &rlen
, &flags
, &rc
);
1218 test_compare(MEMCACHED_NOTFOUND
, rc
);
1219 val
= memcached_get(memc
, keys
[0], lengths
[0], &rlen
, &flags
, &rc
);
1221 test_compare(MEMCACHED_SUCCESS
, rc
);
1224 return TEST_SUCCESS
;
1227 static test_return_t
mget_end(memcached_st
*memc
)
1229 const char *keys
[]= { "foo", "foo2" };
1230 size_t lengths
[]= { 3, 4 };
1231 const char *values
[]= { "fjord", "41" };
1233 memcached_return_t rc
;
1236 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1238 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
, keys
[x
], lengths
[x
], values
[x
], strlen(values
[x
]), (time_t)0, (uint32_t)0));
1242 size_t string_length
;
1245 // retrieve both via mget
1246 test_compare(MEMCACHED_SUCCESS
, memcached_mget(memc
, keys
, lengths
, test_array_length(keys
)));
1248 char key
[MEMCACHED_MAX_KEY
];
1251 // this should get both
1252 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1254 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
,
1256 test_compare(MEMCACHED_SUCCESS
, rc
);
1258 if (key_length
== 4)
1263 test_compare(string_length
, strlen(values
[val
]));
1264 test_true(strncmp(values
[val
], string
, string_length
) == 0);
1268 // this should indicate end
1269 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1270 test_compare(MEMCACHED_END
, rc
);
1274 rc
= memcached_mget(memc
, keys
, lengths
, 1);
1275 test_compare(MEMCACHED_SUCCESS
, rc
);
1277 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1278 test_compare(key_length
, lengths
[0]);
1279 test_true(strncmp(keys
[0], key
, key_length
) == 0);
1280 test_compare(string_length
, strlen(values
[0]));
1281 test_true(strncmp(values
[0], string
, string_length
) == 0);
1282 test_compare(MEMCACHED_SUCCESS
, rc
);
1285 // this should indicate end
1286 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1287 test_compare(MEMCACHED_END
, rc
);
1290 return TEST_SUCCESS
;
1293 /* Do not copy the style of this code, I just access hosts to testthis function */
1294 static test_return_t
stats_servername_test(memcached_st
*memc
)
1296 memcached_stat_st memc_stat
;
1297 memcached_server_instance_st instance
=
1298 memcached_server_instance_by_position(memc
, 0);
1300 if (LIBMEMCACHED_WITH_SASL_SUPPORT
and memcached_get_sasl_callbacks(memc
))
1302 return TEST_SKIPPED
;
1305 test_compare(MEMCACHED_SUCCESS
, memcached_stat_servername(&memc_stat
, NULL
,
1306 memcached_server_name(instance
),
1307 memcached_server_port(instance
)));
1309 return TEST_SUCCESS
;
1312 static test_return_t
increment_test(memcached_st
*memc
)
1314 uint64_t new_number
;
1316 test_compare(MEMCACHED_SUCCESS
,
1318 test_literal_param("number"),
1319 test_literal_param("0"),
1320 (time_t)0, (uint32_t)0));
1322 test_compare(MEMCACHED_SUCCESS
,
1323 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1324 test_compare(uint64_t(1), new_number
);
1326 test_compare(MEMCACHED_SUCCESS
,
1327 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1328 test_compare(uint64_t(2), new_number
);
1330 return TEST_SUCCESS
;
1333 static test_return_t
increment_with_initial_test(memcached_st
*memc
)
1335 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1337 uint64_t new_number
;
1338 uint64_t initial
= 0;
1340 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1342 test_compare(MEMCACHED_SUCCESS
,
1343 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1344 test_compare(new_number
, initial
);
1346 test_compare(MEMCACHED_SUCCESS
,
1347 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1348 test_compare(new_number
, (initial
+1));
1350 return TEST_SUCCESS
;
1353 static test_return_t
decrement_test(memcached_st
*memc
)
1355 uint64_t new_number
;
1356 memcached_return_t rc
;
1357 const char *value
= "3";
1359 rc
= memcached_set(memc
,
1360 test_literal_param("number"),
1361 value
, strlen(value
),
1362 (time_t)0, (uint32_t)0);
1363 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1365 test_compare(MEMCACHED_SUCCESS
,
1366 memcached_decrement(memc
,
1367 test_literal_param("number"),
1369 test_compare(uint64_t(2), new_number
);
1371 test_compare(MEMCACHED_SUCCESS
,
1372 memcached_decrement(memc
,
1373 test_literal_param("number"),
1375 test_compare(uint64_t(1), new_number
);
1377 return TEST_SUCCESS
;
1380 static test_return_t
decrement_with_initial_test(memcached_st
*memc
)
1382 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1384 uint64_t new_number
;
1385 uint64_t initial
= 3;
1387 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1389 test_compare(MEMCACHED_SUCCESS
,
1390 memcached_decrement_with_initial(memc
,
1391 test_literal_param("number"),
1392 1, initial
, 0, &new_number
));
1393 test_compare(new_number
, initial
);
1395 test_compare(MEMCACHED_SUCCESS
,
1396 memcached_decrement_with_initial(memc
,
1397 test_literal_param("number"),
1398 1, initial
, 0, &new_number
));
1399 test_compare(new_number
, (initial
- 1));
1401 return TEST_SUCCESS
;
1404 static test_return_t
increment_by_key_test(memcached_st
*memc
)
1406 uint64_t new_number
;
1407 memcached_return_t rc
;
1408 const char *master_key
= "foo";
1409 const char *key
= "number";
1410 const char *value
= "0";
1412 rc
= memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1414 value
, strlen(value
),
1415 (time_t)0, (uint32_t)0);
1416 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1418 test_compare(MEMCACHED_SUCCESS
,
1419 memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
), 1, &new_number
));
1420 test_compare(uint64_t(1), new_number
);
1422 test_compare(MEMCACHED_SUCCESS
,
1423 memcached_increment_by_key(memc
, master_key
, strlen(master_key
), key
, strlen(key
), 1, &new_number
));
1424 test_compare(uint64_t(2), new_number
);
1426 return TEST_SUCCESS
;
1429 static test_return_t
increment_with_initial_by_key_test(memcached_st
*memc
)
1431 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1433 uint64_t new_number
;
1434 memcached_return_t rc
;
1435 const char *master_key
= "foo";
1436 const char *key
= "number";
1437 uint64_t initial
= 0;
1439 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1441 1, initial
, 0, &new_number
);
1442 test_compare(MEMCACHED_SUCCESS
, rc
);
1443 test_compare(new_number
, initial
);
1445 rc
= memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1447 1, initial
, 0, &new_number
);
1448 test_compare(MEMCACHED_SUCCESS
, rc
);
1449 test_compare(new_number
, (initial
+1));
1451 return TEST_SUCCESS
;
1454 static test_return_t
decrement_by_key_test(memcached_st
*memc
)
1456 uint64_t new_number
;
1457 memcached_return_t rc
;
1458 const char *value
= "3";
1460 rc
= memcached_set_by_key(memc
,
1461 test_literal_param("foo"),
1462 test_literal_param("number"),
1463 value
, strlen(value
),
1464 (time_t)0, (uint32_t)0);
1465 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1467 test_compare(MEMCACHED_SUCCESS
,
1468 memcached_decrement_by_key(memc
,
1469 test_literal_param("foo"),
1470 test_literal_param("number"),
1472 test_compare(uint64_t(2), new_number
);
1474 test_compare(MEMCACHED_SUCCESS
,
1475 memcached_decrement_by_key(memc
,
1476 test_literal_param("foo"),
1477 test_literal_param("number"),
1479 test_compare(uint64_t(1), new_number
);
1481 return TEST_SUCCESS
;
1484 static test_return_t
decrement_with_initial_by_key_test(memcached_st
*memc
)
1486 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1488 uint64_t new_number
;
1489 uint64_t initial
= 3;
1491 test_compare(MEMCACHED_SUCCESS
,
1492 memcached_decrement_with_initial_by_key(memc
,
1493 test_literal_param("foo"),
1494 test_literal_param("number"),
1495 1, initial
, 0, &new_number
));
1496 test_compare(new_number
, initial
);
1498 test_compare(MEMCACHED_SUCCESS
,
1499 memcached_decrement_with_initial_by_key(memc
,
1500 test_literal_param("foo"),
1501 test_literal_param("number"),
1502 1, initial
, 0, &new_number
));
1503 test_compare(new_number
, (initial
- 1));
1505 return TEST_SUCCESS
;
1507 static test_return_t
binary_increment_with_prefix_test(memcached_st
*orig_memc
)
1509 memcached_st
*memc
= memcached_clone(NULL
, orig_memc
);
1511 test_skip(TEST_SUCCESS
, pre_binary(memc
));
1513 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)"namespace:"));
1515 memcached_return_t rc
;
1516 rc
= memcached_set(memc
,
1517 test_literal_param("number"),
1518 test_literal_param("0"),
1519 (time_t)0, (uint32_t)0);
1520 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1522 uint64_t new_number
;
1523 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1524 test_literal_param("number"),
1526 test_compare(uint64_t(1), new_number
);
1528 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1529 test_literal_param("number"),
1531 test_compare(uint64_t(2), new_number
);
1532 memcached_free(memc
);
1534 return TEST_SUCCESS
;
1537 static test_return_t
quit_test(memcached_st
*memc
)
1539 memcached_return_t rc
;
1540 const char *key
= "fudge";
1541 const char *value
= "sanford and sun";
1543 rc
= memcached_set(memc
, key
, strlen(key
),
1544 value
, strlen(value
),
1545 (time_t)10, (uint32_t)3);
1546 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1547 memcached_quit(memc
);
1549 rc
= memcached_set(memc
, key
, strlen(key
),
1550 value
, strlen(value
),
1551 (time_t)50, (uint32_t)9);
1552 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1554 return TEST_SUCCESS
;
1557 static test_return_t
mget_result_test(memcached_st
*memc
)
1559 const char *keys
[]= {"fudge", "son", "food"};
1560 size_t key_length
[]= {5, 3, 4};
1562 memcached_result_st results_obj
;
1563 memcached_result_st
*results
;
1565 results
= memcached_result_create(memc
, &results_obj
);
1567 test_true(&results_obj
== results
);
1569 /* We need to empty the server before continueing test */
1570 test_compare(MEMCACHED_SUCCESS
,
1571 memcached_flush(memc
, 0));
1573 test_compare(MEMCACHED_SUCCESS
,
1574 memcached_mget(memc
, keys
, key_length
, 3));
1576 memcached_return_t rc
;
1577 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1582 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
))) { test_true(false); /* We should never see a value returned */ };
1583 test_false(results
);
1584 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1586 for (uint32_t x
= 0; x
< 3; x
++)
1588 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1589 keys
[x
], key_length
[x
],
1590 (time_t)50, (uint32_t)9);
1591 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1594 test_compare(MEMCACHED_SUCCESS
,
1595 memcached_mget(memc
, keys
, key_length
, 3));
1597 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1600 test_true(&results_obj
== results
);
1601 test_compare(MEMCACHED_SUCCESS
, rc
);
1602 test_memcmp(memcached_result_key_value(results
),
1603 memcached_result_value(results
),
1604 memcached_result_length(results
));
1605 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1608 memcached_result_free(&results_obj
);
1610 return TEST_SUCCESS
;
1613 static test_return_t
mget_result_alloc_test(memcached_st
*memc
)
1615 const char *keys
[]= {"fudge", "son", "food"};
1616 size_t key_length
[]= {5, 3, 4};
1618 memcached_result_st
*results
;
1620 /* We need to empty the server before continueing test */
1621 test_compare(MEMCACHED_SUCCESS
,
1622 memcached_flush(memc
, 0));
1624 test_compare(MEMCACHED_SUCCESS
,
1625 memcached_mget(memc
, keys
, key_length
, 3));
1627 memcached_return_t rc
;
1628 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1632 test_false(results
);
1633 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1635 for (uint32_t x
= 0; x
< 3; x
++)
1637 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1638 keys
[x
], key_length
[x
],
1639 (time_t)50, (uint32_t)9);
1640 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1643 test_compare(MEMCACHED_SUCCESS
,
1644 memcached_mget(memc
, keys
, key_length
, 3));
1647 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1650 test_compare(MEMCACHED_SUCCESS
, rc
);
1651 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1652 test_memcmp(memcached_result_key_value(results
),
1653 memcached_result_value(results
),
1654 memcached_result_length(results
));
1655 memcached_result_free(results
);
1659 return TEST_SUCCESS
;
1662 /* Count the results */
1663 static memcached_return_t
callback_counter(const memcached_st
*, memcached_result_st
*, void *context
)
1665 size_t *counter
= (size_t *)context
;
1667 *counter
= *counter
+ 1;
1669 return MEMCACHED_SUCCESS
;
1672 static test_return_t
mget_result_function(memcached_st
*memc
)
1674 const char *keys
[]= {"fudge", "son", "food"};
1675 size_t key_length
[]= {5, 3, 4};
1677 memcached_execute_fn callbacks
[1];
1679 /* We need to empty the server before continueing test */
1680 test_compare(MEMCACHED_SUCCESS
,
1681 memcached_flush(memc
, 0));
1682 for (uint32_t x
= 0; x
< 3; x
++)
1684 memcached_return_t rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1685 keys
[x
], key_length
[x
],
1686 (time_t)50, (uint32_t)9);
1687 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1690 test_compare(MEMCACHED_SUCCESS
,
1691 memcached_mget(memc
, keys
, key_length
, 3));
1693 callbacks
[0]= &callback_counter
;
1696 test_compare(MEMCACHED_SUCCESS
,
1697 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1699 test_compare(size_t(3), counter
);
1701 return TEST_SUCCESS
;
1704 static test_return_t
mget_test(memcached_st
*memc
)
1706 const char *keys
[]= {"fudge", "son", "food"};
1707 size_t key_length
[]= {5, 3, 4};
1709 char return_key
[MEMCACHED_MAX_KEY
];
1710 size_t return_key_length
;
1712 size_t return_value_length
;
1714 /* We need to empty the server before continueing test */
1715 test_compare(MEMCACHED_SUCCESS
,
1716 memcached_flush(memc
, 0));
1718 test_compare(MEMCACHED_SUCCESS
,
1719 memcached_mget(memc
, keys
, key_length
, 3));
1722 memcached_return_t rc
;
1723 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1724 &return_value_length
, &flags
, &rc
)))
1726 test_true(return_value
);
1728 test_false(return_value
);
1729 test_zero(return_value_length
);
1730 test_compare(MEMCACHED_NOTFOUND
, rc
);
1732 for (uint32_t x
= 0; x
< 3; x
++)
1734 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1735 keys
[x
], key_length
[x
],
1736 (time_t)50, (uint32_t)9);
1737 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1739 test_compare(MEMCACHED_SUCCESS
,
1740 memcached_mget(memc
, keys
, key_length
, 3));
1743 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1744 &return_value_length
, &flags
, &rc
)))
1746 test_true(return_value
);
1747 test_compare(MEMCACHED_SUCCESS
, rc
);
1748 if (not memc
->_namespace
)
1750 test_compare(return_key_length
, return_value_length
);
1751 test_memcmp(return_value
, return_key
, return_value_length
);
1757 return TEST_SUCCESS
;
1760 static test_return_t
mget_execute(memcached_st
*memc
)
1764 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) != 0)
1768 * I only want to hit _one_ server so I know the number of requests I'm
1769 * sending in the pipeline.
1771 uint32_t number_of_hosts
= memc
->number_of_hosts
;
1772 memc
->number_of_hosts
= 1;
1774 size_t max_keys
= 20480;
1777 char **keys
= static_cast<char **>(calloc(max_keys
, sizeof(char*)));
1778 size_t *key_length
=static_cast<size_t *>(calloc(max_keys
, sizeof(size_t)));
1780 /* First add all of the items.. */
1781 char blob
[1024] = {0};
1782 memcached_return_t rc
;
1784 for (size_t x
= 0; x
< max_keys
; ++x
)
1788 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
1790 test_true(keys
[x
] != NULL
);
1791 uint64_t query_id
= memcached_query_id(memc
);
1792 rc
= memcached_add(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
1793 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1794 test_compare(query_id
+1, memcached_query_id(memc
));
1797 /* Try to get all of them with a large multiget */
1799 memcached_execute_fn callbacks
[]= { &callback_counter
};
1800 rc
= memcached_mget_execute(memc
, (const char**)keys
, key_length
,
1801 max_keys
, callbacks
, &counter
, 1);
1803 if (memcached_success(rc
))
1806 uint64_t query_id
= memcached_query_id(memc
);
1807 test_compare(MEMCACHED_SUCCESS
,
1808 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1809 test_compare(query_id
, memcached_query_id(memc
));
1811 /* Verify that we got all of the items */
1812 test_true(counter
== max_keys
);
1814 else if (rc
== MEMCACHED_NOT_SUPPORTED
)
1816 test_true(counter
== 0);
1820 test_fail("note: this test functions differently when in binary mode");
1823 /* Release all allocated resources */
1824 for (size_t x
= 0; x
< max_keys
; ++x
)
1831 memc
->number_of_hosts
= number_of_hosts
;
1832 return TEST_SUCCESS
;
1835 #define REGRESSION_BINARY_VS_BLOCK_COUNT 20480
1837 static test_return_t
key_setup(memcached_st
*memc
)
1839 test_skip(TEST_SUCCESS
, pre_binary(memc
));
1841 global_pairs
= pairs_generate(REGRESSION_BINARY_VS_BLOCK_COUNT
, 0);
1843 return TEST_SUCCESS
;
1846 static test_return_t
key_teardown(memcached_st
*memc
)
1849 pairs_free(global_pairs
);
1851 return TEST_SUCCESS
;
1854 static test_return_t
block_add_regression(memcached_st
*memc
)
1856 /* First add all of the items.. */
1857 for (size_t x
= 0; x
< REGRESSION_BINARY_VS_BLOCK_COUNT
; ++x
)
1859 memcached_return_t rc
;
1860 char blob
[1024] = {0};
1862 rc
= memcached_add_by_key(memc
, "bob", 3, global_pairs
[x
].key
, global_pairs
[x
].key_length
, blob
, sizeof(blob
), 0, 0);
1863 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
1866 return TEST_SUCCESS
;
1869 static test_return_t
binary_add_regression(memcached_st
*memc
)
1871 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
1872 test_return_t rc
= block_add_regression(memc
);
1873 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 0);
1877 static test_return_t
get_stats_keys(memcached_st
*memc
)
1881 memcached_stat_st memc_stat
;
1882 memcached_return_t rc
;
1884 stat_list
= memcached_stat_get_keys(memc
, &memc_stat
, &rc
);
1885 test_compare(MEMCACHED_SUCCESS
, rc
);
1886 for (ptr
= stat_list
; *ptr
; ptr
++)
1891 return TEST_SUCCESS
;
1894 static test_return_t
version_string_test(memcached_st
*memc
)
1896 const char *version_string
;
1899 version_string
= memcached_lib_version();
1901 test_strcmp(version_string
, LIBMEMCACHED_VERSION_STRING
);
1903 return TEST_SUCCESS
;
1906 static test_return_t
get_stats(memcached_st
*memc
)
1908 memcached_return_t rc
;
1910 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
1911 test_compare(MEMCACHED_SUCCESS
, rc
);
1912 test_true(memc_stat
);
1914 for (uint32_t x
= 0; x
< memcached_server_count(memc
); x
++)
1916 char **stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
1917 test_compare(MEMCACHED_SUCCESS
, rc
);
1918 for (char **ptr
= stat_list
; *ptr
; ptr
++) {};
1923 memcached_stat_free(NULL
, memc_stat
);
1925 return TEST_SUCCESS
;
1928 static test_return_t
add_host_test(memcached_st
*memc
)
1931 memcached_server_st
*servers
;
1932 memcached_return_t rc
;
1933 char servername
[]= "0.example.com";
1935 servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
1937 test_true(1 == memcached_server_list_count(servers
));
1939 for (x
= 2; x
< 20; x
++)
1941 char buffer
[SMALL_STRING_LEN
];
1943 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
1944 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
1946 test_compare(MEMCACHED_SUCCESS
, rc
);
1947 test_true(x
== memcached_server_list_count(servers
));
1950 rc
= memcached_server_push(memc
, servers
);
1951 test_compare(MEMCACHED_SUCCESS
, rc
);
1952 rc
= memcached_server_push(memc
, servers
);
1953 test_compare(MEMCACHED_SUCCESS
, rc
);
1955 memcached_server_list_free(servers
);
1957 return TEST_SUCCESS
;
1960 static test_return_t
memcached_fetch_result_NOT_FOUND(memcached_st
*memc
)
1962 memcached_return_t rc
;
1963 const char *key
= "not_found";
1964 size_t key_len
= strlen(key
);
1966 test_compare(MEMCACHED_SUCCESS
,
1967 memcached_mget(memc
, &key
, &key_len
, 1));
1969 memcached_result_st
*result
= NULL
;
1970 result
= memcached_fetch_result(memc
, result
, &rc
);
1972 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1974 memcached_result_free(result
);
1976 return TEST_SUCCESS
;
1979 static memcached_return_t
clone_test_callback(memcached_st
*parent
, memcached_st
*memc_clone
)
1981 (void)parent
;(void)memc_clone
;
1982 return MEMCACHED_SUCCESS
;
1985 static memcached_return_t
cleanup_test_callback(memcached_st
*ptr
)
1988 return MEMCACHED_SUCCESS
;
1991 static test_return_t
callback_test(memcached_st
*memc
)
1993 /* Test User Data */
1997 memcached_return_t rc
;
1999 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
);
2000 test_compare(MEMCACHED_SUCCESS
, rc
);
2001 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
2002 test_true(*test_ptr
== x
);
2005 /* Test Clone Callback */
2007 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
2008 void *clone_cb_ptr
= *(void **)&clone_cb
;
2009 void *temp_function
= NULL
;
2010 memcached_return_t rc
;
2012 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
2014 test_compare(MEMCACHED_SUCCESS
, rc
);
2015 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
2016 test_true(temp_function
== clone_cb_ptr
);
2019 /* Test Cleanup Callback */
2021 memcached_cleanup_fn cleanup_cb
=
2022 (memcached_cleanup_fn
)cleanup_test_callback
;
2023 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
2024 void *temp_function
= NULL
;
2025 memcached_return_t rc
;
2027 rc
= memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
,
2029 test_compare(MEMCACHED_SUCCESS
, rc
);
2030 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
2031 test_true(temp_function
== cleanup_cb_ptr
);
2034 return TEST_SUCCESS
;
2037 /* We don't test the behavior itself, we test the switches */
2038 static test_return_t
behavior_test(memcached_st
*memc
)
2043 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2044 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
2045 test_true(value
== 1);
2047 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2048 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
2049 test_true(value
== 1);
2051 set
= MEMCACHED_HASH_MD5
;
2052 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
2053 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
2054 test_true(value
== MEMCACHED_HASH_MD5
);
2058 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2059 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
);
2060 test_true(value
== 0);
2062 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2063 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
);
2064 test_true(value
== 0);
2066 set
= MEMCACHED_HASH_DEFAULT
;
2067 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
2068 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
2069 test_true(value
== MEMCACHED_HASH_DEFAULT
);
2071 set
= MEMCACHED_HASH_CRC
;
2072 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, set
);
2073 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
2074 test_true(value
== MEMCACHED_HASH_CRC
);
2076 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
2077 test_true(value
> 0);
2079 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
2080 test_true(value
> 0);
2082 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
2083 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+ 1);
2084 test_true((value
+ 1) == memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
));
2086 return TEST_SUCCESS
;
2089 static test_return_t
MEMCACHED_BEHAVIOR_CORK_test(memcached_st
*memc
)
2091 memcached_return_t rc
;
2094 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CORK
, set
);
2095 test_true(rc
== MEMCACHED_DEPRECATED
);
2097 // Platform dependent
2099 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_CORK
);
2103 return TEST_SUCCESS
;
2107 static test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test(memcached_st
*memc
)
2109 memcached_return_t rc
;
2113 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
, set
);
2114 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
2116 value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
);
2118 if (rc
== MEMCACHED_SUCCESS
)
2120 test_true((bool)value
== set
);
2124 test_false((bool)value
== set
);
2127 return TEST_SUCCESS
;
2131 static test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st
*memc
)
2133 memcached_return_t rc
;
2137 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
, set
);
2138 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
2140 value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
);
2142 if (rc
== MEMCACHED_SUCCESS
)
2144 test_true((bool)value
== set
);
2148 test_false((bool)value
== set
);
2151 return TEST_SUCCESS
;
2154 static test_return_t
fetch_all_results(memcached_st
*memc
, unsigned int &keys_returned
, const memcached_return_t expect
)
2156 memcached_return_t rc
;
2157 char return_key
[MEMCACHED_MAX_KEY
];
2158 size_t return_key_length
;
2160 size_t return_value_length
;
2164 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2165 &return_value_length
, &flags
, &rc
)))
2167 test_true(return_value
);
2168 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2173 if (memcached_success(expect
) and memcached_success(rc
))
2175 return TEST_SUCCESS
;
2177 else if (expect
== rc
)
2179 return TEST_SUCCESS
;
2181 fprintf(stderr
, "\n%s:%u %s(#%u)\n", __FILE__
, __LINE__
, memcached_strerror(NULL
, rc
), keys_returned
);
2183 return TEST_FAILURE
;
2186 /* Test case provided by Cal Haldenbrand */
2187 #define HALDENBRAND_KEY_COUNT 3000U // * 1024576
2188 #define HALDENBRAND_FLAG_KEY 99 // * 1024576
2189 static test_return_t
user_supplied_bug1(memcached_st
*memc
)
2191 /* We just keep looking at the same values over and over */
2194 unsigned int setter
= 1;
2195 test_compare(MEMCACHED_SUCCESS
,
2196 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
));
2197 test_compare(MEMCACHED_SUCCESS
,
2198 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
));
2202 unsigned long long total
= 0;
2203 for (uint32_t x
= 0 ; total
< 20 * 1024576 ; x
++ )
2205 uint32_t size
= (uint32_t)(rand() % ( 5 * 1024 ) ) + 400;
2206 char randomstuff
[6 * 1024];
2207 memset(randomstuff
, 0, 6 * 1024);
2208 test_true(size
< 6 * 1024); /* Being safe here */
2210 for (uint32_t j
= 0 ; j
< size
;j
++)
2212 randomstuff
[j
] = (signed char) ((rand() % 26) + 97);
2217 int key_length
= snprintf(key
, sizeof(key
), "%u", x
);
2218 test_compare(MEMCACHED_SUCCESS
,
2219 memcached_set(memc
, key
, key_length
, randomstuff
, strlen(randomstuff
), time_t(0), HALDENBRAND_FLAG_KEY
));
2221 test_true(total
> HALDENBRAND_KEY_COUNT
);
2223 return TEST_SUCCESS
;
2226 /* Test case provided by Cal Haldenbrand */
2227 static test_return_t
user_supplied_bug2(memcached_st
*memc
)
2229 unsigned int setter
= 1;
2231 test_compare(MEMCACHED_SUCCESS
,
2232 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
));
2234 test_compare(MEMCACHED_SUCCESS
,
2235 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
));
2238 setter
= 20 * 1024576;
2239 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
2240 setter
= 20 * 1024576;
2241 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
2242 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
2243 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
2245 for (x
= 0, errors
= 0; total
< 20 * 1024576 ; x
++)
2248 size_t total_value_length
= 0;
2249 for (uint32_t x
= 0, errors
= 0; total_value_length
< 24576 ; x
++)
2254 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
2255 int key_length
= snprintf(key
, sizeof(key
), "%u", x
);
2257 memcached_return_t rc
;
2258 char *getval
= memcached_get(memc
, key
, key_length
, &val_len
, &flags
, &rc
);
2259 if (memcached_failed(rc
))
2261 if (rc
== MEMCACHED_NOTFOUND
)
2272 test_compare(uint32_t(HALDENBRAND_FLAG_KEY
), flags
);
2274 total_value_length
+= val_len
;
2279 return TEST_SUCCESS
;
2282 /* Do a large mget() over all the keys we think exist */
2283 static test_return_t
user_supplied_bug3(memcached_st
*memc
)
2285 unsigned int setter
= 1;
2286 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, setter
);
2287 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, setter
);
2289 setter
= 20 * 1024576;
2290 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
, setter
);
2291 setter
= 20 * 1024576;
2292 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
, setter
);
2293 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
);
2294 getter
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
);
2297 size_t key_lengths
[HALDENBRAND_KEY_COUNT
];
2298 char **keys
= static_cast<char **>(calloc(HALDENBRAND_KEY_COUNT
, sizeof(char *)));
2300 for (uint32_t x
= 0; x
< HALDENBRAND_KEY_COUNT
; x
++)
2302 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
2303 int key_length
= snprintf(key
, sizeof(key
), "%u", x
);
2304 keys
[x
]= strdup(key
);
2306 key_lengths
[x
]= key_length
;
2307 test_compare(size_t(key_length
), strlen(keys
[x
]));
2310 test_compare(MEMCACHED_SUCCESS
,
2311 memcached_mget(memc
, (const char **)keys
, key_lengths
, HALDENBRAND_KEY_COUNT
));
2313 unsigned int keys_returned
;
2314 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, keys_returned
, MEMCACHED_SUCCESS
));
2315 test_compare(HALDENBRAND_KEY_COUNT
, keys_returned
);
2317 for (uint32_t x
= 0; x
< HALDENBRAND_KEY_COUNT
; x
++)
2323 return TEST_SUCCESS
;
2326 /* Make sure we behave properly if server list has no values */
2327 static test_return_t
user_supplied_bug4(memcached_st
*memc
)
2329 const char *keys
[]= {"fudge", "son", "food"};
2330 size_t key_length
[]= {5, 3, 4};
2332 /* Here we free everything before running a bunch of mget tests */
2333 memcached_servers_reset(memc
);
2336 /* We need to empty the server before continueing test */
2337 test_compare(MEMCACHED_NO_SERVERS
,
2338 memcached_flush(memc
, 0));
2340 test_compare(MEMCACHED_NO_SERVERS
,
2341 memcached_mget(memc
, keys
, key_length
, 3));
2343 unsigned int keys_returned
;
2344 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, keys_returned
, MEMCACHED_NOTFOUND
));
2345 test_zero(keys_returned
);
2347 for (uint32_t x
= 0; x
< 3; x
++)
2349 test_compare(MEMCACHED_NO_SERVERS
,
2350 memcached_set(memc
, keys
[x
], key_length
[x
],
2351 keys
[x
], key_length
[x
],
2352 (time_t)50, (uint32_t)9));
2355 test_compare(MEMCACHED_NO_SERVERS
,
2356 memcached_mget(memc
, keys
, key_length
, 3));
2360 char return_key
[MEMCACHED_MAX_KEY
];
2361 memcached_return_t rc
;
2362 size_t return_key_length
;
2363 size_t return_value_length
;
2366 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2367 &return_value_length
, &flags
, &rc
)))
2369 test_true(return_value
);
2370 test_compare(MEMCACHED_SUCCESS
, rc
);
2371 test_true(return_key_length
== return_value_length
);
2372 test_memcmp(return_value
, return_key
, return_value_length
);
2378 return TEST_SUCCESS
;
2381 #define VALUE_SIZE_BUG5 1048064
2382 static test_return_t
user_supplied_bug5(memcached_st
*memc
)
2384 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2385 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2387 size_t value_length
;
2389 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2391 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2393 insert_data
[x
]= (signed char)rand();
2396 test_compare(MEMCACHED_SUCCESS
,
2397 memcached_flush(memc
, 0));
2399 memcached_return_t rc
;
2400 value
= memcached_get(memc
, keys
[0], key_length
[0],
2401 &value_length
, &flags
, &rc
);
2403 test_compare(MEMCACHED_SUCCESS
,
2404 memcached_mget(memc
, keys
, key_length
, 4));
2407 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
, MEMCACHED_NOTFOUND
));
2410 for (uint32_t x
= 0; x
< 4; x
++)
2412 test_compare(MEMCACHED_SUCCESS
,
2413 memcached_set(memc
, keys
[x
], key_length
[x
],
2414 insert_data
, VALUE_SIZE_BUG5
,
2415 (time_t)0, (uint32_t)0));
2418 for (uint32_t x
= 0; x
< 10; x
++)
2420 value
= memcached_get(memc
, keys
[0], key_length
[0],
2421 &value_length
, &flags
, &rc
);
2422 test_compare(rc
, MEMCACHED_SUCCESS
);
2426 test_compare(MEMCACHED_SUCCESS
,
2427 memcached_mget(memc
, keys
, key_length
, 4));
2429 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
, MEMCACHED_SUCCESS
));
2430 test_compare(4U, count
);
2432 delete [] insert_data
;
2434 return TEST_SUCCESS
;
2437 static test_return_t
user_supplied_bug6(memcached_st
*memc
)
2439 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2440 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2441 char return_key
[MEMCACHED_MAX_KEY
];
2442 size_t return_key_length
;
2444 size_t value_length
;
2446 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2448 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2450 insert_data
[x
]= (signed char)rand();
2453 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
2455 test_compare(TEST_SUCCESS
, confirm_keys_dont_exist(memc
, keys
, test_array_length(keys
)));
2457 // We will now confirm that memcached_mget() returns success, but we will
2458 // then check to make sure that no actual keys are returned.
2459 test_compare(MEMCACHED_SUCCESS
,
2460 memcached_mget(memc
, keys
, key_length
, 4));
2462 memcached_return_t rc
;
2464 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2465 &value_length
, &flags
, &rc
)))
2470 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
2472 for (uint32_t x
= 0; x
< test_array_length(keys
); x
++)
2474 test_compare(MEMCACHED_SUCCESS
,
2475 memcached_set(memc
, keys
[x
], key_length
[x
],
2476 insert_data
, VALUE_SIZE_BUG5
,
2477 (time_t)0, (uint32_t)0));
2479 test_compare(TEST_SUCCESS
, confirm_keys_exist(memc
, keys
, test_array_length(keys
)));
2481 for (uint32_t x
= 0; x
< 2; x
++)
2483 value
= memcached_get(memc
, keys
[0], key_length
[0],
2484 &value_length
, &flags
, &rc
);
2488 test_compare(MEMCACHED_SUCCESS
,
2489 memcached_mget(memc
, keys
, key_length
, 4));
2490 /* We test for purge of partial complete fetches */
2491 for (count
= 3; count
; count
--)
2493 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2494 &value_length
, &flags
, &rc
);
2495 test_compare(MEMCACHED_SUCCESS
, rc
);
2496 test_memcmp(value
, insert_data
, value_length
);
2497 test_true(value_length
);
2501 delete [] insert_data
;
2503 return TEST_SUCCESS
;
2506 static test_return_t
user_supplied_bug8(memcached_st
*)
2508 memcached_return_t rc
;
2510 memcached_st
*memc_clone
;
2512 memcached_server_st
*servers
;
2513 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";
2515 servers
= memcached_servers_parse(server_list
);
2518 mine
= memcached_create(NULL
);
2519 rc
= memcached_server_push(mine
, servers
);
2520 test_compare(MEMCACHED_SUCCESS
, rc
);
2521 memcached_server_list_free(servers
);
2524 memc_clone
= memcached_clone(NULL
, mine
);
2526 memcached_quit(mine
);
2527 memcached_quit(memc_clone
);
2530 memcached_free(mine
);
2531 memcached_free(memc_clone
);
2533 return TEST_SUCCESS
;
2536 /* Test flag store/retrieve */
2537 static test_return_t
user_supplied_bug7(memcached_st
*memc
)
2539 const char *keys
= "036790384900";
2540 size_t key_length
= strlen(keys
);
2541 char return_key
[MEMCACHED_MAX_KEY
];
2542 size_t return_key_length
;
2544 size_t value_length
;
2546 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2548 for (unsigned int x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2549 insert_data
[x
]= (signed char)rand();
2551 memcached_flush(memc
, 0);
2554 memcached_return_t rc
= memcached_set(memc
, keys
, key_length
,
2555 insert_data
, VALUE_SIZE_BUG5
,
2557 test_compare(MEMCACHED_SUCCESS
, rc
);
2560 value
= memcached_get(memc
, keys
, key_length
,
2561 &value_length
, &flags
, &rc
);
2562 test_true(flags
== 245);
2566 rc
= memcached_mget(memc
, &keys
, &key_length
, 1);
2569 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2570 &value_length
, &flags
, &rc
);
2571 test_compare(uint32_t(245), flags
);
2574 delete [] insert_data
;
2577 return TEST_SUCCESS
;
2580 static test_return_t
user_supplied_bug9(memcached_st
*memc
)
2582 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2583 size_t key_length
[3];
2587 char return_key
[MEMCACHED_MAX_KEY
];
2588 size_t return_key_length
;
2590 size_t return_value_length
;
2593 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2594 key_length
[1]= strlen("fudge&*@#");
2595 key_length
[2]= strlen("for^#@&$not");
2598 for (unsigned int x
= 0; x
< 3; x
++)
2600 memcached_return_t rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2601 keys
[x
], key_length
[x
],
2602 (time_t)50, (uint32_t)9);
2603 test_compare(MEMCACHED_SUCCESS
, rc
);
2606 memcached_return_t rc
= memcached_mget(memc
, keys
, key_length
, 3);
2607 test_compare(MEMCACHED_SUCCESS
, rc
);
2609 /* We need to empty the server before continueing test */
2610 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2611 &return_value_length
, &flags
, &rc
)) != NULL
)
2613 test_true(return_value
);
2617 test_compare(3U, count
);
2619 return TEST_SUCCESS
;
2622 /* We are testing with aggressive timeout to get failures */
2623 static test_return_t
user_supplied_bug10(memcached_st
*memc
)
2625 size_t value_length
= 512;
2626 unsigned int set
= 1;
2627 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2629 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2630 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2631 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, uint64_t(0));
2633 char *value
= (char*)malloc(value_length
* sizeof(char));
2635 for (unsigned int x
= 0; x
< value_length
; x
++)
2637 value
[x
]= (char) (x
% 127);
2640 for (unsigned int x
= 1; x
<= 100000; ++x
)
2642 memcached_return_t rc
= memcached_set(mclone
,
2643 test_literal_param("foo"),
2644 value
, value_length
, 0, 0);
2646 test_true_got((rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_BUFFERED
or rc
== MEMCACHED_TIMEOUT
or rc
== MEMCACHED_CONNECTION_FAILURE
2647 or rc
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
),
2648 memcached_strerror(NULL
, rc
));
2650 if (rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_TIMEOUT
)
2657 memcached_free(mclone
);
2659 return TEST_SUCCESS
;
2663 We are looking failures in the async protocol
2665 static test_return_t
user_supplied_bug11(memcached_st
*memc
)
2667 const char *key
= "foo";
2668 size_t value_length
= 512;
2670 unsigned int set
= 1;
2671 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2673 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2674 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2675 int32_t timeout
= -1;
2676 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, (size_t)timeout
);
2678 timeout
= (int32_t)memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
);
2680 test_true(timeout
== -1);
2682 char *value
= (char*)malloc(value_length
* sizeof(char));
2684 for (unsigned int x
= 0; x
< value_length
; x
++)
2686 value
[x
]= (char) (x
% 127);
2689 for (unsigned int x
= 1; x
<= 100000; ++x
)
2691 memcached_return_t rc
= memcached_set(mclone
, key
, key_len
,value
, value_length
, 0, 0);
2696 memcached_free(mclone
);
2698 return TEST_SUCCESS
;
2702 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2704 static test_return_t
user_supplied_bug12(memcached_st
*memc
)
2706 memcached_return_t rc
;
2708 size_t value_length
;
2710 uint64_t number_value
;
2712 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2713 &value_length
, &flags
, &rc
);
2714 test_true(value
== NULL
);
2715 test_compare(MEMCACHED_NOTFOUND
, rc
);
2717 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2720 test_true(value
== NULL
);
2721 /* The binary protocol will set the key if it doesn't exist */
2722 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2724 test_compare(MEMCACHED_SUCCESS
, rc
);
2728 test_compare(MEMCACHED_NOTFOUND
, rc
);
2731 rc
= memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0);
2733 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2734 &value_length
, &flags
, &rc
);
2736 test_compare(MEMCACHED_SUCCESS
, rc
);
2739 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2741 test_true(number_value
== 2);
2742 test_compare(MEMCACHED_SUCCESS
, rc
);
2744 return TEST_SUCCESS
;
2748 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2749 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2751 static test_return_t
user_supplied_bug13(memcached_st
*memc
)
2753 char key
[] = "key34567890";
2754 memcached_return_t rc
;
2755 size_t overflowSize
;
2757 char commandFirst
[]= "set key34567890 0 0 ";
2758 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2759 size_t commandLength
;
2762 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2764 overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2766 for (testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2768 char *overflow
= new (std::nothrow
) char[testSize
];
2769 test_true(overflow
);
2771 memset(overflow
, 'x', testSize
);
2772 rc
= memcached_set(memc
, key
, strlen(key
),
2773 overflow
, testSize
, 0, 0);
2774 test_compare(MEMCACHED_SUCCESS
, rc
);
2778 return TEST_SUCCESS
;
2783 Test values of many different sizes
2784 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2785 set key34567890 0 0 8169 \r\n
2786 is sent followed by buffer of size 8169, followed by 8169
2788 static test_return_t
user_supplied_bug14(memcached_st
*memc
)
2790 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true);
2792 std::vector
<char> value
;
2793 for (size_t x
= 0; x
< 18000; x
++)
2795 value
.push_back((char) (x
% 127));
2798 for (size_t current_length
= 0; current_length
< value
.size(); current_length
++)
2800 memcached_return_t rc
= memcached_set(memc
, test_literal_param("foo"),
2801 &value
[0], current_length
,
2802 (time_t)0, (uint32_t)0);
2803 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
2805 size_t string_length
;
2807 char *string
= memcached_get(memc
, test_literal_param("foo"),
2808 &string_length
, &flags
, &rc
);
2810 test_compare(MEMCACHED_SUCCESS
, rc
);
2811 test_compare(string_length
, current_length
);
2812 test_memcmp(string
, &value
[0], string_length
);
2817 return TEST_SUCCESS
;
2821 Look for zero length value problems
2823 static test_return_t
user_supplied_bug15(memcached_st
*memc
)
2825 for (uint32_t x
= 0; x
< 2; x
++)
2827 memcached_return_t rc
= memcached_set(memc
, test_literal_param("mykey"),
2829 (time_t)0, (uint32_t)0);
2831 test_compare(MEMCACHED_SUCCESS
, rc
);
2835 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2836 &length
, &flags
, &rc
);
2838 test_compare(MEMCACHED_SUCCESS
, rc
);
2843 value
= memcached_get(memc
, test_literal_param("mykey"),
2844 &length
, &flags
, &rc
);
2846 test_compare(MEMCACHED_SUCCESS
, rc
);
2847 test_true(value
== NULL
);
2852 return TEST_SUCCESS
;
2855 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2856 static test_return_t
user_supplied_bug16(memcached_st
*memc
)
2858 memcached_return_t rc
= memcached_set(memc
, test_literal_param("mykey"),
2860 (time_t)0, UINT32_MAX
);
2862 test_compare(MEMCACHED_SUCCESS
, rc
);
2866 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2867 &length
, &flags
, &rc
);
2869 test_compare(MEMCACHED_SUCCESS
, rc
);
2870 test_true(value
== NULL
);
2872 test_compare(flags
, UINT32_MAX
);
2874 return TEST_SUCCESS
;
2877 #if !defined(__sun) && !defined(__OpenBSD__)
2878 /* Check the validity of chinese key*/
2879 static test_return_t
user_supplied_bug17(memcached_st
*memc
)
2881 const char *key
= "豆瓣";
2882 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2883 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
2884 value
, strlen(value
),
2887 test_compare(MEMCACHED_SUCCESS
, rc
);
2891 char *value2
= memcached_get(memc
, key
, strlen(key
),
2892 &length
, &flags
, &rc
);
2894 test_true(length
==strlen(value
));
2895 test_compare(MEMCACHED_SUCCESS
, rc
);
2896 test_memcmp(value
, value2
, length
);
2899 return TEST_SUCCESS
;
2907 static test_return_t
user_supplied_bug19(memcached_st
*)
2909 memcached_return_t res
;
2911 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:11311/?100 --server=localhost:11312/?100"));
2913 const memcached_server_st
*server
= memcached_server_by_key(memc
, "a", 1, &res
);
2916 memcached_free(memc
);
2918 return TEST_SUCCESS
;
2921 /* CAS test from Andei */
2922 static test_return_t
user_supplied_bug20(memcached_st
*memc
)
2924 const char *key
= "abc";
2925 size_t key_len
= strlen("abc");
2927 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
2929 test_compare(MEMCACHED_SUCCESS
,
2931 test_literal_param("abc"),
2932 test_literal_param("foobar"),
2933 (time_t)0, (uint32_t)0));
2935 test_compare(MEMCACHED_SUCCESS
,
2936 memcached_mget(memc
, &key
, &key_len
, 1));
2938 memcached_result_st result_obj
;
2939 memcached_result_st
*result
= memcached_result_create(memc
, &result_obj
);
2942 memcached_result_create(memc
, &result_obj
);
2943 memcached_return_t status
;
2944 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2947 test_compare(MEMCACHED_SUCCESS
, status
);
2949 memcached_result_free(result
);
2951 return TEST_SUCCESS
;
2954 /* Large mget() of missing keys with binary proto
2956 * If many binary quiet commands (such as getq's in an mget) fill the output
2957 * buffer and the server chooses not to respond, memcached_flush hangs. See
2958 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2961 /* sighandler_t function that always asserts false */
2962 static void fail(int)
2968 static test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2973 return TEST_SKIPPED
;
2975 void (*oldalarm
)(int);
2977 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
2978 test_true(memc_clone
);
2980 /* only binproto uses getq for mget */
2981 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
2983 /* empty the cache to ensure misses (hence non-responses) */
2984 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc_clone
, 0));
2986 size_t* key_lengths
= new (std::nothrow
) size_t[key_count
];
2987 test_true(key_lengths
);
2988 char **keys
= static_cast<char **>(calloc(key_count
, sizeof(char *)));
2990 for (unsigned int x
= 0; x
< key_count
; x
++)
2994 snprintf(buffer
, 30, "%u", x
);
2995 keys
[x
]= strdup(buffer
);
2997 key_lengths
[x
]= strlen(keys
[x
]);
3000 oldalarm
= signal(SIGALRM
, fail
);
3003 test_compare_got(MEMCACHED_SUCCESS
,
3004 memcached_mget(memc_clone
, (const char **)keys
, key_lengths
, key_count
), memcached_last_error_message(memc_clone
));
3007 signal(SIGALRM
, oldalarm
);
3009 memcached_return_t rc
;
3011 char return_key
[MEMCACHED_MAX_KEY
];
3012 size_t return_key_length
;
3014 size_t return_value_length
;
3015 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
3016 &return_value_length
, &flags
, &rc
)))
3018 test_false(return_value
); // There are no keys to fetch, so the value should never be returned
3020 test_compare(MEMCACHED_NOTFOUND
, rc
);
3021 test_zero(return_value_length
);
3022 test_zero(return_key_length
);
3023 test_false(return_key
[0]);
3024 test_false(return_value
);
3026 for (unsigned int x
= 0; x
< key_count
; x
++)
3031 delete [] key_lengths
;
3033 memcached_free(memc_clone
);
3035 return TEST_SUCCESS
;
3039 static test_return_t
user_supplied_bug21(memcached_st
*memc
)
3041 test_return_t test_rc
;
3042 test_rc
= pre_binary(memc
);
3044 if (test_rc
!= TEST_SUCCESS
)
3049 /* should work as of r580 */
3050 test_compare(TEST_SUCCESS
,
3051 _user_supplied_bug21(memc
, 10));
3053 /* should fail as of r580 */
3054 test_compare(TEST_SUCCESS
,
3055 _user_supplied_bug21(memc
, 1000));
3057 return TEST_SUCCESS
;
3060 static test_return_t
output_ketama_weighted_keys(memcached_st
*)
3062 memcached_st
*memc
= memcached_create(NULL
);
3066 test_compare(MEMCACHED_SUCCESS
,
3067 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, true));
3069 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
3070 test_compare(value
, uint64_t(1));
3072 test_compare(MEMCACHED_SUCCESS
,
3073 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
));
3075 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
3076 test_true(value
== MEMCACHED_HASH_MD5
);
3079 test_true(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
3081 memcached_server_st
*server_pool
;
3082 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");
3083 memcached_server_push(memc
, server_pool
);
3085 // @todo this needs to be refactored to actually test something.
3088 if ((fp
= fopen("ketama_keys.txt", "w")))
3092 printf("cannot write to file ketama_keys.txt");
3093 return TEST_FAILURE
;
3096 for (int x
= 0; x
< 10000; x
++)
3099 snprintf(key
, sizeof(key
), "%d", x
);
3101 uint32_t server_idx
= memcached_generate_hash(memc
, key
, strlen(key
));
3102 char *hostname
= memc
->hosts
[server_idx
].hostname
;
3103 in_port_t port
= memc
->hosts
[server_idx
].port
;
3104 fprintf(fp
, "key %s is on host /%s:%u\n", key
, hostname
, port
);
3105 memcached_server_instance_st instance
=
3106 memcached_server_instance_by_position(memc
, host_index
);
3110 memcached_server_list_free(server_pool
);
3111 memcached_free(memc
);
3113 return TEST_SUCCESS
;
3117 static test_return_t
result_static(memcached_st
*memc
)
3119 memcached_result_st result
;
3120 memcached_result_st
*result_ptr
= memcached_result_create(memc
, &result
);
3121 test_false(result
.options
.is_allocated
);
3122 test_true(memcached_is_initialized(&result
));
3123 test_true(result_ptr
);
3124 test_true(result_ptr
== &result
);
3126 memcached_result_free(&result
);
3128 test_false(result
.options
.is_allocated
);
3129 test_false(memcached_is_initialized(&result
));
3131 return TEST_SUCCESS
;
3134 static test_return_t
result_alloc(memcached_st
*memc
)
3136 memcached_result_st
*result_ptr
= memcached_result_create(memc
, NULL
);
3137 test_true(result_ptr
);
3138 test_true(result_ptr
->options
.is_allocated
);
3139 test_true(memcached_is_initialized(result_ptr
));
3140 memcached_result_free(result_ptr
);
3142 return TEST_SUCCESS
;
3145 static test_return_t
cleanup_pairs(memcached_st
*memc
)
3148 pairs_free(global_pairs
);
3150 return TEST_SUCCESS
;
3153 static test_return_t
generate_pairs(memcached_st
*)
3155 global_pairs
= pairs_generate(GLOBAL_COUNT
, 400);
3156 global_count
= GLOBAL_COUNT
;
3158 for (size_t x
= 0; x
< global_count
; x
++)
3160 global_keys
[x
]= global_pairs
[x
].key
;
3161 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3164 return TEST_SUCCESS
;
3167 static test_return_t
generate_large_pairs(memcached_st
*)
3169 global_pairs
= pairs_generate(GLOBAL2_COUNT
, MEMCACHED_MAX_BUFFER
+10);
3170 global_count
= GLOBAL2_COUNT
;
3172 for (size_t x
= 0; x
< global_count
; x
++)
3174 global_keys
[x
]= global_pairs
[x
].key
;
3175 global_keys_length
[x
]= global_pairs
[x
].key_length
;
3178 return TEST_SUCCESS
;
3181 static test_return_t
generate_data(memcached_st
*memc
)
3183 unsigned int check_execute
= execute_set(memc
, global_pairs
, global_count
);
3185 test_compare(check_execute
, global_count
);
3187 return TEST_SUCCESS
;
3190 static test_return_t
generate_data_with_stats(memcached_st
*memc
)
3192 uint32_t host_index
= 0;
3193 unsigned int check_execute
= execute_set(memc
, global_pairs
, global_count
);
3195 test_true(check_execute
== global_count
);
3197 // @todo hosts used size stats
3198 memcached_return_t rc
;
3199 memcached_stat_st
*stat_p
= memcached_stat(memc
, NULL
, &rc
);
3202 for (host_index
= 0; host_index
< SERVERS_TO_CREATE
; host_index
++)
3204 /* This test was changes so that "make test" would work properlly */
3207 memcached_server_instance_st instance
=
3208 memcached_server_instance_by_position(memc
, host_index
);
3210 printf("\nserver %u|%s|%u bytes: %llu\n", host_index
, instance
->hostname
, instance
->port
, (unsigned long long)(stat_p
+ host_index
)->bytes
);
3212 test_true((unsigned long long)(stat_p
+ host_index
)->bytes
);
3215 memcached_stat_free(NULL
, stat_p
);
3217 return TEST_SUCCESS
;
3219 static test_return_t
generate_buffer_data(memcached_st
*memc
)
3221 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, true);
3222 generate_data(memc
);
3224 return TEST_SUCCESS
;
3227 static test_return_t
get_read_count(memcached_st
*memc
)
3229 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
3230 test_true(memc_clone
);
3232 memcached_server_add_with_weight(memc_clone
, "localhost", 6666, 0);
3236 size_t return_value_length
;
3240 for (size_t x
= count
= 0; x
< global_count
; x
++)
3242 memcached_return_t rc
;
3243 return_value
= memcached_get(memc_clone
, global_keys
[x
], global_keys_length
[x
],
3244 &return_value_length
, &flags
, &rc
);
3245 if (rc
== MEMCACHED_SUCCESS
)
3256 memcached_free(memc_clone
);
3258 return TEST_SUCCESS
;
3261 static test_return_t
get_read(memcached_st
*memc
)
3263 for (size_t x
= 0; x
< global_count
; x
++)
3265 size_t return_value_length
;
3267 memcached_return_t rc
;
3268 char *return_value
= memcached_get(memc
, global_keys
[x
], global_keys_length
[x
],
3269 &return_value_length
, &flags
, &rc
);
3271 test_true(return_value);
3272 test_compare(MEMCACHED_SUCCESS, rc);
3274 if (rc
== MEMCACHED_SUCCESS
&& return_value
)
3280 return TEST_SUCCESS
;
3283 static test_return_t
mget_read(memcached_st
*memc
)
3286 test_skip(true, bool(libmemcached_util_version_check(memc
, 1, 4, 4)));
3288 test_compare(MEMCACHED_SUCCESS
,
3289 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3291 // Go fetch the keys and test to see if all of them were returned
3293 unsigned int keys_returned
;
3294 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, keys_returned
, MEMCACHED_SUCCESS
));
3295 test_true(keys_returned
> 0);
3296 test_compare_warn_hint(global_count
, keys_returned
, "Possible false, positive, memcached may have ejected key/value based on memory needs");
3299 return TEST_SUCCESS
;
3302 static test_return_t
mget_read_result(memcached_st
*memc
)
3305 test_skip(true, bool(libmemcached_util_version_check(memc
, 1, 4, 4)));
3307 test_compare(MEMCACHED_SUCCESS
,
3308 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3310 /* Turn this into a help function */
3312 memcached_result_st results_obj
;
3313 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
3316 memcached_return_t rc
;
3317 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
3319 if (rc
== MEMCACHED_IN_PROGRESS
)
3325 test_compare(MEMCACHED_SUCCESS
, rc
);
3327 test_compare(MEMCACHED_END
, rc
);
3329 memcached_result_free(&results_obj
);
3332 return TEST_SUCCESS
;
3335 static test_return_t
mget_read_internal_result(memcached_st
*memc
)
3338 test_skip(true, bool(libmemcached_util_version_check(memc
, 1, 4, 4)));
3340 test_compare(MEMCACHED_SUCCESS
,
3341 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3343 memcached_result_st
*results
= NULL
;
3344 memcached_return_t rc
;
3345 while ((results
= memcached_fetch_result(memc
, results
, &rc
)))
3348 test_compare(MEMCACHED_SUCCESS
, rc
);
3350 test_compare(MEMCACHED_END
, rc
);
3352 memcached_result_free(results
);
3355 return TEST_SUCCESS
;
3358 static test_return_t
mget_read_partial_result(memcached_st
*memc
)
3361 test_skip(true, bool(libmemcached_util_version_check(memc
, 1, 4, 4)));
3363 test_compare(MEMCACHED_SUCCESS
,
3364 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3366 // We will scan for just one key
3368 memcached_result_st results_obj
;
3369 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
3371 memcached_return_t rc
;
3372 results
= memcached_fetch_result(memc
, results
, &rc
);
3374 test_compare(MEMCACHED_SUCCESS
, rc
);
3376 memcached_result_free(&results_obj
);
3379 // We already have a read happening, lets start up another one.
3380 test_compare(MEMCACHED_SUCCESS
,
3381 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3383 memcached_result_st results_obj
;
3384 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
3386 test_false(memcached_is_allocated(results
));
3388 memcached_return_t rc
;
3389 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
3392 test_compare(MEMCACHED_SUCCESS
, rc
);
3394 test_compare(MEMCACHED_END
, rc
);
3396 memcached_result_free(&results_obj
);
3399 return TEST_SUCCESS
;
3402 static test_return_t
mget_read_function(memcached_st
*memc
)
3404 test_skip(true, bool(libmemcached_util_version_check(memc
, 1, 4, 4)));
3406 test_compare(MEMCACHED_SUCCESS
,
3407 memcached_mget(memc
, global_keys
, global_keys_length
, global_count
));
3409 memcached_execute_fn callbacks
[]= { &callback_counter
};
3411 test_compare(MEMCACHED_SUCCESS
,
3412 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
3414 return TEST_SUCCESS
;
3417 static test_return_t
delete_generate(memcached_st
*memc
)
3419 for (size_t x
= 0; x
< global_count
; x
++)
3421 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3424 return TEST_SUCCESS
;
3427 static test_return_t
delete_buffer_generate(memcached_st
*memc
)
3429 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, true);
3431 for (size_t x
= 0; x
< global_count
; x
++)
3433 (void)memcached_delete(memc
, global_keys
[x
], global_keys_length
[x
], (time_t)0);
3436 return TEST_SUCCESS
;
3439 static test_return_t
add_host_test1(memcached_st
*memc
)
3441 memcached_return_t rc
;
3442 char servername
[]= "0.example.com";
3444 memcached_server_st
*servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
3446 test_compare(1U, memcached_server_list_count(servers
));
3448 for (uint32_t x
= 2; x
< 20; x
++)
3450 char buffer
[SMALL_STRING_LEN
];
3452 snprintf(buffer
, SMALL_STRING_LEN
, "%lu.example.com", (unsigned long)(400 +x
));
3453 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
3455 test_compare(MEMCACHED_SUCCESS
, rc
);
3456 test_compare(x
, memcached_server_list_count(servers
));
3459 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
3460 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
3462 memcached_server_list_free(servers
);
3464 return TEST_SUCCESS
;
3467 static test_return_t
pre_nonblock(memcached_st
*memc
)
3469 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3471 return TEST_SUCCESS
;
3474 static test_return_t
pre_cork(memcached_st
*memc
)
3477 return TEST_SKIPPED
;
3480 if (memcached_success(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CORK
, set
)))
3481 return TEST_SUCCESS
;
3483 return TEST_SKIPPED
;
3486 static test_return_t
pre_cork_and_nonblock(memcached_st
*memc
)
3489 return TEST_SKIPPED
;
3491 test_return_t test_rc
;
3492 if ((test_rc
= pre_cork(memc
)) != TEST_SUCCESS
)
3495 return pre_nonblock(memc
);
3498 static test_return_t
pre_nonblock_binary(memcached_st
*memc
)
3500 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
3501 test_true(memc_clone
);
3503 // The memcached_version needs to be done on a clone, because the server
3504 // will not toggle protocol on an connection.
3505 memcached_version(memc_clone
);
3507 memcached_return_t rc
= MEMCACHED_FAILURE
;
3508 if (libmemcached_util_version_check(memc_clone
, 1, 4, 4))
3510 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3511 test_compare(MEMCACHED_SUCCESS
,
3512 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
3513 test_compare(uint64_t(1), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
3517 memcached_free(memc_clone
);
3518 return TEST_SKIPPED
;
3521 memcached_free(memc_clone
);
3523 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3526 static test_return_t
pre_murmur(memcached_st
*memc
)
3528 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3529 return TEST_SUCCESS
;
3532 static test_return_t
pre_jenkins(memcached_st
*memc
)
3534 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_JENKINS
);
3536 return TEST_SUCCESS
;
3540 static test_return_t
pre_md5(memcached_st
*memc
)
3542 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MD5
);
3544 return TEST_SUCCESS
;
3547 static test_return_t
pre_crc(memcached_st
*memc
)
3549 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_CRC
);
3551 return TEST_SUCCESS
;
3554 static test_return_t
pre_hsieh(memcached_st
*memc
)
3556 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_HSIEH
));
3557 return TEST_SUCCESS
;
3560 static test_return_t
pre_hash_fnv1_64(memcached_st
*memc
)
3562 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3564 return TEST_SUCCESS
;
3567 static test_return_t
pre_hash_fnv1a_64(memcached_st
*memc
)
3569 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_64
));
3571 return TEST_SUCCESS
;
3574 static test_return_t
pre_hash_fnv1_32(memcached_st
*memc
)
3576 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1_32
);
3578 return TEST_SUCCESS
;
3581 static test_return_t
pre_hash_fnv1a_32(memcached_st
*memc
)
3583 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_32
);
3585 return TEST_SUCCESS
;
3588 static test_return_t
pre_behavior_ketama(memcached_st
*memc
)
3590 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA
, 1);
3591 test_compare(MEMCACHED_SUCCESS
, rc
);
3593 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA
);
3594 test_compare(value
, uint64_t(1));
3596 return TEST_SUCCESS
;
3599 static test_return_t
pre_behavior_ketama_weighted(memcached_st
*memc
)
3601 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
3602 test_compare(MEMCACHED_SUCCESS
, rc
);
3604 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
3605 test_compare(value
, uint64_t(1));
3607 test_compare(MEMCACHED_SUCCESS
,
3608 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
));
3610 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
3611 test_compare(MEMCACHED_HASH_MD5
, memcached_hash_t(value
));
3613 return TEST_SUCCESS
;
3617 @note This should be testing to see if the server really supports the binary protocol.
3619 static test_return_t
pre_binary(memcached_st
*memc
)
3621 memcached_return_t rc
= MEMCACHED_FAILURE
;
3623 if (libmemcached_util_version_check(memc
, 1, 4, 4))
3625 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
3626 test_compare(MEMCACHED_SUCCESS
, rc
);
3627 test_true(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1);
3630 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3633 static test_return_t
pre_replication(memcached_st
*memc
)
3635 test_skip(TEST_SUCCESS
, pre_binary(memc
));
3638 * Make sure that we store the item on all servers
3639 * (master + replicas == number of servers)
3641 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, memcached_server_count(memc
) - 1));
3642 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
), uint64_t(memcached_server_count(memc
) - 1));
3644 return TEST_SUCCESS
;
3648 static test_return_t
pre_replication_noblock(memcached_st
*memc
)
3650 test_skip(TEST_SUCCESS
, pre_replication(memc
));
3652 return pre_nonblock(memc
);
3656 static void my_free(const memcached_st
*ptr
, void *mem
, void *context
)
3660 #ifdef HARD_MALLOC_TESTS
3661 void *real_ptr
= (mem
== NULL
) ? mem
: (void*)((caddr_t
)mem
- 8);
3669 static void *my_malloc(const memcached_st
*ptr
, const size_t size
, void *context
)
3673 #ifdef HARD_MALLOC_TESTS
3674 void *ret
= malloc(size
+ 8);
3677 ret
= (void*)((caddr_t
)ret
+ 8);
3680 void *ret
= malloc(size
);
3685 memset(ret
, 0xff, size
);
3692 static void *my_realloc(const memcached_st
*ptr
, void *mem
, const size_t size
, void *)
3694 #ifdef HARD_MALLOC_TESTS
3695 void *real_ptr
= (mem
== NULL
) ? NULL
: (void*)((caddr_t
)mem
- 8);
3696 void *nmem
= realloc(real_ptr
, size
+ 8);
3701 ret
= (void*)((caddr_t
)nmem
+ 8);
3707 return realloc(mem
, size
);
3712 static void *my_calloc(const memcached_st
*ptr
, size_t nelem
, const size_t size
, void *)
3714 #ifdef HARD_MALLOC_TESTS
3715 void *mem
= my_malloc(ptr
, nelem
* size
);
3718 memset(mem
, 0, nelem
* size
);
3724 return calloc(nelem
, size
);
3728 static test_return_t
selection_of_namespace_tests(memcached_st
*memc
)
3730 memcached_return_t rc
;
3731 const char *key
= "mine";
3734 /* Make sure be default none exists */
3735 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3737 test_compare_got(MEMCACHED_FAILURE
, rc
, memcached_strerror(NULL
, rc
));
3739 /* Test a clean set */
3740 test_compare(MEMCACHED_SUCCESS
,
3741 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3743 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3745 test_memcmp(value
, key
, 4);
3746 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3748 /* Test that we can turn it off */
3749 test_compare(MEMCACHED_SUCCESS
,
3750 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
3752 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3754 test_compare_got(MEMCACHED_FAILURE
, rc
, memcached_strerror(NULL
, rc
));
3756 /* Now setup for main test */
3757 test_compare(MEMCACHED_SUCCESS
,
3758 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3760 value
= (char *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3762 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3763 test_memcmp(value
, key
, 4);
3765 /* Set to Zero, and then Set to something too large */
3768 memset(long_key
, 0, 255);
3770 test_compare(MEMCACHED_SUCCESS
,
3771 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
3773 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3775 test_true(rc
== MEMCACHED_FAILURE
);
3776 test_true(value
== NULL
);
3778 /* Test a long key for failure */
3779 /* TODO, extend test to determine based on setting, what result should be */
3780 strncpy(long_key
, "Thisismorethentheallottednumberofcharacters", sizeof(long_key
));
3781 test_compare(MEMCACHED_SUCCESS
,
3782 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
3784 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3785 strncpy(long_key
, "This is more then the allotted number of characters", sizeof(long_key
));
3786 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
3787 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
3789 /* Test for a bad prefix, but with a short key */
3790 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_INVALID_ARGUMENTS
: MEMCACHED_SUCCESS
,
3791 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1));
3793 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
3794 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, "dog cat"));
3797 return TEST_SUCCESS
;
3800 static test_return_t
set_namespace(memcached_st
*memc
)
3802 memcached_return_t rc
;
3803 const char *key
= "mine";
3806 /* Make sure be default none exists */
3807 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3809 test_compare_got(MEMCACHED_FAILURE
, rc
, memcached_strerror(NULL
, rc
));
3811 /* Test a clean set */
3812 test_compare(MEMCACHED_SUCCESS
,
3813 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3815 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3817 test_memcmp(value
, key
, 4);
3818 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3820 return TEST_SUCCESS
;
3823 static test_return_t
set_namespace_and_binary(memcached_st
*memc
)
3825 test_return_if(pre_binary(memc
));
3826 test_return_if(set_namespace(memc
));
3828 return TEST_SUCCESS
;
3831 #ifdef MEMCACHED_ENABLE_DEPRECATED
3832 static test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
3834 void *test_ptr
= NULL
;
3837 memcached_malloc_fn malloc_cb
=
3838 (memcached_malloc_fn
)my_malloc
;
3839 cb_ptr
= *(void **)&malloc_cb
;
3840 memcached_return_t rc
;
3842 test_compare(MEMCACHED_SUCCESS
,
3843 memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
));
3844 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3845 test_compare(MEMCACHED_SUCCESS
, rc
);
3846 test_true(test_ptr
== cb_ptr
);
3850 memcached_realloc_fn realloc_cb
=
3851 (memcached_realloc_fn
)my_realloc
;
3852 cb_ptr
= *(void **)&realloc_cb
;
3853 memcached_return_t rc
;
3855 test_compare(MEMCACHED_SUCCESS
,
3856 memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
));
3857 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3858 test_compare(MEMCACHED_SUCCESS
, rc
);
3859 test_true(test_ptr
== cb_ptr
);
3863 memcached_free_fn free_cb
=
3864 (memcached_free_fn
)my_free
;
3865 cb_ptr
= *(void **)&free_cb
;
3866 memcached_return_t rc
;
3868 test_compare(MEMCACHED_SUCCESS
,
3869 memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
));
3870 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3871 test_compare(MEMCACHED_SUCCESS
, rc
);
3872 test_true(test_ptr
== cb_ptr
);
3875 return TEST_SUCCESS
;
3880 static test_return_t
set_memory_alloc(memcached_st
*memc
)
3882 test_compare(MEMCACHED_INVALID_ARGUMENTS
,
3883 memcached_set_memory_allocators(memc
, NULL
, my_free
,
3884 my_realloc
, my_calloc
, NULL
));
3886 test_compare(MEMCACHED_SUCCESS
,
3887 memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3888 my_realloc
, my_calloc
, NULL
));
3890 memcached_malloc_fn mem_malloc
;
3891 memcached_free_fn mem_free
;
3892 memcached_realloc_fn mem_realloc
;
3893 memcached_calloc_fn mem_calloc
;
3894 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3895 &mem_realloc
, &mem_calloc
);
3897 test_true(mem_malloc
== my_malloc
);
3898 test_true(mem_realloc
== my_realloc
);
3899 test_true(mem_calloc
== my_calloc
);
3900 test_true(mem_free
== my_free
);
3902 return TEST_SUCCESS
;
3905 static test_return_t
enable_consistent_crc(memcached_st
*memc
)
3908 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3909 memcached_hash_t hash
;
3910 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3911 if ((rc
= pre_crc(memc
)) != TEST_SUCCESS
)
3914 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3915 test_true(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3917 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3919 if (hash
!= MEMCACHED_HASH_CRC
)
3920 return TEST_SKIPPED
;
3922 return TEST_SUCCESS
;
3925 static test_return_t
enable_consistent_hsieh(memcached_st
*memc
)
3928 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3929 memcached_hash_t hash
;
3930 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3931 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3936 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3937 test_true(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3939 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3941 if (hash
!= MEMCACHED_HASH_HSIEH
)
3942 return TEST_SKIPPED
;
3945 return TEST_SUCCESS
;
3948 static test_return_t
enable_cas(memcached_st
*memc
)
3950 unsigned int set
= 1;
3952 if (libmemcached_util_version_check(memc
, 1, 2, 4))
3954 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3956 return TEST_SUCCESS
;
3959 return TEST_SKIPPED
;
3962 static test_return_t
check_for_1_2_3(memcached_st
*memc
)
3964 memcached_version(memc
);
3966 memcached_server_instance_st instance
=
3967 memcached_server_instance_by_position(memc
, 0);
3969 if ((instance
->major_version
>= 1 && (instance
->minor_version
== 2 && instance
->micro_version
>= 4))
3970 or instance
->minor_version
> 2)
3972 return TEST_SUCCESS
;
3975 return TEST_SKIPPED
;
3978 static test_return_t
pre_unix_socket(memcached_st
*memc
)
3982 memcached_servers_reset(memc
);
3983 const char *socket_file
= default_socket();
3985 test_skip(0, stat(socket_file
, &buf
));
3987 test_compare(MEMCACHED_SUCCESS
,
3988 memcached_server_add_unix_socket_with_weight(memc
, socket_file
, 0));
3990 return TEST_SUCCESS
;
3993 static test_return_t
pre_nodelay(memcached_st
*memc
)
3995 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3996 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
3998 return TEST_SUCCESS
;
4001 static test_return_t
pre_settimer(memcached_st
*memc
)
4003 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
4004 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
4006 return TEST_SUCCESS
;
4009 static test_return_t
MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test(memcached_st
*memc
)
4011 const uint64_t timeout
= 100; // Not using, just checking that it sets
4013 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
4015 test_compare(timeout
, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
));
4017 return TEST_SUCCESS
;
4020 static test_return_t
noreply_test(memcached_st
*memc
)
4022 test_compare(MEMCACHED_SUCCESS
,
4023 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
4024 test_compare(MEMCACHED_SUCCESS
,
4025 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1));
4026 test_compare(MEMCACHED_SUCCESS
,
4027 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1));
4028 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
));
4029 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
));
4030 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
));
4032 memcached_return_t ret
;
4033 for (int count
= 0; count
< 5; ++count
)
4035 for (size_t x
= 0; x
< 100; ++x
)
4038 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
4039 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
4041 size_t len
= (size_t)check_length
;
4046 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
4049 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
4052 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
4055 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
4058 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
4064 test_true_got(ret
== MEMCACHED_SUCCESS
or ret
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, ret
));
4068 ** NOTE: Don't ever do this in your code! this is not a supported use of the
4069 ** API and is _ONLY_ done this way to verify that the library works the
4070 ** way it is supposed to do!!!!
4073 for (uint32_t x
= 0; x
< memcached_server_count(memc
); ++x
)
4075 memcached_server_instance_st instance
=
4076 memcached_server_instance_by_position(memc
, x
);
4077 no_msg
+=(int)(instance
->cursor_active
);
4080 test_true(no_msg
== 0);
4081 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
4084 ** Now validate that all items was set properly!
4086 for (size_t x
= 0; x
< 100; ++x
)
4090 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
4092 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
4094 size_t len
= (size_t)check_length
;
4097 char* value
=memcached_get(memc
, key
, strlen(key
),
4098 &length
, &flags
, &ret
);
4099 test_true_got(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
, memcached_strerror(NULL
, ret
));
4102 case 0: /* FALLTHROUGH */
4103 case 1: /* FALLTHROUGH */
4105 test_true(strncmp(value
, key
, len
) == 0);
4106 test_true(len
== length
);
4109 test_true(length
== len
* 2);
4112 test_true(length
== len
* 3);
4122 /* Try setting an illegal cas value (should not return an error to
4123 * the caller (because we don't expect a return message from the server)
4125 const char* keys
[]= {"0"};
4126 size_t lengths
[]= {1};
4129 memcached_result_st results_obj
;
4130 memcached_result_st
*results
;
4131 test_compare(MEMCACHED_SUCCESS
,
4132 memcached_mget(memc
, keys
, lengths
, 1));
4134 results
= memcached_result_create(memc
, &results_obj
);
4136 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
4138 test_compare(MEMCACHED_SUCCESS
, ret
);
4139 uint64_t cas
= memcached_result_cas(results
);
4140 memcached_result_free(&results_obj
);
4142 test_compare(MEMCACHED_SUCCESS
,
4143 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
4146 * The item will have a new cas value, so try to set it again with the old
4147 * value. This should fail!
4149 test_compare(MEMCACHED_SUCCESS
,
4150 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
4151 test_true(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
4152 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
4153 test_true(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
4156 return TEST_SUCCESS
;
4159 static test_return_t
analyzer_test(memcached_st
*memc
)
4161 memcached_return_t rc
;
4162 memcached_stat_st
*memc_stat
;
4163 memcached_analysis_st
*report
;
4165 memc_stat
= memcached_stat(memc
, NULL
, &rc
);
4166 test_compare(MEMCACHED_SUCCESS
, rc
);
4167 test_true(memc_stat
);
4169 report
= memcached_analyze(memc
, memc_stat
, &rc
);
4170 test_compare(MEMCACHED_SUCCESS
, rc
);
4174 memcached_stat_free(NULL
, memc_stat
);
4176 return TEST_SUCCESS
;
4179 /* Count the objects */
4181 static test_return_t
dump_test(memcached_st
*memc
)
4183 /* No support for Binary protocol yet */
4184 test_skip(false, memc
->flags
.binary_protocol
);
4186 test_compare(TEST_SUCCESS
, set_test3(memc
));
4188 // confirm_key_count() call dump
4189 size_t counter
= confirm_key_count(memc
);
4191 /* We may have more then 32 if our previous flush has not completed */
4192 test_true(counter
>= 32);
4194 return TEST_SUCCESS
;
4197 struct test_pool_context_st
{
4198 memcached_pool_st
* pool
;
4202 static void* connection_release(void *arg
)
4204 test_pool_context_st
*resource
= static_cast<test_pool_context_st
*>(arg
);
4207 // Release all of the memc we are holding
4208 assert(memcached_success(memcached_pool_push(resource
->pool
, resource
->mmc
)));
4212 #define POOL_SIZE 10
4213 static test_return_t
connection_pool_test(memcached_st
*memc
)
4215 memcached_pool_st
* pool
= memcached_pool_create(memc
, 5, POOL_SIZE
);
4216 test_true(pool
!= NULL
);
4217 memcached_st
*mmc
[POOL_SIZE
];
4218 memcached_return_t rc
;
4220 // Fill up our array that we will store the memc that are in the pool
4221 for (size_t x
= 0; x
< POOL_SIZE
; ++x
)
4223 mmc
[x
]= memcached_pool_pop(pool
, false, &rc
);
4224 test_true(mmc
[x
] != NULL
);
4225 test_compare(MEMCACHED_SUCCESS
, rc
);
4228 // All memc should be gone
4229 test_true(memcached_pool_pop(pool
, false, &rc
) == NULL
);
4230 test_compare(MEMCACHED_SUCCESS
, rc
);
4233 test_pool_context_st item
= { pool
, mmc
[9] };
4235 pthread_create(&tid
, NULL
, connection_release
, &item
);
4236 mmc
[9]= memcached_pool_pop(pool
, true, &rc
);
4237 test_compare(MEMCACHED_SUCCESS
, rc
);
4238 pthread_join(tid
, NULL
);
4240 const char *key
= "key";
4241 size_t keylen
= strlen(key
);
4243 // verify that I can do ops with all connections
4244 test_compare(MEMCACHED_SUCCESS
,
4245 memcached_set(mmc
[0], key
, keylen
, "0", 1, 0, 0));
4247 for (uint64_t x
= 0; x
< POOL_SIZE
; ++x
)
4249 uint64_t number_value
;
4250 test_compare(MEMCACHED_SUCCESS
,
4251 memcached_increment(mmc
[x
], key
, keylen
, 1, &number_value
));
4252 test_compare(number_value
, (x
+1));
4256 for (size_t x
= 0; x
< POOL_SIZE
; ++x
)
4258 test_compare(MEMCACHED_SUCCESS
, memcached_pool_push(pool
, mmc
[x
]));
4262 /* verify that I can set behaviors on the pool when I don't have all
4263 * of the connections in the pool. It should however be enabled
4264 * when I push the item into the pool
4266 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4269 rc
= memcached_pool_behavior_set(pool
, MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
, 9999);
4270 test_compare(MEMCACHED_SUCCESS
, rc
);
4272 mmc
[1]= memcached_pool_pop(pool
, false, &rc
);
4275 test_compare(UINT64_C(9999), memcached_behavior_get(mmc
[1], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
));
4276 test_compare(MEMCACHED_SUCCESS
, memcached_pool_push(pool
, mmc
[1]));
4277 test_compare(MEMCACHED_SUCCESS
, memcached_pool_push(pool
, mmc
[0]));
4279 mmc
[0]= memcached_pool_pop(pool
, false, &rc
);
4280 test_compare(UINT64_C(9999), memcached_behavior_get(mmc
[0], MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
));
4281 test_compare(MEMCACHED_SUCCESS
, memcached_pool_push(pool
, mmc
[0]));
4283 test_true(memcached_pool_destroy(pool
) == memc
);
4285 return TEST_SUCCESS
;
4288 static test_return_t
util_version_test(memcached_st
*memc
)
4290 bool if_successful
= libmemcached_util_version_check(memc
, 0, 0, 0);
4291 test_true(if_successful
);
4293 if_successful
= libmemcached_util_version_check(memc
, 9, 9, 9);
4295 // We expect failure
4298 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
4299 fprintf(stderr
, "\nDumping Server Information\n\n");
4300 memcached_server_fn callbacks
[1];
4302 callbacks
[0]= dump_server_information
;
4303 memcached_server_cursor(memc
, callbacks
, (void *)stderr
, 1);
4304 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
4306 test_true(if_successful
== false);
4308 memcached_server_instance_st instance
=
4309 memcached_server_instance_by_position(memc
, 0);
4311 memcached_version(memc
);
4313 // We only use one binary when we test, so this should be just fine.
4314 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, instance
->micro_version
);
4315 test_true(if_successful
== true);
4317 if (instance
->micro_version
> 0)
4319 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
-1));
4321 else if (instance
->minor_version
> 0)
4323 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
- 1), instance
->micro_version
);
4325 else if (instance
->major_version
> 0)
4327 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
-1), instance
->minor_version
, instance
->micro_version
);
4330 test_true(if_successful
== true);
4332 if (instance
->micro_version
> 0)
4334 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
+1));
4336 else if (instance
->minor_version
> 0)
4338 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
+1), instance
->micro_version
);
4340 else if (instance
->major_version
> 0)
4342 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
+1), instance
->minor_version
, instance
->micro_version
);
4345 test_true(if_successful
== false);
4347 return TEST_SUCCESS
;
4350 static test_return_t
getpid_connection_failure_test(memcached_st
*memc
)
4352 memcached_return_t rc
;
4353 memcached_server_instance_st instance
=
4354 memcached_server_instance_by_position(memc
, 0);
4356 // Test both the version that returns a code, and the one that does not.
4357 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
4358 memcached_server_port(instance
) -1, NULL
) == -1);
4360 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
4361 memcached_server_port(instance
) -1, &rc
) == -1);
4362 test_compare_got(MEMCACHED_CONNECTION_FAILURE
, rc
, memcached_strerror(memc
, rc
));
4364 return TEST_SUCCESS
;
4368 static test_return_t
getpid_test(memcached_st
*memc
)
4370 memcached_return_t rc
;
4371 memcached_server_instance_st instance
=
4372 memcached_server_instance_by_position(memc
, 0);
4374 // Test both the version that returns a code, and the one that does not.
4375 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
4376 memcached_server_port(instance
), NULL
) > -1);
4378 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
4379 memcached_server_port(instance
), &rc
) > -1);
4380 test_compare(MEMCACHED_SUCCESS
, rc
);
4382 return TEST_SUCCESS
;
4385 static test_return_t
ping_test(memcached_st
*memc
)
4387 memcached_return_t rc
;
4388 memcached_server_instance_st instance
=
4389 memcached_server_instance_by_position(memc
, 0);
4391 // Test both the version that returns a code, and the one that does not.
4392 test_true(libmemcached_util_ping(memcached_server_name(instance
),
4393 memcached_server_port(instance
), NULL
));
4395 test_true(libmemcached_util_ping(memcached_server_name(instance
),
4396 memcached_server_port(instance
), &rc
));
4398 test_compare(MEMCACHED_SUCCESS
, rc
);
4400 return TEST_SUCCESS
;
4405 static test_return_t
hash_sanity_test (memcached_st
*memc
)
4409 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
4410 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
4411 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
4412 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
4413 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
4414 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
4415 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
4416 #ifdef HAVE_HSIEH_HASH
4417 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
4419 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
4420 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
4421 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
4423 return TEST_SUCCESS
;
4427 static test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
4429 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
4431 memcached_return_t expected_rc
= MEMCACHED_INVALID_ARGUMENTS
;
4432 #ifdef HAVE_HSIEH_HASH
4433 expected_rc
= MEMCACHED_SUCCESS
;
4435 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
4436 (uint64_t)MEMCACHED_HASH_HSIEH
);
4437 test_compare(expected_rc
, rc
);
4439 return TEST_SUCCESS
;
4442 static test_return_t
murmur_avaibility_test (memcached_st
*memc
)
4444 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
4446 memcached_return_t expected_rc
= MEMCACHED_INVALID_ARGUMENTS
;
4447 #ifdef HAVE_MURMUR_HASH
4448 expected_rc
= MEMCACHED_SUCCESS
;
4450 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
4451 (uint64_t)MEMCACHED_HASH_MURMUR
);
4452 test_compare(expected_rc
, rc
);
4454 return TEST_SUCCESS
;
4457 static test_return_t
one_at_a_time_run (memcached_st
*)
4462 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4464 test_compare(one_at_a_time_values
[x
],
4465 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_DEFAULT
));
4468 return TEST_SUCCESS
;
4471 static test_return_t
md5_run (memcached_st
*)
4476 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4478 test_compare(md5_values
[x
],
4479 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
));
4482 return TEST_SUCCESS
;
4485 static test_return_t
crc_run (memcached_st
*)
4490 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4492 test_compare(crc_values
[x
],
4493 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
));
4496 return TEST_SUCCESS
;
4499 static test_return_t
fnv1_64_run (memcached_st
*)
4501 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
));
4506 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4508 test_compare(fnv1_64_values
[x
],
4509 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
));
4512 return TEST_SUCCESS
;
4515 static test_return_t
fnv1a_64_run (memcached_st
*)
4517 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1A_64
));
4522 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4524 test_compare(fnv1a_64_values
[x
],
4525 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
));
4528 return TEST_SUCCESS
;
4531 static test_return_t
fnv1_32_run (memcached_st
*)
4536 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4538 test_compare(fnv1_32_values
[x
],
4539 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
));
4542 return TEST_SUCCESS
;
4545 static test_return_t
fnv1a_32_run (memcached_st
*)
4550 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4552 test_compare(fnv1a_32_values
[x
],
4553 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
));
4556 return TEST_SUCCESS
;
4559 static test_return_t
hsieh_run (memcached_st
*)
4561 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
4566 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4568 test_compare(hsieh_values
[x
],
4569 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
));
4572 return TEST_SUCCESS
;
4575 static test_return_t
murmur_run (memcached_st
*)
4577 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
4579 #ifdef WORDS_BIGENDIAN
4580 (void)murmur_values
;
4581 return TEST_SKIPPED
;
4586 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4588 test_compare(murmur_values
[x
],
4589 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
));
4592 return TEST_SUCCESS
;
4596 static test_return_t
jenkins_run (memcached_st
*)
4601 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4603 test_compare(jenkins_values
[x
],
4604 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
));
4607 return TEST_SUCCESS
;
4610 static uint32_t hash_md5_test_function(const char *string
, size_t string_length
, void *)
4612 return libhashkit_md5(string
, string_length
);
4615 static uint32_t hash_crc_test_function(const char *string
, size_t string_length
, void *)
4617 return libhashkit_crc32(string
, string_length
);
4620 static test_return_t
memcached_get_hashkit_test (memcached_st
*)
4626 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:1 --server=localhost:2 --server=localhost:3 --server=localhost:4 --server=localhost5"));
4628 uint32_t md5_hosts
[]= {4U, 1U, 0U, 1U, 4U, 2U, 0U, 3U, 0U, 0U, 3U, 1U, 0U, 0U, 1U, 3U, 0U, 0U, 0U, 3U, 1U, 0U, 4U, 4U, 3U};
4629 uint32_t crc_hosts
[]= {2U, 4U, 1U, 0U, 2U, 4U, 4U, 4U, 1U, 2U, 3U, 4U, 3U, 4U, 1U, 3U, 3U, 2U, 0U, 0U, 0U, 1U, 2U, 4U, 0U};
4631 const hashkit_st
*kit
= memcached_get_hashkit(memc
);
4633 hashkit_clone(&new_kit
, kit
);
4634 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_md5_test_function
, NULL
));
4636 memcached_set_hashkit(memc
, &new_kit
);
4639 Verify Setting the hash.
4641 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4645 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
4646 test_compare_got(md5_values
[x
], hash_val
, *ptr
);
4651 Now check memcached_st.
4653 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4657 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
4658 test_compare_got(md5_hosts
[x
], hash_val
, *ptr
);
4661 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_crc_test_function
, NULL
));
4663 memcached_set_hashkit(memc
, &new_kit
);
4666 Verify Setting the hash.
4668 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4672 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
4673 test_true(crc_values
[x
] == hash_val
);
4676 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4680 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
4681 test_compare(crc_hosts
[x
], hash_val
);
4684 memcached_free(memc
);
4686 return TEST_SUCCESS
;
4690 Test case adapted from John Gorman <johngorman2@gmail.com>
4692 We are testing the error condition when we connect to a server via memcached_get()
4693 but find that the server is not available.
4695 static test_return_t
memcached_get_MEMCACHED_ERRNO(memcached_st
*)
4697 const char *key
= "MemcachedLives";
4700 memcached_return rc
;
4703 memcached_st
*tl_memc_h
= memcached(test_literal_param("--server=localhost:9898 --server=localhost:9899")); // This server should not exist
4705 // See if memcached is reachable.
4706 char *value
= memcached_get(tl_memc_h
, key
, strlen(key
), &len
, &flags
, &rc
);
4710 test_true(memcached_failed(rc
));
4712 memcached_free(tl_memc_h
);
4714 return TEST_SUCCESS
;
4718 We connect to a server which exists, but search for a key that does not exist.
4720 static test_return_t
memcached_get_MEMCACHED_NOTFOUND(memcached_st
*memc
)
4722 const char *key
= "MemcachedKeyNotEXIST";
4725 memcached_return rc
;
4727 // See if memcached is reachable.
4728 char *value
= memcached_get(memc
, key
, strlen(key
), &len
, &flags
, &rc
);
4732 test_compare(MEMCACHED_NOTFOUND
, rc
);
4734 return TEST_SUCCESS
;
4738 Test case adapted from John Gorman <johngorman2@gmail.com>
4740 We are testing the error condition when we connect to a server via memcached_get_by_key()
4741 but find that the server is not available.
4743 static test_return_t
memcached_get_by_key_MEMCACHED_ERRNO(memcached_st
*memc
)
4746 memcached_st
*tl_memc_h
;
4747 memcached_server_st
*servers
;
4749 const char *key
= "MemcachedLives";
4752 memcached_return rc
;
4756 tl_memc_h
= memcached_create(NULL
);
4757 servers
= memcached_servers_parse("localhost:9898,localhost:9899"); // This server should not exist
4758 memcached_server_push(tl_memc_h
, servers
);
4759 memcached_server_list_free(servers
);
4761 // See if memcached is reachable.
4762 value
= memcached_get_by_key(tl_memc_h
, key
, strlen(key
), key
, strlen(key
), &len
, &flags
, &rc
);
4766 test_true(memcached_failed(rc
));
4768 memcached_free(tl_memc_h
);
4770 return TEST_SUCCESS
;
4774 We connect to a server which exists, but search for a key that does not exist.
4776 static test_return_t
memcached_get_by_key_MEMCACHED_NOTFOUND(memcached_st
*memc
)
4778 const char *key
= "MemcachedKeyNotEXIST";
4781 memcached_return rc
;
4784 // See if memcached is reachable.
4785 value
= memcached_get_by_key(memc
, key
, strlen(key
), key
, strlen(key
), &len
, &flags
, &rc
);
4789 test_compare(MEMCACHED_NOTFOUND
, rc
);
4791 return TEST_SUCCESS
;
4794 static test_return_t
regression_bug_434484(memcached_st
*memc
)
4796 test_return_t test_rc
;
4797 test_rc
= pre_binary(memc
);
4799 if (test_rc
!= TEST_SUCCESS
)
4802 const char *key
= "regression_bug_434484";
4803 size_t keylen
= strlen(key
);
4805 memcached_return_t ret
= memcached_append(memc
, key
, keylen
, key
, keylen
, 0, 0);
4806 test_compare(MEMCACHED_NOTSTORED
, ret
);
4808 size_t size
= 2048 * 1024;
4809 char *data
= (char*)calloc(1, size
);
4811 test_compare(MEMCACHED_E2BIG
,
4812 memcached_set(memc
, key
, keylen
, data
, size
, 0, 0));
4815 return TEST_SUCCESS
;
4818 static test_return_t
regression_bug_434843(memcached_st
*memc
)
4820 test_return_t test_rc
;
4821 test_rc
= pre_binary(memc
);
4823 if (test_rc
!= TEST_SUCCESS
)
4826 memcached_return_t rc
;
4828 memcached_execute_fn callbacks
[]= { &callback_counter
};
4831 * I only want to hit only _one_ server so I know the number of requests I'm
4832 * sending in the pipleine to the server. Let's try to do a multiget of
4833 * 1024 (that should satisfy most users don't you think?). Future versions
4834 * will include a mget_execute function call if you need a higher number.
4836 uint32_t number_of_hosts
= memcached_server_count(memc
);
4837 memc
->number_of_hosts
= 1;
4838 const size_t max_keys
= 1024;
4839 char **keys
= (char**)calloc(max_keys
, sizeof(char*));
4840 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
4842 for (size_t x
= 0; x
< max_keys
; ++x
)
4846 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
4852 * Run two times.. the first time we should have 100% cache miss,
4853 * and the second time we should have 100% cache hits
4855 for (size_t y
= 0; y
< 2; y
++)
4857 test_compare(MEMCACHED_SUCCESS
,
4858 memcached_mget(memc
, (const char**)keys
, key_length
, max_keys
));
4860 test_compare(y
? MEMCACHED_SUCCESS
: MEMCACHED_NOTFOUND
,
4861 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4865 /* The first iteration should give me a 100% cache miss. verify that*/
4866 char blob
[1024]= { 0 };
4868 test_false(counter
);
4870 for (size_t x
= 0; x
< max_keys
; ++x
)
4872 rc
= memcached_add(memc
, keys
[x
], key_length
[x
],
4873 blob
, sizeof(blob
), 0, 0);
4874 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4879 /* Verify that we received all of the key/value pairs */
4880 test_compare(counter
, max_keys
);
4884 /* Release allocated resources */
4885 for (size_t x
= 0; x
< max_keys
; ++x
)
4892 memc
->number_of_hosts
= number_of_hosts
;
4894 return TEST_SUCCESS
;
4897 static test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
4899 memcached_return_t rc
;
4900 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4901 test_compare(MEMCACHED_SUCCESS
, rc
);
4903 return regression_bug_434843(memc
);
4906 static test_return_t
regression_bug_421108(memcached_st
*memc
)
4908 memcached_return_t rc
;
4909 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
4910 test_compare(MEMCACHED_SUCCESS
, rc
);
4912 char *bytes_str
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
4913 test_compare(MEMCACHED_SUCCESS
, rc
);
4914 test_true(bytes_str
);
4915 char *bytes_read_str
= memcached_stat_get_value(memc
, memc_stat
,
4917 test_compare(MEMCACHED_SUCCESS
, rc
);
4918 test_true(bytes_read_str
);
4920 char *bytes_written_str
= memcached_stat_get_value(memc
, memc_stat
,
4921 "bytes_written", &rc
);
4922 test_compare(MEMCACHED_SUCCESS
, rc
);
4923 test_true(bytes_written_str
);
4925 unsigned long long bytes
= strtoull(bytes_str
, 0, 10);
4926 unsigned long long bytes_read
= strtoull(bytes_read_str
, 0, 10);
4927 unsigned long long bytes_written
= strtoull(bytes_written_str
, 0, 10);
4929 test_true(bytes
!= bytes_read
);
4930 test_true(bytes
!= bytes_written
);
4932 /* Release allocated resources */
4934 free(bytes_read_str
);
4935 free(bytes_written_str
);
4936 memcached_stat_free(NULL
, memc_stat
);
4938 return TEST_SUCCESS
;
4942 * The test case isn't obvious so I should probably document why
4943 * it works the way it does. Bug 442914 was caused by a bug
4944 * in the logic in memcached_purge (it did not handle the case
4945 * where the number of bytes sent was equal to the watermark).
4946 * In this test case, create messages so that we hit that case
4947 * and then disable noreply mode and issue a new command to
4948 * verify that it isn't stuck. If we change the format for the
4949 * delete command or the watermarks, we need to update this
4952 static test_return_t
regression_bug_442914(memcached_st
*memc
)
4954 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
4955 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
4957 uint32_t number_of_hosts
= memcached_server_count(memc
);
4958 memc
->number_of_hosts
= 1;
4963 for (uint32_t x
= 0; x
< 250; ++x
)
4965 len
= (size_t)snprintf(k
, sizeof(k
), "%0250u", x
);
4966 memcached_return_t rc
= memcached_delete(memc
, k
, len
, 0);
4967 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4970 (void)snprintf(k
, sizeof(k
), "%037u", 251U);
4973 memcached_return_t rc
= memcached_delete(memc
, k
, len
, 0);
4974 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4976 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0));
4977 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, k
, len
, 0));
4979 memc
->number_of_hosts
= number_of_hosts
;
4981 return TEST_SUCCESS
;
4984 static test_return_t
regression_bug_447342(memcached_st
*memc
)
4986 memcached_server_instance_st instance_one
;
4987 memcached_server_instance_st instance_two
;
4989 if (memcached_server_count(memc
) < 3 or pre_replication(memc
) != TEST_SUCCESS
)
4990 return TEST_SKIPPED
;
4992 test_compare(MEMCACHED_SUCCESS
,
4993 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2));
4995 const unsigned int max_keys
= 100;
4996 char **keys
= (char**)calloc(max_keys
, sizeof(char*));
4997 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
4999 for (unsigned int x
= 0; x
< max_keys
; ++x
)
5003 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
5006 test_compare(MEMCACHED_SUCCESS
,
5007 memcached_set(memc
, k
, key_length
[x
], k
, key_length
[x
], 0, 0));
5011 ** We are using the quiet commands to store the replicas, so we need
5012 ** to ensure that all of them are processed before we can continue.
5013 ** In the test we go directly from storing the object to trying to
5014 ** receive the object from all of the different servers, so we
5015 ** could end up in a race condition (the memcached server hasn't yet
5016 ** processed the quiet command from the replication set when it process
5017 ** the request from the other client (created by the clone)). As a
5018 ** workaround for that we call memcached_quit to send the quit command
5019 ** to the server and wait for the response ;-) If you use the test code
5020 ** as an example for your own code, please note that you shouldn't need
5023 memcached_quit(memc
);
5025 /* Verify that all messages are stored, and we didn't stuff too much
5028 test_compare(MEMCACHED_SUCCESS
,
5029 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
5031 unsigned int counter
= 0;
5032 memcached_execute_fn callbacks
[]= { &callback_counter
};
5033 test_compare(MEMCACHED_SUCCESS
,
5034 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
5036 /* Verify that we received all of the key/value pairs */
5037 test_compare(counter
, max_keys
);
5039 memcached_quit(memc
);
5041 * Don't do the following in your code. I am abusing the internal details
5042 * within the library, and this is not a supported interface.
5043 * This is to verify correct behavior in the library. Fake that two servers
5046 instance_one
= memcached_server_instance_by_position(memc
, 0);
5047 instance_two
= memcached_server_instance_by_position(memc
, 2);
5048 in_port_t port0
= instance_one
->port
;
5049 in_port_t port2
= instance_two
->port
;
5051 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
5052 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
5054 test_compare(MEMCACHED_SUCCESS
,
5055 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
5058 test_compare(MEMCACHED_SUCCESS
,
5059 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
5060 test_compare(counter
, (unsigned int)max_keys
);
5062 /* restore the memc handle */
5063 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
5064 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
5066 memcached_quit(memc
);
5068 /* Remove half of the objects */
5069 for (size_t x
= 0; x
< max_keys
; ++x
)
5073 test_compare(MEMCACHED_SUCCESS
,
5074 memcached_delete(memc
, keys
[x
], key_length
[x
], 0));
5078 memcached_quit(memc
);
5079 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
5080 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
5082 /* now retry the command, this time we should have cache misses */
5083 test_compare(MEMCACHED_SUCCESS
,
5084 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
5087 test_compare(MEMCACHED_SUCCESS
,
5088 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
5089 test_compare(counter
, (unsigned int)(max_keys
>> 1));
5091 /* Release allocated resources */
5092 for (size_t x
= 0; x
< max_keys
; ++x
)
5099 /* restore the memc handle */
5100 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
5101 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
5103 return TEST_SUCCESS
;
5106 static test_return_t
regression_bug_463297(memcached_st
*memc
)
5108 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
5109 test_true(memc_clone
);
5110 test_true(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
5112 memcached_server_instance_st instance
=
5113 memcached_server_instance_by_position(memc_clone
, 0);
5115 if (instance
->major_version
> 1 ||
5116 (instance
->major_version
== 1 &&
5117 instance
->minor_version
> 2))
5119 /* Binary protocol doesn't support deferred delete */
5120 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
5121 test_true(bin_clone
);
5122 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
5123 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(bin_clone
, "foo", 3, 1));
5124 memcached_free(bin_clone
);
5126 memcached_quit(memc_clone
);
5128 /* If we know the server version, deferred delete should fail
5129 * with invalid arguments */
5130 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(memc_clone
, "foo", 3, 1));
5132 /* If we don't know the server version, we should get a protocol error */
5133 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
5135 /* but there is a bug in some of the memcached servers (1.4) that treats
5136 * the counter as noreply so it doesn't send the proper error message
5138 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
5140 /* And buffered mode should be disabled and we should get protocol error */
5141 test_true(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
5142 rc
= memcached_delete(memc
, "foo", 3, 1);
5143 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
5145 /* Same goes for noreply... */
5146 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
5147 rc
= memcached_delete(memc
, "foo", 3, 1);
5148 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
5150 /* but a normal request should go through (and be buffered) */
5151 test_compare(MEMCACHED_BUFFERED
, (rc
= memcached_delete(memc
, "foo", 3, 0)));
5152 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
5154 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0));
5155 /* unbuffered noreply should be success */
5156 test_compare(MEMCACHED_SUCCESS
, memcached_delete(memc
, "foo", 3, 0));
5157 /* unbuffered with reply should be not found... */
5158 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0));
5159 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, "foo", 3, 0));
5162 memcached_free(memc_clone
);
5163 return TEST_SUCCESS
;
5167 /* Test memcached_server_get_last_disconnect
5168 * For a working server set, shall be NULL
5169 * For a set of non existing server, shall not be NULL
5171 static test_return_t
test_get_last_disconnect(memcached_st
*memc
)
5173 memcached_return_t rc
;
5174 memcached_server_instance_st disconnected_server
;
5176 /* With the working set of server */
5177 const char *key
= "marmotte";
5178 const char *value
= "milka";
5180 memcached_reset_last_disconnected_server(memc
);
5181 test_false(memc
->last_disconnected_server
);
5182 rc
= memcached_set(memc
, key
, strlen(key
),
5183 value
, strlen(value
),
5184 (time_t)0, (uint32_t)0);
5185 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5187 disconnected_server
= memcached_server_get_last_disconnect(memc
);
5188 test_false(disconnected_server
);
5190 /* With a non existing server */
5192 memcached_server_st
*servers
;
5194 const char *server_list
= "localhost:9";
5196 servers
= memcached_servers_parse(server_list
);
5198 mine
= memcached_create(NULL
);
5199 rc
= memcached_server_push(mine
, servers
);
5200 test_compare(MEMCACHED_SUCCESS
, rc
);
5201 memcached_server_list_free(servers
);
5204 rc
= memcached_set(mine
, key
, strlen(key
),
5205 value
, strlen(value
),
5206 (time_t)0, (uint32_t)0);
5207 test_true(memcached_failed(rc
));
5209 disconnected_server
= memcached_server_get_last_disconnect(mine
);
5210 test_true_got(disconnected_server
, memcached_strerror(mine
, rc
));
5211 test_compare(in_port_t(9), memcached_server_port(disconnected_server
));
5212 test_false(strncmp(memcached_server_name(disconnected_server
),"localhost",9));
5214 memcached_quit(mine
);
5215 memcached_free(mine
);
5217 return TEST_SUCCESS
;
5220 static test_return_t
test_multiple_get_last_disconnect(memcached_st
*)
5222 const char *server_string
= "--server=localhost:8888 --server=localhost:8889 --server=localhost:8890 --server=localhost:8891 --server=localhost:8892";
5223 char buffer
[BUFSIZ
];
5225 test_compare(MEMCACHED_SUCCESS
,
5226 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
5228 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
5231 // We will just use the error strings as our keys
5232 uint32_t counter
= 100;
5235 for (int x
= int(MEMCACHED_SUCCESS
); x
< int(MEMCACHED_MAXIMUM_RETURN
); ++x
)
5237 const char *msg
= memcached_strerror(memc
, memcached_return_t(x
));
5238 memcached_return_t ret
= memcached_set(memc
, msg
, strlen(msg
), NULL
, 0, (time_t)0, (uint32_t)0);
5239 test_true_got((ret
== MEMCACHED_CONNECTION_FAILURE
or ret
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
), memcached_last_error_message(memc
));
5241 memcached_server_instance_st disconnected_server
= memcached_server_get_last_disconnect(memc
);
5242 test_true(disconnected_server
);
5243 test_strcmp("localhost", memcached_server_name(disconnected_server
));
5244 test_true(memcached_server_port(disconnected_server
) >= 8888 and memcached_server_port(disconnected_server
) <= 8892);
5248 memcached_reset_last_disconnected_server(memc
);
5253 memcached_free(memc
);
5255 return TEST_SUCCESS
;
5258 static test_return_t
test_verbosity(memcached_st
*memc
)
5260 memcached_verbosity(memc
, 3);
5262 return TEST_SUCCESS
;
5266 static memcached_return_t
stat_printer(memcached_server_instance_st server
,
5267 const char *key
, size_t key_length
,
5268 const char *value
, size_t value_length
,
5278 return MEMCACHED_SUCCESS
;
5281 static test_return_t
memcached_stat_execute_test(memcached_st
*memc
)
5283 memcached_return_t rc
= memcached_stat_execute(memc
, NULL
, stat_printer
, NULL
);
5284 test_compare(MEMCACHED_SUCCESS
, rc
);
5286 rc
= memcached_stat_execute(memc
, "slabs", stat_printer
, NULL
);
5287 test_compare(MEMCACHED_SUCCESS
, rc
);
5289 rc
= memcached_stat_execute(memc
, "items", stat_printer
, NULL
);
5290 test_compare(MEMCACHED_SUCCESS
, rc
);
5292 rc
= memcached_stat_execute(memc
, "sizes", stat_printer
, NULL
);
5293 test_compare(MEMCACHED_SUCCESS
, rc
);
5295 return TEST_SUCCESS
;
5299 * This test ensures that the failure counter isn't incremented during
5300 * normal termination of the memcached instance.
5302 static test_return_t
wrong_failure_counter_test(memcached_st
*memc
)
5304 memcached_return_t rc
;
5305 memcached_server_instance_st instance
;
5307 /* Set value to force connection to the server */
5308 const char *key
= "marmotte";
5309 const char *value
= "milka";
5312 * Please note that I'm abusing the internal structures in libmemcached
5313 * in a non-portable way and you shouldn't be doing this. I'm only
5314 * doing this in order to verify that the library works the way it should
5316 uint32_t number_of_hosts
= memcached_server_count(memc
);
5317 memc
->number_of_hosts
= 1;
5319 /* Ensure that we are connected to the server by setting a value */
5320 rc
= memcached_set(memc
, key
, strlen(key
),
5321 value
, strlen(value
),
5322 (time_t)0, (uint32_t)0);
5323 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
5326 instance
= memcached_server_instance_by_position(memc
, 0);
5327 /* The test is to see that the memcached_quit doesn't increase the
5328 * the server failure conter, so let's ensure that it is zero
5329 * before sending quit
5331 ((memcached_server_write_instance_st
)instance
)->server_failure_counter
= 0;
5333 memcached_quit(memc
);
5335 /* Verify that it memcached_quit didn't increment the failure counter
5336 * Please note that this isn't bullet proof, because an error could
5339 test_zero(instance
->server_failure_counter
);
5341 /* restore the instance */
5342 memc
->number_of_hosts
= number_of_hosts
;
5344 return TEST_SUCCESS
;
5348 * This tests ensures expected disconnections (for some behavior changes
5349 * for instance) do not wrongly increase failure counter
5351 static test_return_t
wrong_failure_counter_two_test(memcached_st
*memc
)
5353 memcached_return rc
;
5355 memcached_st
*memc_clone
;
5356 memc_clone
= memcached_clone(NULL
, memc
);
5357 test_true(memc_clone
);
5359 /* Set value to force connection to the server */
5360 const char *key
= "marmotte";
5361 const char *value
= "milka";
5362 char *string
= NULL
;
5363 size_t string_length
;
5366 rc
= memcached_set(memc_clone
, key
, strlen(key
),
5367 value
, strlen(value
),
5368 (time_t)0, (uint32_t)0);
5369 test_true_got(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
5372 /* put failure limit to 1 */
5373 test_compare(MEMCACHED_SUCCESS
,
5374 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, 1));
5376 /* Put a retry timeout to effectively activate failure_limit effect */
5377 test_compare(MEMCACHED_SUCCESS
,
5378 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 1));
5380 /* change behavior that triggers memcached_quit()*/
5381 test_compare(MEMCACHED_SUCCESS
,
5382 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1));
5385 /* Check if we still are connected */
5386 string
= memcached_get(memc_clone
, key
, strlen(key
),
5387 &string_length
, &flags
, &rc
);
5389 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
5392 memcached_free(memc_clone
);
5394 return TEST_SUCCESS
;
5401 * Test that ensures mget_execute does not end into recursive calls that finally fails
5403 static test_return_t
regression_bug_490486(memcached_st
*memc
)
5405 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
5406 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 1);
5407 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
5408 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, 1);
5409 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 3600);
5412 return TEST_SKIPPED
; // My MAC can't handle this test
5416 * I only want to hit _one_ server so I know the number of requests I'm
5417 * sending in the pipeline.
5419 uint32_t number_of_hosts
= memc
->number_of_hosts
;
5420 memc
->number_of_hosts
= 1;
5421 size_t max_keys
= 20480;
5424 char **keys
= (char **)calloc(max_keys
, sizeof(char*));
5425 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
5427 /* First add all of the items.. */
5428 char blob
[1024]= { 0 };
5429 for (size_t x
= 0; x
< max_keys
; ++x
)
5432 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
5435 memcached_return rc
= memcached_set(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
5436 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
); // MEMCACHED_TIMEOUT <-- hash been observed on OSX
5441 /* Try to get all of them with a large multiget */
5443 memcached_execute_function callbacks
[]= { &callback_counter
};
5444 memcached_return_t rc
= memcached_mget_execute(memc
, (const char**)keys
, key_length
,
5445 (size_t)max_keys
, callbacks
, &counter
, 1);
5446 test_compare(MEMCACHED_SUCCESS
, rc
);
5448 char* the_value
= NULL
;
5449 char the_key
[MEMCACHED_MAX_KEY
];
5450 size_t the_key_length
;
5451 size_t the_value_length
;
5455 the_value
= memcached_fetch(memc
, the_key
, &the_key_length
, &the_value_length
, &the_flags
, &rc
);
5457 if ((the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
))
5463 } while ( (the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
));
5466 test_compare(MEMCACHED_END
, rc
);
5468 /* Verify that we got all of the items */
5469 test_compare(counter
, max_keys
);
5472 /* Release all allocated resources */
5473 for (size_t x
= 0; x
< max_keys
; ++x
)
5480 memc
->number_of_hosts
= number_of_hosts
;
5482 return TEST_SUCCESS
;
5485 static test_return_t
regression_bug_583031(memcached_st
*)
5487 memcached_st
*memc
= memcached_create(NULL
);
5489 test_compare(MEMCACHED_SUCCESS
, memcached_server_add(memc
, "10.2.3.4", 11211));
5491 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
, 1000);
5492 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 1000);
5493 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
5494 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
5495 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
5496 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, 3);
5498 memcached_return_t rc
;
5502 const char *value
= memcached_get(memc
, "dsf", 3, &length
, &flags
, &rc
);
5506 test_compare_got(MEMCACHED_TIMEOUT
, rc
, memcached_last_error_message(memc
));
5508 memcached_free(memc
);
5510 return TEST_SUCCESS
;
5513 static test_return_t
regression_bug_581030(memcached_st
*)
5516 memcached_stat_st
*local_stat
= memcached_stat(NULL
, NULL
, NULL
);
5517 test_false(local_stat
);
5519 memcached_stat_free(NULL
, NULL
);
5522 return TEST_SUCCESS
;
5525 #define regression_bug_655423_COUNT 6000
5526 static test_return_t
regression_bug_655423(memcached_st
*memc
)
5528 memcached_st
*clone
= memcached_clone(NULL
, memc
);
5529 memc
= NULL
; // Just to make sure it is not used
5534 return TEST_SKIPPED
;
5537 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
5538 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1));
5539 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1));
5540 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH
, 1));
5542 memset(payload
, int('x'), sizeof(payload
));
5544 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5546 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5547 snprintf(key
, sizeof(key
), "%u", x
);
5549 test_compare(MEMCACHED_SUCCESS
, memcached_set(clone
, key
, strlen(key
), payload
, sizeof(payload
), 0, 0));
5552 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5554 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5555 snprintf(key
, sizeof(key
), "%u", x
);
5557 size_t value_length
;
5558 memcached_return_t rc
;
5559 char *value
= memcached_get(clone
, key
, strlen(key
), &value_length
, NULL
, &rc
);
5561 if (rc
== MEMCACHED_NOTFOUND
)
5564 test_zero(value_length
);
5568 test_compare(MEMCACHED_SUCCESS
, rc
);
5570 test_compare(100LLU, value_length
);
5574 char **keys
= (char**)calloc(regression_bug_655423_COUNT
, sizeof(char*));
5575 size_t *key_length
= (size_t *)calloc(regression_bug_655423_COUNT
, sizeof(size_t));
5576 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5578 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5579 snprintf(key
, sizeof(key
), "%u", x
);
5581 keys
[x
]= strdup(key
);
5583 key_length
[x
]= strlen(key
);
5584 test_true(key_length
[x
]);
5587 test_compare(MEMCACHED_SUCCESS
,
5588 memcached_mget(clone
, (const char* const *)keys
, key_length
, regression_bug_655423_COUNT
));
5591 memcached_result_st
*result
= NULL
;
5592 while ((result
= memcached_fetch_result(clone
, result
, NULL
)))
5594 test_compare(size_t(100), memcached_result_length(result
));
5598 test_true(count
> 100); // If we don't get back atleast this, something is up
5600 /* Release all allocated resources */
5601 for (size_t x
= 0; x
< regression_bug_655423_COUNT
; ++x
)
5609 memcached_free(clone
);
5611 return TEST_SUCCESS
;
5615 * Test that ensures that buffered set to not trigger problems during io_flush
5617 #define regression_bug_490520_COUNT 200480
5618 static test_return_t
regression_bug_490520(memcached_st
*memc
)
5620 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
,1);
5621 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
,1);
5622 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
5623 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
,1);
5624 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 3600);
5626 memc
->number_of_hosts
= 1;
5628 char **keys
= (char **)calloc(regression_bug_490520_COUNT
, sizeof(char*));
5629 size_t *key_length
= (size_t *)calloc(regression_bug_490520_COUNT
, sizeof(size_t));
5631 /* First add all of the items.. */
5632 char blob
[3333] = {0};
5633 for (uint32_t x
= 0; x
< regression_bug_490520_COUNT
; ++x
)
5636 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5640 memcached_return rc
= memcached_set(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
5641 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
5644 for (uint32_t x
= 0; x
< regression_bug_490520_COUNT
; ++x
)
5651 return TEST_SUCCESS
;
5654 static void memcached_die(memcached_st
* mc
, memcached_return error
, const char* what
, uint32_t it
)
5656 fprintf(stderr
, "Iteration #%u: ", it
);
5658 if (error
== MEMCACHED_ERRNO
)
5660 fprintf(stderr
, "system error %d from %s: %s\n",
5661 errno
, what
, strerror(errno
));
5665 fprintf(stderr
, "error %d from %s: %s\n", error
, what
,
5666 memcached_strerror(mc
, error
));
5670 #define TEST_CONSTANT_CREATION 200
5672 static test_return_t
regression_bug_(memcached_st
*memc
)
5674 const char *remote_server
;
5677 if (! (remote_server
= getenv("LIBMEMCACHED_REMOTE_SERVER")))
5679 return TEST_SKIPPED
;
5682 for (uint32_t x
= 0; x
< TEST_CONSTANT_CREATION
; x
++)
5684 memcached_st
* mc
= memcached_create(NULL
);
5685 memcached_return rc
;
5687 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
5688 if (rc
!= MEMCACHED_SUCCESS
)
5690 memcached_die(mc
, rc
, "memcached_behavior_set", x
);
5693 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
, 1);
5694 if (rc
!= MEMCACHED_SUCCESS
)
5696 memcached_die(mc
, rc
, "memcached_behavior_set", x
);
5699 rc
= memcached_server_add(mc
, remote_server
, 0);
5700 if (rc
!= MEMCACHED_SUCCESS
)
5702 memcached_die(mc
, rc
, "memcached_server_add", x
);
5705 const char *set_key
= "akey";
5706 const size_t set_key_len
= strlen(set_key
);
5707 const char *set_value
= "a value";
5708 const size_t set_value_len
= strlen(set_value
);
5710 if (rc
== MEMCACHED_SUCCESS
)
5714 size_t get_value_len
;
5716 uint32_t get_value_flags
;
5718 get_value
= memcached_get(mc
, set_key
, set_key_len
, &get_value_len
,
5719 &get_value_flags
, &rc
);
5720 if (rc
!= MEMCACHED_SUCCESS
)
5722 memcached_die(mc
, rc
, "memcached_get", x
);
5728 (get_value_len
!= set_value_len
5729 || 0!=strncmp(get_value
, set_value
, get_value_len
)))
5731 fprintf(stderr
, "Values don't match?\n");
5732 rc
= MEMCACHED_FAILURE
;
5738 rc
= memcached_set(mc
,
5739 set_key
, set_key_len
,
5740 set_value
, set_value_len
,
5744 if (rc
!= MEMCACHED_SUCCESS
)
5746 memcached_die(mc
, rc
, "memcached_set", x
);
5753 if (rc
!= MEMCACHED_SUCCESS
)
5759 return TEST_SUCCESS
;
5762 /* Clean the server before beginning testing */
5764 {"util_version", true, (test_callback_fn
*)util_version_test
},
5765 {"flush", false, (test_callback_fn
*)flush_test
},
5766 {"init", false, (test_callback_fn
*)init_test
},
5767 {"allocation", false, (test_callback_fn
*)allocation_test
},
5768 {"server_list_null_test", false, (test_callback_fn
*)server_list_null_test
},
5769 {"server_unsort", false, (test_callback_fn
*)server_unsort_test
},
5770 {"server_sort", false, (test_callback_fn
*)server_sort_test
},
5771 {"server_sort2", false, (test_callback_fn
*)server_sort2_test
},
5772 {"memcached_server_remove", false, (test_callback_fn
*)memcached_server_remove_test
},
5773 {"clone_test", false, (test_callback_fn
*)clone_test
},
5774 {"connection_test", false, (test_callback_fn
*)connection_test
},
5775 {"callback_test", false, (test_callback_fn
*)callback_test
},
5776 {"userdata_test", false, (test_callback_fn
*)userdata_test
},
5777 {"set", false, (test_callback_fn
*)set_test
},
5778 {"set2", false, (test_callback_fn
*)set_test2
},
5779 {"set3", false, (test_callback_fn
*)set_test3
},
5780 {"dump", true, (test_callback_fn
*)dump_test
},
5781 {"add", true, (test_callback_fn
*)add_test
},
5782 {"memcached_fetch_result(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_fetch_result_NOT_FOUND
},
5783 {"replace", true, (test_callback_fn
*)replace_test
},
5784 {"delete", true, (test_callback_fn
*)delete_test
},
5785 {"get", true, (test_callback_fn
*)get_test
},
5786 {"get2", false, (test_callback_fn
*)get_test2
},
5787 {"get3", false, (test_callback_fn
*)get_test3
},
5788 {"get4", false, (test_callback_fn
*)get_test4
},
5789 {"partial mget", false, (test_callback_fn
*)get_test5
},
5790 {"stats_servername", false, (test_callback_fn
*)stats_servername_test
},
5791 {"increment", false, (test_callback_fn
*)increment_test
},
5792 {"increment_with_initial", true, (test_callback_fn
*)increment_with_initial_test
},
5793 {"decrement", false, (test_callback_fn
*)decrement_test
},
5794 {"decrement_with_initial", true, (test_callback_fn
*)decrement_with_initial_test
},
5795 {"increment_by_key", false, (test_callback_fn
*)increment_by_key_test
},
5796 {"increment_with_initial_by_key", true, (test_callback_fn
*)increment_with_initial_by_key_test
},
5797 {"decrement_by_key", false, (test_callback_fn
*)decrement_by_key_test
},
5798 {"decrement_with_initial_by_key", true, (test_callback_fn
*)decrement_with_initial_by_key_test
},
5799 {"binary_increment_with_prefix", 1, (test_callback_fn
*)binary_increment_with_prefix_test
},
5800 {"quit", false, (test_callback_fn
*)quit_test
},
5801 {"mget", true, (test_callback_fn
*)mget_test
},
5802 {"mget_result", true, (test_callback_fn
*)mget_result_test
},
5803 {"mget_result_alloc", true, (test_callback_fn
*)mget_result_alloc_test
},
5804 {"mget_result_function", true, (test_callback_fn
*)mget_result_function
},
5805 {"mget_execute", true, (test_callback_fn
*)mget_execute
},
5806 {"mget_end", false, (test_callback_fn
*)mget_end
},
5807 {"get_stats", false, (test_callback_fn
*)get_stats
},
5808 {"add_host_test", false, (test_callback_fn
*)add_host_test
},
5809 {"add_host_test_1", false, (test_callback_fn
*)add_host_test1
},
5810 {"get_stats_keys", false, (test_callback_fn
*)get_stats_keys
},
5811 {"version_string_test", false, (test_callback_fn
*)version_string_test
},
5812 {"bad_key", true, (test_callback_fn
*)bad_key_test
},
5813 {"memcached_server_cursor", true, (test_callback_fn
*)memcached_server_cursor_test
},
5814 {"read_through", true, (test_callback_fn
*)read_through
},
5815 {"delete_through", true, (test_callback_fn
*)delete_through
},
5816 {"noreply", true, (test_callback_fn
*)noreply_test
},
5817 {"analyzer", true, (test_callback_fn
*)analyzer_test
},
5818 {"connectionpool", true, (test_callback_fn
*)connection_pool_test
},
5819 {"memcached_pool_test", true, (test_callback_fn
*)memcached_pool_test
},
5820 {"test_get_last_disconnect", true, (test_callback_fn
*)test_get_last_disconnect
},
5821 {"verbosity", true, (test_callback_fn
*)test_verbosity
},
5822 {"memcached_stat_execute", true, (test_callback_fn
*)memcached_stat_execute_test
},
5823 {"memcached_exist(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_exist_NOTFOUND
},
5824 {"memcached_exist(MEMCACHED_SUCCESS)", true, (test_callback_fn
*)memcached_exist_SUCCESS
},
5825 {"memcached_exist_by_key(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_exist_by_key_NOTFOUND
},
5826 {"memcached_exist_by_key(MEMCACHED_SUCCESS)", true, (test_callback_fn
*)memcached_exist_by_key_SUCCESS
},
5830 test_st behavior_tests
[] ={
5831 {"libmemcached_string_behavior()", false, (test_callback_fn
*)libmemcached_string_behavior_test
},
5832 {"libmemcached_string_distribution()", false, (test_callback_fn
*)libmemcached_string_distribution_test
},
5833 {"behavior_test", false, (test_callback_fn
*)behavior_test
},
5834 {"MEMCACHED_BEHAVIOR_CORK", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_CORK_test
},
5835 {"MEMCACHED_BEHAVIOR_TCP_KEEPALIVE", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test
},
5836 {"MEMCACHED_BEHAVIOR_TCP_KEEPIDLE", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test
},
5837 {"MEMCACHED_BEHAVIOR_POLL_TIMEOUT", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test
},
5841 test_st libmemcachedutil_tests
[] ={
5842 {"libmemcached_util_ping()", true, (test_callback_fn
*)ping_test
},
5843 {"libmemcached_util_getpid()", true, (test_callback_fn
*)getpid_test
},
5844 {"libmemcached_util_getpid(MEMCACHED_CONNECTION_FAILURE)", true, (test_callback_fn
*)getpid_connection_failure_test
},
5848 test_st basic_tests
[] ={
5849 {"init", true, (test_callback_fn
*)basic_init_test
},
5850 {"clone", true, (test_callback_fn
*)basic_clone_test
},
5851 {"reset", true, (test_callback_fn
*)basic_reset_stack_test
},
5852 {"reset heap", true, (test_callback_fn
*)basic_reset_heap_test
},
5853 {"reset stack clone", true, (test_callback_fn
*)basic_reset_stack_clone_test
},
5854 {"reset heap clone", true, (test_callback_fn
*)basic_reset_heap_clone_test
},
5855 {"memcached_return_t", false, (test_callback_fn
*)memcached_return_t_TEST
},
5859 test_st regression_binary_vs_block
[] ={
5860 {"block add", true, (test_callback_fn
*)block_add_regression
},
5861 {"binary add", true, (test_callback_fn
*)binary_add_regression
},
5865 test_st async_tests
[] ={
5866 {"add", true, (test_callback_fn
*)add_wrapper
},
5870 test_st memcached_server_get_last_disconnect_tests
[] ={
5871 {"memcached_server_get_last_disconnect()", false, (test_callback_fn
*)test_multiple_get_last_disconnect
},
5872 {0, 0, (test_callback_fn
*)0}
5876 test_st result_tests
[] ={
5877 {"result static", false, (test_callback_fn
*)result_static
},
5878 {"result alloc", false, (test_callback_fn
*)result_alloc
},
5879 {0, 0, (test_callback_fn
*)0}
5882 test_st version_1_2_3
[] ={
5883 {"append", false, (test_callback_fn
*)append_test
},
5884 {"prepend", false, (test_callback_fn
*)prepend_test
},
5885 {"cas", false, (test_callback_fn
*)cas_test
},
5886 {"cas2", false, (test_callback_fn
*)cas2_test
},
5887 {"append_binary", false, (test_callback_fn
*)append_binary_test
},
5888 {0, 0, (test_callback_fn
*)0}
5891 test_st haldenbrand_tests
[] ={
5892 {"memcached_set", false, (test_callback_fn
*)user_supplied_bug1
},
5893 {"memcached_get()", false, (test_callback_fn
*)user_supplied_bug2
},
5894 {"memcached_mget()", false, (test_callback_fn
*)user_supplied_bug3
},
5895 {0, 0, (test_callback_fn
*)0}
5898 test_st user_tests
[] ={
5899 {"user_supplied_bug4", true, (test_callback_fn
*)user_supplied_bug4
},
5900 {"user_supplied_bug5", true, (test_callback_fn
*)user_supplied_bug5
},
5901 {"user_supplied_bug6", true, (test_callback_fn
*)user_supplied_bug6
},
5902 {"user_supplied_bug7", true, (test_callback_fn
*)user_supplied_bug7
},
5903 {"user_supplied_bug8", true, (test_callback_fn
*)user_supplied_bug8
},
5904 {"user_supplied_bug9", true, (test_callback_fn
*)user_supplied_bug9
},
5905 {"user_supplied_bug10", true, (test_callback_fn
*)user_supplied_bug10
},
5906 {"user_supplied_bug11", true, (test_callback_fn
*)user_supplied_bug11
},
5907 {"user_supplied_bug12", true, (test_callback_fn
*)user_supplied_bug12
},
5908 {"user_supplied_bug13", true, (test_callback_fn
*)user_supplied_bug13
},
5909 {"user_supplied_bug14", true, (test_callback_fn
*)user_supplied_bug14
},
5910 {"user_supplied_bug15", true, (test_callback_fn
*)user_supplied_bug15
},
5911 {"user_supplied_bug16", true, (test_callback_fn
*)user_supplied_bug16
},
5912 #if !defined(__sun) && !defined(__OpenBSD__)
5914 ** It seems to be something weird with the character sets..
5915 ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
5916 ** guess I need to find out how this is supposed to work.. Perhaps I need
5917 ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
5918 ** so just disable the code for now...).
5920 {"user_supplied_bug17", true, (test_callback_fn
*)user_supplied_bug17
},
5922 {"user_supplied_bug18", true, (test_callback_fn
*)user_supplied_bug18
},
5923 {"user_supplied_bug19", true, (test_callback_fn
*)user_supplied_bug19
},
5924 {"user_supplied_bug20", true, (test_callback_fn
*)user_supplied_bug20
},
5925 {"user_supplied_bug21", true, (test_callback_fn
*)user_supplied_bug21
},
5926 {"wrong_failure_counter_test", true, (test_callback_fn
*)wrong_failure_counter_test
},
5927 {"wrong_failure_counter_two_test", true, (test_callback_fn
*)wrong_failure_counter_two_test
},
5928 {0, 0, (test_callback_fn
*)0}
5931 test_st replication_tests
[]= {
5932 {"set", true, (test_callback_fn
*)replication_set_test
},
5933 {"get", false, (test_callback_fn
*)replication_get_test
},
5934 {"mget", false, (test_callback_fn
*)replication_mget_test
},
5935 {"delete", true, (test_callback_fn
*)replication_delete_test
},
5936 {"rand_mget", false, (test_callback_fn
*)replication_randomize_mget_test
},
5937 {"fail", false, (test_callback_fn
*)replication_randomize_mget_fail_test
},
5938 {0, 0, (test_callback_fn
*)0}
5942 * The following test suite is used to verify that we don't introduce
5943 * regression bugs. If you want more information about the bug / test,
5944 * you should look in the bug report at
5945 * http://bugs.launchpad.net/libmemcached
5947 test_st regression_tests
[]= {
5948 {"lp:434484", true, (test_callback_fn
*)regression_bug_434484
},
5949 {"lp:434843", true, (test_callback_fn
*)regression_bug_434843
},
5950 {"lp:434843-buffered", true, (test_callback_fn
*)regression_bug_434843_buffered
},
5951 {"lp:421108", true, (test_callback_fn
*)regression_bug_421108
},
5952 {"lp:442914", true, (test_callback_fn
*)regression_bug_442914
},
5953 {"lp:447342", true, (test_callback_fn
*)regression_bug_447342
},
5954 {"lp:463297", true, (test_callback_fn
*)regression_bug_463297
},
5955 {"lp:490486", true, (test_callback_fn
*)regression_bug_490486
},
5956 {"lp:583031", true, (test_callback_fn
*)regression_bug_583031
},
5957 {"lp:?", true, (test_callback_fn
*)regression_bug_
},
5958 {"lp:728286", true, (test_callback_fn
*)regression_bug_728286
},
5959 {"lp:581030", true, (test_callback_fn
*)regression_bug_581030
},
5960 {"lp:71231153 connect()", true, (test_callback_fn
*)regression_bug_71231153_connect
},
5961 {"lp:71231153 poll()", true, (test_callback_fn
*)regression_bug_71231153_poll
},
5962 {"lp:655423", true, (test_callback_fn
*)regression_bug_655423
},
5963 {"lp:490520", true, (test_callback_fn
*)regression_bug_490520
},
5964 {0, false, (test_callback_fn
*)0}
5967 test_st ketama_compatibility
[]= {
5968 {"libmemcached", true, (test_callback_fn
*)ketama_compatibility_libmemcached
},
5969 {"spymemcached", true, (test_callback_fn
*)ketama_compatibility_spymemcached
},
5970 {0, 0, (test_callback_fn
*)0}
5973 test_st generate_tests
[] ={
5974 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
5975 {"generate_data", true, (test_callback_fn
*)generate_data
},
5976 {"get_read", false, (test_callback_fn
*)get_read
},
5977 {"delete_generate", false, (test_callback_fn
*)delete_generate
},
5978 {"generate_buffer_data", true, (test_callback_fn
*)generate_buffer_data
},
5979 {"delete_buffer", false, (test_callback_fn
*)delete_buffer_generate
},
5980 {"generate_data", true, (test_callback_fn
*)generate_data
},
5981 {"mget_read", false, (test_callback_fn
*)mget_read
},
5982 {"mget_read_result", false, (test_callback_fn
*)mget_read_result
},
5983 {"memcached_fetch_result() use internal result", false, (test_callback_fn
*)mget_read_internal_result
},
5984 {"memcached_fetch_result() partial read", false, (test_callback_fn
*)mget_read_partial_result
},
5985 {"mget_read_function", false, (test_callback_fn
*)mget_read_function
},
5986 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5987 {"generate_large_pairs", true, (test_callback_fn
*)generate_large_pairs
},
5988 {"generate_data", true, (test_callback_fn
*)generate_data
},
5989 {"generate_buffer_data", true, (test_callback_fn
*)generate_buffer_data
},
5990 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5991 {0, 0, (test_callback_fn
*)0}
5994 test_st consistent_tests
[] ={
5995 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
5996 {"generate_data", true, (test_callback_fn
*)generate_data
},
5997 {"get_read", 0, (test_callback_fn
*)get_read_count
},
5998 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5999 {0, 0, (test_callback_fn
*)0}
6002 test_st consistent_weighted_tests
[] ={
6003 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
6004 {"generate_data", true, (test_callback_fn
*)generate_data_with_stats
},
6005 {"get_read", false, (test_callback_fn
*)get_read_count
},
6006 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
6007 {0, 0, (test_callback_fn
*)0}
6010 test_st hsieh_availability
[] ={
6011 {"hsieh_avaibility_test", false, (test_callback_fn
*)hsieh_avaibility_test
},
6012 {0, 0, (test_callback_fn
*)0}
6015 test_st murmur_availability
[] ={
6016 {"murmur_avaibility_test", false, (test_callback_fn
*)murmur_avaibility_test
},
6017 {0, 0, (test_callback_fn
*)0}
6021 test_st hash_sanity
[] ={
6022 {"hash sanity", 0, (test_callback_fn
*)hash_sanity_test
},
6023 {0, 0, (test_callback_fn
*)0}
6027 test_st ketama_auto_eject_hosts
[] ={
6028 {"auto_eject_hosts", true, (test_callback_fn
*)auto_eject_hosts
},
6029 {"output_ketama_weighted_keys", true, (test_callback_fn
*)output_ketama_weighted_keys
},
6030 {0, 0, (test_callback_fn
*)0}
6033 test_st hash_tests
[] ={
6034 {"one_at_a_time_run", false, (test_callback_fn
*)one_at_a_time_run
},
6035 {"md5", false, (test_callback_fn
*)md5_run
},
6036 {"crc", false, (test_callback_fn
*)crc_run
},
6037 {"fnv1_64", false, (test_callback_fn
*)fnv1_64_run
},
6038 {"fnv1a_64", false, (test_callback_fn
*)fnv1a_64_run
},
6039 {"fnv1_32", false, (test_callback_fn
*)fnv1_32_run
},
6040 {"fnv1a_32", false, (test_callback_fn
*)fnv1a_32_run
},
6041 {"hsieh", false, (test_callback_fn
*)hsieh_run
},
6042 {"murmur", false, (test_callback_fn
*)murmur_run
},
6043 {"jenkis", false, (test_callback_fn
*)jenkins_run
},
6044 {"memcached_get_hashkit", false, (test_callback_fn
*)memcached_get_hashkit_test
},
6045 {0, 0, (test_callback_fn
*)0}
6048 test_st error_conditions
[] ={
6049 {"memcached_get(MEMCACHED_ERRNO)", false, (test_callback_fn
*)memcached_get_MEMCACHED_ERRNO
},
6050 {"memcached_get(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_MEMCACHED_NOTFOUND
},
6051 {"memcached_get_by_key(MEMCACHED_ERRNO)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_ERRNO
},
6052 {"memcached_get_by_key(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_NOTFOUND
},
6053 {"memcached_get_by_key(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_NOTFOUND
},
6054 {"memcached_increment(MEMCACHED_NO_SERVERS)", false, (test_callback_fn
*)memcached_increment_MEMCACHED_NO_SERVERS
},
6055 {0, 0, (test_callback_fn
*)0}
6059 test_st parser_tests
[] ={
6060 {"behavior", false, (test_callback_fn
*)behavior_parser_test
},
6061 {"boolean_options", false, (test_callback_fn
*)parser_boolean_options_test
},
6062 {"configure_file", false, (test_callback_fn
*)memcached_create_with_options_with_filename
},
6063 {"distribtions", false, (test_callback_fn
*)parser_distribution_test
},
6064 {"hash", false, (test_callback_fn
*)parser_hash_test
},
6065 {"libmemcached_check_configuration", false, (test_callback_fn
*)libmemcached_check_configuration_test
},
6066 {"libmemcached_check_configuration_with_filename", false, (test_callback_fn
*)libmemcached_check_configuration_with_filename_test
},
6067 {"number_options", false, (test_callback_fn
*)parser_number_options_test
},
6068 {"randomly generated options", false, (test_callback_fn
*)random_statement_build_test
},
6069 {"namespace", false, (test_callback_fn
*)parser_key_prefix_test
},
6070 {"server", false, (test_callback_fn
*)server_test
},
6071 {"bad server strings", false, (test_callback_fn
*)servers_bad_test
},
6072 {"server with weights", false, (test_callback_fn
*)server_with_weight_test
},
6073 {"parsing servername, port, and weight", false, (test_callback_fn
*)test_hostname_port_weight
},
6074 {"--socket=", false, (test_callback_fn
*)test_parse_socket
},
6075 {"--namespace=", false, (test_callback_fn
*)test_namespace_keyword
},
6076 {0, 0, (test_callback_fn
*)0}
6079 test_st virtual_bucket_tests
[] ={
6080 {"basic", false, (test_callback_fn
*)virtual_back_map
},
6081 {0, 0, (test_callback_fn
*)0}
6084 test_st memcached_server_add_tests
[] ={
6085 {"memcached_server_add(\"\")", false, (test_callback_fn
*)memcached_server_add_empty_test
},
6086 {"memcached_server_add(NULL)", false, (test_callback_fn
*)memcached_server_add_null_test
},
6087 {0, 0, (test_callback_fn
*)0}
6090 test_st namespace_tests
[] ={
6091 {"basic tests", true, (test_callback_fn
*)selection_of_namespace_tests
},
6092 {"increment", true, (test_callback_fn
*)memcached_increment_namespace
},
6093 {0, 0, (test_callback_fn
*)0}
6096 collection_st collection
[] ={
6098 {"hash_sanity", 0, 0, hash_sanity
},
6100 {"libmemcachedutil", 0, 0, libmemcachedutil_tests
},
6101 {"basic", 0, 0, basic_tests
},
6102 {"hsieh_availability", 0, 0, hsieh_availability
},
6103 {"murmur_availability", 0, 0, murmur_availability
},
6104 {"memcached_server_add", 0, 0, memcached_server_add_tests
},
6105 {"block", 0, 0, tests
},
6106 {"binary", (test_callback_fn
*)pre_binary
, 0, tests
},
6107 {"nonblock", (test_callback_fn
*)pre_nonblock
, 0, tests
},
6108 {"nodelay", (test_callback_fn
*)pre_nodelay
, 0, tests
},
6109 {"settimer", (test_callback_fn
*)pre_settimer
, 0, tests
},
6110 {"md5", (test_callback_fn
*)pre_md5
, 0, tests
},
6111 {"crc", (test_callback_fn
*)pre_crc
, 0, tests
},
6112 {"hsieh", (test_callback_fn
*)pre_hsieh
, 0, tests
},
6113 {"jenkins", (test_callback_fn
*)pre_jenkins
, 0, tests
},
6114 {"fnv1_64", (test_callback_fn
*)pre_hash_fnv1_64
, 0, tests
},
6115 {"fnv1a_64", (test_callback_fn
*)pre_hash_fnv1a_64
, 0, tests
},
6116 {"fnv1_32", (test_callback_fn
*)pre_hash_fnv1_32
, 0, tests
},
6117 {"fnv1a_32", (test_callback_fn
*)pre_hash_fnv1a_32
, 0, tests
},
6118 {"ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, tests
},
6119 {"ketama_auto_eject_hosts", (test_callback_fn
*)pre_behavior_ketama
, 0, ketama_auto_eject_hosts
},
6120 {"unix_socket", (test_callback_fn
*)pre_unix_socket
, 0, tests
},
6121 {"unix_socket_nodelay", (test_callback_fn
*)pre_nodelay
, 0, tests
},
6122 {"gets", (test_callback_fn
*)enable_cas
, 0, tests
},
6123 {"consistent_crc", (test_callback_fn
*)enable_consistent_crc
, 0, tests
},
6124 {"consistent_hsieh", (test_callback_fn
*)enable_consistent_hsieh
, 0, tests
},
6125 #ifdef MEMCACHED_ENABLE_DEPRECATED
6126 {"deprecated_memory_allocators", (test_callback_fn
*)deprecated_set_memory_alloc
, 0, tests
},
6128 {"memory_allocators", (test_callback_fn
*)set_memory_alloc
, 0, tests
},
6129 {"namespace", (test_callback_fn
*)set_namespace
, 0, tests
},
6130 {"namespace(BINARY)", (test_callback_fn
*)set_namespace_and_binary
, 0, tests
},
6131 {"specific namespace", 0, 0, namespace_tests
},
6132 {"specific namespace(BINARY)", (test_callback_fn
*)pre_binary
, 0, namespace_tests
},
6133 {"version_1_2_3", (test_callback_fn
*)check_for_1_2_3
, 0, version_1_2_3
},
6134 {"result", 0, 0, result_tests
},
6135 {"async", (test_callback_fn
*)pre_nonblock
, 0, async_tests
},
6136 {"async(BINARY)", (test_callback_fn
*)pre_nonblock_binary
, 0, async_tests
},
6137 {"Cal Haldenbrand's tests", 0, 0, haldenbrand_tests
},
6138 {"user written tests", 0, 0, user_tests
},
6139 {"generate", 0, 0, generate_tests
},
6140 {"generate_hsieh", (test_callback_fn
*)pre_hsieh
, 0, generate_tests
},
6141 {"generate_ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, generate_tests
},
6142 {"generate_hsieh_consistent", (test_callback_fn
*)enable_consistent_hsieh
, 0, generate_tests
},
6143 {"generate_md5", (test_callback_fn
*)pre_md5
, 0, generate_tests
},
6144 {"generate_murmur", (test_callback_fn
*)pre_murmur
, 0, generate_tests
},
6145 {"generate_jenkins", (test_callback_fn
*)pre_jenkins
, 0, generate_tests
},
6146 {"generate_nonblock", (test_callback_fn
*)pre_nonblock
, 0, generate_tests
},
6148 {"generate_corked", (test_callback_fn
*)pre_cork
, 0, generate_tests
},
6149 {"generate_corked_and_nonblock", (test_callback_fn
*)pre_cork_and_nonblock
, 0, generate_tests
},
6150 {"consistent_not", 0, 0, consistent_tests
},
6151 {"consistent_ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, consistent_tests
},
6152 {"consistent_ketama_weighted", (test_callback_fn
*)pre_behavior_ketama_weighted
, 0, consistent_weighted_tests
},
6153 {"ketama_compat", 0, 0, ketama_compatibility
},
6154 {"test_hashes", 0, 0, hash_tests
},
6155 {"replication", (test_callback_fn
*)pre_replication
, 0, replication_tests
},
6156 {"replication_noblock", (test_callback_fn
*)pre_replication_noblock
, 0, replication_tests
},
6157 {"regression", 0, 0, regression_tests
},
6158 {"behaviors", 0, 0, behavior_tests
},
6159 {"regression_binary_vs_block", (test_callback_fn
*)key_setup
, (test_callback_fn
*)key_teardown
, regression_binary_vs_block
},
6160 {"error_conditions", 0, 0, error_conditions
},
6161 {"parser", 0, 0, parser_tests
},
6162 {"virtual buckets", 0, 0, virtual_bucket_tests
},
6163 {"memcached_server_get_last_disconnect", 0, 0, memcached_server_get_last_disconnect_tests
},
6167 #define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
6169 #include "tests/libmemcached_world.h"
6171 void get_world(Framework
*world
)
6173 world
->collections
= collection
;
6175 world
->_create
= (test_callback_create_fn
*)world_create
;
6176 world
->_destroy
= (test_callback_destroy_fn
*)world_destroy
;
6178 world
->item
._startup
= (test_callback_fn
*)world_test_startup
;
6179 world
->item
.set_pre((test_callback_fn
*)world_pre_run
);
6180 world
->item
.set_flush((test_callback_fn
*)world_flush
);
6181 world
->item
.set_post((test_callback_fn
*)world_post_run
);
6182 world
->_on_error
= (test_callback_error_fn
*)world_on_error
;
6184 world
->collection_startup
= (test_callback_fn
*)world_container_startup
;
6185 world
->collection_shutdown
= (test_callback_fn
*)world_container_shutdown
;
6187 world
->set_runner(&defualt_libmemcached_runner
);
6189 world
->set_socket();