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>
41 #if defined(HAVE_LIBUUID) && HAVE_LIBUUID
42 #include <uuid/uuid.h>
49 #include <libmemcached-1.0/memcached.h>
50 #include <libmemcached/is.h>
51 #include <libmemcached/server_instance.h>
53 #include <libhashkit-1.0/hashkit.h>
59 #include <semaphore.h>
63 #include <sys/types.h>
68 #include <libtest/server.h>
70 #include "clients/generator.h"
72 #define SMALL_STRING_LEN 1024
74 #include <libtest/test.hpp>
76 #include "tests/basic.h"
77 #include "tests/debug.h"
78 #include "tests/deprecated.h"
79 #include "tests/error_conditions.h"
80 #include "tests/exist.h"
81 #include "tests/ketama.h"
82 #include "tests/namespace.h"
83 #include "tests/parser.h"
84 #include "tests/libmemcached-1.0/dump.h"
85 #include "tests/libmemcached-1.0/generate.h"
86 #include "tests/libmemcached-1.0/fetch_all_results.h"
87 #include "tests/libmemcached-1.0/haldenbrand.h"
88 #include "tests/libmemcached-1.0/stat.h"
89 #include "tests/touch.h"
90 #include "tests/callbacks.h"
91 #include "tests/pool.h"
92 #include "tests/print.h"
93 #include "tests/replication.h"
94 #include "tests/server_add.h"
95 #include "tests/virtual_buckets.h"
97 using namespace libtest
;
99 #include <libmemcached/util.h>
101 #include "tests/hash_results.h"
103 #include "tests/libmemcached-1.0/servers_to_create.h"
105 #define UUID_STRING_MAXLENGTH 36
111 init(arg
, UUID_STRING_MAXLENGTH
);
114 keys_st(size_t arg
, size_t padding
)
119 void init(size_t arg
, size_t padding
)
121 _lengths
.resize(arg
);
124 for (size_t x
= 0; x
< _keys
.size(); x
++)
126 libtest::vchar_t key_buffer
;
127 key_buffer
.resize(padding
+1);
128 memset(&key_buffer
[0], 'x', padding
);
135 uuid_unparse(out
, &key_buffer
[0]);
136 _keys
[x
]= strdup(&key_buffer
[0]);
138 else // We just use a number and pad the string if UUID is not available
140 char int_buffer
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
141 int key_length
= snprintf(int_buffer
, sizeof(int_buffer
), "%u", uint32_t(x
));
142 memcpy(&key_buffer
[0], int_buffer
, key_length
);
143 _keys
[x
]= strdup(&key_buffer
[0]);
145 _lengths
[x
]= padding
;
151 for (libtest::vchar_ptr_t::iterator iter
= _keys
.begin();
159 libtest::vchar_ptr_t::iterator
begin()
161 return _keys
.begin();
164 libtest::vchar_ptr_t::iterator
end()
174 std::vector
<size_t>& lengths()
179 libtest::vchar_ptr_t
& keys()
184 size_t* lengths_ptr()
194 char* key_at(size_t arg
)
199 size_t length_at(size_t arg
)
201 return _lengths
[arg
];
205 libtest::vchar_ptr_t _keys
;
206 std::vector
<size_t> _lengths
;
210 @note This should be testing to see if the server really supports the binary protocol.
212 static test_return_t
pre_binary(memcached_st
*memc
)
214 test_skip(true, libmemcached_util_version_check(memc
, 1, 4, 4));
215 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
220 static memcached_return_t
return_value_based_on_buffering(memcached_st
*memc
)
222 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
))
224 return MEMCACHED_BUFFERED
;
227 return MEMCACHED_SUCCESS
;
230 static memcached_st
* create_single_instance_memcached(const memcached_st
*original_memc
, const char *options
)
233 * I only want to hit _one_ server so I know the number of requests I'm
234 * sending in the pipeline.
236 memcached_server_instance_st instance
= memcached_server_instance_by_position(original_memc
, 0);
238 char server_string
[1024];
239 int server_string_length
;
242 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--server=%s:%d %s",
243 memcached_server_name(instance
), int(memcached_server_port(instance
)),
248 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--server=%s:%d",
249 memcached_server_name(instance
), int(memcached_server_port(instance
)));
252 if (server_string_length
<= 0)
258 if (memcached_failed(libmemcached_check_configuration(server_string
, server_string_length
, buffer
, sizeof(buffer
))))
260 Error
<< "Failed to parse " << server_string_length
;
264 return memcached(server_string
, server_string_length
);
268 static test_return_t
init_test(memcached_st
*not_used
)
273 (void)memcached_create(&memc
);
274 memcached_free(&memc
);
279 #define TEST_PORT_COUNT 7
280 in_port_t test_ports
[TEST_PORT_COUNT
];
282 static memcached_return_t
server_display_function(const memcached_st
*ptr
,
283 const memcached_server_st
*server
,
287 size_t bigger
= *((size_t *)(context
));
289 assert(bigger
<= memcached_server_port(server
));
290 *((size_t *)(context
))= memcached_server_port(server
);
292 return MEMCACHED_SUCCESS
;
295 static memcached_return_t
dump_server_information(const memcached_st
*ptr
,
296 const memcached_server_st
*instance
,
300 FILE *stream
= (FILE *)context
;
303 fprintf(stream
, "Memcached Server: %s %u Version %u.%u.%u\n",
304 memcached_server_name(instance
),
305 memcached_server_port(instance
),
306 instance
->major_version
,
307 instance
->minor_version
,
308 instance
->micro_version
);
310 return MEMCACHED_SUCCESS
;
313 static test_return_t
server_sort_test(memcached_st
*ptr
)
315 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
317 memcached_return_t rc
;
318 memcached_server_fn callbacks
[1];
319 memcached_st
*local_memc
;
322 local_memc
= memcached_create(NULL
);
323 test_true(local_memc
);
324 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
326 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
328 test_ports
[x
]= (in_port_t
)random() % 64000;
329 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
330 test_compare(memcached_server_count(local_memc
), x
+1);
332 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
334 test_compare(MEMCACHED_SUCCESS
, rc
);
337 callbacks
[0]= server_display_function
;
338 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
341 memcached_free(local_memc
);
346 static test_return_t
server_sort2_test(memcached_st
*ptr
)
348 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
349 memcached_server_fn callbacks
[1];
350 memcached_st
*local_memc
;
351 memcached_server_instance_st instance
;
354 local_memc
= memcached_create(NULL
);
355 test_true(local_memc
);
356 test_compare(MEMCACHED_SUCCESS
,
357 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1));
359 test_compare(MEMCACHED_SUCCESS
,
360 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0));
361 instance
= memcached_server_instance_by_position(local_memc
, 0);
362 test_compare(in_port_t(43043), memcached_server_port(instance
));
364 test_compare(MEMCACHED_SUCCESS
,
365 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0));
367 instance
= memcached_server_instance_by_position(local_memc
, 0);
368 test_compare(in_port_t(43042), memcached_server_port(instance
));
370 instance
= memcached_server_instance_by_position(local_memc
, 1);
371 test_compare(in_port_t(43043), memcached_server_port(instance
));
373 callbacks
[0]= server_display_function
;
374 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
377 memcached_free(local_memc
);
382 static test_return_t
memcached_server_remove_test(memcached_st
*)
384 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";
387 test_compare(MEMCACHED_SUCCESS
,
388 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
389 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
392 memcached_server_fn callbacks
[1];
393 callbacks
[0]= server_print_callback
;
394 memcached_server_cursor(memc
, callbacks
, NULL
, 1);
396 memcached_free(memc
);
401 static memcached_return_t
server_display_unsort_function(const memcached_st
*,
402 const memcached_server_st
*server
,
406 uint32_t x
= *((uint32_t *)(context
));
408 if (! (test_ports
[x
] == server
->port
))
410 fprintf(stderr
, "%lu -> %lu\n", (unsigned long)test_ports
[x
], (unsigned long)server
->port
);
411 return MEMCACHED_FAILURE
;
414 *((uint32_t *)(context
))= ++x
;
416 return MEMCACHED_SUCCESS
;
419 static test_return_t
server_unsort_test(memcached_st
*ptr
)
421 size_t counter
= 0; /* Prime the value for the test_true in server_display_function */
422 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
423 memcached_server_fn callbacks
[1];
424 memcached_st
*local_memc
;
427 local_memc
= memcached_create(NULL
);
428 test_true(local_memc
);
430 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
432 test_ports
[x
]= (in_port_t
)(random() % 64000);
433 test_compare(MEMCACHED_SUCCESS
,
434 memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0));
435 test_compare(memcached_server_count(local_memc
), x
+1);
437 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
441 callbacks
[0]= server_display_unsort_function
;
442 memcached_server_cursor(local_memc
, callbacks
, (void *)&counter
, 1);
444 /* Now we sort old data! */
445 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
446 callbacks
[0]= server_display_function
;
447 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
450 memcached_free(local_memc
);
455 static test_return_t
allocation_test(memcached_st
*not_used
)
459 memc
= memcached_create(NULL
);
461 memcached_free(memc
);
466 static test_return_t
clone_test(memcached_st
*memc
)
470 memcached_st
*memc_clone
;
471 memc_clone
= memcached_clone(NULL
, NULL
);
472 test_true(memc_clone
);
473 memcached_free(memc_clone
);
476 /* Can we init from null? */
478 memcached_st
*memc_clone
;
479 memc_clone
= memcached_clone(NULL
, memc
);
480 test_true(memc_clone
);
483 test_true(memc_clone
->allocators
.free
== memc
->allocators
.free
);
484 test_true(memc_clone
->allocators
.malloc
== memc
->allocators
.malloc
);
485 test_true(memc_clone
->allocators
.realloc
== memc
->allocators
.realloc
);
486 test_true(memc_clone
->allocators
.calloc
== memc
->allocators
.calloc
);
489 test_true(memc_clone
->connect_timeout
== memc
->connect_timeout
);
490 test_true(memc_clone
->delete_trigger
== memc
->delete_trigger
);
491 test_true(memc_clone
->distribution
== memc
->distribution
);
492 { // Test all of the flags
493 test_true(memc_clone
->flags
.no_block
== memc
->flags
.no_block
);
494 test_true(memc_clone
->flags
.tcp_nodelay
== memc
->flags
.tcp_nodelay
);
495 test_true(memc_clone
->flags
.support_cas
== memc
->flags
.support_cas
);
496 test_true(memc_clone
->flags
.buffer_requests
== memc
->flags
.buffer_requests
);
497 test_true(memc_clone
->flags
.use_sort_hosts
== memc
->flags
.use_sort_hosts
);
498 test_true(memc_clone
->flags
.verify_key
== memc
->flags
.verify_key
);
499 test_true(memc_clone
->ketama
.weighted
== memc
->ketama
.weighted
);
500 test_true(memc_clone
->flags
.binary_protocol
== memc
->flags
.binary_protocol
);
501 test_true(memc_clone
->flags
.hash_with_namespace
== memc
->flags
.hash_with_namespace
);
502 test_true(memc_clone
->flags
.reply
== memc
->flags
.reply
);
503 test_true(memc_clone
->flags
.use_udp
== memc
->flags
.use_udp
);
504 test_true(memc_clone
->flags
.auto_eject_hosts
== memc
->flags
.auto_eject_hosts
);
505 test_true(memc_clone
->flags
.randomize_replica_read
== memc
->flags
.randomize_replica_read
);
507 test_true(memc_clone
->get_key_failure
== memc
->get_key_failure
);
508 test_true(hashkit_compare(&memc_clone
->hashkit
, &memc
->hashkit
));
509 test_true(memc_clone
->io_bytes_watermark
== memc
->io_bytes_watermark
);
510 test_true(memc_clone
->io_msg_watermark
== memc
->io_msg_watermark
);
511 test_true(memc_clone
->io_key_prefetch
== memc
->io_key_prefetch
);
512 test_true(memc_clone
->on_cleanup
== memc
->on_cleanup
);
513 test_true(memc_clone
->on_clone
== memc
->on_clone
);
514 test_true(memc_clone
->poll_timeout
== memc
->poll_timeout
);
515 test_true(memc_clone
->rcv_timeout
== memc
->rcv_timeout
);
516 test_true(memc_clone
->recv_size
== memc
->recv_size
);
517 test_true(memc_clone
->retry_timeout
== memc
->retry_timeout
);
518 test_true(memc_clone
->send_size
== memc
->send_size
);
519 test_true(memc_clone
->server_failure_limit
== memc
->server_failure_limit
);
520 test_true(memc_clone
->snd_timeout
== memc
->snd_timeout
);
521 test_true(memc_clone
->user_data
== memc
->user_data
);
523 memcached_free(memc_clone
);
526 /* Can we init from struct? */
528 memcached_st declared_clone
;
529 memcached_st
*memc_clone
;
530 memset(&declared_clone
, 0 , sizeof(memcached_st
));
531 memc_clone
= memcached_clone(&declared_clone
, NULL
);
532 test_true(memc_clone
);
533 memcached_free(memc_clone
);
536 /* Can we init from struct? */
538 memcached_st declared_clone
;
539 memcached_st
*memc_clone
;
540 memset(&declared_clone
, 0 , sizeof(memcached_st
));
541 memc_clone
= memcached_clone(&declared_clone
, memc
);
542 test_true(memc_clone
);
543 memcached_free(memc_clone
);
549 static test_return_t
userdata_test(memcached_st
*memc
)
552 test_false(memcached_set_user_data(memc
, foo
));
553 test_true(memcached_get_user_data(memc
) == foo
);
554 test_true(memcached_set_user_data(memc
, NULL
) == foo
);
559 static test_return_t
connection_test(memcached_st
*memc
)
561 test_compare(MEMCACHED_SUCCESS
,
562 memcached_server_add_with_weight(memc
, "localhost", 0, 0));
567 static test_return_t
libmemcached_string_behavior_test(memcached_st
*)
569 for (int x
= MEMCACHED_BEHAVIOR_NO_BLOCK
; x
< int(MEMCACHED_BEHAVIOR_MAX
); ++x
)
571 test_true(libmemcached_string_behavior(memcached_behavior_t(x
)));
573 test_compare(37, int(MEMCACHED_BEHAVIOR_MAX
));
578 static test_return_t
libmemcached_string_distribution_test(memcached_st
*)
580 for (int x
= MEMCACHED_DISTRIBUTION_MODULA
; x
< int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
); ++x
)
582 test_true(libmemcached_string_distribution(memcached_server_distribution_t(x
)));
584 test_compare(7, int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
));
589 static test_return_t
memcached_return_t_TEST(memcached_st
*memc
)
591 uint32_t values
[] = { 851992627U, 2337886783U, 4109241422U, 4001849190U,
592 982370485U, 1263635348U, 4242906218U, 3829656100U,
593 1891735253U, 334139633U, 2257084983U, 3351789013U,
594 13199785U, 2542027183U, 1097051614U, 199566778U,
595 2748246961U, 2465192557U, 1664094137U, 2405439045U,
596 1842224848U, 692413798U, 3479807801U, 919913813U,
597 4269430871U, 610793021U, 527273862U, 1437122909U,
598 2300930706U, 2943759320U, 674306647U, 2400528935U,
599 54481931U, 4186304426U, 1741088401U, 2979625118U,
600 4159057246U, 3425930182U, 2593724503U, 1868899624U,
601 1769812374U, 2302537950U, 1110330676U, 3365377466U,
602 1336171666U, 3021258493U, 2334992265U, 3861994737U,
603 3582734124U, 3365377466U };
605 // You have updated the memcache_error messages but not updated docs/tests.
606 for (int rc
= int(MEMCACHED_SUCCESS
); rc
< int(MEMCACHED_MAXIMUM_RETURN
); ++rc
)
609 const char *msg
= memcached_strerror(memc
, memcached_return_t(rc
));
610 hash_val
= memcached_generate_hash_value(msg
, strlen(msg
),
611 MEMCACHED_HASH_JENKINS
);
612 if (values
[rc
] != hash_val
)
614 fprintf(stderr
, "\n\nYou have updated memcached_return_t without updating the memcached_return_t_TEST\n");
615 fprintf(stderr
, "%u, %s, (%u)\n\n", (uint32_t)rc
, memcached_strerror(memc
, memcached_return_t(rc
)), hash_val
);
617 test_compare(values
[rc
], hash_val
);
619 test_compare(49, int(MEMCACHED_MAXIMUM_RETURN
));
624 static test_return_t
set_test(memcached_st
*memc
)
626 memcached_return_t rc
= memcached_set(memc
,
627 test_literal_param("foo"),
628 test_literal_param("when we sanitize"),
629 time_t(0), (uint32_t)0);
630 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
635 static test_return_t
append_test(memcached_st
*memc
)
637 memcached_return_t rc
;
638 const char *in_value
= "we";
642 test_compare(MEMCACHED_SUCCESS
,
643 memcached_flush(memc
, 0));
645 test_compare(MEMCACHED_SUCCESS
,
647 test_literal_param(__func__
),
648 in_value
, strlen(in_value
),
649 time_t(0), uint32_t(0)));
651 test_compare(MEMCACHED_SUCCESS
,
652 memcached_append(memc
,
653 test_literal_param(__func__
),
654 " the", strlen(" the"),
655 time_t(0), uint32_t(0)));
657 test_compare(MEMCACHED_SUCCESS
,
658 memcached_append(memc
,
659 test_literal_param(__func__
),
660 " people", strlen(" people"),
661 time_t(0), uint32_t(0)));
663 char *out_value
= memcached_get(memc
,
664 test_literal_param(__func__
),
665 &value_length
, &flags
, &rc
);
666 test_memcmp(out_value
, "we the people", strlen("we the people"));
667 test_compare(strlen("we the people"), value_length
);
668 test_compare(MEMCACHED_SUCCESS
, rc
);
674 static test_return_t
append_binary_test(memcached_st
*memc
)
676 uint32_t store_list
[] = { 23, 56, 499, 98, 32847, 0 };
678 test_compare(MEMCACHED_SUCCESS
,
679 memcached_flush(memc
, 0));
681 test_compare(MEMCACHED_SUCCESS
,
683 test_literal_param(__func__
),
685 time_t(0), uint32_t(0)));
688 for (uint32_t x
= 0; store_list
[x
] ; x
++)
690 test_compare(MEMCACHED_SUCCESS
,
691 memcached_append(memc
,
692 test_literal_param(__func__
),
693 (char *)&store_list
[x
], sizeof(uint32_t),
694 time_t(0), uint32_t(0)));
700 memcached_return_t rc
;
701 uint32_t *value
= (uint32_t *)memcached_get(memc
,
702 test_literal_param(__func__
),
703 &value_length
, &flags
, &rc
);
704 test_compare(value_length
, sizeof(uint32_t) * count
);
705 test_compare(MEMCACHED_SUCCESS
, rc
);
707 for (uint32_t counter
= count
, *ptr
= value
; counter
; counter
--)
709 test_compare(*ptr
, store_list
[count
- counter
]);
717 static test_return_t
memcached_mget_mixed_memcached_get_TEST(memcached_st
*memc
)
721 for (libtest::vchar_ptr_t::iterator iter
= keys
.begin();
725 test_compare(MEMCACHED_SUCCESS
,
729 time_t(0), uint32_t(0)));
732 for (size_t loop
= 0; loop
< 20; loop
++)
736 test_compare(MEMCACHED_SUCCESS
,
737 memcached_mget(memc
, keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
739 memcached_result_st
*results
= memcached_result_create(memc
, NULL
);
742 size_t result_count
= 0;
743 memcached_return_t rc
;
744 while (memcached_fetch_result(memc
, results
, &rc
))
748 test_compare(keys
.size(), result_count
);
752 int which_key
= random() %keys
.size();
755 memcached_return_t rc
;
756 char *out_value
= memcached_get(memc
, keys
.key_at(which_key
), keys
.length_at(which_key
),
757 &value_length
, &flags
, &rc
);
758 test_compare(MEMCACHED_SUCCESS
, rc
);
759 test_null(out_value
);
760 test_zero(value_length
);
768 static test_return_t
cas2_test(memcached_st
*memc
)
770 const char *keys
[]= {"fudge", "son", "food"};
771 size_t key_length
[]= {5, 3, 4};
772 const char *value
= "we the people";
773 size_t value_length
= strlen("we the people");
775 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
777 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
779 for (uint32_t x
= 0; x
< 3; x
++)
781 test_compare(MEMCACHED_SUCCESS
,
782 memcached_set(memc
, keys
[x
], key_length
[x
],
783 keys
[x
], key_length
[x
],
784 time_t(50), uint32_t(9)));
787 test_compare(MEMCACHED_SUCCESS
,
788 memcached_mget(memc
, keys
, key_length
, 3));
790 memcached_result_st
*results
= memcached_result_create(memc
, NULL
);
793 memcached_return_t rc
;
794 results
= memcached_fetch_result(memc
, results
, &rc
);
796 test_true(results
->item_cas
);
797 test_compare(MEMCACHED_SUCCESS
, rc
);
798 test_true(memcached_result_cas(results
));
800 test_memcmp(value
, "we the people", strlen("we the people"));
801 test_compare(strlen("we the people"), value_length
);
802 test_compare(MEMCACHED_SUCCESS
, rc
);
804 memcached_result_free(results
);
809 static test_return_t
cas_test(memcached_st
*memc
)
811 const char* keys
[2] = { __func__
, NULL
};
812 size_t keylengths
[2] = { strlen(__func__
), 0 };
814 memcached_result_st results_obj
;
816 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
818 test_skip(true, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
820 test_compare(MEMCACHED_SUCCESS
,
822 test_literal_param(__func__
),
823 test_literal_param("we the people"),
824 (time_t)0, (uint32_t)0));
826 test_compare(MEMCACHED_SUCCESS
,
827 memcached_mget(memc
, keys
, keylengths
, 1));
829 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
832 memcached_return_t rc
;
833 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
835 test_compare(MEMCACHED_SUCCESS
, rc
);
836 test_true(memcached_result_cas(results
));
837 test_memcmp("we the people", memcached_result_value(results
), test_literal_param_size("we the people"));
838 test_compare(test_literal_param_size("we the people"),
839 strlen(memcached_result_value(results
)));
841 uint64_t cas
= memcached_result_cas(results
);
844 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
845 test_true(rc
== MEMCACHED_END
);
846 test_true(results
== NULL
);
849 test_compare(MEMCACHED_SUCCESS
,
851 test_literal_param(__func__
),
852 test_literal_param("change the value"),
856 * The item will have a new cas value, so try to set it again with the old
857 * value. This should fail!
859 test_compare(MEMCACHED_DATA_EXISTS
,
861 test_literal_param(__func__
),
862 test_literal_param("change the value"),
865 memcached_result_free(&results_obj
);
870 static test_return_t
prepend_test(memcached_st
*memc
)
872 const char *key
= "fig";
873 const char *value
= "people";
875 test_compare(MEMCACHED_SUCCESS
,
876 memcached_flush(memc
, 0));
878 test_compare(MEMCACHED_SUCCESS
,
879 memcached_set(memc
, key
, strlen(key
),
880 value
, strlen(value
),
881 time_t(0), uint32_t(0)));
883 test_compare(MEMCACHED_SUCCESS
,
884 memcached_prepend(memc
, key
, strlen(key
),
885 "the ", strlen("the "),
886 time_t(0), uint32_t(0)));
888 test_compare(MEMCACHED_SUCCESS
,
889 memcached_prepend(memc
, key
, strlen(key
),
890 "we ", strlen("we "),
891 time_t(0), uint32_t(0)));
895 memcached_return_t rc
;
896 char *out_value
= memcached_get(memc
, key
, strlen(key
),
897 &value_length
, &flags
, &rc
);
898 test_memcmp(out_value
, "we the people", strlen("we the people"));
899 test_compare(strlen("we the people"), value_length
);
900 test_compare(MEMCACHED_SUCCESS
, rc
);
907 Set the value, then quit to make sure it is flushed.
908 Come back in and test that add fails.
910 static test_return_t
add_test(memcached_st
*memc
)
912 test_compare_hint(return_value_based_on_buffering(memc
),
914 test_literal_param(__func__
),
915 test_literal_param("when we sanitize"),
916 time_t(0), uint32_t(0)),
917 memcached_last_error_message(memc
));
919 memcached_quit(memc
);
921 test_compare_hint(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_DATA_EXISTS
: MEMCACHED_NOTSTORED
,
923 test_literal_param(__func__
),
924 test_literal_param("try something else"),
925 time_t(0), uint32_t(0)),
926 memcached_last_error_message(memc
));
932 ** There was a problem of leaking filedescriptors in the initial release
933 ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
934 ** systems it seems that the kernel is slow on reclaiming the resources
935 ** because the connects starts to time out (the test doesn't do much
936 ** anyway, so just loop 10 iterations)
938 static test_return_t
add_wrapper(memcached_st
*memc
)
940 unsigned int max
= 10000;
948 for (uint32_t x
= 0; x
< max
; x
++)
954 static test_return_t
replace_test(memcached_st
*memc
)
956 test_compare(return_value_based_on_buffering(memc
),
958 test_literal_param(__func__
),
959 test_literal_param("when we sanitize"),
960 time_t(0), uint32_t(0)));
962 test_compare(MEMCACHED_SUCCESS
,
963 memcached_replace(memc
,
964 test_literal_param(__func__
),
965 test_literal_param("first we insert some data"),
966 time_t(0), uint32_t(0)));
971 static test_return_t
delete_test(memcached_st
*memc
)
973 test_compare(return_value_based_on_buffering(memc
),
975 test_literal_param(__func__
),
976 test_literal_param("when we sanitize"),
977 time_t(0), uint32_t(0)));
979 test_compare_hint(return_value_based_on_buffering(memc
),
980 memcached_delete(memc
,
981 test_literal_param(__func__
),
983 memcached_last_error_message(memc
));
988 static test_return_t
flush_test(memcached_st
*memc
)
990 uint64_t query_id
= memcached_query_id(memc
);
991 test_compare(MEMCACHED_SUCCESS
,
992 memcached_flush(memc
, 0));
993 test_compare(query_id
+1, memcached_query_id(memc
));
998 static memcached_return_t
server_function(const memcached_st
*,
999 const memcached_server_st
*,
1003 return MEMCACHED_SUCCESS
;
1006 static test_return_t
memcached_server_cursor_test(memcached_st
*memc
)
1009 strncpy(context
, "foo bad", sizeof(context
));
1010 memcached_server_fn callbacks
[1];
1012 callbacks
[0]= server_function
;
1013 memcached_server_cursor(memc
, callbacks
, context
, 1);
1014 return TEST_SUCCESS
;
1017 static test_return_t
bad_key_test(memcached_st
*memc
)
1019 memcached_return_t rc
;
1020 const char *key
= "foo bad";
1023 uint64_t query_id
= memcached_query_id(memc
);
1025 // Just skip if we are in binary mode.
1026 test_skip(false, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1028 test_compare(query_id
, memcached_query_id(memc
)); // We should not increase the query_id for memcached_behavior_get()
1030 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
1031 test_true(memc_clone
);
1033 query_id
= memcached_query_id(memc_clone
);
1034 test_compare(MEMCACHED_SUCCESS
,
1035 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
1036 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
1038 /* All keys are valid in the binary protocol (except for length) */
1039 if (memcached_behavior_get(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == false)
1041 uint64_t before_query_id
= memcached_query_id(memc_clone
);
1043 size_t string_length
;
1044 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
1045 &string_length
, &flags
, &rc
);
1046 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
1047 test_zero(string_length
);
1050 test_compare(before_query_id
+1, memcached_query_id(memc_clone
));
1052 query_id
= memcached_query_id(memc_clone
);
1053 test_compare(MEMCACHED_SUCCESS
,
1054 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, false));
1055 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
1057 size_t string_length
;
1058 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
1059 &string_length
, &flags
, &rc
);
1060 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1061 test_zero(string_length
);
1065 /* Test multi key for bad keys */
1066 const char *keys
[] = { "GoodKey", "Bad Key", "NotMine" };
1067 size_t key_lengths
[] = { 7, 7, 7 };
1068 query_id
= memcached_query_id(memc_clone
);
1069 test_compare(MEMCACHED_SUCCESS
,
1070 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
1071 test_compare(query_id
, memcached_query_id(memc_clone
));
1073 query_id
= memcached_query_id(memc_clone
);
1074 test_compare(MEMCACHED_BAD_KEY_PROVIDED
,
1075 memcached_mget(memc_clone
, keys
, key_lengths
, 3));
1076 test_compare(query_id
+1, memcached_query_id(memc_clone
));
1078 query_id
= memcached_query_id(memc_clone
);
1079 // Grouping keys are not required to follow normal key behaviors
1080 test_compare(MEMCACHED_SUCCESS
,
1081 memcached_mget_by_key(memc_clone
, "foo daddy", 9, keys
, key_lengths
, 1));
1082 test_compare(query_id
+1, memcached_query_id(memc_clone
));
1084 /* The following test should be moved to the end of this function when the
1085 memcached server is updated to allow max size length of the keys in the
1088 test_compare(MEMCACHED_SUCCESS
,
1089 memcached_callback_set(memc_clone
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
1091 libtest::vchar_t longkey
;
1093 libtest::vchar_t::iterator it
= longkey
.begin();
1094 longkey
.insert(it
, MEMCACHED_MAX_KEY
, 'a');
1097 test_compare(longkey
.size(), size_t(MEMCACHED_MAX_KEY
));
1099 size_t string_length
;
1101 test_null(memcached_get(memc_clone
, &longkey
[0], longkey
.size() -1, &string_length
, &flags
, &rc
));
1102 test_compare(MEMCACHED_NOTFOUND
, rc
);
1103 test_zero(string_length
);
1105 test_null(memcached_get(memc_clone
, &longkey
[0], longkey
.size(), &string_length
, &flags
, &rc
));
1106 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
1107 test_zero(string_length
);
1111 /* Make sure zero length keys are marked as bad */
1113 test_compare(MEMCACHED_SUCCESS
,
1114 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
1115 size_t string_length
;
1116 char *string
= memcached_get(memc_clone
, key
, 0,
1117 &string_length
, &flags
, &rc
);
1118 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
1119 test_zero(string_length
);
1123 memcached_free(memc_clone
);
1125 return TEST_SUCCESS
;
1128 #define READ_THROUGH_VALUE "set for me"
1129 static memcached_return_t
read_through_trigger(memcached_st
*memc
,
1132 memcached_result_st
*result
)
1134 (void)memc
;(void)key
;(void)key_length
;
1135 return memcached_result_set_value(result
, READ_THROUGH_VALUE
, strlen(READ_THROUGH_VALUE
));
1138 #ifndef __INTEL_COMPILER
1139 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
1142 static test_return_t
read_through(memcached_st
*memc
)
1144 memcached_trigger_key_fn cb
= (memcached_trigger_key_fn
)read_through_trigger
;
1146 size_t string_length
;
1148 memcached_return_t rc
;
1149 char *string
= memcached_get(memc
,
1150 test_literal_param(__func__
),
1151 &string_length
, &flags
, &rc
);
1153 test_compare(MEMCACHED_NOTFOUND
, rc
);
1154 test_false(string_length
);
1157 test_compare(MEMCACHED_SUCCESS
,
1158 memcached_callback_set(memc
, MEMCACHED_CALLBACK_GET_FAILURE
, *(void **)&cb
));
1160 string
= memcached_get(memc
,
1161 test_literal_param(__func__
),
1162 &string_length
, &flags
, &rc
);
1164 test_compare(MEMCACHED_SUCCESS
, rc
);
1165 test_compare(string_length
, sizeof(READ_THROUGH_VALUE
) -1);
1166 test_true(string
[sizeof(READ_THROUGH_VALUE
) -1] == 0);
1167 test_strcmp(READ_THROUGH_VALUE
, string
);
1170 string
= memcached_get(memc
,
1171 test_literal_param(__func__
),
1172 &string_length
, &flags
, &rc
);
1174 test_compare(MEMCACHED_SUCCESS
, rc
);
1176 test_compare(string_length
, sizeof(READ_THROUGH_VALUE
) -1);
1177 test_true(string
[sizeof(READ_THROUGH_VALUE
) -1] == 0);
1178 test_strcmp(READ_THROUGH_VALUE
, string
);
1181 return TEST_SUCCESS
;
1184 static test_return_t
get_test(memcached_st
*memc
)
1186 memcached_return_t rc
;
1188 size_t string_length
;
1191 uint64_t query_id
= memcached_query_id(memc
);
1192 rc
= memcached_delete(memc
,
1193 test_literal_param(__func__
),
1195 test_true_got(rc
== MEMCACHED_BUFFERED
or rc
== MEMCACHED_NOTFOUND
, memcached_last_error_message(memc
));
1196 test_compare(query_id
+1, memcached_query_id(memc
));
1198 string
= memcached_get(memc
,
1199 test_literal_param(__func__
),
1200 &string_length
, &flags
, &rc
);
1202 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1203 test_false(string_length
);
1206 return TEST_SUCCESS
;
1209 static test_return_t
get_test2(memcached_st
*memc
)
1211 const char *value
= "when we sanitize";
1213 uint64_t query_id
= memcached_query_id(memc
);
1214 test_compare(return_value_based_on_buffering(memc
),
1216 test_literal_param(__func__
),
1217 value
, strlen(value
),
1218 time_t(0), uint32_t(0)));
1219 test_compare(query_id
+1, memcached_query_id(memc
));
1221 query_id
= memcached_query_id(memc
);
1222 test_true(query_id
);
1225 size_t string_length
;
1226 memcached_return_t rc
;
1227 char *string
= memcached_get(memc
,
1228 test_literal_param(__func__
),
1229 &string_length
, &flags
, &rc
);
1230 test_compare(query_id
+1, memcached_query_id(memc
));
1232 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
1233 test_compare_got(MEMCACHED_SUCCESS
, memcached_last_error(memc
), memcached_last_error_message(memc
));
1235 test_compare(strlen(value
), string_length
);
1236 test_memcmp(string
, value
, string_length
);
1240 return TEST_SUCCESS
;
1243 static test_return_t
set_test2(memcached_st
*memc
)
1245 for (uint32_t x
= 0; x
< 10; x
++)
1247 test_compare(return_value_based_on_buffering(memc
),
1249 test_literal_param("foo"),
1250 test_literal_param("train in the brain"),
1251 time_t(0), uint32_t(0)));
1254 return TEST_SUCCESS
;
1257 static test_return_t
set_test3(memcached_st
*memc
)
1259 size_t value_length
= 8191;
1261 libtest::vchar_t value
;
1262 value
.reserve(value_length
);
1263 for (uint32_t x
= 0; x
< value_length
; x
++)
1265 value
.push_back(char(x
% 127));
1268 /* The dump test relies on there being at least 32 items in memcached */
1269 for (uint32_t x
= 0; x
< 32; x
++)
1273 snprintf(key
, sizeof(key
), "foo%u", x
);
1275 uint64_t query_id
= memcached_query_id(memc
);
1276 test_compare_hint(return_value_based_on_buffering(memc
),
1277 memcached_set(memc
, key
, strlen(key
),
1278 &value
[0], value
.size(),
1279 time_t(0), uint32_t(0)),
1280 memcached_last_error_message(memc
));
1281 test_compare(query_id
+1, memcached_query_id(memc
));
1284 return TEST_SUCCESS
;
1287 static test_return_t
get_test3(memcached_st
*memc
)
1289 size_t value_length
= 8191;
1291 libtest::vchar_t value
;
1292 value
.reserve(value_length
);
1293 for (uint32_t x
= 0; x
< value_length
; x
++)
1295 value
.push_back(char(x
% 127));
1298 test_compare_hint(return_value_based_on_buffering(memc
),
1300 test_literal_param(__func__
),
1301 &value
[0], value
.size(),
1302 time_t(0), uint32_t(0)),
1303 memcached_last_error_message(memc
));
1305 size_t string_length
;
1307 memcached_return_t rc
;
1308 char *string
= memcached_get(memc
,
1309 test_literal_param(__func__
),
1310 &string_length
, &flags
, &rc
);
1312 test_compare(MEMCACHED_SUCCESS
, rc
);
1314 test_compare(value
.size(), string_length
);
1315 test_memcmp(string
, &value
[0], string_length
);
1319 return TEST_SUCCESS
;
1322 static test_return_t
get_test4(memcached_st
*memc
)
1324 size_t value_length
= 8191;
1326 libtest::vchar_t value
;
1327 value
.reserve(value_length
);
1328 for (uint32_t x
= 0; x
< value_length
; x
++)
1330 value
.push_back(char(x
% 127));
1333 test_compare_hint(return_value_based_on_buffering(memc
),
1335 test_literal_param(__func__
),
1336 &value
[0], value
.size(),
1337 time_t(0), uint32_t(0)),
1338 memcached_last_error_message(memc
));
1340 for (uint32_t x
= 0; x
< 10; x
++)
1343 size_t string_length
;
1344 memcached_return_t rc
;
1345 char *string
= memcached_get(memc
,
1346 test_literal_param(__func__
),
1347 &string_length
, &flags
, &rc
);
1349 test_compare(MEMCACHED_SUCCESS
, rc
);
1351 test_compare(value
.size(), string_length
);
1352 test_memcmp(string
, &value
[0], string_length
);
1356 return TEST_SUCCESS
;
1360 * This test verifies that memcached_read_one_response doesn't try to
1361 * dereference a NIL-pointer if you issue a multi-get and don't read out all
1362 * responses before you execute a storage command.
1364 static test_return_t
get_test5(memcached_st
*memc
)
1367 ** Request the same key twice, to ensure that we hash to the same server
1368 ** (so that we have multiple response values queued up) ;-)
1370 const char *keys
[]= { "key", "key" };
1371 size_t lengths
[]= { 3, 3 };
1375 test_compare_hint(return_value_based_on_buffering(memc
),
1376 memcached_set(memc
, keys
[0], lengths
[0],
1377 keys
[0], lengths
[0],
1378 time_t(0), uint32_t(0)),
1379 memcached_last_error_message(memc
));
1380 test_compare(MEMCACHED_SUCCESS
, memcached_mget(memc
, keys
, lengths
, test_array_length(keys
)));
1382 memcached_result_st results_obj
;
1383 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
1386 memcached_return_t rc
;
1387 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
1390 memcached_result_free(&results_obj
);
1392 /* Don't read out the second result, but issue a set instead.. */
1393 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0));
1395 char *val
= memcached_get_by_key(memc
, keys
[0], lengths
[0], "yek", 3,
1396 &rlen
, &flags
, &rc
);
1398 test_compare(MEMCACHED_NOTFOUND
, rc
);
1399 val
= memcached_get(memc
, keys
[0], lengths
[0], &rlen
, &flags
, &rc
);
1401 test_compare(MEMCACHED_SUCCESS
, rc
);
1404 return TEST_SUCCESS
;
1407 static test_return_t
mget_end(memcached_st
*memc
)
1409 const char *keys
[]= { "foo", "foo2" };
1410 size_t lengths
[]= { 3, 4 };
1411 const char *values
[]= { "fjord", "41" };
1414 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1416 test_compare(MEMCACHED_SUCCESS
,
1418 keys
[x
], lengths
[x
],
1419 values
[x
], strlen(values
[x
]),
1420 time_t(0), uint32_t(0)));
1424 size_t string_length
;
1427 // retrieve both via mget
1428 test_compare(MEMCACHED_SUCCESS
,
1429 memcached_mget(memc
,
1431 test_array_length(keys
)));
1433 char key
[MEMCACHED_MAX_KEY
];
1435 memcached_return_t rc
;
1437 // this should get both
1438 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1440 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
,
1442 test_compare(MEMCACHED_SUCCESS
, rc
);
1444 if (key_length
== 4)
1449 test_compare(string_length
, strlen(values
[val
]));
1450 test_true(strncmp(values
[val
], string
, string_length
) == 0);
1454 // this should indicate end
1455 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1456 test_compare(MEMCACHED_END
, rc
);
1460 test_compare(MEMCACHED_SUCCESS
,
1461 memcached_mget(memc
, keys
, lengths
, 1));
1463 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1464 test_compare(key_length
, lengths
[0]);
1465 test_true(strncmp(keys
[0], key
, key_length
) == 0);
1466 test_compare(string_length
, strlen(values
[0]));
1467 test_true(strncmp(values
[0], string
, string_length
) == 0);
1468 test_compare(MEMCACHED_SUCCESS
, rc
);
1471 // this should indicate end
1472 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1473 test_compare(MEMCACHED_END
, rc
);
1476 return TEST_SUCCESS
;
1479 /* Do not copy the style of this code, I just access hosts to testthis function */
1480 static test_return_t
stats_servername_test(memcached_st
*memc
)
1482 memcached_stat_st memc_stat
;
1483 memcached_server_instance_st instance
=
1484 memcached_server_instance_by_position(memc
, 0);
1486 if (LIBMEMCACHED_WITH_SASL_SUPPORT
and memcached_get_sasl_callbacks(memc
))
1488 return TEST_SKIPPED
;
1491 test_compare(MEMCACHED_SUCCESS
, memcached_stat_servername(&memc_stat
, NULL
,
1492 memcached_server_name(instance
),
1493 memcached_server_port(instance
)));
1495 return TEST_SUCCESS
;
1498 static test_return_t
increment_test(memcached_st
*memc
)
1500 uint64_t new_number
;
1502 test_compare(MEMCACHED_SUCCESS
,
1504 test_literal_param("number"),
1505 test_literal_param("0"),
1506 (time_t)0, (uint32_t)0));
1508 test_compare(MEMCACHED_SUCCESS
,
1509 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1510 test_compare(uint64_t(1), new_number
);
1512 test_compare(MEMCACHED_SUCCESS
,
1513 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1514 test_compare(uint64_t(2), new_number
);
1516 return TEST_SUCCESS
;
1519 static test_return_t
increment_with_initial_test(memcached_st
*memc
)
1521 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1523 uint64_t new_number
;
1524 uint64_t initial
= 0;
1526 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1528 test_compare(MEMCACHED_SUCCESS
,
1529 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1530 test_compare(new_number
, initial
);
1532 test_compare(MEMCACHED_SUCCESS
,
1533 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1534 test_compare(new_number
, (initial
+1));
1536 return TEST_SUCCESS
;
1539 static test_return_t
decrement_test(memcached_st
*memc
)
1541 test_compare(return_value_based_on_buffering(memc
),
1543 test_literal_param(__func__
),
1544 test_literal_param("3"),
1545 time_t(0), uint32_t(0)));
1546 // Make sure we flush the value we just set
1547 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1549 uint64_t new_number
;
1550 test_compare(MEMCACHED_SUCCESS
,
1551 memcached_decrement(memc
,
1552 test_literal_param(__func__
),
1554 test_compare(uint64_t(2), new_number
);
1556 test_compare(MEMCACHED_SUCCESS
,
1557 memcached_decrement(memc
,
1558 test_literal_param(__func__
),
1560 test_compare(uint64_t(1), new_number
);
1562 return TEST_SUCCESS
;
1565 static test_return_t
decrement_with_initial_test(memcached_st
*memc
)
1567 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1569 uint64_t initial
= 3;
1571 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1573 uint64_t new_number
;
1574 test_compare(MEMCACHED_SUCCESS
,
1575 memcached_decrement_with_initial(memc
,
1576 test_literal_param(__func__
),
1579 test_compare(new_number
, initial
);
1581 test_compare(MEMCACHED_SUCCESS
,
1582 memcached_decrement_with_initial(memc
,
1583 test_literal_param(__func__
),
1586 test_compare(new_number
, (initial
- 1));
1588 return TEST_SUCCESS
;
1591 static test_return_t
increment_by_key_test(memcached_st
*memc
)
1593 const char *master_key
= "foo";
1594 const char *key
= "number";
1595 const char *value
= "0";
1597 test_compare(return_value_based_on_buffering(memc
),
1598 memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1600 value
, strlen(value
),
1601 time_t(0), uint32_t(0)));
1603 // Make sure we flush the value we just set
1604 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1606 uint64_t new_number
;
1607 test_compare(MEMCACHED_SUCCESS
,
1608 memcached_increment_by_key(memc
, master_key
, strlen(master_key
),
1609 key
, strlen(key
), 1, &new_number
));
1610 test_compare(uint64_t(1), new_number
);
1612 test_compare(MEMCACHED_SUCCESS
,
1613 memcached_increment_by_key(memc
, master_key
, strlen(master_key
),
1614 key
, strlen(key
), 1, &new_number
));
1615 test_compare(uint64_t(2), new_number
);
1617 return TEST_SUCCESS
;
1620 static test_return_t
increment_with_initial_by_key_test(memcached_st
*memc
)
1622 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1624 uint64_t new_number
;
1625 const char *master_key
= "foo";
1626 const char *key
= "number";
1627 uint64_t initial
= 0;
1629 test_compare(MEMCACHED_SUCCESS
,
1630 memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1632 1, initial
, 0, &new_number
));
1633 test_compare(new_number
, initial
);
1635 test_compare(MEMCACHED_SUCCESS
,
1636 memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1638 1, initial
, 0, &new_number
));
1639 test_compare(new_number
, (initial
+1));
1641 return TEST_SUCCESS
;
1644 static test_return_t
decrement_by_key_test(memcached_st
*memc
)
1646 uint64_t new_number
;
1647 const char *value
= "3";
1649 test_compare(return_value_based_on_buffering(memc
),
1650 memcached_set_by_key(memc
,
1651 test_literal_param("foo"),
1652 test_literal_param("number"),
1653 value
, strlen(value
),
1654 (time_t)0, (uint32_t)0));
1656 test_compare(MEMCACHED_SUCCESS
,
1657 memcached_decrement_by_key(memc
,
1658 test_literal_param("foo"),
1659 test_literal_param("number"),
1661 test_compare(uint64_t(2), new_number
);
1663 test_compare(MEMCACHED_SUCCESS
,
1664 memcached_decrement_by_key(memc
,
1665 test_literal_param("foo"),
1666 test_literal_param("number"),
1668 test_compare(uint64_t(1), new_number
);
1670 return TEST_SUCCESS
;
1673 static test_return_t
decrement_with_initial_by_key_test(memcached_st
*memc
)
1675 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1677 uint64_t new_number
;
1678 uint64_t initial
= 3;
1680 test_compare(MEMCACHED_SUCCESS
,
1681 memcached_decrement_with_initial_by_key(memc
,
1682 test_literal_param("foo"),
1683 test_literal_param("number"),
1684 1, initial
, 0, &new_number
));
1685 test_compare(new_number
, initial
);
1687 test_compare(MEMCACHED_SUCCESS
,
1688 memcached_decrement_with_initial_by_key(memc
,
1689 test_literal_param("foo"),
1690 test_literal_param("number"),
1691 1, initial
, 0, &new_number
));
1692 test_compare(new_number
, (initial
- 1));
1694 return TEST_SUCCESS
;
1696 static test_return_t
binary_increment_with_prefix_test(memcached_st
*memc
)
1698 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1700 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)"namespace:"));
1702 test_compare(return_value_based_on_buffering(memc
),
1704 test_literal_param("number"),
1705 test_literal_param("0"),
1706 (time_t)0, (uint32_t)0));
1708 uint64_t new_number
;
1709 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1710 test_literal_param("number"),
1712 test_compare(uint64_t(1), new_number
);
1714 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1715 test_literal_param("number"),
1717 test_compare(uint64_t(2), new_number
);
1719 return TEST_SUCCESS
;
1722 static test_return_t
quit_test(memcached_st
*memc
)
1724 const char *value
= "sanford and sun";
1726 test_compare(return_value_based_on_buffering(memc
),
1728 test_literal_param(__func__
),
1729 value
, strlen(value
),
1730 (time_t)10, (uint32_t)3));
1731 memcached_quit(memc
);
1733 test_compare(return_value_based_on_buffering(memc
),
1735 test_literal_param(__func__
),
1736 value
, strlen(value
),
1737 (time_t)50, (uint32_t)9));
1739 return TEST_SUCCESS
;
1742 static test_return_t
mget_result_test(memcached_st
*memc
)
1744 const char *keys
[]= {"fudge", "son", "food"};
1745 size_t key_length
[]= {5, 3, 4};
1747 memcached_result_st results_obj
;
1748 memcached_result_st
*results
;
1750 results
= memcached_result_create(memc
, &results_obj
);
1752 test_true(&results_obj
== results
);
1754 /* We need to empty the server before continueing test */
1755 test_compare(MEMCACHED_SUCCESS
,
1756 memcached_flush(memc
, 0));
1758 test_compare(MEMCACHED_SUCCESS
,
1759 memcached_mget(memc
, keys
, key_length
, 3));
1761 memcached_return_t rc
;
1762 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1767 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
))) { test_true(false); /* We should never see a value returned */ };
1768 test_false(results
);
1769 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1771 for (uint32_t x
= 0; x
< 3; x
++)
1773 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1774 keys
[x
], key_length
[x
],
1775 (time_t)50, (uint32_t)9);
1776 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1779 test_compare(MEMCACHED_SUCCESS
,
1780 memcached_mget(memc
, keys
, key_length
, 3));
1782 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1785 test_true(&results_obj
== results
);
1786 test_compare(MEMCACHED_SUCCESS
, rc
);
1787 test_memcmp(memcached_result_key_value(results
),
1788 memcached_result_value(results
),
1789 memcached_result_length(results
));
1790 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1793 memcached_result_free(&results_obj
);
1795 return TEST_SUCCESS
;
1798 static test_return_t
mget_result_alloc_test(memcached_st
*memc
)
1800 const char *keys
[]= {"fudge", "son", "food"};
1801 size_t key_length
[]= {5, 3, 4};
1803 memcached_result_st
*results
;
1805 /* We need to empty the server before continueing test */
1806 test_compare(MEMCACHED_SUCCESS
,
1807 memcached_flush(memc
, 0));
1809 test_compare(MEMCACHED_SUCCESS
,
1810 memcached_mget(memc
, keys
, key_length
, 3));
1812 memcached_return_t rc
;
1813 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1817 test_false(results
);
1818 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1820 for (uint32_t x
= 0; x
< 3; x
++)
1822 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1823 keys
[x
], key_length
[x
],
1824 (time_t)50, (uint32_t)9);
1825 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1828 test_compare(MEMCACHED_SUCCESS
,
1829 memcached_mget(memc
, keys
, key_length
, 3));
1832 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1835 test_compare(MEMCACHED_SUCCESS
, rc
);
1836 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1837 test_memcmp(memcached_result_key_value(results
),
1838 memcached_result_value(results
),
1839 memcached_result_length(results
));
1840 memcached_result_free(results
);
1844 return TEST_SUCCESS
;
1847 /* Count the results */
1848 static memcached_return_t
callback_counter(const memcached_st
*, memcached_result_st
*, void *context
)
1850 size_t *counter
= (size_t *)context
;
1852 *counter
= *counter
+ 1;
1854 return MEMCACHED_SUCCESS
;
1857 static test_return_t
mget_result_function(memcached_st
*memc
)
1859 const char *keys
[]= {"fudge", "son", "food"};
1860 size_t key_length
[]= {5, 3, 4};
1862 memcached_execute_fn callbacks
[1];
1864 for (uint32_t x
= 0; x
< 3; x
++)
1866 test_compare(return_value_based_on_buffering(memc
),
1867 memcached_set(memc
, keys
[x
], key_length
[x
],
1868 keys
[x
], key_length
[x
],
1869 time_t(50), uint32_t(9)));
1871 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1872 memcached_quit(memc
);
1874 test_compare(MEMCACHED_SUCCESS
,
1875 memcached_mget(memc
, keys
, key_length
, 3));
1877 callbacks
[0]= &callback_counter
;
1880 test_compare(MEMCACHED_SUCCESS
,
1881 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1883 test_compare(size_t(3), counter
);
1885 return TEST_SUCCESS
;
1888 static test_return_t
mget_test(memcached_st
*memc
)
1890 const char *keys
[]= {"fudge", "son", "food"};
1891 size_t key_length
[]= {5, 3, 4};
1893 char return_key
[MEMCACHED_MAX_KEY
];
1894 size_t return_key_length
;
1896 size_t return_value_length
;
1898 test_compare(MEMCACHED_SUCCESS
,
1899 memcached_mget(memc
, keys
, key_length
, 3));
1902 memcached_return_t rc
;
1903 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1904 &return_value_length
, &flags
, &rc
)))
1906 test_true(return_value
);
1908 test_false(return_value
);
1909 test_zero(return_value_length
);
1910 test_compare(MEMCACHED_NOTFOUND
, rc
);
1912 for (uint32_t x
= 0; x
< 3; x
++)
1914 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1915 keys
[x
], key_length
[x
],
1916 (time_t)50, (uint32_t)9);
1917 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1919 test_compare(MEMCACHED_SUCCESS
,
1920 memcached_mget(memc
, keys
, key_length
, 3));
1923 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1924 &return_value_length
, &flags
, &rc
)))
1926 test_true(return_value
);
1927 test_compare(MEMCACHED_SUCCESS
, rc
);
1928 if (not memc
->_namespace
)
1930 test_compare(return_key_length
, return_value_length
);
1931 test_memcmp(return_value
, return_key
, return_value_length
);
1937 return TEST_SUCCESS
;
1940 static test_return_t
mget_execute(memcached_st
*original_memc
)
1942 test_skip(true, memcached_behavior_get(original_memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1944 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL");
1947 size_t max_keys
= 20480;
1950 char **keys
= static_cast<char **>(calloc(max_keys
, sizeof(char*)));
1951 size_t *key_length
=static_cast<size_t *>(calloc(max_keys
, sizeof(size_t)));
1953 /* First add all of the items.. */
1954 char blob
[1024] = {0};
1956 for (size_t x
= 0; x
< max_keys
; ++x
)
1960 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
1962 test_true(keys
[x
] != NULL
);
1963 uint64_t query_id
= memcached_query_id(memc
);
1964 memcached_return_t rc
= memcached_add(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
1965 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1966 test_compare(query_id
+1, memcached_query_id(memc
));
1969 /* Try to get all of them with a large multiget */
1971 memcached_execute_fn callbacks
[]= { &callback_counter
};
1972 test_compare(MEMCACHED_SUCCESS
,
1973 memcached_mget_execute(memc
, (const char**)keys
, key_length
,
1974 max_keys
, callbacks
, &counter
, 1));
1977 uint64_t query_id
= memcached_query_id(memc
);
1978 test_compare(MEMCACHED_SUCCESS
,
1979 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1980 test_compare(query_id
, memcached_query_id(memc
));
1982 /* Verify that we got all of the items */
1983 test_true(counter
== max_keys
);
1986 /* Release all allocated resources */
1987 for (size_t x
= 0; x
< max_keys
; ++x
)
1994 memcached_free(memc
);
1996 return TEST_SUCCESS
;
1999 #define REGRESSION_BINARY_VS_BLOCK_COUNT 20480
2000 static pairs_st
*global_pairs
;
2002 static test_return_t
key_setup(memcached_st
*memc
)
2004 test_skip(TEST_SUCCESS
, pre_binary(memc
));
2006 global_pairs
= pairs_generate(REGRESSION_BINARY_VS_BLOCK_COUNT
, 0);
2008 return TEST_SUCCESS
;
2011 static test_return_t
key_teardown(memcached_st
*memc
)
2014 pairs_free(global_pairs
);
2016 return TEST_SUCCESS
;
2019 static test_return_t
block_add_regression(memcached_st
*memc
)
2021 /* First add all of the items.. */
2022 for (size_t x
= 0; x
< REGRESSION_BINARY_VS_BLOCK_COUNT
; ++x
)
2024 char blob
[1024] = {0};
2026 memcached_return_t rc
= memcached_add_by_key(memc
, "bob", 3, global_pairs
[x
].key
, global_pairs
[x
].key_length
, blob
, sizeof(blob
), 0, 0);
2027 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
, memcached_strerror(NULL
, rc
));
2030 return TEST_SUCCESS
;
2033 static test_return_t
binary_add_regression(memcached_st
*memc
)
2035 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
2036 test_return_t rc
= block_add_regression(memc
);
2041 static test_return_t
get_stats_keys(memcached_st
*memc
)
2045 memcached_stat_st memc_stat
;
2046 memcached_return_t rc
;
2048 stat_list
= memcached_stat_get_keys(memc
, &memc_stat
, &rc
);
2049 test_compare(MEMCACHED_SUCCESS
, rc
);
2050 for (ptr
= stat_list
; *ptr
; ptr
++)
2055 return TEST_SUCCESS
;
2058 static test_return_t
version_string_test(memcached_st
*)
2060 test_strcmp(LIBMEMCACHED_VERSION_STRING
, memcached_lib_version());
2062 return TEST_SUCCESS
;
2065 static test_return_t
get_stats(memcached_st
*memc
)
2067 memcached_return_t rc
;
2069 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
2070 test_compare(MEMCACHED_SUCCESS
, rc
);
2071 test_true(memc_stat
);
2073 for (uint32_t x
= 0; x
< memcached_server_count(memc
); x
++)
2075 char **stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
2076 test_compare(MEMCACHED_SUCCESS
, rc
);
2077 for (char **ptr
= stat_list
; *ptr
; ptr
++) {};
2082 memcached_stat_free(NULL
, memc_stat
);
2084 return TEST_SUCCESS
;
2087 static test_return_t
add_host_test(memcached_st
*memc
)
2089 char servername
[]= "0.example.com";
2091 memcached_return_t rc
;
2092 memcached_server_st
*servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
2093 test_compare(1U, memcached_server_list_count(servers
));
2095 for (unsigned int x
= 2; x
< 20; x
++)
2097 char buffer
[SMALL_STRING_LEN
];
2099 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
2100 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
2102 test_compare(MEMCACHED_SUCCESS
, rc
);
2103 test_compare(x
, memcached_server_list_count(servers
));
2106 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
2107 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
2109 memcached_server_list_free(servers
);
2111 return TEST_SUCCESS
;
2114 static test_return_t
memcached_fetch_result_NOT_FOUND(memcached_st
*memc
)
2116 memcached_return_t rc
;
2118 const char *key
= "not_found";
2119 size_t key_length
= test_literal_param_size("not_found");
2121 test_compare(MEMCACHED_SUCCESS
,
2122 memcached_mget(memc
, &key
, &key_length
, 1));
2124 memcached_result_st
*result
= memcached_fetch_result(memc
, NULL
, &rc
);
2126 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
2128 memcached_result_free(result
);
2130 return TEST_SUCCESS
;
2133 static memcached_return_t
clone_test_callback(memcached_st
*, memcached_st
*)
2135 return MEMCACHED_SUCCESS
;
2138 static memcached_return_t
cleanup_test_callback(memcached_st
*)
2140 return MEMCACHED_SUCCESS
;
2143 static test_return_t
callback_test(memcached_st
*memc
)
2145 /* Test User Data */
2149 memcached_return_t rc
;
2151 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
));
2152 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
2153 test_true(*test_ptr
== x
);
2156 /* Test Clone Callback */
2158 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
2159 void *clone_cb_ptr
= *(void **)&clone_cb
;
2160 void *temp_function
= NULL
;
2162 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, clone_cb_ptr
));
2163 memcached_return_t rc
;
2164 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
2165 test_true(temp_function
== clone_cb_ptr
);
2166 test_compare(MEMCACHED_SUCCESS
, rc
);
2169 /* Test Cleanup Callback */
2171 memcached_cleanup_fn cleanup_cb
= (memcached_cleanup_fn
)cleanup_test_callback
;
2172 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
2173 void *temp_function
= NULL
;
2174 memcached_return_t rc
;
2176 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, cleanup_cb_ptr
));
2177 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
2178 test_true(temp_function
== cleanup_cb_ptr
);
2181 return TEST_SUCCESS
;
2184 /* We don't test the behavior itself, we test the switches */
2185 static test_return_t
behavior_test(memcached_st
*memc
)
2187 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 1);
2188 test_compare(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
));
2190 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
2191 test_compare(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
));
2193 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_MD5
);
2194 test_compare(uint64_t(MEMCACHED_HASH_MD5
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
2196 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
2197 test_zero(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
));
2199 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
2200 test_zero(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
));
2202 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_DEFAULT
);
2203 test_compare(uint64_t(MEMCACHED_HASH_DEFAULT
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
2205 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_CRC
);
2206 test_compare(uint64_t(MEMCACHED_HASH_CRC
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
2208 test_true(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
));
2210 test_true(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
));
2212 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
2213 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+1);
2214 test_compare((value
+1), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
));
2216 return TEST_SUCCESS
;
2219 static test_return_t
MEMCACHED_BEHAVIOR_CORK_test(memcached_st
*memc
)
2221 test_compare(MEMCACHED_DEPRECATED
,
2222 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CORK
, true));
2224 // Platform dependent
2226 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_CORK
);
2230 return TEST_SUCCESS
;
2234 static test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test(memcached_st
*memc
)
2236 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
, true);
2237 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
2239 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
);
2241 if (memcached_success(rc
))
2250 return TEST_SUCCESS
;
2254 static test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st
*memc
)
2256 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
, true);
2257 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
2259 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
);
2261 if (memcached_success(rc
))
2270 return TEST_SUCCESS
;
2273 /* Make sure we behave properly if server list has no values */
2274 static test_return_t
user_supplied_bug4(memcached_st
*memc
)
2276 const char *keys
[]= {"fudge", "son", "food"};
2277 size_t key_length
[]= {5, 3, 4};
2279 /* Here we free everything before running a bunch of mget tests */
2280 memcached_servers_reset(memc
);
2283 /* We need to empty the server before continueing test */
2284 test_compare(MEMCACHED_NO_SERVERS
,
2285 memcached_flush(memc
, 0));
2287 test_compare(MEMCACHED_NO_SERVERS
,
2288 memcached_mget(memc
, keys
, key_length
, 3));
2291 unsigned int keys_returned
;
2292 memcached_return_t rc
;
2293 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, keys_returned
, rc
));
2294 test_compare(MEMCACHED_NOTFOUND
, rc
);
2295 test_zero(keys_returned
);
2298 for (uint32_t x
= 0; x
< 3; x
++)
2300 test_compare(MEMCACHED_NO_SERVERS
,
2301 memcached_set(memc
, keys
[x
], key_length
[x
],
2302 keys
[x
], key_length
[x
],
2303 (time_t)50, (uint32_t)9));
2306 test_compare(MEMCACHED_NO_SERVERS
,
2307 memcached_mget(memc
, keys
, key_length
, 3));
2311 char return_key
[MEMCACHED_MAX_KEY
];
2312 memcached_return_t rc
;
2313 size_t return_key_length
;
2314 size_t return_value_length
;
2317 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2318 &return_value_length
, &flags
, &rc
)))
2320 test_true(return_value
);
2321 test_compare(MEMCACHED_SUCCESS
, rc
);
2322 test_true(return_key_length
== return_value_length
);
2323 test_memcmp(return_value
, return_key
, return_value_length
);
2329 return TEST_SUCCESS
;
2332 #define VALUE_SIZE_BUG5 1048064
2333 static test_return_t
user_supplied_bug5(memcached_st
*memc
)
2335 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2336 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2338 size_t value_length
;
2340 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2342 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2344 insert_data
[x
]= (signed char)rand();
2347 test_compare(MEMCACHED_SUCCESS
,
2348 memcached_flush(memc
, 0));
2350 memcached_return_t rc
;
2351 test_null(memcached_get(memc
, keys
[0], key_length
[0], &value_length
, &flags
, &rc
));
2352 test_compare(MEMCACHED_SUCCESS
,
2353 memcached_mget(memc
, keys
, key_length
, 4));
2356 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
, rc
));
2357 test_compare(MEMCACHED_NOTFOUND
, rc
);
2360 for (uint32_t x
= 0; x
< 4; x
++)
2362 test_compare(MEMCACHED_SUCCESS
,
2363 memcached_set(memc
, keys
[x
], key_length
[x
],
2364 insert_data
, VALUE_SIZE_BUG5
,
2365 (time_t)0, (uint32_t)0));
2368 for (uint32_t x
= 0; x
< 10; x
++)
2370 value
= memcached_get(memc
, keys
[0], key_length
[0],
2371 &value_length
, &flags
, &rc
);
2372 test_compare(rc
, MEMCACHED_SUCCESS
);
2376 test_compare(MEMCACHED_SUCCESS
,
2377 memcached_mget(memc
, keys
, key_length
, 4));
2379 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
));
2380 test_compare(4U, count
);
2382 delete [] insert_data
;
2384 return TEST_SUCCESS
;
2387 static test_return_t
user_supplied_bug6(memcached_st
*memc
)
2389 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2390 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2391 char return_key
[MEMCACHED_MAX_KEY
];
2392 size_t return_key_length
;
2394 size_t value_length
;
2396 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2398 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2400 insert_data
[x
]= (signed char)rand();
2403 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
2405 test_compare(TEST_SUCCESS
, confirm_keys_dont_exist(memc
, keys
, test_array_length(keys
)));
2407 // We will now confirm that memcached_mget() returns success, but we will
2408 // then check to make sure that no actual keys are returned.
2409 test_compare(MEMCACHED_SUCCESS
,
2410 memcached_mget(memc
, keys
, key_length
, 4));
2412 memcached_return_t rc
;
2414 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2415 &value_length
, &flags
, &rc
)))
2420 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
2422 for (uint32_t x
= 0; x
< test_array_length(keys
); x
++)
2424 test_compare(MEMCACHED_SUCCESS
,
2425 memcached_set(memc
, keys
[x
], key_length
[x
],
2426 insert_data
, VALUE_SIZE_BUG5
,
2427 (time_t)0, (uint32_t)0));
2429 test_compare(TEST_SUCCESS
, confirm_keys_exist(memc
, keys
, test_array_length(keys
)));
2431 for (uint32_t x
= 0; x
< 2; x
++)
2433 value
= memcached_get(memc
, keys
[0], key_length
[0],
2434 &value_length
, &flags
, &rc
);
2438 test_compare(MEMCACHED_SUCCESS
,
2439 memcached_mget(memc
, keys
, key_length
, 4));
2440 /* We test for purge of partial complete fetches */
2441 for (count
= 3; count
; count
--)
2443 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2444 &value_length
, &flags
, &rc
);
2445 test_compare(MEMCACHED_SUCCESS
, rc
);
2446 test_memcmp(value
, insert_data
, value_length
);
2447 test_true(value_length
);
2451 delete [] insert_data
;
2453 return TEST_SUCCESS
;
2456 static test_return_t
user_supplied_bug8(memcached_st
*)
2458 memcached_return_t rc
;
2460 memcached_st
*memc_clone
;
2462 memcached_server_st
*servers
;
2463 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";
2465 servers
= memcached_servers_parse(server_list
);
2468 mine
= memcached_create(NULL
);
2469 rc
= memcached_server_push(mine
, servers
);
2470 test_compare(MEMCACHED_SUCCESS
, rc
);
2471 memcached_server_list_free(servers
);
2474 memc_clone
= memcached_clone(NULL
, mine
);
2476 memcached_quit(mine
);
2477 memcached_quit(memc_clone
);
2480 memcached_free(mine
);
2481 memcached_free(memc_clone
);
2483 return TEST_SUCCESS
;
2486 /* Test flag store/retrieve */
2487 static test_return_t
user_supplied_bug7(memcached_st
*memc
)
2489 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2490 test_true(insert_data
);
2492 for (size_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2494 insert_data
[x
]= (signed char)rand();
2497 memcached_flush(memc
, 0);
2499 const char *keys
= "036790384900";
2500 size_t key_length
= strlen(keys
);
2501 test_compare_hint(MEMCACHED_SUCCESS
, memcached_set(memc
, keys
, key_length
,
2502 insert_data
, VALUE_SIZE_BUG5
,
2504 memcached_last_error_message(memc
));
2506 memcached_return_t rc
;
2507 size_t value_length
;
2509 char *value
= memcached_get(memc
, keys
, key_length
,
2510 &value_length
, &flags
, &rc
);
2511 test_compare(245U, flags
);
2515 test_compare(MEMCACHED_SUCCESS
, memcached_mget(memc
, &keys
, &key_length
, 1));
2517 char return_key
[MEMCACHED_MAX_KEY
];
2518 size_t return_key_length
;
2520 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2521 &value_length
, &flags
, &rc
);
2522 test_compare(uint32_t(245), flags
);
2525 delete [] insert_data
;
2528 return TEST_SUCCESS
;
2531 static test_return_t
user_supplied_bug9(memcached_st
*memc
)
2533 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2534 size_t key_length
[3];
2538 char return_key
[MEMCACHED_MAX_KEY
];
2539 size_t return_key_length
;
2541 size_t return_value_length
;
2544 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2545 key_length
[1]= strlen("fudge&*@#");
2546 key_length
[2]= strlen("for^#@&$not");
2549 for (unsigned int x
= 0; x
< 3; x
++)
2551 memcached_return_t rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2552 keys
[x
], key_length
[x
],
2553 (time_t)50, (uint32_t)9);
2554 test_compare(MEMCACHED_SUCCESS
, rc
);
2557 memcached_return_t rc
= memcached_mget(memc
, keys
, key_length
, 3);
2558 test_compare(MEMCACHED_SUCCESS
, rc
);
2560 /* We need to empty the server before continueing test */
2561 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2562 &return_value_length
, &flags
, &rc
)) != NULL
)
2564 test_true(return_value
);
2568 test_compare(3U, count
);
2570 return TEST_SUCCESS
;
2573 /* We are testing with aggressive timeout to get failures */
2574 static test_return_t
user_supplied_bug10(memcached_st
*memc
)
2576 size_t value_length
= 512;
2577 unsigned int set
= 1;
2578 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2580 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2581 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2582 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, uint64_t(0));
2584 libtest::vchar_t value
;
2585 value
.reserve(value_length
);
2586 for (uint32_t x
= 0; x
< value_length
; x
++)
2588 value
.push_back(char(x
% 127));
2591 for (unsigned int x
= 1; x
<= 100000; ++x
)
2593 memcached_return_t rc
= memcached_set(mclone
,
2594 test_literal_param("foo"),
2595 &value
[0], value
.size(),
2598 test_true_got((rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_BUFFERED
or rc
== MEMCACHED_TIMEOUT
or rc
== MEMCACHED_CONNECTION_FAILURE
2599 or rc
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
),
2600 memcached_strerror(NULL
, rc
));
2602 if (rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_TIMEOUT
)
2608 memcached_free(mclone
);
2610 return TEST_SUCCESS
;
2614 We are looking failures in the async protocol
2616 static test_return_t
user_supplied_bug11(memcached_st
*memc
)
2618 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2620 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, true);
2621 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true);
2622 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, size_t(-1));
2624 test_compare(-1, int32_t(memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
)));
2627 libtest::vchar_t value
;
2629 for (unsigned int x
= 0; x
< 512; x
++)
2631 value
.push_back(char(x
% 127));
2634 for (unsigned int x
= 1; x
<= 100000; ++x
)
2636 memcached_return_t rc
= memcached_set(mclone
, test_literal_param("foo"), &value
[0], value
.size(), 0, 0);
2640 memcached_free(mclone
);
2642 return TEST_SUCCESS
;
2646 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2648 static test_return_t
user_supplied_bug12(memcached_st
*memc
)
2650 memcached_return_t rc
;
2652 size_t value_length
;
2654 uint64_t number_value
;
2656 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2657 &value_length
, &flags
, &rc
);
2659 test_compare(MEMCACHED_NOTFOUND
, rc
);
2661 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2664 /* The binary protocol will set the key if it doesn't exist */
2665 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2667 test_compare(MEMCACHED_SUCCESS
, rc
);
2671 test_compare(MEMCACHED_NOTFOUND
, rc
);
2674 test_compare(MEMCACHED_SUCCESS
,
2675 memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0));
2677 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"), &value_length
, &flags
, &rc
);
2681 test_compare(MEMCACHED_SUCCESS
,
2682 memcached_increment(memc
, "autoincrement", strlen("autoincrement"), 1, &number_value
));
2683 test_compare(2UL, number_value
);
2685 return TEST_SUCCESS
;
2689 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2690 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2692 static test_return_t
user_supplied_bug13(memcached_st
*memc
)
2694 char key
[] = "key34567890";
2696 char commandFirst
[]= "set key34567890 0 0 ";
2697 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2698 size_t commandLength
;
2700 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2702 size_t overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2704 for (size_t testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2706 char *overflow
= new (std::nothrow
) char[testSize
];
2707 test_true(overflow
);
2709 memset(overflow
, 'x', testSize
);
2710 test_compare(MEMCACHED_SUCCESS
,
2711 memcached_set(memc
, key
, strlen(key
),
2712 overflow
, testSize
, 0, 0));
2716 return TEST_SUCCESS
;
2721 Test values of many different sizes
2722 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2723 set key34567890 0 0 8169 \r\n
2724 is sent followed by buffer of size 8169, followed by 8169
2726 static test_return_t
user_supplied_bug14(memcached_st
*memc
)
2728 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true);
2730 libtest::vchar_t value
;
2731 value
.reserve(18000);
2732 for (size_t x
= 0; x
< 18000; x
++)
2734 value
.push_back((char) (x
% 127));
2737 for (size_t current_length
= 0; current_length
< value
.size(); current_length
++)
2739 memcached_return_t rc
= memcached_set(memc
, test_literal_param("foo"),
2740 &value
[0], current_length
,
2741 (time_t)0, (uint32_t)0);
2742 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
2744 size_t string_length
;
2746 char *string
= memcached_get(memc
, test_literal_param("foo"),
2747 &string_length
, &flags
, &rc
);
2749 test_compare(MEMCACHED_SUCCESS
, rc
);
2750 test_compare(string_length
, current_length
);
2751 test_memcmp(string
, &value
[0], string_length
);
2756 return TEST_SUCCESS
;
2760 Look for zero length value problems
2762 static test_return_t
user_supplied_bug15(memcached_st
*memc
)
2764 for (uint32_t x
= 0; x
< 2; x
++)
2766 memcached_return_t rc
= memcached_set(memc
, test_literal_param("mykey"),
2768 (time_t)0, (uint32_t)0);
2770 test_compare(MEMCACHED_SUCCESS
, rc
);
2774 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2775 &length
, &flags
, &rc
);
2777 test_compare(MEMCACHED_SUCCESS
, rc
);
2782 value
= memcached_get(memc
, test_literal_param("mykey"),
2783 &length
, &flags
, &rc
);
2785 test_compare(MEMCACHED_SUCCESS
, rc
);
2791 return TEST_SUCCESS
;
2794 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2795 static test_return_t
user_supplied_bug16(memcached_st
*memc
)
2797 test_compare_hint(MEMCACHED_SUCCESS
, memcached_set(memc
, test_literal_param("mykey"),
2799 (time_t)0, UINT32_MAX
),
2800 memcached_last_error_message(memc
));
2805 memcached_return_t rc
;
2806 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2807 &length
, &flags
, &rc
);
2809 test_compare(MEMCACHED_SUCCESS
, rc
);
2812 test_compare(flags
, UINT32_MAX
);
2814 return TEST_SUCCESS
;
2817 #if !defined(__sun) && !defined(__OpenBSD__)
2818 /* Check the validity of chinese key*/
2819 static test_return_t
user_supplied_bug17(memcached_st
*memc
)
2821 const char *key
= "豆瓣";
2822 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2823 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
2824 value
, strlen(value
),
2827 test_compare(MEMCACHED_SUCCESS
, rc
);
2831 char *value2
= memcached_get(memc
, key
, strlen(key
),
2832 &length
, &flags
, &rc
);
2834 test_true(length
==strlen(value
));
2835 test_compare(MEMCACHED_SUCCESS
, rc
);
2836 test_memcmp(value
, value2
, length
);
2839 return TEST_SUCCESS
;
2847 static test_return_t
user_supplied_bug19(memcached_st
*)
2849 memcached_return_t res
;
2851 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:11311/?100 --server=localhost:11312/?100"));
2853 const memcached_server_st
*server
= memcached_server_by_key(memc
, "a", 1, &res
);
2856 memcached_free(memc
);
2858 return TEST_SUCCESS
;
2861 /* CAS test from Andei */
2862 static test_return_t
user_supplied_bug20(memcached_st
*memc
)
2864 const char *key
= "abc";
2865 size_t key_len
= strlen("abc");
2867 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
2869 test_compare(MEMCACHED_SUCCESS
,
2871 test_literal_param("abc"),
2872 test_literal_param("foobar"),
2873 (time_t)0, (uint32_t)0));
2875 test_compare(MEMCACHED_SUCCESS
,
2876 memcached_mget(memc
, &key
, &key_len
, 1));
2878 memcached_result_st result_obj
;
2879 memcached_result_st
*result
= memcached_result_create(memc
, &result_obj
);
2882 memcached_result_create(memc
, &result_obj
);
2883 memcached_return_t status
;
2884 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2887 test_compare(MEMCACHED_SUCCESS
, status
);
2889 memcached_result_free(result
);
2891 return TEST_SUCCESS
;
2894 /* Large mget() of missing keys with binary proto
2896 * If many binary quiet commands (such as getq's in an mget) fill the output
2897 * buffer and the server chooses not to respond, memcached_flush hangs. See
2898 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2901 /* sighandler_t function that always asserts false */
2902 static void fail(int)
2908 static test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2913 return TEST_SKIPPED
;
2915 void (*oldalarm
)(int);
2917 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
2918 test_true(memc_clone
);
2920 /* only binproto uses getq for mget */
2921 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
2923 /* empty the cache to ensure misses (hence non-responses) */
2924 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc_clone
, 0));
2926 keys_st
keys(key_count
);
2928 oldalarm
= signal(SIGALRM
, fail
);
2931 test_compare_got(MEMCACHED_SUCCESS
,
2932 memcached_mget(memc_clone
, keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()),
2933 memcached_last_error_message(memc_clone
));
2936 signal(SIGALRM
, oldalarm
);
2938 memcached_return_t rc
;
2940 char return_key
[MEMCACHED_MAX_KEY
];
2941 size_t return_key_length
;
2943 size_t return_value_length
;
2944 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2945 &return_value_length
, &flags
, &rc
)))
2947 test_false(return_value
); // There are no keys to fetch, so the value should never be returned
2949 test_compare(MEMCACHED_NOTFOUND
, rc
);
2950 test_zero(return_value_length
);
2951 test_zero(return_key_length
);
2952 test_false(return_key
[0]);
2953 test_false(return_value
);
2955 memcached_free(memc_clone
);
2957 return TEST_SUCCESS
;
2961 static test_return_t
user_supplied_bug21(memcached_st
*memc
)
2963 test_skip(TEST_SUCCESS
, pre_binary(memc
));
2965 /* should work as of r580 */
2966 test_compare(TEST_SUCCESS
,
2967 _user_supplied_bug21(memc
, 10));
2969 /* should fail as of r580 */
2970 test_compare(TEST_SUCCESS
,
2971 _user_supplied_bug21(memc
, 1000));
2973 return TEST_SUCCESS
;
2976 static test_return_t
output_ketama_weighted_keys(memcached_st
*)
2978 memcached_st
*memc
= memcached_create(NULL
);
2982 test_compare(MEMCACHED_SUCCESS
,
2983 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, true));
2985 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2986 test_compare(value
, uint64_t(1));
2988 test_compare(MEMCACHED_SUCCESS
,
2989 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
));
2991 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2992 test_true(value
== MEMCACHED_HASH_MD5
);
2995 test_true(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
2997 memcached_server_st
*server_pool
;
2998 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");
2999 memcached_server_push(memc
, server_pool
);
3001 // @todo this needs to be refactored to actually test something.
3004 if ((fp
= fopen("ketama_keys.txt", "w")))
3008 printf("cannot write to file ketama_keys.txt");
3009 return TEST_FAILURE
;
3012 for (int x
= 0; x
< 10000; x
++)
3015 snprintf(key
, sizeof(key
), "%d", x
);
3017 uint32_t server_idx
= memcached_generate_hash(memc
, key
, strlen(key
));
3018 char *hostname
= memc
->hosts
[server_idx
].hostname
;
3019 in_port_t port
= memc
->hosts
[server_idx
].port
;
3020 fprintf(fp
, "key %s is on host /%s:%u\n", key
, hostname
, port
);
3021 memcached_server_instance_st instance
=
3022 memcached_server_instance_by_position(memc
, host_index
);
3026 memcached_server_list_free(server_pool
);
3027 memcached_free(memc
);
3029 return TEST_SUCCESS
;
3033 static test_return_t
result_static(memcached_st
*memc
)
3035 memcached_result_st result
;
3036 memcached_result_st
*result_ptr
= memcached_result_create(memc
, &result
);
3037 test_false(result
.options
.is_allocated
);
3038 test_true(memcached_is_initialized(&result
));
3039 test_true(result_ptr
);
3040 test_true(result_ptr
== &result
);
3042 memcached_result_free(&result
);
3044 test_false(result
.options
.is_allocated
);
3045 test_false(memcached_is_initialized(&result
));
3047 return TEST_SUCCESS
;
3050 static test_return_t
result_alloc(memcached_st
*memc
)
3052 memcached_result_st
*result_ptr
= memcached_result_create(memc
, NULL
);
3053 test_true(result_ptr
);
3054 test_true(result_ptr
->options
.is_allocated
);
3055 test_true(memcached_is_initialized(result_ptr
));
3056 memcached_result_free(result_ptr
);
3058 return TEST_SUCCESS
;
3062 static test_return_t
add_host_test1(memcached_st
*memc
)
3064 memcached_return_t rc
;
3065 char servername
[]= "0.example.com";
3067 memcached_server_st
*servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
3069 test_compare(1U, memcached_server_list_count(servers
));
3071 for (uint32_t x
= 2; x
< 20; x
++)
3073 char buffer
[SMALL_STRING_LEN
];
3075 snprintf(buffer
, SMALL_STRING_LEN
, "%lu.example.com", (unsigned long)(400 +x
));
3076 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
3078 test_compare(MEMCACHED_SUCCESS
, rc
);
3079 test_compare(x
, memcached_server_list_count(servers
));
3082 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
3083 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
3085 memcached_server_list_free(servers
);
3087 return TEST_SUCCESS
;
3090 static test_return_t
pre_nonblock(memcached_st
*memc
)
3092 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3094 return TEST_SUCCESS
;
3097 static test_return_t
pre_cork(memcached_st
*memc
)
3100 return TEST_SKIPPED
;
3103 if (memcached_success(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CORK
, set
)))
3104 return TEST_SUCCESS
;
3106 return TEST_SKIPPED
;
3109 static test_return_t
pre_cork_and_nonblock(memcached_st
*memc
)
3112 return TEST_SKIPPED
;
3114 test_return_t test_rc
;
3115 if ((test_rc
= pre_cork(memc
)) != TEST_SUCCESS
)
3118 return pre_nonblock(memc
);
3121 static test_return_t
pre_nonblock_binary(memcached_st
*memc
)
3123 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
3124 test_true(memc_clone
);
3126 // The memcached_version needs to be done on a clone, because the server
3127 // will not toggle protocol on an connection.
3128 memcached_version(memc_clone
);
3130 memcached_return_t rc
= MEMCACHED_FAILURE
;
3131 if (libmemcached_util_version_check(memc_clone
, 1, 4, 4))
3133 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3134 test_compare(MEMCACHED_SUCCESS
,
3135 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
3136 test_compare(uint64_t(1), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
3140 memcached_free(memc_clone
);
3141 return TEST_SKIPPED
;
3144 memcached_free(memc_clone
);
3146 return rc
== MEMCACHED_SUCCESS
? TEST_SUCCESS
: TEST_SKIPPED
;
3149 static test_return_t
pre_murmur(memcached_st
*memc
)
3151 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3152 return TEST_SUCCESS
;
3155 static test_return_t
pre_jenkins(memcached_st
*memc
)
3157 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_JENKINS
);
3159 return TEST_SKIPPED
;
3163 static test_return_t
pre_md5(memcached_st
*memc
)
3165 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MD5
);
3167 return TEST_SUCCESS
;
3170 static test_return_t
pre_crc(memcached_st
*memc
)
3172 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_CRC
);
3174 return TEST_SUCCESS
;
3177 static test_return_t
pre_hsieh(memcached_st
*memc
)
3179 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_HSIEH
));
3180 return TEST_SUCCESS
;
3183 static test_return_t
pre_hash_fnv1_64(memcached_st
*memc
)
3185 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3187 return TEST_SUCCESS
;
3190 static test_return_t
pre_hash_fnv1a_64(memcached_st
*memc
)
3192 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_64
));
3194 return TEST_SUCCESS
;
3197 static test_return_t
pre_hash_fnv1_32(memcached_st
*memc
)
3199 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1_32
);
3201 return TEST_SUCCESS
;
3204 static test_return_t
pre_hash_fnv1a_32(memcached_st
*memc
)
3206 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_FNV1A_32
);
3208 return TEST_SUCCESS
;
3211 static test_return_t
pre_behavior_ketama(memcached_st
*memc
)
3213 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA
, 1);
3214 test_compare(MEMCACHED_SUCCESS
, rc
);
3216 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA
);
3217 test_compare(value
, uint64_t(1));
3219 return TEST_SUCCESS
;
3222 static test_return_t
pre_behavior_ketama_weighted(memcached_st
*memc
)
3224 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, 1);
3225 test_compare(MEMCACHED_SUCCESS
, rc
);
3227 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
3228 test_compare(value
, uint64_t(1));
3230 test_compare(MEMCACHED_SUCCESS
,
3231 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
));
3233 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
3234 test_compare(MEMCACHED_HASH_MD5
, memcached_hash_t(value
));
3236 return TEST_SUCCESS
;
3239 static test_return_t
pre_replication(memcached_st
*memc
)
3241 test_skip(TEST_SUCCESS
, pre_binary(memc
));
3244 * Make sure that we store the item on all servers
3245 * (master + replicas == number of servers)
3247 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, memcached_server_count(memc
) - 1));
3248 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
), uint64_t(memcached_server_count(memc
) - 1));
3250 return TEST_SUCCESS
;
3254 static test_return_t
pre_replication_noblock(memcached_st
*memc
)
3256 test_skip(TEST_SUCCESS
, pre_replication(memc
));
3258 return pre_nonblock(memc
);
3262 static void my_free(const memcached_st
*ptr
, void *mem
, void *context
)
3266 #ifdef HARD_MALLOC_TESTS
3267 void *real_ptr
= (mem
== NULL
) ? mem
: (void*)((caddr_t
)mem
- 8);
3275 static void *my_malloc(const memcached_st
*ptr
, const size_t size
, void *context
)
3279 #ifdef HARD_MALLOC_TESTS
3280 void *ret
= malloc(size
+ 8);
3283 ret
= (void*)((caddr_t
)ret
+ 8);
3286 void *ret
= malloc(size
);
3291 memset(ret
, 0xff, size
);
3298 static void *my_realloc(const memcached_st
*ptr
, void *mem
, const size_t size
, void *)
3300 #ifdef HARD_MALLOC_TESTS
3301 void *real_ptr
= (mem
== NULL
) ? NULL
: (void*)((caddr_t
)mem
- 8);
3302 void *nmem
= realloc(real_ptr
, size
+ 8);
3307 ret
= (void*)((caddr_t
)nmem
+ 8);
3313 return realloc(mem
, size
);
3318 static void *my_calloc(const memcached_st
*ptr
, size_t nelem
, const size_t size
, void *)
3320 #ifdef HARD_MALLOC_TESTS
3321 void *mem
= my_malloc(ptr
, nelem
* size
);
3324 memset(mem
, 0, nelem
* size
);
3330 return calloc(nelem
, size
);
3334 static test_return_t
selection_of_namespace_tests(memcached_st
*memc
)
3336 memcached_return_t rc
;
3337 const char *key
= "mine";
3340 /* Make sure be default none exists */
3341 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3343 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3345 /* Test a clean set */
3346 test_compare(MEMCACHED_SUCCESS
,
3347 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3349 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3351 test_memcmp(value
, key
, 4);
3352 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3354 /* Test that we can turn it off */
3355 test_compare(MEMCACHED_SUCCESS
,
3356 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
3358 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3360 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3362 /* Now setup for main test */
3363 test_compare(MEMCACHED_SUCCESS
,
3364 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3366 value
= (char *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3368 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3369 test_memcmp(value
, key
, 4);
3371 /* Set to Zero, and then Set to something too large */
3374 memset(long_key
, 0, 255);
3376 test_compare(MEMCACHED_SUCCESS
,
3377 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
3379 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3381 test_compare(MEMCACHED_SUCCESS
, rc
);
3383 /* Test a long key for failure */
3384 /* TODO, extend test to determine based on setting, what result should be */
3385 strncpy(long_key
, "Thisismorethentheallottednumberofcharacters", sizeof(long_key
));
3386 test_compare(MEMCACHED_SUCCESS
,
3387 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
3389 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3390 strncpy(long_key
, "This is more then the allotted number of characters", sizeof(long_key
));
3391 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
3392 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
3394 /* Test for a bad prefix, but with a short key */
3395 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_INVALID_ARGUMENTS
: MEMCACHED_SUCCESS
,
3396 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1));
3398 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
3399 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, "dog cat"));
3402 return TEST_SUCCESS
;
3405 static test_return_t
set_namespace(memcached_st
*memc
)
3407 memcached_return_t rc
;
3408 const char *key
= "mine";
3411 // Make sure we default to a null namespace
3412 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3414 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3416 /* Test a clean set */
3417 test_compare(MEMCACHED_SUCCESS
,
3418 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
3420 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
3422 test_memcmp(value
, key
, 4);
3423 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
3425 return TEST_SUCCESS
;
3428 static test_return_t
set_namespace_and_binary(memcached_st
*memc
)
3430 test_return_if(pre_binary(memc
));
3431 test_return_if(set_namespace(memc
));
3433 return TEST_SUCCESS
;
3436 #ifdef MEMCACHED_ENABLE_DEPRECATED
3437 static test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
3439 void *test_ptr
= NULL
;
3442 memcached_malloc_fn malloc_cb
=
3443 (memcached_malloc_fn
)my_malloc
;
3444 cb_ptr
= *(void **)&malloc_cb
;
3445 memcached_return_t rc
;
3447 test_compare(MEMCACHED_SUCCESS
,
3448 memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
));
3449 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3450 test_compare(MEMCACHED_SUCCESS
, rc
);
3451 test_true(test_ptr
== cb_ptr
);
3455 memcached_realloc_fn realloc_cb
=
3456 (memcached_realloc_fn
)my_realloc
;
3457 cb_ptr
= *(void **)&realloc_cb
;
3458 memcached_return_t rc
;
3460 test_compare(MEMCACHED_SUCCESS
,
3461 memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
));
3462 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3463 test_compare(MEMCACHED_SUCCESS
, rc
);
3464 test_true(test_ptr
== cb_ptr
);
3468 memcached_free_fn free_cb
=
3469 (memcached_free_fn
)my_free
;
3470 cb_ptr
= *(void **)&free_cb
;
3471 memcached_return_t rc
;
3473 test_compare(MEMCACHED_SUCCESS
,
3474 memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
));
3475 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3476 test_compare(MEMCACHED_SUCCESS
, rc
);
3477 test_true(test_ptr
== cb_ptr
);
3480 return TEST_SUCCESS
;
3485 static test_return_t
set_memory_alloc(memcached_st
*memc
)
3487 test_compare(MEMCACHED_INVALID_ARGUMENTS
,
3488 memcached_set_memory_allocators(memc
, NULL
, my_free
,
3489 my_realloc
, my_calloc
, NULL
));
3491 test_compare(MEMCACHED_SUCCESS
,
3492 memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3493 my_realloc
, my_calloc
, NULL
));
3495 memcached_malloc_fn mem_malloc
;
3496 memcached_free_fn mem_free
;
3497 memcached_realloc_fn mem_realloc
;
3498 memcached_calloc_fn mem_calloc
;
3499 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3500 &mem_realloc
, &mem_calloc
);
3502 test_true(mem_malloc
== my_malloc
);
3503 test_true(mem_realloc
== my_realloc
);
3504 test_true(mem_calloc
== my_calloc
);
3505 test_true(mem_free
== my_free
);
3507 return TEST_SUCCESS
;
3510 static test_return_t
enable_consistent_crc(memcached_st
*memc
)
3513 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3514 memcached_hash_t hash
;
3515 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3516 if ((rc
= pre_crc(memc
)) != TEST_SUCCESS
)
3519 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3520 test_true(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3522 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3524 if (hash
!= MEMCACHED_HASH_CRC
)
3525 return TEST_SKIPPED
;
3527 return TEST_SUCCESS
;
3530 static test_return_t
enable_consistent_hsieh(memcached_st
*memc
)
3533 memcached_server_distribution_t value
= MEMCACHED_DISTRIBUTION_CONSISTENT
;
3534 memcached_hash_t hash
;
3535 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, value
);
3536 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3541 value
= (memcached_server_distribution_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
);
3542 test_true(value
== MEMCACHED_DISTRIBUTION_CONSISTENT
);
3544 hash
= (memcached_hash_t
)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
);
3546 if (hash
!= MEMCACHED_HASH_HSIEH
)
3547 return TEST_SKIPPED
;
3550 return TEST_SUCCESS
;
3553 static test_return_t
enable_cas(memcached_st
*memc
)
3555 unsigned int set
= 1;
3557 if (libmemcached_util_version_check(memc
, 1, 2, 4))
3559 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3561 return TEST_SUCCESS
;
3564 return TEST_SKIPPED
;
3567 static test_return_t
check_for_1_2_3(memcached_st
*memc
)
3569 memcached_version(memc
);
3571 memcached_server_instance_st instance
=
3572 memcached_server_instance_by_position(memc
, 0);
3574 if ((instance
->major_version
>= 1 && (instance
->minor_version
== 2 && instance
->micro_version
>= 4))
3575 or instance
->minor_version
> 2)
3577 return TEST_SUCCESS
;
3580 return TEST_SKIPPED
;
3583 static test_return_t
pre_unix_socket(memcached_st
*memc
)
3587 memcached_servers_reset(memc
);
3588 const char *socket_file
= default_socket();
3590 test_skip(0, stat(socket_file
, &buf
));
3592 test_compare(MEMCACHED_SUCCESS
,
3593 memcached_server_add_unix_socket_with_weight(memc
, socket_file
, 0));
3595 return TEST_SUCCESS
;
3598 static test_return_t
pre_nodelay(memcached_st
*memc
)
3600 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
3601 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
3603 return TEST_SUCCESS
;
3606 static test_return_t
pre_settimer(memcached_st
*memc
)
3608 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
3609 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
3611 return TEST_SUCCESS
;
3614 static test_return_t
MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test(memcached_st
*memc
)
3616 const uint64_t timeout
= 100; // Not using, just checking that it sets
3618 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
3620 test_compare(timeout
, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
));
3622 return TEST_SUCCESS
;
3625 static test_return_t
noreply_test(memcached_st
*memc
)
3627 test_compare(MEMCACHED_SUCCESS
,
3628 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, true));
3629 test_compare(MEMCACHED_SUCCESS
,
3630 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, true));
3631 test_compare(MEMCACHED_SUCCESS
,
3632 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
3633 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
));
3634 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
));
3635 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
));
3637 memcached_return_t ret
;
3638 for (int count
= 0; count
< 5; ++count
)
3640 for (size_t x
= 0; x
< 100; ++x
)
3642 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
3643 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
3644 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
3646 size_t len
= (size_t)check_length
;
3651 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
3654 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
3657 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
3660 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
3663 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
3669 test_true_got(ret
== MEMCACHED_SUCCESS
or ret
== MEMCACHED_BUFFERED
,
3670 memcached_strerror(NULL
, ret
));
3674 ** NOTE: Don't ever do this in your code! this is not a supported use of the
3675 ** API and is _ONLY_ done this way to verify that the library works the
3676 ** way it is supposed to do!!!!
3680 for (uint32_t x
= 0; x
< memcached_server_count(memc
); ++x
)
3682 memcached_server_instance_st instance
=
3683 memcached_server_instance_by_position(memc
, x
);
3684 no_msg
+=(int)(instance
->cursor_active
);
3687 test_true(no_msg
== 0);
3689 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
3692 ** Now validate that all items was set properly!
3694 for (size_t x
= 0; x
< 100; ++x
)
3698 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
3700 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
3702 size_t len
= (size_t)check_length
;
3705 char* value
=memcached_get(memc
, key
, strlen(key
),
3706 &length
, &flags
, &ret
);
3707 test_true_got(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
, memcached_strerror(NULL
, ret
));
3710 case 0: /* FALLTHROUGH */
3711 case 1: /* FALLTHROUGH */
3713 test_true(strncmp(value
, key
, len
) == 0);
3714 test_true(len
== length
);
3717 test_true(length
== len
* 2);
3720 test_true(length
== len
* 3);
3730 /* Try setting an illegal cas value (should not return an error to
3731 * the caller (because we don't expect a return message from the server)
3733 const char* keys
[]= {"0"};
3734 size_t lengths
[]= {1};
3737 memcached_result_st results_obj
;
3738 memcached_result_st
*results
;
3739 test_compare(MEMCACHED_SUCCESS
,
3740 memcached_mget(memc
, keys
, lengths
, 1));
3742 results
= memcached_result_create(memc
, &results_obj
);
3744 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
3746 test_compare(MEMCACHED_SUCCESS
, ret
);
3747 uint64_t cas
= memcached_result_cas(results
);
3748 memcached_result_free(&results_obj
);
3750 test_compare(MEMCACHED_SUCCESS
,
3751 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
3754 * The item will have a new cas value, so try to set it again with the old
3755 * value. This should fail!
3757 test_compare(MEMCACHED_SUCCESS
,
3758 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
3759 test_true(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3760 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
3761 test_true(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3764 return TEST_SUCCESS
;
3767 static test_return_t
analyzer_test(memcached_st
*memc
)
3769 memcached_analysis_st
*report
;
3770 memcached_return_t rc
;
3772 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
3773 test_compare(MEMCACHED_SUCCESS
, rc
);
3774 test_true(memc_stat
);
3776 report
= memcached_analyze(memc
, memc_stat
, &rc
);
3777 test_compare(MEMCACHED_SUCCESS
, rc
);
3781 memcached_stat_free(NULL
, memc_stat
);
3783 return TEST_SUCCESS
;
3786 static test_return_t
util_version_test(memcached_st
*memc
)
3788 test_compare_hint(MEMCACHED_SUCCESS
, memcached_version(memc
), memcached_last_error_message(memc
));
3789 test_true(libmemcached_util_version_check(memc
, 0, 0, 0));
3791 bool if_successful
= libmemcached_util_version_check(memc
, 9, 9, 9);
3793 // We expect failure
3796 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
3797 fprintf(stderr
, "\nDumping Server Information\n\n");
3798 memcached_server_fn callbacks
[1];
3800 callbacks
[0]= dump_server_information
;
3801 memcached_server_cursor(memc
, callbacks
, (void *)stderr
, 1);
3802 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
3804 test_true(if_successful
== false);
3806 memcached_server_instance_st instance
=
3807 memcached_server_instance_by_position(memc
, 0);
3809 memcached_version(memc
);
3811 // We only use one binary when we test, so this should be just fine.
3812 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, instance
->micro_version
);
3813 test_true(if_successful
== true);
3815 if (instance
->micro_version
> 0)
3817 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
-1));
3819 else if (instance
->minor_version
> 0)
3821 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
- 1), instance
->micro_version
);
3823 else if (instance
->major_version
> 0)
3825 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
-1), instance
->minor_version
, instance
->micro_version
);
3828 test_true(if_successful
== true);
3830 if (instance
->micro_version
> 0)
3832 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
+1));
3834 else if (instance
->minor_version
> 0)
3836 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
+1), instance
->micro_version
);
3838 else if (instance
->major_version
> 0)
3840 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
+1), instance
->minor_version
, instance
->micro_version
);
3843 test_true(if_successful
== false);
3845 return TEST_SUCCESS
;
3848 static test_return_t
getpid_connection_failure_test(memcached_st
*memc
)
3850 memcached_return_t rc
;
3851 memcached_server_instance_st instance
=
3852 memcached_server_instance_by_position(memc
, 0);
3854 // Test both the version that returns a code, and the one that does not.
3855 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3856 memcached_server_port(instance
) -1, NULL
) == -1);
3858 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3859 memcached_server_port(instance
) -1, &rc
) == -1);
3860 test_compare_got(MEMCACHED_CONNECTION_FAILURE
, rc
, memcached_strerror(memc
, rc
));
3862 return TEST_SUCCESS
;
3866 static test_return_t
getpid_test(memcached_st
*memc
)
3868 memcached_return_t rc
;
3869 memcached_server_instance_st instance
=
3870 memcached_server_instance_by_position(memc
, 0);
3872 // Test both the version that returns a code, and the one that does not.
3873 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3874 memcached_server_port(instance
), NULL
) > -1);
3876 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3877 memcached_server_port(instance
), &rc
) > -1);
3878 test_compare(MEMCACHED_SUCCESS
, rc
);
3880 return TEST_SUCCESS
;
3883 static test_return_t
ping_test(memcached_st
*memc
)
3885 memcached_return_t rc
;
3886 memcached_server_instance_st instance
=
3887 memcached_server_instance_by_position(memc
, 0);
3889 // Test both the version that returns a code, and the one that does not.
3890 test_true(libmemcached_util_ping(memcached_server_name(instance
),
3891 memcached_server_port(instance
), NULL
));
3893 test_true(libmemcached_util_ping(memcached_server_name(instance
),
3894 memcached_server_port(instance
), &rc
));
3896 test_compare(MEMCACHED_SUCCESS
, rc
);
3898 return TEST_SUCCESS
;
3903 static test_return_t
hash_sanity_test (memcached_st
*memc
)
3907 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
3908 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
3909 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
3910 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
3911 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
3912 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
3913 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
3914 #ifdef HAVE_HSIEH_HASH
3915 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
3917 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
3918 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
3919 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
3921 return TEST_SUCCESS
;
3925 static test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
3927 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
3929 test_compare(MEMCACHED_SUCCESS
,
3930 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
3931 (uint64_t)MEMCACHED_HASH_HSIEH
));
3933 return TEST_SUCCESS
;
3936 static test_return_t
murmur_avaibility_test (memcached_st
*memc
)
3938 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
3940 test_compare(MEMCACHED_SUCCESS
,
3941 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3943 return TEST_SUCCESS
;
3946 static test_return_t
one_at_a_time_run (memcached_st
*)
3951 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3953 test_compare(one_at_a_time_values
[x
],
3954 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_DEFAULT
));
3957 return TEST_SUCCESS
;
3960 static test_return_t
md5_run (memcached_st
*)
3965 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3967 test_compare(md5_values
[x
],
3968 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
));
3971 return TEST_SUCCESS
;
3974 static test_return_t
crc_run (memcached_st
*)
3979 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3981 test_compare(crc_values
[x
],
3982 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
));
3985 return TEST_SUCCESS
;
3988 static test_return_t
fnv1_64_run (memcached_st
*)
3990 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
));
3995 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3997 test_compare(fnv1_64_values
[x
],
3998 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
));
4001 return TEST_SUCCESS
;
4004 static test_return_t
fnv1a_64_run (memcached_st
*)
4006 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1A_64
));
4011 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4013 test_compare(fnv1a_64_values
[x
],
4014 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
));
4017 return TEST_SUCCESS
;
4020 static test_return_t
fnv1_32_run (memcached_st
*)
4025 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4027 test_compare(fnv1_32_values
[x
],
4028 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
));
4031 return TEST_SUCCESS
;
4034 static test_return_t
fnv1a_32_run (memcached_st
*)
4039 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4041 test_compare(fnv1a_32_values
[x
],
4042 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
));
4045 return TEST_SUCCESS
;
4048 static test_return_t
hsieh_run (memcached_st
*)
4050 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
4055 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4057 test_compare(hsieh_values
[x
],
4058 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
));
4061 return TEST_SUCCESS
;
4064 static test_return_t
murmur_run (memcached_st
*)
4066 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
4068 #ifdef WORDS_BIGENDIAN
4069 (void)murmur_values
;
4070 return TEST_SKIPPED
;
4075 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4077 test_compare(murmur_values
[x
],
4078 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
));
4081 return TEST_SUCCESS
;
4085 static test_return_t
jenkins_run (memcached_st
*)
4090 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4092 test_compare(jenkins_values
[x
],
4093 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
));
4096 return TEST_SUCCESS
;
4099 static uint32_t hash_md5_test_function(const char *string
, size_t string_length
, void *)
4101 return libhashkit_md5(string
, string_length
);
4104 static uint32_t hash_crc_test_function(const char *string
, size_t string_length
, void *)
4106 return libhashkit_crc32(string
, string_length
);
4109 static test_return_t
memcached_get_hashkit_test (memcached_st
*)
4115 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:1 --server=localhost:2 --server=localhost:3 --server=localhost:4 --server=localhost5 --DISTRIBUTION=modula"));
4117 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};
4118 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};
4120 const hashkit_st
*kit
= memcached_get_hashkit(memc
);
4122 hashkit_clone(&new_kit
, kit
);
4123 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_md5_test_function
, NULL
));
4125 memcached_set_hashkit(memc
, &new_kit
);
4128 Verify Setting the hash.
4130 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4134 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
4135 test_compare_got(md5_values
[x
], hash_val
, *ptr
);
4140 Now check memcached_st.
4142 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4146 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
4147 test_compare_got(md5_hosts
[x
], hash_val
, *ptr
);
4150 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_crc_test_function
, NULL
));
4152 memcached_set_hashkit(memc
, &new_kit
);
4155 Verify Setting the hash.
4157 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4161 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
4162 test_true(crc_values
[x
] == hash_val
);
4165 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
4169 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
4170 test_compare(crc_hosts
[x
], hash_val
);
4173 memcached_free(memc
);
4175 return TEST_SUCCESS
;
4179 Test case adapted from John Gorman <johngorman2@gmail.com>
4181 We are testing the error condition when we connect to a server via memcached_get()
4182 but find that the server is not available.
4184 static test_return_t
memcached_get_MEMCACHED_ERRNO(memcached_st
*)
4186 const char *key
= "MemcachedLives";
4189 memcached_return rc
;
4192 memcached_st
*tl_memc_h
= memcached(test_literal_param("--server=localhost:9898 --server=localhost:9899")); // This server should not exist
4194 // See if memcached is reachable.
4195 char *value
= memcached_get(tl_memc_h
, key
, strlen(key
), &len
, &flags
, &rc
);
4199 test_true(memcached_failed(rc
));
4201 memcached_free(tl_memc_h
);
4203 return TEST_SUCCESS
;
4207 We connect to a server which exists, but search for a key that does not exist.
4209 static test_return_t
memcached_get_MEMCACHED_NOTFOUND(memcached_st
*memc
)
4211 const char *key
= "MemcachedKeyNotEXIST";
4214 memcached_return rc
;
4216 // See if memcached is reachable.
4217 char *value
= memcached_get(memc
, key
, strlen(key
), &len
, &flags
, &rc
);
4221 test_compare(MEMCACHED_NOTFOUND
, rc
);
4223 return TEST_SUCCESS
;
4227 Test case adapted from John Gorman <johngorman2@gmail.com>
4229 We are testing the error condition when we connect to a server via memcached_get_by_key()
4230 but find that the server is not available.
4232 static test_return_t
memcached_get_by_key_MEMCACHED_ERRNO(memcached_st
*memc
)
4235 memcached_st
*tl_memc_h
;
4236 memcached_server_st
*servers
;
4238 const char *key
= "MemcachedLives";
4241 memcached_return rc
;
4245 tl_memc_h
= memcached_create(NULL
);
4246 servers
= memcached_servers_parse("localhost:9898,localhost:9899"); // This server should not exist
4247 memcached_server_push(tl_memc_h
, servers
);
4248 memcached_server_list_free(servers
);
4250 // See if memcached is reachable.
4251 value
= memcached_get_by_key(tl_memc_h
, key
, strlen(key
), key
, strlen(key
), &len
, &flags
, &rc
);
4255 test_true(memcached_failed(rc
));
4257 memcached_free(tl_memc_h
);
4259 return TEST_SUCCESS
;
4263 We connect to a server which exists, but search for a key that does not exist.
4265 static test_return_t
memcached_get_by_key_MEMCACHED_NOTFOUND(memcached_st
*memc
)
4267 const char *key
= "MemcachedKeyNotEXIST";
4270 memcached_return rc
;
4273 // See if memcached is reachable.
4274 value
= memcached_get_by_key(memc
, key
, strlen(key
), key
, strlen(key
), &len
, &flags
, &rc
);
4278 test_compare(MEMCACHED_NOTFOUND
, rc
);
4280 return TEST_SUCCESS
;
4283 static test_return_t
regression_bug_434484(memcached_st
*memc
)
4285 test_skip(TEST_SUCCESS
, pre_binary(memc
));
4287 const char *key
= "regression_bug_434484";
4288 size_t keylen
= strlen(key
);
4290 memcached_return_t ret
= memcached_append(memc
, key
, keylen
, key
, keylen
, 0, 0);
4291 test_compare(MEMCACHED_NOTSTORED
, ret
);
4293 size_t size
= 2048 * 1024;
4294 char *data
= (char*)calloc(1, size
);
4296 test_compare(MEMCACHED_E2BIG
,
4297 memcached_set(memc
, key
, keylen
, data
, size
, 0, 0));
4300 return TEST_SUCCESS
;
4303 static test_return_t
regression_bug_434843(memcached_st
*original_memc
)
4305 test_skip(TEST_SUCCESS
, pre_binary(original_memc
));
4307 memcached_return_t rc
;
4309 memcached_execute_fn callbacks
[]= { &callback_counter
};
4312 * I only want to hit only _one_ server so I know the number of requests I'm
4313 * sending in the pipleine to the server. Let's try to do a multiget of
4314 * 1024 (that should satisfy most users don't you think?). Future versions
4315 * will include a mget_execute function call if you need a higher number.
4317 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL");
4319 const size_t max_keys
= 1024;
4320 char **keys
= (char**)calloc(max_keys
, sizeof(char*));
4321 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
4323 for (size_t x
= 0; x
< max_keys
; ++x
)
4327 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
4333 * Run two times.. the first time we should have 100% cache miss,
4334 * and the second time we should have 100% cache hits
4336 for (size_t y
= 0; y
< 2; y
++)
4338 test_compare(MEMCACHED_SUCCESS
,
4339 memcached_mget(memc
, (const char**)keys
, key_length
, max_keys
));
4341 // One the first run we should get a NOT_FOUND, but on the second some data
4342 // should be returned.
4343 test_compare(y
? MEMCACHED_SUCCESS
: MEMCACHED_NOTFOUND
,
4344 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4348 /* The first iteration should give me a 100% cache miss. verify that*/
4349 char blob
[1024]= { 0 };
4351 test_false(counter
);
4353 for (size_t x
= 0; x
< max_keys
; ++x
)
4355 rc
= memcached_add(memc
, keys
[x
], key_length
[x
],
4356 blob
, sizeof(blob
), 0, 0);
4357 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4362 /* Verify that we received all of the key/value pairs */
4363 test_compare(counter
, max_keys
);
4367 /* Release allocated resources */
4368 for (size_t x
= 0; x
< max_keys
; ++x
)
4375 memcached_free(memc
);
4377 return TEST_SUCCESS
;
4380 static test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
4382 memcached_return_t rc
;
4383 rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1);
4384 test_compare(MEMCACHED_SUCCESS
, rc
);
4386 return regression_bug_434843(memc
);
4389 static test_return_t
regression_bug_421108(memcached_st
*memc
)
4391 memcached_return_t rc
;
4392 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
4393 test_compare(MEMCACHED_SUCCESS
, rc
);
4395 char *bytes_str
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
4396 test_compare(MEMCACHED_SUCCESS
, rc
);
4397 test_true(bytes_str
);
4398 char *bytes_read_str
= memcached_stat_get_value(memc
, memc_stat
,
4400 test_compare(MEMCACHED_SUCCESS
, rc
);
4401 test_true(bytes_read_str
);
4403 char *bytes_written_str
= memcached_stat_get_value(memc
, memc_stat
,
4404 "bytes_written", &rc
);
4405 test_compare(MEMCACHED_SUCCESS
, rc
);
4406 test_true(bytes_written_str
);
4408 unsigned long long bytes
= strtoull(bytes_str
, 0, 10);
4409 unsigned long long bytes_read
= strtoull(bytes_read_str
, 0, 10);
4410 unsigned long long bytes_written
= strtoull(bytes_written_str
, 0, 10);
4412 test_true(bytes
!= bytes_read
);
4413 test_true(bytes
!= bytes_written
);
4415 /* Release allocated resources */
4417 free(bytes_read_str
);
4418 free(bytes_written_str
);
4419 memcached_stat_free(NULL
, memc_stat
);
4421 return TEST_SUCCESS
;
4425 * The test case isn't obvious so I should probably document why
4426 * it works the way it does. Bug 442914 was caused by a bug
4427 * in the logic in memcached_purge (it did not handle the case
4428 * where the number of bytes sent was equal to the watermark).
4429 * In this test case, create messages so that we hit that case
4430 * and then disable noreply mode and issue a new command to
4431 * verify that it isn't stuck. If we change the format for the
4432 * delete command or the watermarks, we need to update this
4435 static test_return_t
regression_bug_442914(memcached_st
*memc
)
4437 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
4438 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
4440 uint32_t number_of_hosts
= memcached_server_count(memc
);
4441 memc
->number_of_hosts
= 1;
4446 for (uint32_t x
= 0; x
< 250; ++x
)
4448 len
= (size_t)snprintf(k
, sizeof(k
), "%0250u", x
);
4449 memcached_return_t rc
= memcached_delete(memc
, k
, len
, 0);
4450 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4453 len
= snprintf(k
, sizeof(k
), "%037u", 251U);
4455 memcached_return_t rc
= memcached_delete(memc
, k
, len
, 0);
4456 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4458 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0));
4459 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, k
, len
, 0));
4461 memc
->number_of_hosts
= number_of_hosts
;
4463 return TEST_SUCCESS
;
4466 static test_return_t
regression_bug_447342(memcached_st
*memc
)
4468 memcached_server_instance_st instance_one
;
4469 memcached_server_instance_st instance_two
;
4471 if (memcached_server_count(memc
) < 3 or pre_replication(memc
) != TEST_SUCCESS
)
4472 return TEST_SKIPPED
;
4474 test_compare(MEMCACHED_SUCCESS
,
4475 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2));
4477 const unsigned int max_keys
= 100;
4478 char **keys
= (char**)calloc(max_keys
, sizeof(char*));
4479 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
4481 for (unsigned int x
= 0; x
< max_keys
; ++x
)
4485 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
4488 test_compare(MEMCACHED_SUCCESS
,
4489 memcached_set(memc
, k
, key_length
[x
], k
, key_length
[x
], 0, 0));
4493 ** We are using the quiet commands to store the replicas, so we need
4494 ** to ensure that all of them are processed before we can continue.
4495 ** In the test we go directly from storing the object to trying to
4496 ** receive the object from all of the different servers, so we
4497 ** could end up in a race condition (the memcached server hasn't yet
4498 ** processed the quiet command from the replication set when it process
4499 ** the request from the other client (created by the clone)). As a
4500 ** workaround for that we call memcached_quit to send the quit command
4501 ** to the server and wait for the response ;-) If you use the test code
4502 ** as an example for your own code, please note that you shouldn't need
4505 memcached_quit(memc
);
4507 /* Verify that all messages are stored, and we didn't stuff too much
4510 test_compare(MEMCACHED_SUCCESS
,
4511 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
4513 unsigned int counter
= 0;
4514 memcached_execute_fn callbacks
[]= { &callback_counter
};
4515 test_compare(MEMCACHED_SUCCESS
,
4516 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4518 /* Verify that we received all of the key/value pairs */
4519 test_compare(counter
, max_keys
);
4521 memcached_quit(memc
);
4523 * Don't do the following in your code. I am abusing the internal details
4524 * within the library, and this is not a supported interface.
4525 * This is to verify correct behavior in the library. Fake that two servers
4528 instance_one
= memcached_server_instance_by_position(memc
, 0);
4529 instance_two
= memcached_server_instance_by_position(memc
, 2);
4530 in_port_t port0
= instance_one
->port
;
4531 in_port_t port2
= instance_two
->port
;
4533 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
4534 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
4536 test_compare(MEMCACHED_SUCCESS
,
4537 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
4540 test_compare(MEMCACHED_SUCCESS
,
4541 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4542 test_compare(counter
, (unsigned int)max_keys
);
4544 /* restore the memc handle */
4545 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
4546 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
4548 memcached_quit(memc
);
4550 /* Remove half of the objects */
4551 for (size_t x
= 0; x
< max_keys
; ++x
)
4555 test_compare(MEMCACHED_SUCCESS
,
4556 memcached_delete(memc
, keys
[x
], key_length
[x
], 0));
4560 memcached_quit(memc
);
4561 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
4562 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
4564 /* now retry the command, this time we should have cache misses */
4565 test_compare(MEMCACHED_SUCCESS
,
4566 memcached_mget(memc
, (const char* const *)keys
, key_length
, max_keys
));
4569 test_compare(MEMCACHED_SUCCESS
,
4570 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4571 test_compare(counter
, (unsigned int)(max_keys
>> 1));
4573 /* Release allocated resources */
4574 for (size_t x
= 0; x
< max_keys
; ++x
)
4581 /* restore the memc handle */
4582 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
4583 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
4585 return TEST_SUCCESS
;
4588 static test_return_t
regression_bug_463297(memcached_st
*memc
)
4590 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(memc
, "foo", 3, 1));
4592 // Since we blocked timed delete, this test is no longer valid.
4594 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4595 test_true(memc_clone
);
4596 test_true(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
4598 memcached_server_instance_st instance
=
4599 memcached_server_instance_by_position(memc_clone
, 0);
4601 if (instance
->major_version
> 1 ||
4602 (instance
->major_version
== 1 &&
4603 instance
->minor_version
> 2))
4605 /* Binary protocol doesn't support deferred delete */
4606 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
4607 test_true(bin_clone
);
4608 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
4609 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(bin_clone
, "foo", 3, 1));
4610 memcached_free(bin_clone
);
4612 memcached_quit(memc_clone
);
4614 /* If we know the server version, deferred delete should fail
4615 * with invalid arguments */
4616 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(memc_clone
, "foo", 3, 1));
4618 /* If we don't know the server version, we should get a protocol error */
4619 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
4621 /* but there is a bug in some of the memcached servers (1.4) that treats
4622 * the counter as noreply so it doesn't send the proper error message
4624 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4626 /* And buffered mode should be disabled and we should get protocol error */
4627 test_true(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
4628 rc
= memcached_delete(memc
, "foo", 3, 1);
4629 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4631 /* Same goes for noreply... */
4632 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
4633 rc
= memcached_delete(memc
, "foo", 3, 1);
4634 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4636 /* but a normal request should go through (and be buffered) */
4637 test_compare(MEMCACHED_BUFFERED
, (rc
= memcached_delete(memc
, "foo", 3, 0)));
4638 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
4640 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0));
4641 /* unbuffered noreply should be success */
4642 test_compare(MEMCACHED_SUCCESS
, memcached_delete(memc
, "foo", 3, 0));
4643 /* unbuffered with reply should be not found... */
4644 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0));
4645 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, "foo", 3, 0));
4648 memcached_free(memc_clone
);
4651 return TEST_SUCCESS
;
4655 /* Test memcached_server_get_last_disconnect
4656 * For a working server set, shall be NULL
4657 * For a set of non existing server, shall not be NULL
4659 static test_return_t
test_get_last_disconnect(memcached_st
*memc
)
4661 memcached_return_t rc
;
4662 memcached_server_instance_st disconnected_server
;
4664 /* With the working set of server */
4665 const char *key
= "marmotte";
4666 const char *value
= "milka";
4668 memcached_reset_last_disconnected_server(memc
);
4669 test_false(memc
->last_disconnected_server
);
4670 rc
= memcached_set(memc
, key
, strlen(key
),
4671 value
, strlen(value
),
4672 (time_t)0, (uint32_t)0);
4673 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4675 disconnected_server
= memcached_server_get_last_disconnect(memc
);
4676 test_false(disconnected_server
);
4678 /* With a non existing server */
4680 memcached_server_st
*servers
;
4682 const char *server_list
= "localhost:9";
4684 servers
= memcached_servers_parse(server_list
);
4686 mine
= memcached_create(NULL
);
4687 rc
= memcached_server_push(mine
, servers
);
4688 test_compare(MEMCACHED_SUCCESS
, rc
);
4689 memcached_server_list_free(servers
);
4692 rc
= memcached_set(mine
, key
, strlen(key
),
4693 value
, strlen(value
),
4694 (time_t)0, (uint32_t)0);
4695 test_true(memcached_failed(rc
));
4697 disconnected_server
= memcached_server_get_last_disconnect(mine
);
4698 test_true_got(disconnected_server
, memcached_strerror(mine
, rc
));
4699 test_compare(in_port_t(9), memcached_server_port(disconnected_server
));
4700 test_false(strncmp(memcached_server_name(disconnected_server
),"localhost",9));
4702 memcached_quit(mine
);
4703 memcached_free(mine
);
4705 return TEST_SUCCESS
;
4708 static test_return_t
test_multiple_get_last_disconnect(memcached_st
*)
4710 const char *server_string
= "--server=localhost:8888 --server=localhost:8889 --server=localhost:8890 --server=localhost:8891 --server=localhost:8892";
4711 char buffer
[BUFSIZ
];
4713 test_compare(MEMCACHED_SUCCESS
,
4714 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
4716 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
4719 // We will just use the error strings as our keys
4720 uint32_t counter
= 100;
4723 for (int x
= int(MEMCACHED_SUCCESS
); x
< int(MEMCACHED_MAXIMUM_RETURN
); ++x
)
4725 const char *msg
= memcached_strerror(memc
, memcached_return_t(x
));
4726 memcached_return_t ret
= memcached_set(memc
, msg
, strlen(msg
), NULL
, 0, (time_t)0, (uint32_t)0);
4727 test_true_got((ret
== MEMCACHED_CONNECTION_FAILURE
or ret
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
), memcached_last_error_message(memc
));
4729 memcached_server_instance_st disconnected_server
= memcached_server_get_last_disconnect(memc
);
4730 test_true(disconnected_server
);
4731 test_strcmp("localhost", memcached_server_name(disconnected_server
));
4732 test_true(memcached_server_port(disconnected_server
) >= 8888 and memcached_server_port(disconnected_server
) <= 8892);
4736 memcached_reset_last_disconnected_server(memc
);
4741 memcached_free(memc
);
4743 return TEST_SUCCESS
;
4746 static test_return_t
test_verbosity(memcached_st
*memc
)
4748 memcached_verbosity(memc
, 3);
4750 return TEST_SUCCESS
;
4754 static memcached_return_t
stat_printer(memcached_server_instance_st server
,
4755 const char *key
, size_t key_length
,
4756 const char *value
, size_t value_length
,
4766 return MEMCACHED_SUCCESS
;
4769 static test_return_t
memcached_stat_execute_test(memcached_st
*memc
)
4771 memcached_return_t rc
= memcached_stat_execute(memc
, NULL
, stat_printer
, NULL
);
4772 test_compare(MEMCACHED_SUCCESS
, rc
);
4774 test_compare(MEMCACHED_SUCCESS
,
4775 memcached_stat_execute(memc
, "slabs", stat_printer
, NULL
));
4777 test_compare(MEMCACHED_SUCCESS
,
4778 memcached_stat_execute(memc
, "items", stat_printer
, NULL
));
4780 test_compare(MEMCACHED_SUCCESS
,
4781 memcached_stat_execute(memc
, "sizes", stat_printer
, NULL
));
4783 return TEST_SUCCESS
;
4787 * This test ensures that the failure counter isn't incremented during
4788 * normal termination of the memcached instance.
4790 static test_return_t
wrong_failure_counter_test(memcached_st
*memc
)
4792 memcached_return_t rc
;
4793 memcached_server_instance_st instance
;
4795 /* Set value to force connection to the server */
4796 const char *key
= "marmotte";
4797 const char *value
= "milka";
4800 * Please note that I'm abusing the internal structures in libmemcached
4801 * in a non-portable way and you shouldn't be doing this. I'm only
4802 * doing this in order to verify that the library works the way it should
4804 uint32_t number_of_hosts
= memcached_server_count(memc
);
4805 memc
->number_of_hosts
= 1;
4807 /* Ensure that we are connected to the server by setting a value */
4808 rc
= memcached_set(memc
, key
, strlen(key
),
4809 value
, strlen(value
),
4810 (time_t)0, (uint32_t)0);
4811 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
4814 instance
= memcached_server_instance_by_position(memc
, 0);
4815 /* The test is to see that the memcached_quit doesn't increase the
4816 * the server failure conter, so let's ensure that it is zero
4817 * before sending quit
4819 ((memcached_server_write_instance_st
)instance
)->server_failure_counter
= 0;
4821 memcached_quit(memc
);
4823 /* Verify that it memcached_quit didn't increment the failure counter
4824 * Please note that this isn't bullet proof, because an error could
4827 test_zero(instance
->server_failure_counter
);
4829 /* restore the instance */
4830 memc
->number_of_hosts
= number_of_hosts
;
4832 return TEST_SUCCESS
;
4836 * This tests ensures expected disconnections (for some behavior changes
4837 * for instance) do not wrongly increase failure counter
4839 static test_return_t
wrong_failure_counter_two_test(memcached_st
*memc
)
4841 /* Set value to force connection to the server */
4842 const char *key
= "marmotte";
4843 const char *value
= "milka";
4845 test_compare_hint(MEMCACHED_SUCCESS
,
4846 memcached_set(memc
, key
, strlen(key
),
4847 value
, strlen(value
),
4848 (time_t)0, (uint32_t)0),
4849 memcached_last_error_message(memc
));
4852 /* put failure limit to 1 */
4853 test_compare(MEMCACHED_SUCCESS
,
4854 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, true));
4856 /* Put a retry timeout to effectively activate failure_limit effect */
4857 test_compare(MEMCACHED_SUCCESS
,
4858 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, true));
4860 /* change behavior that triggers memcached_quit()*/
4861 test_compare(MEMCACHED_SUCCESS
,
4862 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true));
4865 /* Check if we still are connected */
4867 size_t string_length
;
4868 memcached_return rc
;
4869 char *string
= memcached_get(memc
, key
, strlen(key
),
4870 &string_length
, &flags
, &rc
);
4872 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
4876 return TEST_SUCCESS
;
4881 * Test that ensures mget_execute does not end into recursive calls that finally fails
4883 static test_return_t
regression_bug_490486(memcached_st
*original_memc
)
4887 return TEST_SKIPPED
; // My MAC can't handle this test
4890 test_skip(TEST_SUCCESS
, pre_binary(original_memc
));
4893 * I only want to hit _one_ server so I know the number of requests I'm
4894 * sending in the pipeline.
4896 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL --POLL-TIMEOUT=1000 --REMOVE-FAILED-SERVERS=1 --RETRY-TIMEOUT=3600");
4899 size_t max_keys
= 20480;
4901 char **keys
= (char **)calloc(max_keys
, sizeof(char*));
4902 size_t *key_length
= (size_t *)calloc(max_keys
, sizeof(size_t));
4904 /* First add all of the items.. */
4905 char blob
[1024]= { 0 };
4906 for (size_t x
= 0; x
< max_keys
; ++x
)
4909 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%lu", (unsigned long)x
);
4912 memcached_return rc
= memcached_set(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
4913 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
); // MEMCACHED_TIMEOUT <-- hash been observed on OSX
4918 /* Try to get all of them with a large multiget */
4920 memcached_execute_function callbacks
[]= { &callback_counter
};
4921 memcached_return_t rc
= memcached_mget_execute(memc
, (const char**)keys
, key_length
,
4922 (size_t)max_keys
, callbacks
, &counter
, 1);
4923 test_compare(MEMCACHED_SUCCESS
, rc
);
4925 char* the_value
= NULL
;
4926 char the_key
[MEMCACHED_MAX_KEY
];
4927 size_t the_key_length
;
4928 size_t the_value_length
;
4932 the_value
= memcached_fetch(memc
, the_key
, &the_key_length
, &the_value_length
, &the_flags
, &rc
);
4934 if ((the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
))
4940 } while ( (the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
));
4943 test_compare(MEMCACHED_END
, rc
);
4945 /* Verify that we got all of the items */
4946 test_compare(counter
, max_keys
);
4949 /* Release all allocated resources */
4950 for (size_t x
= 0; x
< max_keys
; ++x
)
4957 memcached_free(memc
);
4959 return TEST_SUCCESS
;
4962 static test_return_t
regression_bug_583031(memcached_st
*)
4964 memcached_st
*memc
= memcached_create(NULL
);
4966 test_compare(MEMCACHED_SUCCESS
, memcached_server_add(memc
, "10.2.3.4", 11211));
4968 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
, 1000);
4969 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 1000);
4970 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
4971 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
4972 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
4973 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, 3);
4975 memcached_return_t rc
;
4979 const char *value
= memcached_get(memc
, "dsf", 3, &length
, &flags
, &rc
);
4983 test_compare_got(MEMCACHED_TIMEOUT
, rc
, memcached_last_error_message(memc
));
4985 memcached_free(memc
);
4987 return TEST_SUCCESS
;
4990 static test_return_t
regression_bug_581030(memcached_st
*)
4993 memcached_stat_st
*local_stat
= memcached_stat(NULL
, NULL
, NULL
);
4994 test_false(local_stat
);
4996 memcached_stat_free(NULL
, NULL
);
4999 return TEST_SUCCESS
;
5002 #define regression_bug_655423_COUNT 6000
5003 static test_return_t
regression_bug_655423(memcached_st
*memc
)
5005 memcached_st
*clone
= memcached_clone(NULL
, memc
);
5006 memc
= NULL
; // Just to make sure it is not used
5011 return TEST_SKIPPED
;
5014 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
5015 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1));
5016 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1));
5017 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH
, 1));
5019 memset(payload
, int('x'), sizeof(payload
));
5021 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5023 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5024 snprintf(key
, sizeof(key
), "%u", x
);
5026 test_compare(MEMCACHED_SUCCESS
, memcached_set(clone
, key
, strlen(key
), payload
, sizeof(payload
), 0, 0));
5029 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5031 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5032 snprintf(key
, sizeof(key
), "%u", x
);
5034 size_t value_length
;
5035 memcached_return_t rc
;
5036 char *value
= memcached_get(clone
, key
, strlen(key
), &value_length
, NULL
, &rc
);
5038 if (rc
== MEMCACHED_NOTFOUND
)
5041 test_zero(value_length
);
5045 test_compare(MEMCACHED_SUCCESS
, rc
);
5047 test_compare(100LLU, value_length
);
5051 char **keys
= (char**)calloc(regression_bug_655423_COUNT
, sizeof(char*));
5052 size_t *key_length
= (size_t *)calloc(regression_bug_655423_COUNT
, sizeof(size_t));
5053 for (uint32_t x
= 0; x
< regression_bug_655423_COUNT
; x
++)
5055 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
5056 snprintf(key
, sizeof(key
), "%u", x
);
5058 keys
[x
]= strdup(key
);
5060 key_length
[x
]= strlen(key
);
5061 test_true(key_length
[x
]);
5064 test_compare(MEMCACHED_SUCCESS
,
5065 memcached_mget(clone
, (const char* const *)keys
, key_length
, regression_bug_655423_COUNT
));
5068 memcached_result_st
*result
= NULL
;
5069 while ((result
= memcached_fetch_result(clone
, result
, NULL
)))
5071 test_compare(size_t(100), memcached_result_length(result
));
5075 test_true(count
> 100); // If we don't get back atleast this, something is up
5077 /* Release all allocated resources */
5078 for (size_t x
= 0; x
< regression_bug_655423_COUNT
; ++x
)
5086 memcached_free(clone
);
5088 return TEST_SUCCESS
;
5092 * Test that ensures that buffered set to not trigger problems during io_flush
5094 #define regression_bug_490520_COUNT 200480
5095 static test_return_t
regression_bug_490520(memcached_st
*memc
)
5097 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
,1);
5098 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
,1);
5099 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
5100 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
,1);
5101 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 3600);
5103 memc
->number_of_hosts
= 1;
5105 char **keys
= (char **)calloc(regression_bug_490520_COUNT
, sizeof(char*));
5106 size_t *key_length
= (size_t *)calloc(regression_bug_490520_COUNT
, sizeof(size_t));
5108 /* First add all of the items.. */
5109 char blob
[3333] = {0};
5110 for (uint32_t x
= 0; x
< regression_bug_490520_COUNT
; ++x
)
5113 key_length
[x
]= (size_t)snprintf(k
, sizeof(k
), "0200%u", x
);
5117 memcached_return rc
= memcached_set(memc
, keys
[x
], key_length
[x
], blob
, sizeof(blob
), 0, 0);
5118 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_last_error_message(memc
));
5121 for (uint32_t x
= 0; x
< regression_bug_490520_COUNT
; ++x
)
5128 return TEST_SUCCESS
;
5132 static test_return_t
regression_bug_854604(memcached_st
*)
5136 test_compare(MEMCACHED_INVALID_ARGUMENTS
, libmemcached_check_configuration(0, 0, buffer
, 0));
5138 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 0));
5140 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 1));
5141 test_compare(buffer
[0], 0);
5143 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 10));
5144 test_true(strlen(buffer
));
5146 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, sizeof(buffer
)));
5147 test_true(strlen(buffer
));
5149 return TEST_SUCCESS
;
5152 static void memcached_die(memcached_st
* mc
, memcached_return error
, const char* what
, uint32_t it
)
5154 fprintf(stderr
, "Iteration #%u: ", it
);
5156 if (error
== MEMCACHED_ERRNO
)
5158 fprintf(stderr
, "system error %d from %s: %s\n",
5159 errno
, what
, strerror(errno
));
5163 fprintf(stderr
, "error %d from %s: %s\n", error
, what
,
5164 memcached_strerror(mc
, error
));
5168 #define TEST_CONSTANT_CREATION 200
5170 static test_return_t
regression_bug_(memcached_st
*memc
)
5172 const char *remote_server
;
5175 if (! (remote_server
= getenv("LIBMEMCACHED_REMOTE_SERVER")))
5177 return TEST_SKIPPED
;
5180 for (uint32_t x
= 0; x
< TEST_CONSTANT_CREATION
; x
++)
5182 memcached_st
* mc
= memcached_create(NULL
);
5183 memcached_return rc
;
5185 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
5186 if (rc
!= MEMCACHED_SUCCESS
)
5188 memcached_die(mc
, rc
, "memcached_behavior_set", x
);
5191 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
, 1);
5192 if (rc
!= MEMCACHED_SUCCESS
)
5194 memcached_die(mc
, rc
, "memcached_behavior_set", x
);
5197 rc
= memcached_server_add(mc
, remote_server
, 0);
5198 if (rc
!= MEMCACHED_SUCCESS
)
5200 memcached_die(mc
, rc
, "memcached_server_add", x
);
5203 const char *set_key
= "akey";
5204 const size_t set_key_len
= strlen(set_key
);
5205 const char *set_value
= "a value";
5206 const size_t set_value_len
= strlen(set_value
);
5208 if (rc
== MEMCACHED_SUCCESS
)
5212 size_t get_value_len
;
5214 uint32_t get_value_flags
;
5216 get_value
= memcached_get(mc
, set_key
, set_key_len
, &get_value_len
,
5217 &get_value_flags
, &rc
);
5218 if (rc
!= MEMCACHED_SUCCESS
)
5220 memcached_die(mc
, rc
, "memcached_get", x
);
5226 (get_value_len
!= set_value_len
5227 || 0!=strncmp(get_value
, set_value
, get_value_len
)))
5229 fprintf(stderr
, "Values don't match?\n");
5230 rc
= MEMCACHED_FAILURE
;
5236 rc
= memcached_set(mc
,
5237 set_key
, set_key_len
,
5238 set_value
, set_value_len
,
5242 if (rc
!= MEMCACHED_SUCCESS
)
5244 memcached_die(mc
, rc
, "memcached_set", x
);
5251 if (rc
!= MEMCACHED_SUCCESS
)
5257 return TEST_SUCCESS
;
5260 /* Clean the server before beginning testing */
5262 {"util_version", true, (test_callback_fn
*)util_version_test
},
5263 {"flush", false, (test_callback_fn
*)flush_test
},
5264 {"init", false, (test_callback_fn
*)init_test
},
5265 {"allocation", false, (test_callback_fn
*)allocation_test
},
5266 {"server_list_null_test", false, (test_callback_fn
*)server_list_null_test
},
5267 {"server_unsort", false, (test_callback_fn
*)server_unsort_test
},
5268 {"server_sort", false, (test_callback_fn
*)server_sort_test
},
5269 {"server_sort2", false, (test_callback_fn
*)server_sort2_test
},
5270 {"memcached_server_remove", false, (test_callback_fn
*)memcached_server_remove_test
},
5271 {"clone_test", false, (test_callback_fn
*)clone_test
},
5272 {"connection_test", false, (test_callback_fn
*)connection_test
},
5273 {"callback_test", false, (test_callback_fn
*)callback_test
},
5274 {"userdata_test", false, (test_callback_fn
*)userdata_test
},
5275 {"memcached_set()", false, (test_callback_fn
*)set_test
},
5276 {"memcached_set() 2", false, (test_callback_fn
*)set_test2
},
5277 {"memcached_set() 3", false, (test_callback_fn
*)set_test3
},
5278 {"add", true, (test_callback_fn
*)add_test
},
5279 {"memcached_fetch_result(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_fetch_result_NOT_FOUND
},
5280 {"replace", true, (test_callback_fn
*)replace_test
},
5281 {"delete", true, (test_callback_fn
*)delete_test
},
5282 {"get", true, (test_callback_fn
*)get_test
},
5283 {"get2", false, (test_callback_fn
*)get_test2
},
5284 {"get3", false, (test_callback_fn
*)get_test3
},
5285 {"get4", false, (test_callback_fn
*)get_test4
},
5286 {"partial mget", false, (test_callback_fn
*)get_test5
},
5287 {"stats_servername", false, (test_callback_fn
*)stats_servername_test
},
5288 {"increment", false, (test_callback_fn
*)increment_test
},
5289 {"increment_with_initial", true, (test_callback_fn
*)increment_with_initial_test
},
5290 {"decrement", false, (test_callback_fn
*)decrement_test
},
5291 {"decrement_with_initial", true, (test_callback_fn
*)decrement_with_initial_test
},
5292 {"increment_by_key", false, (test_callback_fn
*)increment_by_key_test
},
5293 {"increment_with_initial_by_key", true, (test_callback_fn
*)increment_with_initial_by_key_test
},
5294 {"decrement_by_key", false, (test_callback_fn
*)decrement_by_key_test
},
5295 {"decrement_with_initial_by_key", true, (test_callback_fn
*)decrement_with_initial_by_key_test
},
5296 {"binary_increment_with_prefix", true, (test_callback_fn
*)binary_increment_with_prefix_test
},
5297 {"quit", false, (test_callback_fn
*)quit_test
},
5298 {"mget", true, (test_callback_fn
*)mget_test
},
5299 {"mget_result", true, (test_callback_fn
*)mget_result_test
},
5300 {"mget_result_alloc", true, (test_callback_fn
*)mget_result_alloc_test
},
5301 {"mget_result_function", true, (test_callback_fn
*)mget_result_function
},
5302 {"mget_execute", true, (test_callback_fn
*)mget_execute
},
5303 {"mget_end", false, (test_callback_fn
*)mget_end
},
5304 {"get_stats", false, (test_callback_fn
*)get_stats
},
5305 {"add_host_test", false, (test_callback_fn
*)add_host_test
},
5306 {"add_host_test_1", false, (test_callback_fn
*)add_host_test1
},
5307 {"get_stats_keys", false, (test_callback_fn
*)get_stats_keys
},
5308 {"version_string_test", true, (test_callback_fn
*)version_string_test
},
5309 {"memcached_mget() mixed memcached_get()", true, (test_callback_fn
*)memcached_mget_mixed_memcached_get_TEST
},
5310 {"bad_key", true, (test_callback_fn
*)bad_key_test
},
5311 {"memcached_server_cursor", true, (test_callback_fn
*)memcached_server_cursor_test
},
5312 {"read_through", true, (test_callback_fn
*)read_through
},
5313 {"delete_through", true, (test_callback_fn
*)test_MEMCACHED_CALLBACK_DELETE_TRIGGER
},
5314 {"noreply", true, (test_callback_fn
*)noreply_test
},
5315 {"analyzer", true, (test_callback_fn
*)analyzer_test
},
5316 {"memcached_pool_st", true, (test_callback_fn
*)connection_pool_test
},
5317 {"memcached_pool_st #2", true, (test_callback_fn
*)connection_pool2_test
},
5319 {"memcached_pool_st #3", true, (test_callback_fn
*)connection_pool3_test
},
5321 {"memcached_pool_test", true, (test_callback_fn
*)memcached_pool_test
},
5322 {"test_get_last_disconnect", true, (test_callback_fn
*)test_get_last_disconnect
},
5323 {"verbosity", true, (test_callback_fn
*)test_verbosity
},
5324 {"memcached_stat_execute", true, (test_callback_fn
*)memcached_stat_execute_test
},
5325 {"memcached_exist(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_exist_NOTFOUND
},
5326 {"memcached_exist(MEMCACHED_SUCCESS)", true, (test_callback_fn
*)memcached_exist_SUCCESS
},
5327 {"memcached_exist_by_key(MEMCACHED_NOTFOUND)", true, (test_callback_fn
*)memcached_exist_by_key_NOTFOUND
},
5328 {"memcached_exist_by_key(MEMCACHED_SUCCESS)", true, (test_callback_fn
*)memcached_exist_by_key_SUCCESS
},
5329 {"memcached_touch", 0, (test_callback_fn
*)test_memcached_touch
},
5330 {"memcached_touch_with_prefix", 0, (test_callback_fn
*)test_memcached_touch_by_key
},
5332 {"memcached_dump() no data", true, (test_callback_fn
*)memcached_dump_TEST
},
5334 {"memcached_dump() with data", true, (test_callback_fn
*)memcached_dump_TEST2
},
5338 test_st touch_tests
[] ={
5339 {"memcached_touch", 0, (test_callback_fn
*)test_memcached_touch
},
5340 {"memcached_touch_with_prefix", 0, (test_callback_fn
*)test_memcached_touch_by_key
},
5344 test_st memcached_stat_tests
[] ={
5345 {"memcached_stat() INVALID ARG", 0, (test_callback_fn
*)memcached_stat_TEST
},
5346 {"memcached_stat()", 0, (test_callback_fn
*)memcached_stat_TEST2
},
5350 test_st behavior_tests
[] ={
5351 {"libmemcached_string_behavior()", false, (test_callback_fn
*)libmemcached_string_behavior_test
},
5352 {"libmemcached_string_distribution()", false, (test_callback_fn
*)libmemcached_string_distribution_test
},
5353 {"behavior_test", false, (test_callback_fn
*)behavior_test
},
5354 {"MEMCACHED_BEHAVIOR_CORK", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_CORK_test
},
5355 {"MEMCACHED_BEHAVIOR_TCP_KEEPALIVE", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test
},
5356 {"MEMCACHED_BEHAVIOR_TCP_KEEPIDLE", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test
},
5357 {"MEMCACHED_BEHAVIOR_POLL_TIMEOUT", false, (test_callback_fn
*)MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test
},
5358 {"MEMCACHED_CALLBACK_DELETE_TRIGGER_and_MEMCACHED_BEHAVIOR_NOREPLY", false, (test_callback_fn
*)test_MEMCACHED_CALLBACK_DELETE_TRIGGER_and_MEMCACHED_BEHAVIOR_NOREPLY
},
5362 test_st libmemcachedutil_tests
[] ={
5363 {"libmemcached_util_ping()", true, (test_callback_fn
*)ping_test
},
5364 {"libmemcached_util_getpid()", true, (test_callback_fn
*)getpid_test
},
5365 {"libmemcached_util_getpid(MEMCACHED_CONNECTION_FAILURE)", true, (test_callback_fn
*)getpid_connection_failure_test
},
5369 test_st basic_tests
[] ={
5370 {"init", true, (test_callback_fn
*)basic_init_test
},
5371 {"clone", true, (test_callback_fn
*)basic_clone_test
},
5372 {"reset", true, (test_callback_fn
*)basic_reset_stack_test
},
5373 {"reset heap", true, (test_callback_fn
*)basic_reset_heap_test
},
5374 {"reset stack clone", true, (test_callback_fn
*)basic_reset_stack_clone_test
},
5375 {"reset heap clone", true, (test_callback_fn
*)basic_reset_heap_clone_test
},
5376 {"memcached_return_t", false, (test_callback_fn
*)memcached_return_t_TEST
},
5380 test_st regression_binary_vs_block
[] ={
5381 {"block add", true, (test_callback_fn
*)block_add_regression
},
5382 {"binary add", true, (test_callback_fn
*)binary_add_regression
},
5386 test_st async_tests
[] ={
5387 {"add", true, (test_callback_fn
*)add_wrapper
},
5391 test_st memcached_server_get_last_disconnect_tests
[] ={
5392 {"memcached_server_get_last_disconnect()", false, (test_callback_fn
*)test_multiple_get_last_disconnect
},
5393 {0, 0, (test_callback_fn
*)0}
5397 test_st result_tests
[] ={
5398 {"result static", false, (test_callback_fn
*)result_static
},
5399 {"result alloc", false, (test_callback_fn
*)result_alloc
},
5400 {0, 0, (test_callback_fn
*)0}
5403 test_st version_1_2_3
[] ={
5404 {"append", false, (test_callback_fn
*)append_test
},
5405 {"prepend", false, (test_callback_fn
*)prepend_test
},
5406 {"cas", false, (test_callback_fn
*)cas_test
},
5407 {"cas2", false, (test_callback_fn
*)cas2_test
},
5408 {"append_binary", false, (test_callback_fn
*)append_binary_test
},
5409 {0, 0, (test_callback_fn
*)0}
5412 test_st haldenbrand_TESTS
[] ={
5413 {"memcached_set", false, (test_callback_fn
*)haldenbrand_TEST1
},
5414 {"memcached_get()", false, (test_callback_fn
*)haldenbrand_TEST2
},
5415 {"memcached_mget()", false, (test_callback_fn
*)haldenbrand_TEST3
},
5416 {0, 0, (test_callback_fn
*)0}
5419 test_st user_tests
[] ={
5420 {"user_supplied_bug4", true, (test_callback_fn
*)user_supplied_bug4
},
5421 {"user_supplied_bug5", true, (test_callback_fn
*)user_supplied_bug5
},
5422 {"user_supplied_bug6", true, (test_callback_fn
*)user_supplied_bug6
},
5423 {"user_supplied_bug7", true, (test_callback_fn
*)user_supplied_bug7
},
5424 {"user_supplied_bug8", true, (test_callback_fn
*)user_supplied_bug8
},
5425 {"user_supplied_bug9", true, (test_callback_fn
*)user_supplied_bug9
},
5426 {"user_supplied_bug10", true, (test_callback_fn
*)user_supplied_bug10
},
5427 {"user_supplied_bug11", true, (test_callback_fn
*)user_supplied_bug11
},
5428 {"user_supplied_bug12", true, (test_callback_fn
*)user_supplied_bug12
},
5429 {"user_supplied_bug13", true, (test_callback_fn
*)user_supplied_bug13
},
5430 {"user_supplied_bug14", true, (test_callback_fn
*)user_supplied_bug14
},
5431 {"user_supplied_bug15", true, (test_callback_fn
*)user_supplied_bug15
},
5432 {"user_supplied_bug16", true, (test_callback_fn
*)user_supplied_bug16
},
5433 #if !defined(__sun) && !defined(__OpenBSD__)
5435 ** It seems to be something weird with the character sets..
5436 ** value_fetch is unable to parse the value line (iscntrl "fails"), so I
5437 ** guess I need to find out how this is supposed to work.. Perhaps I need
5438 ** to run the test in a specific locale (I tried zh_CN.UTF-8 without success,
5439 ** so just disable the code for now...).
5441 {"user_supplied_bug17", true, (test_callback_fn
*)user_supplied_bug17
},
5443 {"user_supplied_bug18", true, (test_callback_fn
*)user_supplied_bug18
},
5444 {"user_supplied_bug19", true, (test_callback_fn
*)user_supplied_bug19
},
5445 {"user_supplied_bug20", true, (test_callback_fn
*)user_supplied_bug20
},
5446 {"user_supplied_bug21", true, (test_callback_fn
*)user_supplied_bug21
},
5447 {"wrong_failure_counter_test", true, (test_callback_fn
*)wrong_failure_counter_test
},
5448 {"wrong_failure_counter_two_test", true, (test_callback_fn
*)wrong_failure_counter_two_test
},
5449 {0, 0, (test_callback_fn
*)0}
5452 test_st replication_tests
[]= {
5453 {"set", true, (test_callback_fn
*)replication_set_test
},
5454 {"get", false, (test_callback_fn
*)replication_get_test
},
5455 {"mget", false, (test_callback_fn
*)replication_mget_test
},
5456 {"delete", true, (test_callback_fn
*)replication_delete_test
},
5457 {"rand_mget", false, (test_callback_fn
*)replication_randomize_mget_test
},
5458 {"miss", false, (test_callback_fn
*)replication_miss_test
},
5459 {"fail", false, (test_callback_fn
*)replication_randomize_mget_fail_test
},
5460 {0, 0, (test_callback_fn
*)0}
5464 * The following test suite is used to verify that we don't introduce
5465 * regression bugs. If you want more information about the bug / test,
5466 * you should look in the bug report at
5467 * http://bugs.launchpad.net/libmemcached
5469 test_st regression_tests
[]= {
5470 {"lp:434484", true, (test_callback_fn
*)regression_bug_434484
},
5471 {"lp:434843", true, (test_callback_fn
*)regression_bug_434843
},
5472 {"lp:434843-buffered", true, (test_callback_fn
*)regression_bug_434843_buffered
},
5473 {"lp:421108", true, (test_callback_fn
*)regression_bug_421108
},
5474 {"lp:442914", true, (test_callback_fn
*)regression_bug_442914
},
5475 {"lp:447342", true, (test_callback_fn
*)regression_bug_447342
},
5476 {"lp:463297", true, (test_callback_fn
*)regression_bug_463297
},
5477 {"lp:490486", true, (test_callback_fn
*)regression_bug_490486
},
5478 {"lp:583031", true, (test_callback_fn
*)regression_bug_583031
},
5479 {"lp:?", true, (test_callback_fn
*)regression_bug_
},
5480 {"lp:728286", true, (test_callback_fn
*)regression_bug_728286
},
5481 {"lp:581030", true, (test_callback_fn
*)regression_bug_581030
},
5482 {"lp:71231153 connect()", true, (test_callback_fn
*)regression_bug_71231153_connect
},
5483 {"lp:71231153 poll()", true, (test_callback_fn
*)regression_bug_71231153_poll
},
5484 {"lp:655423", true, (test_callback_fn
*)regression_bug_655423
},
5485 {"lp:490520", true, (test_callback_fn
*)regression_bug_490520
},
5486 {"lp:854604", true, (test_callback_fn
*)regression_bug_854604
},
5487 {0, false, (test_callback_fn
*)0}
5490 test_st ketama_compatibility
[]= {
5491 {"libmemcached", true, (test_callback_fn
*)ketama_compatibility_libmemcached
},
5492 {"spymemcached", true, (test_callback_fn
*)ketama_compatibility_spymemcached
},
5493 {0, 0, (test_callback_fn
*)0}
5496 test_st generate_tests
[] ={
5497 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
5498 {"generate_data", true, (test_callback_fn
*)generate_data
},
5499 {"get_read", false, (test_callback_fn
*)get_read
},
5500 {"delete_generate", false, (test_callback_fn
*)delete_generate
},
5501 {"generate_buffer_data", true, (test_callback_fn
*)generate_buffer_data
},
5502 {"delete_buffer", false, (test_callback_fn
*)delete_buffer_generate
},
5503 {"generate_data", true, (test_callback_fn
*)generate_data
},
5504 {"mget_read", false, (test_callback_fn
*)mget_read
},
5505 {"mget_read_result", false, (test_callback_fn
*)mget_read_result
},
5506 {"memcached_fetch_result() use internal result", false, (test_callback_fn
*)mget_read_internal_result
},
5507 {"memcached_fetch_result() partial read", false, (test_callback_fn
*)mget_read_partial_result
},
5508 {"mget_read_function", false, (test_callback_fn
*)mget_read_function
},
5509 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5510 {"generate_large_pairs", true, (test_callback_fn
*)generate_large_pairs
},
5511 {"generate_data", true, (test_callback_fn
*)generate_data
},
5512 {"generate_buffer_data", true, (test_callback_fn
*)generate_buffer_data
},
5513 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5514 {0, 0, (test_callback_fn
*)0}
5517 test_st consistent_tests
[] ={
5518 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
5519 {"generate_data", true, (test_callback_fn
*)generate_data
},
5520 {"get_read", 0, (test_callback_fn
*)get_read_count
},
5521 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5522 {0, 0, (test_callback_fn
*)0}
5525 test_st consistent_weighted_tests
[] ={
5526 {"generate_pairs", true, (test_callback_fn
*)generate_pairs
},
5527 {"generate_data", true, (test_callback_fn
*)generate_data_with_stats
},
5528 {"get_read", false, (test_callback_fn
*)get_read_count
},
5529 {"cleanup", true, (test_callback_fn
*)cleanup_pairs
},
5530 {0, 0, (test_callback_fn
*)0}
5533 test_st hsieh_availability
[] ={
5534 {"hsieh_avaibility_test", false, (test_callback_fn
*)hsieh_avaibility_test
},
5535 {0, 0, (test_callback_fn
*)0}
5538 test_st murmur_availability
[] ={
5539 {"murmur_avaibility_test", false, (test_callback_fn
*)murmur_avaibility_test
},
5540 {0, 0, (test_callback_fn
*)0}
5544 test_st hash_sanity
[] ={
5545 {"hash sanity", 0, (test_callback_fn
*)hash_sanity_test
},
5546 {0, 0, (test_callback_fn
*)0}
5550 test_st ketama_auto_eject_hosts
[] ={
5551 {"auto_eject_hosts", true, (test_callback_fn
*)auto_eject_hosts
},
5552 {"output_ketama_weighted_keys", true, (test_callback_fn
*)output_ketama_weighted_keys
},
5553 {0, 0, (test_callback_fn
*)0}
5556 test_st hash_tests
[] ={
5557 {"one_at_a_time_run", false, (test_callback_fn
*)one_at_a_time_run
},
5558 {"md5", false, (test_callback_fn
*)md5_run
},
5559 {"crc", false, (test_callback_fn
*)crc_run
},
5560 {"fnv1_64", false, (test_callback_fn
*)fnv1_64_run
},
5561 {"fnv1a_64", false, (test_callback_fn
*)fnv1a_64_run
},
5562 {"fnv1_32", false, (test_callback_fn
*)fnv1_32_run
},
5563 {"fnv1a_32", false, (test_callback_fn
*)fnv1a_32_run
},
5564 {"hsieh", false, (test_callback_fn
*)hsieh_run
},
5565 {"murmur", false, (test_callback_fn
*)murmur_run
},
5566 {"jenkis", false, (test_callback_fn
*)jenkins_run
},
5567 {"memcached_get_hashkit", false, (test_callback_fn
*)memcached_get_hashkit_test
},
5568 {0, 0, (test_callback_fn
*)0}
5571 test_st error_conditions
[] ={
5572 {"memcached_get(MEMCACHED_ERRNO)", false, (test_callback_fn
*)memcached_get_MEMCACHED_ERRNO
},
5573 {"memcached_get(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_MEMCACHED_NOTFOUND
},
5574 {"memcached_get_by_key(MEMCACHED_ERRNO)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_ERRNO
},
5575 {"memcached_get_by_key(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_NOTFOUND
},
5576 {"memcached_get_by_key(MEMCACHED_NOTFOUND)", false, (test_callback_fn
*)memcached_get_by_key_MEMCACHED_NOTFOUND
},
5577 {"memcached_increment(MEMCACHED_NO_SERVERS)", false, (test_callback_fn
*)memcached_increment_MEMCACHED_NO_SERVERS
},
5578 {0, 0, (test_callback_fn
*)0}
5581 test_st parser_tests
[] ={
5582 {"behavior", false, (test_callback_fn
*)behavior_parser_test
},
5583 {"boolean_options", false, (test_callback_fn
*)parser_boolean_options_test
},
5584 {"configure_file", false, (test_callback_fn
*)memcached_create_with_options_with_filename
},
5585 {"distribtions", false, (test_callback_fn
*)parser_distribution_test
},
5586 {"hash", false, (test_callback_fn
*)parser_hash_test
},
5587 {"libmemcached_check_configuration", false, (test_callback_fn
*)libmemcached_check_configuration_test
},
5588 {"libmemcached_check_configuration_with_filename", false, (test_callback_fn
*)libmemcached_check_configuration_with_filename_test
},
5589 {"number_options", false, (test_callback_fn
*)parser_number_options_test
},
5590 {"randomly generated options", false, (test_callback_fn
*)random_statement_build_test
},
5591 {"namespace", false, (test_callback_fn
*)parser_key_prefix_test
},
5592 {"server", false, (test_callback_fn
*)server_test
},
5593 {"bad server strings", false, (test_callback_fn
*)servers_bad_test
},
5594 {"server with weights", false, (test_callback_fn
*)server_with_weight_test
},
5595 {"parsing servername, port, and weight", false, (test_callback_fn
*)test_hostname_port_weight
},
5596 {"--socket=", false, (test_callback_fn
*)test_parse_socket
},
5597 {"--namespace=", false, (test_callback_fn
*)test_namespace_keyword
},
5598 {0, 0, (test_callback_fn
*)0}
5601 test_st virtual_bucket_tests
[] ={
5602 {"basic", false, (test_callback_fn
*)virtual_back_map
},
5603 {0, 0, (test_callback_fn
*)0}
5606 test_st memcached_server_add_tests
[] ={
5607 {"memcached_server_add(\"\")", false, (test_callback_fn
*)memcached_server_add_empty_test
},
5608 {"memcached_server_add(NULL)", false, (test_callback_fn
*)memcached_server_add_null_test
},
5609 {0, 0, (test_callback_fn
*)0}
5612 test_st namespace_tests
[] ={
5613 {"basic tests", true, (test_callback_fn
*)selection_of_namespace_tests
},
5614 {"increment", true, (test_callback_fn
*)memcached_increment_namespace
},
5615 {0, 0, (test_callback_fn
*)0}
5618 collection_st collection
[] ={
5620 {"hash_sanity", 0, 0, hash_sanity
},
5622 {"libmemcachedutil", 0, 0, libmemcachedutil_tests
},
5623 {"basic", 0, 0, basic_tests
},
5624 {"hsieh_availability", 0, 0, hsieh_availability
},
5625 {"murmur_availability", 0, 0, murmur_availability
},
5626 {"memcached_server_add", 0, 0, memcached_server_add_tests
},
5627 {"block", 0, 0, tests
},
5628 {"binary", (test_callback_fn
*)pre_binary
, 0, tests
},
5629 {"nonblock", (test_callback_fn
*)pre_nonblock
, 0, tests
},
5630 {"nodelay", (test_callback_fn
*)pre_nodelay
, 0, tests
},
5631 {"settimer", (test_callback_fn
*)pre_settimer
, 0, tests
},
5632 {"md5", (test_callback_fn
*)pre_md5
, 0, tests
},
5633 {"crc", (test_callback_fn
*)pre_crc
, 0, tests
},
5634 {"hsieh", (test_callback_fn
*)pre_hsieh
, 0, tests
},
5635 {"jenkins", (test_callback_fn
*)pre_jenkins
, 0, tests
},
5636 {"fnv1_64", (test_callback_fn
*)pre_hash_fnv1_64
, 0, tests
},
5637 {"fnv1a_64", (test_callback_fn
*)pre_hash_fnv1a_64
, 0, tests
},
5638 {"fnv1_32", (test_callback_fn
*)pre_hash_fnv1_32
, 0, tests
},
5639 {"fnv1a_32", (test_callback_fn
*)pre_hash_fnv1a_32
, 0, tests
},
5640 {"ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, tests
},
5641 {"ketama_auto_eject_hosts", (test_callback_fn
*)pre_behavior_ketama
, 0, ketama_auto_eject_hosts
},
5642 {"unix_socket", (test_callback_fn
*)pre_unix_socket
, 0, tests
},
5643 {"unix_socket_nodelay", (test_callback_fn
*)pre_nodelay
, 0, tests
},
5644 {"gets", (test_callback_fn
*)enable_cas
, 0, tests
},
5645 {"consistent_crc", (test_callback_fn
*)enable_consistent_crc
, 0, tests
},
5646 {"consistent_hsieh", (test_callback_fn
*)enable_consistent_hsieh
, 0, tests
},
5647 #ifdef MEMCACHED_ENABLE_DEPRECATED
5648 {"deprecated_memory_allocators", (test_callback_fn
*)deprecated_set_memory_alloc
, 0, tests
},
5650 {"memory_allocators", (test_callback_fn
*)set_memory_alloc
, 0, tests
},
5651 {"namespace", (test_callback_fn
*)set_namespace
, 0, tests
},
5652 {"namespace(BINARY)", (test_callback_fn
*)set_namespace_and_binary
, 0, tests
},
5653 {"specific namespace", 0, 0, namespace_tests
},
5654 {"specific namespace(BINARY)", (test_callback_fn
*)pre_binary
, 0, namespace_tests
},
5655 {"version_1_2_3", (test_callback_fn
*)check_for_1_2_3
, 0, version_1_2_3
},
5656 {"result", 0, 0, result_tests
},
5657 {"async", (test_callback_fn
*)pre_nonblock
, 0, async_tests
},
5658 {"async(BINARY)", (test_callback_fn
*)pre_nonblock_binary
, 0, async_tests
},
5659 {"Cal Haldenbrand's tests", 0, 0, haldenbrand_TESTS
},
5660 {"user written tests", 0, 0, user_tests
},
5661 {"generate", 0, 0, generate_tests
},
5662 {"generate_hsieh", (test_callback_fn
*)pre_hsieh
, 0, generate_tests
},
5663 {"generate_ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, generate_tests
},
5664 {"generate_hsieh_consistent", (test_callback_fn
*)enable_consistent_hsieh
, 0, generate_tests
},
5665 {"generate_md5", (test_callback_fn
*)pre_md5
, 0, generate_tests
},
5666 {"generate_murmur", (test_callback_fn
*)pre_murmur
, 0, generate_tests
},
5667 {"generate_jenkins", (test_callback_fn
*)pre_jenkins
, 0, generate_tests
},
5668 {"generate_nonblock", (test_callback_fn
*)pre_nonblock
, 0, generate_tests
},
5670 {"generate_corked", (test_callback_fn
*)pre_cork
, 0, generate_tests
},
5671 {"generate_corked_and_nonblock", (test_callback_fn
*)pre_cork_and_nonblock
, 0, generate_tests
},
5672 {"consistent_not", 0, 0, consistent_tests
},
5673 {"consistent_ketama", (test_callback_fn
*)pre_behavior_ketama
, 0, consistent_tests
},
5674 {"consistent_ketama_weighted", (test_callback_fn
*)pre_behavior_ketama_weighted
, 0, consistent_weighted_tests
},
5675 {"ketama_compat", 0, 0, ketama_compatibility
},
5676 {"test_hashes", 0, 0, hash_tests
},
5677 {"replication", (test_callback_fn
*)pre_replication
, 0, replication_tests
},
5678 {"replication_noblock", (test_callback_fn
*)pre_replication_noblock
, 0, replication_tests
},
5679 {"regression", 0, 0, regression_tests
},
5680 {"behaviors", 0, 0, behavior_tests
},
5681 {"regression_binary_vs_block", (test_callback_fn
*)key_setup
, (test_callback_fn
*)key_teardown
, regression_binary_vs_block
},
5682 {"error_conditions", 0, 0, error_conditions
},
5683 {"parser", 0, 0, parser_tests
},
5684 {"virtual buckets", 0, 0, virtual_bucket_tests
},
5685 {"memcached_server_get_last_disconnect", 0, 0, memcached_server_get_last_disconnect_tests
},
5686 {"touch", 0, 0, touch_tests
},
5687 {"touch", (test_callback_fn
*)pre_binary
, 0, touch_tests
},
5688 {"memcached_stat()", 0, 0, memcached_stat_tests
},
5692 #define TEST_PORT_BASE MEMCACHED_DEFAULT_PORT +10
5694 #include "tests/libmemcached_world.h"
5696 void get_world(Framework
*world
)
5698 world
->collections
= collection
;
5700 world
->_create
= (test_callback_create_fn
*)world_create
;
5701 world
->_destroy
= (test_callback_destroy_fn
*)world_destroy
;
5703 world
->item
._startup
= (test_callback_fn
*)world_test_startup
;
5704 world
->item
.set_pre((test_callback_fn
*)world_pre_run
);
5705 world
->item
.set_flush((test_callback_fn
*)world_flush
);
5706 world
->item
.set_post((test_callback_fn
*)world_post_run
);
5707 world
->_on_error
= (test_callback_error_fn
*)world_on_error
;
5709 world
->collection_startup
= (test_callback_fn
*)world_container_startup
;
5710 world
->collection_shutdown
= (test_callback_fn
*)world_container_shutdown
;
5712 world
->set_runner(&defualt_libmemcached_runner
);
5714 world
->set_socket();