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>
58 #include <semaphore.h>
62 #include <sys/types.h>
67 #include <libtest/server.h>
69 #include "clients/generator.h"
71 #define SMALL_STRING_LEN 1024
73 #include <libtest/test.hpp>
75 using namespace libtest
;
77 #include <libmemcached/util.h>
79 #include "tests/hash_results.h"
81 #include "tests/libmemcached-1.0/callback_counter.h"
82 #include "tests/libmemcached-1.0/fetch_all_results.h"
83 #include "tests/libmemcached-1.0/mem_functions.h"
84 #include "tests/libmemcached-1.0/setup_and_teardowns.h"
85 #include "tests/print.h"
86 #include "tests/debug.h"
88 #define UUID_STRING_MAXLENGTH 36
90 #include "tests/keys.hpp"
92 static memcached_st
* create_single_instance_memcached(const memcached_st
*original_memc
, const char *options
)
95 If no options are given, copy over at least the binary flag.
97 char options_buffer
[1024]= { 0 };
100 if (memcached_is_binary(original_memc
))
102 snprintf(options_buffer
, sizeof(options_buffer
), "--BINARY");
107 * I only want to hit _one_ server so I know the number of requests I'm
108 * sending in the pipeline.
110 memcached_server_instance_st instance
= memcached_server_instance_by_position(original_memc
, 0);
112 char server_string
[1024];
113 int server_string_length
;
114 if (instance
->type
== MEMCACHED_CONNECTION_UNIX_SOCKET
)
118 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--SOCKET=\"%s\" %s",
119 memcached_server_name(instance
), options
);
123 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--SOCKET=\"%s\"",
124 memcached_server_name(instance
));
131 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--server=%s:%d %s",
132 memcached_server_name(instance
), int(memcached_server_port(instance
)),
137 server_string_length
= snprintf(server_string
, sizeof(server_string
), "--server=%s:%d",
138 memcached_server_name(instance
), int(memcached_server_port(instance
)));
142 if (server_string_length
<= 0)
147 char errror_buffer
[1024];
148 if (memcached_failed(libmemcached_check_configuration(server_string
, server_string_length
, errror_buffer
, sizeof(errror_buffer
))))
150 Error
<< "Failed to parse (" << server_string
<< ") " << errror_buffer
;
154 return memcached(server_string
, server_string_length
);
158 test_return_t
init_test(memcached_st
*not_used
)
163 (void)memcached_create(&memc
);
164 memcached_free(&memc
);
169 #define TEST_PORT_COUNT 7
170 in_port_t test_ports
[TEST_PORT_COUNT
];
172 static memcached_return_t
server_display_function(const memcached_st
*ptr
,
173 const memcached_server_st
*server
,
177 size_t bigger
= *((size_t *)(context
));
179 fatal_assert(bigger
<= memcached_server_port(server
));
180 *((size_t *)(context
))= memcached_server_port(server
);
182 return MEMCACHED_SUCCESS
;
185 static memcached_return_t
dump_server_information(const memcached_st
*ptr
,
186 const memcached_server_st
*instance
,
190 FILE *stream
= (FILE *)context
;
193 fprintf(stream
, "Memcached Server: %s %u Version %u.%u.%u\n",
194 memcached_server_name(instance
),
195 memcached_server_port(instance
),
196 instance
->major_version
,
197 instance
->minor_version
,
198 instance
->micro_version
);
200 return MEMCACHED_SUCCESS
;
203 test_return_t
server_sort_test(memcached_st
*ptr
)
205 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
207 memcached_return_t rc
;
208 memcached_server_fn callbacks
[1];
209 memcached_st
*local_memc
;
212 local_memc
= memcached_create(NULL
);
213 test_true(local_memc
);
214 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
216 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
218 test_ports
[x
]= (in_port_t
)random() % 64000;
219 rc
= memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0);
220 test_compare(memcached_server_count(local_memc
), x
+1);
222 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
224 test_compare(MEMCACHED_SUCCESS
, rc
);
227 callbacks
[0]= server_display_function
;
228 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
231 memcached_free(local_memc
);
236 test_return_t
server_sort2_test(memcached_st
*ptr
)
238 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
239 memcached_server_fn callbacks
[1];
240 memcached_st
*local_memc
;
241 memcached_server_instance_st instance
;
244 local_memc
= memcached_create(NULL
);
245 test_true(local_memc
);
246 test_compare(MEMCACHED_SUCCESS
,
247 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1));
249 test_compare(MEMCACHED_SUCCESS
,
250 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43043, 0));
251 instance
= memcached_server_instance_by_position(local_memc
, 0);
252 test_compare(in_port_t(43043), memcached_server_port(instance
));
254 test_compare(MEMCACHED_SUCCESS
,
255 memcached_server_add_with_weight(local_memc
, "MEMCACHED_BEHAVIOR_SORT_HOSTS", 43042, 0));
257 instance
= memcached_server_instance_by_position(local_memc
, 0);
258 test_compare(in_port_t(43042), memcached_server_port(instance
));
260 instance
= memcached_server_instance_by_position(local_memc
, 1);
261 test_compare(in_port_t(43043), memcached_server_port(instance
));
263 callbacks
[0]= server_display_function
;
264 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
267 memcached_free(local_memc
);
272 test_return_t
memcached_server_remove_test(memcached_st
*)
274 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";
277 test_compare(MEMCACHED_SUCCESS
,
278 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
279 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
282 memcached_server_fn callbacks
[1];
283 callbacks
[0]= server_print_callback
;
284 memcached_server_cursor(memc
, callbacks
, NULL
, 1);
286 memcached_free(memc
);
291 static memcached_return_t
server_display_unsort_function(const memcached_st
*,
292 const memcached_server_st
*server
,
296 uint32_t x
= *((uint32_t *)(context
));
298 if (! (test_ports
[x
] == server
->port
))
300 fprintf(stderr
, "%lu -> %lu\n", (unsigned long)test_ports
[x
], (unsigned long)server
->port
);
301 return MEMCACHED_FAILURE
;
304 *((uint32_t *)(context
))= ++x
;
306 return MEMCACHED_SUCCESS
;
309 test_return_t
server_unsort_test(memcached_st
*ptr
)
311 size_t counter
= 0; /* Prime the value for the test_true in server_display_function */
312 size_t bigger
= 0; /* Prime the value for the test_true in server_display_function */
313 memcached_server_fn callbacks
[1];
314 memcached_st
*local_memc
;
317 local_memc
= memcached_create(NULL
);
318 test_true(local_memc
);
320 for (uint32_t x
= 0; x
< TEST_PORT_COUNT
; x
++)
322 test_ports
[x
]= (in_port_t
)(random() % 64000);
323 test_compare(MEMCACHED_SUCCESS
,
324 memcached_server_add_with_weight(local_memc
, "localhost", test_ports
[x
], 0));
325 test_compare(memcached_server_count(local_memc
), x
+1);
327 test_true(memcached_server_list_count(memcached_server_list(local_memc
)) == x
+1);
331 callbacks
[0]= server_display_unsort_function
;
332 memcached_server_cursor(local_memc
, callbacks
, (void *)&counter
, 1);
334 /* Now we sort old data! */
335 memcached_behavior_set(local_memc
, MEMCACHED_BEHAVIOR_SORT_HOSTS
, 1);
336 callbacks
[0]= server_display_function
;
337 memcached_server_cursor(local_memc
, callbacks
, (void *)&bigger
, 1);
340 memcached_free(local_memc
);
345 test_return_t
allocation_test(memcached_st
*not_used
)
349 memc
= memcached_create(NULL
);
351 memcached_free(memc
);
356 test_return_t
clone_test(memcached_st
*memc
)
360 memcached_st
*memc_clone
;
361 memc_clone
= memcached_clone(NULL
, NULL
);
362 test_true(memc_clone
);
363 memcached_free(memc_clone
);
366 /* Can we init from null? */
368 memcached_st
*memc_clone
;
369 memc_clone
= memcached_clone(NULL
, memc
);
370 test_true(memc_clone
);
373 test_true(memc_clone
->allocators
.free
== memc
->allocators
.free
);
374 test_true(memc_clone
->allocators
.malloc
== memc
->allocators
.malloc
);
375 test_true(memc_clone
->allocators
.realloc
== memc
->allocators
.realloc
);
376 test_true(memc_clone
->allocators
.calloc
== memc
->allocators
.calloc
);
379 test_true(memc_clone
->connect_timeout
== memc
->connect_timeout
);
380 test_true(memc_clone
->delete_trigger
== memc
->delete_trigger
);
381 test_true(memc_clone
->distribution
== memc
->distribution
);
382 { // Test all of the flags
383 test_true(memc_clone
->flags
.no_block
== memc
->flags
.no_block
);
384 test_true(memc_clone
->flags
.tcp_nodelay
== memc
->flags
.tcp_nodelay
);
385 test_true(memc_clone
->flags
.support_cas
== memc
->flags
.support_cas
);
386 test_true(memc_clone
->flags
.buffer_requests
== memc
->flags
.buffer_requests
);
387 test_true(memc_clone
->flags
.use_sort_hosts
== memc
->flags
.use_sort_hosts
);
388 test_true(memc_clone
->flags
.verify_key
== memc
->flags
.verify_key
);
389 test_true(memc_clone
->ketama
.weighted
== memc
->ketama
.weighted
);
390 test_true(memc_clone
->flags
.binary_protocol
== memc
->flags
.binary_protocol
);
391 test_true(memc_clone
->flags
.hash_with_namespace
== memc
->flags
.hash_with_namespace
);
392 test_true(memc_clone
->flags
.reply
== memc
->flags
.reply
);
393 test_true(memc_clone
->flags
.use_udp
== memc
->flags
.use_udp
);
394 test_true(memc_clone
->flags
.auto_eject_hosts
== memc
->flags
.auto_eject_hosts
);
395 test_true(memc_clone
->flags
.randomize_replica_read
== memc
->flags
.randomize_replica_read
);
397 test_true(memc_clone
->get_key_failure
== memc
->get_key_failure
);
398 test_true(hashkit_compare(&memc_clone
->hashkit
, &memc
->hashkit
));
399 test_true(memc_clone
->io_bytes_watermark
== memc
->io_bytes_watermark
);
400 test_true(memc_clone
->io_msg_watermark
== memc
->io_msg_watermark
);
401 test_true(memc_clone
->io_key_prefetch
== memc
->io_key_prefetch
);
402 test_true(memc_clone
->on_cleanup
== memc
->on_cleanup
);
403 test_true(memc_clone
->on_clone
== memc
->on_clone
);
404 test_true(memc_clone
->poll_timeout
== memc
->poll_timeout
);
405 test_true(memc_clone
->rcv_timeout
== memc
->rcv_timeout
);
406 test_true(memc_clone
->recv_size
== memc
->recv_size
);
407 test_true(memc_clone
->retry_timeout
== memc
->retry_timeout
);
408 test_true(memc_clone
->send_size
== memc
->send_size
);
409 test_true(memc_clone
->server_failure_limit
== memc
->server_failure_limit
);
410 test_true(memc_clone
->snd_timeout
== memc
->snd_timeout
);
411 test_true(memc_clone
->user_data
== memc
->user_data
);
413 memcached_free(memc_clone
);
416 /* Can we init from struct? */
418 memcached_st declared_clone
;
419 memcached_st
*memc_clone
;
420 memset(&declared_clone
, 0 , sizeof(memcached_st
));
421 memc_clone
= memcached_clone(&declared_clone
, NULL
);
422 test_true(memc_clone
);
423 memcached_free(memc_clone
);
426 /* Can we init from struct? */
428 memcached_st declared_clone
;
429 memcached_st
*memc_clone
;
430 memset(&declared_clone
, 0 , sizeof(memcached_st
));
431 memc_clone
= memcached_clone(&declared_clone
, memc
);
432 test_true(memc_clone
);
433 memcached_free(memc_clone
);
439 test_return_t
userdata_test(memcached_st
*memc
)
442 test_false(memcached_set_user_data(memc
, foo
));
443 test_true(memcached_get_user_data(memc
) == foo
);
444 test_true(memcached_set_user_data(memc
, NULL
) == foo
);
449 test_return_t
connection_test(memcached_st
*memc
)
451 test_compare(MEMCACHED_SUCCESS
,
452 memcached_server_add_with_weight(memc
, "localhost", 0, 0));
457 test_return_t
libmemcached_string_behavior_test(memcached_st
*)
459 for (int x
= MEMCACHED_BEHAVIOR_NO_BLOCK
; x
< int(MEMCACHED_BEHAVIOR_MAX
); ++x
)
461 test_true(libmemcached_string_behavior(memcached_behavior_t(x
)));
463 test_compare(37, int(MEMCACHED_BEHAVIOR_MAX
));
468 test_return_t
libmemcached_string_distribution_test(memcached_st
*)
470 for (int x
= MEMCACHED_DISTRIBUTION_MODULA
; x
< int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
); ++x
)
472 test_true(libmemcached_string_distribution(memcached_server_distribution_t(x
)));
474 test_compare(7, int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX
));
479 test_return_t
memcached_return_t_TEST(memcached_st
*memc
)
481 uint32_t values
[] = { 851992627U, 2337886783U, 4109241422U, 4001849190U,
482 982370485U, 1263635348U, 4242906218U, 3829656100U,
483 1891735253U, 334139633U, 2257084983U, 3351789013U,
484 13199785U, 2542027183U, 1097051614U, 199566778U,
485 2748246961U, 2465192557U, 1664094137U, 2405439045U,
486 1842224848U, 692413798U, 3479807801U, 919913813U,
487 4269430871U, 610793021U, 527273862U, 1437122909U,
488 2300930706U, 2943759320U, 674306647U, 2400528935U,
489 54481931U, 4186304426U, 1741088401U, 2979625118U,
490 4159057246U, 3425930182U, 2593724503U, 1868899624U,
491 1769812374U, 2302537950U, 1110330676U, 3365377466U,
492 1336171666U, 3021258493U, 2334992265U, 3861994737U,
493 3582734124U, 3365377466U };
495 // You have updated the memcache_error messages but not updated docs/tests.
496 for (int rc
= int(MEMCACHED_SUCCESS
); rc
< int(MEMCACHED_MAXIMUM_RETURN
); ++rc
)
499 const char *msg
= memcached_strerror(memc
, memcached_return_t(rc
));
500 hash_val
= memcached_generate_hash_value(msg
, strlen(msg
),
501 MEMCACHED_HASH_JENKINS
);
502 if (values
[rc
] != hash_val
)
504 fprintf(stderr
, "\n\nYou have updated memcached_return_t without updating the memcached_return_t_TEST\n");
505 fprintf(stderr
, "%u, %s, (%u)\n\n", (uint32_t)rc
, memcached_strerror(memc
, memcached_return_t(rc
)), hash_val
);
507 test_compare(values
[rc
], hash_val
);
509 test_compare(49, int(MEMCACHED_MAXIMUM_RETURN
));
514 test_return_t
set_test(memcached_st
*memc
)
516 memcached_return_t rc
= memcached_set(memc
,
517 test_literal_param("foo"),
518 test_literal_param("when we sanitize"),
519 time_t(0), (uint32_t)0);
520 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_last_error_message(memc
));
525 test_return_t
append_test(memcached_st
*memc
)
527 memcached_return_t rc
;
528 const char *in_value
= "we";
532 test_compare(MEMCACHED_SUCCESS
,
533 memcached_flush(memc
, 0));
535 test_compare(MEMCACHED_SUCCESS
,
537 test_literal_param(__func__
),
538 in_value
, strlen(in_value
),
539 time_t(0), uint32_t(0)));
541 test_compare(MEMCACHED_SUCCESS
,
542 memcached_append(memc
,
543 test_literal_param(__func__
),
544 " the", strlen(" the"),
545 time_t(0), uint32_t(0)));
547 test_compare(MEMCACHED_SUCCESS
,
548 memcached_append(memc
,
549 test_literal_param(__func__
),
550 " people", strlen(" people"),
551 time_t(0), uint32_t(0)));
553 char *out_value
= memcached_get(memc
,
554 test_literal_param(__func__
),
555 &value_length
, &flags
, &rc
);
556 test_memcmp(out_value
, "we the people", strlen("we the people"));
557 test_compare(strlen("we the people"), value_length
);
558 test_compare(MEMCACHED_SUCCESS
, rc
);
564 test_return_t
append_binary_test(memcached_st
*memc
)
566 uint32_t store_list
[] = { 23, 56, 499, 98, 32847, 0 };
568 test_compare(MEMCACHED_SUCCESS
,
569 memcached_flush(memc
, 0));
571 test_compare(MEMCACHED_SUCCESS
,
573 test_literal_param(__func__
),
575 time_t(0), uint32_t(0)));
578 for (uint32_t x
= 0; store_list
[x
] ; x
++)
580 test_compare(MEMCACHED_SUCCESS
,
581 memcached_append(memc
,
582 test_literal_param(__func__
),
583 (char *)&store_list
[x
], sizeof(uint32_t),
584 time_t(0), uint32_t(0)));
590 memcached_return_t rc
;
591 uint32_t *value
= (uint32_t *)memcached_get(memc
,
592 test_literal_param(__func__
),
593 &value_length
, &flags
, &rc
);
594 test_compare(value_length
, sizeof(uint32_t) * count
);
595 test_compare(MEMCACHED_SUCCESS
, rc
);
597 for (uint32_t counter
= count
, *ptr
= value
; counter
; counter
--)
599 test_compare(*ptr
, store_list
[count
- counter
]);
607 test_return_t
memcached_mget_mixed_memcached_get_TEST(memcached_st
*memc
)
611 for (libtest::vchar_ptr_t::iterator iter
= keys
.begin();
615 test_compare_hint(MEMCACHED_SUCCESS
,
619 time_t(0), uint32_t(0)),
620 memcached_last_error_message(memc
));
623 for (ptrdiff_t loop
= 0; loop
< 20; loop
++)
627 test_compare(MEMCACHED_SUCCESS
,
628 memcached_mget(memc
, keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
630 memcached_result_st
*results
= memcached_result_create(memc
, NULL
);
633 size_t result_count
= 0;
634 memcached_return_t rc
;
635 while (memcached_fetch_result(memc
, results
, &rc
))
639 test_true(keys
.size() >= result_count
);
643 int which_key
= random() %keys
.size();
646 memcached_return_t rc
;
647 char *out_value
= memcached_get(memc
, keys
.key_at(which_key
), keys
.length_at(which_key
),
648 &value_length
, &flags
, &rc
);
649 if (rc
== MEMCACHED_NOTFOUND
)
650 { } // It is possible that the value has been purged.
653 test_compare(MEMCACHED_SUCCESS
, rc
);
655 test_null(out_value
);
656 test_zero(value_length
);
664 test_return_t
cas2_test(memcached_st
*memc
)
666 const char *keys
[]= {"fudge", "son", "food"};
667 size_t key_length
[]= {5, 3, 4};
668 const char *value
= "we the people";
669 size_t value_length
= strlen("we the people");
671 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
673 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
675 for (uint32_t x
= 0; x
< 3; x
++)
677 test_compare(MEMCACHED_SUCCESS
,
678 memcached_set(memc
, keys
[x
], key_length
[x
],
679 keys
[x
], key_length
[x
],
680 time_t(50), uint32_t(9)));
683 test_compare(MEMCACHED_SUCCESS
,
684 memcached_mget(memc
, keys
, key_length
, 3));
686 memcached_result_st
*results
= memcached_result_create(memc
, NULL
);
689 memcached_return_t rc
;
690 results
= memcached_fetch_result(memc
, results
, &rc
);
692 test_true(results
->item_cas
);
693 test_compare(MEMCACHED_SUCCESS
, rc
);
694 test_true(memcached_result_cas(results
));
696 test_memcmp(value
, "we the people", strlen("we the people"));
697 test_compare(strlen("we the people"), value_length
);
698 test_compare(MEMCACHED_SUCCESS
, rc
);
700 memcached_result_free(results
);
705 test_return_t
cas_test(memcached_st
*memc
)
707 const char* keys
[2] = { __func__
, NULL
};
708 size_t keylengths
[2] = { strlen(__func__
), 0 };
710 memcached_result_st results_obj
;
712 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
714 test_skip(true, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
716 test_compare(MEMCACHED_SUCCESS
,
718 test_literal_param(__func__
),
719 test_literal_param("we the people"),
720 (time_t)0, (uint32_t)0));
722 test_compare(MEMCACHED_SUCCESS
,
723 memcached_mget(memc
, keys
, keylengths
, 1));
725 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
728 memcached_return_t rc
;
729 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
731 test_compare(MEMCACHED_SUCCESS
, rc
);
732 test_true(memcached_result_cas(results
));
733 test_memcmp("we the people", memcached_result_value(results
), test_literal_param_size("we the people"));
734 test_compare(test_literal_param_size("we the people"),
735 strlen(memcached_result_value(results
)));
737 uint64_t cas
= memcached_result_cas(results
);
740 results
= memcached_fetch_result(memc
, &results_obj
, &rc
);
741 test_true(rc
== MEMCACHED_END
);
742 test_true(results
== NULL
);
745 test_compare(MEMCACHED_SUCCESS
,
747 test_literal_param(__func__
),
748 test_literal_param("change the value"),
752 * The item will have a new cas value, so try to set it again with the old
753 * value. This should fail!
755 test_compare(MEMCACHED_DATA_EXISTS
,
757 test_literal_param(__func__
),
758 test_literal_param("change the value"),
761 memcached_result_free(&results_obj
);
767 test_return_t
prepend_test(memcached_st
*memc
)
769 const char *key
= "fig";
770 const char *value
= "people";
772 test_compare(MEMCACHED_SUCCESS
,
773 memcached_flush(memc
, 0));
775 test_compare(MEMCACHED_SUCCESS
,
776 memcached_set(memc
, key
, strlen(key
),
777 value
, strlen(value
),
778 time_t(0), uint32_t(0)));
780 test_compare(MEMCACHED_SUCCESS
,
781 memcached_prepend(memc
, key
, strlen(key
),
782 "the ", strlen("the "),
783 time_t(0), uint32_t(0)));
785 test_compare(MEMCACHED_SUCCESS
,
786 memcached_prepend(memc
, key
, strlen(key
),
787 "we ", strlen("we "),
788 time_t(0), uint32_t(0)));
792 memcached_return_t rc
;
793 char *out_value
= memcached_get(memc
, key
, strlen(key
),
794 &value_length
, &flags
, &rc
);
795 test_memcmp(out_value
, "we the people", strlen("we the people"));
796 test_compare(strlen("we the people"), value_length
);
797 test_compare(MEMCACHED_SUCCESS
, rc
);
804 Set the value, then quit to make sure it is flushed.
805 Come back in and test that add fails.
807 test_return_t
memcached_add_SUCCESS_TEST(memcached_st
*memc
)
809 memcached_return_t rc
;
810 test_null(memcached_get(memc
, test_literal_param(__func__
), NULL
, NULL
, &rc
));
811 test_compare(MEMCACHED_NOTFOUND
, rc
);
813 test_compare(MEMCACHED_SUCCESS
,
815 test_literal_param(__func__
),
816 test_literal_param("try something else"),
817 time_t(0), uint32_t(0)));
823 Set the value, then quit to make sure it is flushed.
824 Come back in and test that add fails.
826 test_return_t
add_test(memcached_st
*memc
)
828 test_compare(return_value_based_on_buffering(memc
),
830 test_literal_param(__func__
),
831 test_literal_param("when we sanitize"),
832 time_t(0), uint32_t(0)));
834 memcached_quit(memc
);
838 memcached_return_t rc
;
839 char *check_value
= memcached_get(memc
,
840 test_literal_param(__func__
),
841 &value_length
, &flags
, &rc
);
842 test_memcmp(check_value
, "when we sanitize", strlen("when we sanitize"));
843 test_compare(test_literal_param_size("when we sanitize"), value_length
);
844 test_compare(MEMCACHED_SUCCESS
, rc
);
847 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_DATA_EXISTS
: MEMCACHED_NOTSTORED
,
849 test_literal_param(__func__
),
850 test_literal_param("try something else"),
851 time_t(0), uint32_t(0)));
857 ** There was a problem of leaking filedescriptors in the initial release
858 ** of MacOSX 10.5. This test case triggers the problem. On some Solaris
859 ** systems it seems that the kernel is slow on reclaiming the resources
860 ** because the connects starts to time out (the test doesn't do much
861 ** anyway, so just loop 10 iterations)
863 test_return_t
add_wrapper(memcached_st
*memc
)
865 unsigned int max
= 10000;
873 for (uint32_t x
= 0; x
< max
; x
++)
881 test_return_t
replace_test(memcached_st
*memc
)
883 test_compare(return_value_based_on_buffering(memc
),
885 test_literal_param(__func__
),
886 test_literal_param("when we sanitize"),
887 time_t(0), uint32_t(0)));
889 test_compare(MEMCACHED_SUCCESS
,
890 memcached_replace(memc
,
891 test_literal_param(__func__
),
892 test_literal_param("first we insert some data"),
893 time_t(0), uint32_t(0)));
898 test_return_t
delete_test(memcached_st
*memc
)
900 test_compare(return_value_based_on_buffering(memc
),
902 test_literal_param(__func__
),
903 test_literal_param("when we sanitize"),
904 time_t(0), uint32_t(0)));
906 test_compare(return_value_based_on_buffering(memc
),
907 memcached_delete(memc
,
908 test_literal_param(__func__
),
914 test_return_t
flush_test(memcached_st
*memc
)
916 uint64_t query_id
= memcached_query_id(memc
);
917 test_compare(MEMCACHED_SUCCESS
,
918 memcached_flush(memc
, 0));
919 test_compare(query_id
+1, memcached_query_id(memc
));
924 static memcached_return_t
server_function(const memcached_st
*,
925 const memcached_server_st
*,
929 return MEMCACHED_SUCCESS
;
932 test_return_t
memcached_server_cursor_test(memcached_st
*memc
)
935 strncpy(context
, "foo bad", sizeof(context
));
936 memcached_server_fn callbacks
[1];
938 callbacks
[0]= server_function
;
939 memcached_server_cursor(memc
, callbacks
, context
, 1);
943 test_return_t
bad_key_test(memcached_st
*memc
)
945 memcached_return_t rc
;
946 const char *key
= "foo bad";
949 uint64_t query_id
= memcached_query_id(memc
);
951 // Just skip if we are in binary mode.
952 test_skip(false, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
954 test_compare(query_id
, memcached_query_id(memc
)); // We should not increase the query_id for memcached_behavior_get()
956 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
957 test_true(memc_clone
);
959 query_id
= memcached_query_id(memc_clone
);
960 test_compare(MEMCACHED_SUCCESS
,
961 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
962 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
964 /* All keys are valid in the binary protocol (except for length) */
965 if (memcached_behavior_get(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == false)
967 uint64_t before_query_id
= memcached_query_id(memc_clone
);
969 size_t string_length
;
970 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
971 &string_length
, &flags
, &rc
);
972 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
973 test_zero(string_length
);
976 test_compare(before_query_id
+1, memcached_query_id(memc_clone
));
978 query_id
= memcached_query_id(memc_clone
);
979 test_compare(MEMCACHED_SUCCESS
,
980 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, false));
981 test_compare(query_id
, memcached_query_id(memc_clone
)); // We should not increase the query_id for memcached_behavior_set()
983 size_t string_length
;
984 char *string
= memcached_get(memc_clone
, key
, strlen(key
),
985 &string_length
, &flags
, &rc
);
986 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
987 test_zero(string_length
);
991 /* Test multi key for bad keys */
992 const char *keys
[] = { "GoodKey", "Bad Key", "NotMine" };
993 size_t key_lengths
[] = { 7, 7, 7 };
994 query_id
= memcached_query_id(memc_clone
);
995 test_compare(MEMCACHED_SUCCESS
,
996 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
997 test_compare(query_id
, memcached_query_id(memc_clone
));
999 query_id
= memcached_query_id(memc_clone
);
1000 test_compare(MEMCACHED_BAD_KEY_PROVIDED
,
1001 memcached_mget(memc_clone
, keys
, key_lengths
, 3));
1002 test_compare(query_id
+1, memcached_query_id(memc_clone
));
1004 query_id
= memcached_query_id(memc_clone
);
1005 // Grouping keys are not required to follow normal key behaviors
1006 test_compare(MEMCACHED_SUCCESS
,
1007 memcached_mget_by_key(memc_clone
, "foo daddy", 9, keys
, key_lengths
, 1));
1008 test_compare(query_id
+1, memcached_query_id(memc_clone
));
1010 /* The following test should be moved to the end of this function when the
1011 memcached server is updated to allow max size length of the keys in the
1014 test_compare(MEMCACHED_SUCCESS
,
1015 memcached_callback_set(memc_clone
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
1017 libtest::vchar_t longkey
;
1019 libtest::vchar_t::iterator it
= longkey
.begin();
1020 longkey
.insert(it
, MEMCACHED_MAX_KEY
, 'a');
1023 test_compare(longkey
.size(), size_t(MEMCACHED_MAX_KEY
));
1025 size_t string_length
;
1027 test_null(memcached_get(memc_clone
, &longkey
[0], longkey
.size() -1, &string_length
, &flags
, &rc
));
1028 test_compare(MEMCACHED_NOTFOUND
, rc
);
1029 test_zero(string_length
);
1031 test_null(memcached_get(memc_clone
, &longkey
[0], longkey
.size(), &string_length
, &flags
, &rc
));
1032 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
1033 test_zero(string_length
);
1037 /* Make sure zero length keys are marked as bad */
1039 test_compare(MEMCACHED_SUCCESS
,
1040 memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, true));
1041 size_t string_length
;
1042 char *string
= memcached_get(memc_clone
, key
, 0,
1043 &string_length
, &flags
, &rc
);
1044 test_compare(MEMCACHED_BAD_KEY_PROVIDED
, rc
);
1045 test_zero(string_length
);
1049 memcached_free(memc_clone
);
1051 return TEST_SUCCESS
;
1054 #define READ_THROUGH_VALUE "set for me"
1055 static memcached_return_t
read_through_trigger(memcached_st
*, // memc
1057 size_t, // key_length,
1058 memcached_result_st
*result
)
1060 return memcached_result_set_value(result
, READ_THROUGH_VALUE
, strlen(READ_THROUGH_VALUE
));
1063 #ifndef __INTEL_COMPILER
1064 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
1067 test_return_t
read_through(memcached_st
*memc
)
1069 memcached_trigger_key_fn cb
= (memcached_trigger_key_fn
)read_through_trigger
;
1071 size_t string_length
;
1073 memcached_return_t rc
;
1074 char *string
= memcached_get(memc
,
1075 test_literal_param(__func__
),
1076 &string_length
, &flags
, &rc
);
1078 test_compare(MEMCACHED_NOTFOUND
, rc
);
1079 test_false(string_length
);
1082 test_compare(MEMCACHED_SUCCESS
,
1083 memcached_callback_set(memc
, MEMCACHED_CALLBACK_GET_FAILURE
, *(void **)&cb
));
1085 string
= memcached_get(memc
,
1086 test_literal_param(__func__
),
1087 &string_length
, &flags
, &rc
);
1089 test_compare(MEMCACHED_SUCCESS
, rc
);
1090 test_compare(sizeof(READ_THROUGH_VALUE
) -1, string_length
);
1091 test_compare(0, string
[sizeof(READ_THROUGH_VALUE
) -1]);
1092 test_strcmp(READ_THROUGH_VALUE
, string
);
1095 string
= memcached_get(memc
,
1096 test_literal_param(__func__
),
1097 &string_length
, &flags
, &rc
);
1099 test_compare(MEMCACHED_SUCCESS
, rc
);
1101 test_compare(string_length
, sizeof(READ_THROUGH_VALUE
) -1);
1102 test_true(string
[sizeof(READ_THROUGH_VALUE
) -1] == 0);
1103 test_strcmp(READ_THROUGH_VALUE
, string
);
1106 return TEST_SUCCESS
;
1109 test_return_t
set_test2(memcached_st
*memc
)
1111 for (uint32_t x
= 0; x
< 10; x
++)
1113 test_compare(return_value_based_on_buffering(memc
),
1115 test_literal_param("foo"),
1116 test_literal_param("train in the brain"),
1117 time_t(0), uint32_t(0)));
1120 return TEST_SUCCESS
;
1123 test_return_t
set_test3(memcached_st
*memc
)
1125 size_t value_length
= 8191;
1127 libtest::vchar_t value
;
1128 value
.reserve(value_length
);
1129 for (uint32_t x
= 0; x
< value_length
; x
++)
1131 value
.push_back(char(x
% 127));
1134 /* The dump test relies on there being at least 32 items in memcached */
1135 for (uint32_t x
= 0; x
< 32; x
++)
1139 snprintf(key
, sizeof(key
), "foo%u", x
);
1141 uint64_t query_id
= memcached_query_id(memc
);
1142 test_compare(return_value_based_on_buffering(memc
),
1143 memcached_set(memc
, key
, strlen(key
),
1144 &value
[0], value
.size(),
1145 time_t(0), uint32_t(0)));
1146 test_compare(query_id
+1, memcached_query_id(memc
));
1149 return TEST_SUCCESS
;
1152 test_return_t
mget_end(memcached_st
*memc
)
1154 const char *keys
[]= { "foo", "foo2" };
1155 size_t lengths
[]= { 3, 4 };
1156 const char *values
[]= { "fjord", "41" };
1159 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1161 test_compare(MEMCACHED_SUCCESS
,
1163 keys
[x
], lengths
[x
],
1164 values
[x
], strlen(values
[x
]),
1165 time_t(0), uint32_t(0)));
1169 size_t string_length
;
1172 // retrieve both via mget
1173 test_compare(MEMCACHED_SUCCESS
,
1174 memcached_mget(memc
,
1176 test_array_length(keys
)));
1178 char key
[MEMCACHED_MAX_KEY
];
1180 memcached_return_t rc
;
1182 // this should get both
1183 for (size_t x
= 0; x
< test_array_length(keys
); x
++)
1185 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
,
1187 test_compare(MEMCACHED_SUCCESS
, rc
);
1189 if (key_length
== 4)
1194 test_compare(string_length
, strlen(values
[val
]));
1195 test_true(strncmp(values
[val
], string
, string_length
) == 0);
1199 // this should indicate end
1200 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1201 test_compare(MEMCACHED_END
, rc
);
1205 test_compare(MEMCACHED_SUCCESS
,
1206 memcached_mget(memc
, keys
, lengths
, 1));
1208 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1209 test_compare(key_length
, lengths
[0]);
1210 test_true(strncmp(keys
[0], key
, key_length
) == 0);
1211 test_compare(string_length
, strlen(values
[0]));
1212 test_true(strncmp(values
[0], string
, string_length
) == 0);
1213 test_compare(MEMCACHED_SUCCESS
, rc
);
1216 // this should indicate end
1217 string
= memcached_fetch(memc
, key
, &key_length
, &string_length
, &flags
, &rc
);
1218 test_compare(MEMCACHED_END
, rc
);
1221 return TEST_SUCCESS
;
1224 /* Do not copy the style of this code, I just access hosts to testthis function */
1225 test_return_t
stats_servername_test(memcached_st
*memc
)
1227 memcached_stat_st memc_stat
;
1228 memcached_server_instance_st instance
=
1229 memcached_server_instance_by_position(memc
, 0);
1231 if (LIBMEMCACHED_WITH_SASL_SUPPORT
and memcached_get_sasl_callbacks(memc
))
1233 return TEST_SKIPPED
;
1236 test_compare(MEMCACHED_SUCCESS
, memcached_stat_servername(&memc_stat
, NULL
,
1237 memcached_server_name(instance
),
1238 memcached_server_port(instance
)));
1240 return TEST_SUCCESS
;
1243 test_return_t
increment_test(memcached_st
*memc
)
1245 uint64_t new_number
;
1247 test_compare(MEMCACHED_SUCCESS
,
1249 test_literal_param("number"),
1250 test_literal_param("0"),
1251 (time_t)0, (uint32_t)0));
1253 test_compare(MEMCACHED_SUCCESS
,
1254 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1255 test_compare(uint64_t(1), new_number
);
1257 test_compare(MEMCACHED_SUCCESS
,
1258 memcached_increment(memc
, test_literal_param("number"), 1, &new_number
));
1259 test_compare(uint64_t(2), new_number
);
1261 return TEST_SUCCESS
;
1264 test_return_t
increment_with_initial_test(memcached_st
*memc
)
1266 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1268 uint64_t new_number
;
1269 uint64_t initial
= 0;
1271 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1273 test_compare(MEMCACHED_SUCCESS
,
1274 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1275 test_compare(new_number
, initial
);
1277 test_compare(MEMCACHED_SUCCESS
,
1278 memcached_increment_with_initial(memc
, test_literal_param("number"), 1, initial
, 0, &new_number
));
1279 test_compare(new_number
, (initial
+1));
1281 return TEST_SUCCESS
;
1284 test_return_t
decrement_test(memcached_st
*memc
)
1286 test_compare(return_value_based_on_buffering(memc
),
1288 test_literal_param(__func__
),
1289 test_literal_param("3"),
1290 time_t(0), uint32_t(0)));
1292 // Make sure we flush the value we just set
1293 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1295 uint64_t new_number
;
1296 test_compare(MEMCACHED_SUCCESS
,
1297 memcached_decrement(memc
,
1298 test_literal_param(__func__
),
1300 test_compare(uint64_t(2), new_number
);
1302 test_compare(MEMCACHED_SUCCESS
,
1303 memcached_decrement(memc
,
1304 test_literal_param(__func__
),
1306 test_compare(uint64_t(1), new_number
);
1308 return TEST_SUCCESS
;
1311 test_return_t
decrement_with_initial_test(memcached_st
*memc
)
1313 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1315 uint64_t initial
= 3;
1317 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1319 uint64_t new_number
;
1320 test_compare(MEMCACHED_SUCCESS
,
1321 memcached_decrement_with_initial(memc
,
1322 test_literal_param(__func__
),
1325 test_compare(new_number
, initial
);
1327 test_compare(MEMCACHED_SUCCESS
,
1328 memcached_decrement_with_initial(memc
,
1329 test_literal_param(__func__
),
1332 test_compare(new_number
, (initial
- 1));
1334 return TEST_SUCCESS
;
1337 test_return_t
increment_by_key_test(memcached_st
*memc
)
1339 const char *master_key
= "foo";
1340 const char *key
= "number";
1341 const char *value
= "0";
1343 test_compare(return_value_based_on_buffering(memc
),
1344 memcached_set_by_key(memc
, master_key
, strlen(master_key
),
1346 value
, strlen(value
),
1347 time_t(0), uint32_t(0)));
1349 // Make sure we flush the value we just set
1350 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1352 uint64_t new_number
;
1353 test_compare(MEMCACHED_SUCCESS
,
1354 memcached_increment_by_key(memc
, master_key
, strlen(master_key
),
1355 key
, strlen(key
), 1, &new_number
));
1356 test_compare(uint64_t(1), new_number
);
1358 test_compare(MEMCACHED_SUCCESS
,
1359 memcached_increment_by_key(memc
, master_key
, strlen(master_key
),
1360 key
, strlen(key
), 1, &new_number
));
1361 test_compare(uint64_t(2), new_number
);
1363 return TEST_SUCCESS
;
1366 test_return_t
increment_with_initial_by_key_test(memcached_st
*memc
)
1368 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1370 uint64_t new_number
;
1371 const char *master_key
= "foo";
1372 const char *key
= "number";
1373 uint64_t initial
= 0;
1375 test_compare(MEMCACHED_SUCCESS
,
1376 memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1378 1, initial
, 0, &new_number
));
1379 test_compare(new_number
, initial
);
1381 test_compare(MEMCACHED_SUCCESS
,
1382 memcached_increment_with_initial_by_key(memc
, master_key
, strlen(master_key
),
1384 1, initial
, 0, &new_number
));
1385 test_compare(new_number
, (initial
+1));
1387 return TEST_SUCCESS
;
1390 test_return_t
decrement_by_key_test(memcached_st
*memc
)
1392 uint64_t new_number
;
1393 const char *value
= "3";
1395 test_compare(return_value_based_on_buffering(memc
),
1396 memcached_set_by_key(memc
,
1397 test_literal_param("foo"),
1398 test_literal_param("number"),
1399 value
, strlen(value
),
1400 (time_t)0, (uint32_t)0));
1402 test_compare(MEMCACHED_SUCCESS
,
1403 memcached_decrement_by_key(memc
,
1404 test_literal_param("foo"),
1405 test_literal_param("number"),
1407 test_compare(uint64_t(2), new_number
);
1409 test_compare(MEMCACHED_SUCCESS
,
1410 memcached_decrement_by_key(memc
,
1411 test_literal_param("foo"),
1412 test_literal_param("number"),
1414 test_compare(uint64_t(1), new_number
);
1416 return TEST_SUCCESS
;
1419 test_return_t
decrement_with_initial_by_key_test(memcached_st
*memc
)
1421 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1423 uint64_t new_number
;
1424 uint64_t initial
= 3;
1426 test_compare(MEMCACHED_SUCCESS
,
1427 memcached_decrement_with_initial_by_key(memc
,
1428 test_literal_param("foo"),
1429 test_literal_param("number"),
1430 1, initial
, 0, &new_number
));
1431 test_compare(new_number
, initial
);
1433 test_compare(MEMCACHED_SUCCESS
,
1434 memcached_decrement_with_initial_by_key(memc
,
1435 test_literal_param("foo"),
1436 test_literal_param("number"),
1437 1, initial
, 0, &new_number
));
1438 test_compare(new_number
, (initial
- 1));
1440 return TEST_SUCCESS
;
1442 test_return_t
binary_increment_with_prefix_test(memcached_st
*memc
)
1444 test_skip(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1446 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_PREFIX_KEY
, (void *)"namespace:"));
1448 test_compare(return_value_based_on_buffering(memc
),
1450 test_literal_param("number"),
1451 test_literal_param("0"),
1452 (time_t)0, (uint32_t)0));
1454 uint64_t new_number
;
1455 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1456 test_literal_param("number"),
1458 test_compare(uint64_t(1), new_number
);
1460 test_compare(MEMCACHED_SUCCESS
, memcached_increment(memc
,
1461 test_literal_param("number"),
1463 test_compare(uint64_t(2), new_number
);
1465 return TEST_SUCCESS
;
1468 test_return_t
quit_test(memcached_st
*memc
)
1470 const char *value
= "sanford and sun";
1472 test_compare(return_value_based_on_buffering(memc
),
1474 test_literal_param(__func__
),
1475 value
, strlen(value
),
1476 time_t(10), uint32_t(3)));
1477 memcached_quit(memc
);
1479 test_compare(return_value_based_on_buffering(memc
),
1481 test_literal_param(__func__
),
1482 value
, strlen(value
),
1483 time_t(50), uint32_t(9)));
1485 return TEST_SUCCESS
;
1488 test_return_t
mget_result_test(memcached_st
*memc
)
1490 const char *keys
[]= {"fudge", "son", "food"};
1491 size_t key_length
[]= {5, 3, 4};
1493 memcached_result_st results_obj
;
1494 memcached_result_st
*results
= memcached_result_create(memc
, &results_obj
);
1496 test_true(&results_obj
== results
);
1498 /* We need to empty the server before continueing test */
1499 test_compare(MEMCACHED_SUCCESS
,
1500 memcached_flush(memc
, 0));
1502 test_compare(MEMCACHED_SUCCESS
,
1503 memcached_mget(memc
, keys
, key_length
, 3));
1505 memcached_return_t rc
;
1506 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1511 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
))) { test_true(false); /* We should never see a value returned */ };
1512 test_false(results
);
1513 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1515 for (uint32_t x
= 0; x
< 3; x
++)
1517 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1518 keys
[x
], key_length
[x
],
1519 (time_t)50, (uint32_t)9);
1520 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1523 test_compare(MEMCACHED_SUCCESS
,
1524 memcached_mget(memc
, keys
, key_length
, 3));
1526 while ((results
= memcached_fetch_result(memc
, &results_obj
, &rc
)))
1529 test_true(&results_obj
== results
);
1530 test_compare(MEMCACHED_SUCCESS
, rc
);
1531 test_memcmp(memcached_result_key_value(results
),
1532 memcached_result_value(results
),
1533 memcached_result_length(results
));
1534 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1537 memcached_result_free(&results_obj
);
1539 return TEST_SUCCESS
;
1542 test_return_t
mget_result_alloc_test(memcached_st
*memc
)
1544 const char *keys
[]= {"fudge", "son", "food"};
1545 size_t key_length
[]= {5, 3, 4};
1547 memcached_result_st
*results
;
1549 /* We need to empty the server before continueing test */
1550 test_compare(MEMCACHED_SUCCESS
,
1551 memcached_flush(memc
, 0));
1553 test_compare(MEMCACHED_SUCCESS
,
1554 memcached_mget(memc
, keys
, key_length
, 3));
1556 memcached_return_t rc
;
1557 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1561 test_false(results
);
1562 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1564 for (uint32_t x
= 0; x
< 3; x
++)
1566 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1567 keys
[x
], key_length
[x
],
1568 (time_t)50, (uint32_t)9);
1569 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1572 test_compare(MEMCACHED_SUCCESS
,
1573 memcached_mget(memc
, keys
, key_length
, 3));
1576 while ((results
= memcached_fetch_result(memc
, NULL
, &rc
)))
1579 test_compare(MEMCACHED_SUCCESS
, rc
);
1580 test_compare(memcached_result_key_length(results
), memcached_result_length(results
));
1581 test_memcmp(memcached_result_key_value(results
),
1582 memcached_result_value(results
),
1583 memcached_result_length(results
));
1584 memcached_result_free(results
);
1588 return TEST_SUCCESS
;
1591 test_return_t
mget_result_function(memcached_st
*memc
)
1593 const char *keys
[]= {"fudge", "son", "food"};
1594 size_t key_length
[]= {5, 3, 4};
1596 memcached_execute_fn callbacks
[1];
1598 for (uint32_t x
= 0; x
< 3; x
++)
1600 test_compare(return_value_based_on_buffering(memc
),
1601 memcached_set(memc
, keys
[x
], key_length
[x
],
1602 keys
[x
], key_length
[x
],
1603 time_t(50), uint32_t(9)));
1605 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
1606 memcached_quit(memc
);
1608 test_compare(MEMCACHED_SUCCESS
,
1609 memcached_mget(memc
, keys
, key_length
, 3));
1611 callbacks
[0]= &callback_counter
;
1614 test_compare(MEMCACHED_SUCCESS
,
1615 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1617 test_compare(size_t(3), counter
);
1619 return TEST_SUCCESS
;
1622 test_return_t
mget_test(memcached_st
*memc
)
1624 const char *keys
[]= {"fudge", "son", "food"};
1625 size_t key_length
[]= {5, 3, 4};
1627 char return_key
[MEMCACHED_MAX_KEY
];
1628 size_t return_key_length
;
1630 size_t return_value_length
;
1632 test_compare(MEMCACHED_SUCCESS
,
1633 memcached_mget(memc
, keys
, key_length
, 3));
1636 memcached_return_t rc
;
1637 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1638 &return_value_length
, &flags
, &rc
)))
1640 test_true(return_value
);
1642 test_false(return_value
);
1643 test_zero(return_value_length
);
1644 test_compare(MEMCACHED_NOTFOUND
, rc
);
1646 for (uint32_t x
= 0; x
< 3; x
++)
1648 rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
1649 keys
[x
], key_length
[x
],
1650 (time_t)50, (uint32_t)9);
1651 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_strerror(NULL
, rc
));
1653 test_compare(MEMCACHED_SUCCESS
,
1654 memcached_mget(memc
, keys
, key_length
, 3));
1657 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
1658 &return_value_length
, &flags
, &rc
)))
1660 test_true(return_value
);
1661 test_compare(MEMCACHED_SUCCESS
, rc
);
1662 if (not memc
->_namespace
)
1664 test_compare(return_key_length
, return_value_length
);
1665 test_memcmp(return_value
, return_key
, return_value_length
);
1671 return TEST_SUCCESS
;
1674 test_return_t
mget_execute(memcached_st
*original_memc
)
1676 test_skip(true, memcached_behavior_get(original_memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
));
1678 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL");
1681 keys_st
keys(20480);
1683 /* First add all of the items.. */
1684 char blob
[1024] = {0};
1686 for (size_t x
= 0; x
< keys
.size(); ++x
)
1688 uint64_t query_id
= memcached_query_id(memc
);
1689 memcached_return_t rc
= memcached_add(memc
,
1690 keys
.key_at(x
), keys
.length_at(x
),
1693 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
1694 test_compare(query_id
+1, memcached_query_id(memc
));
1697 /* Try to get all of them with a large multiget */
1699 memcached_execute_fn callbacks
[]= { &callback_counter
};
1700 test_compare(MEMCACHED_SUCCESS
,
1701 memcached_mget_execute(memc
,
1702 keys
.keys_ptr(), keys
.lengths_ptr(),
1703 keys
.size(), callbacks
, &counter
, 1));
1706 uint64_t query_id
= memcached_query_id(memc
);
1707 test_compare(MEMCACHED_SUCCESS
,
1708 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
1709 test_compare(query_id
, memcached_query_id(memc
));
1711 /* Verify that we got all of the items */
1712 test_compare(keys
.size(), counter
);
1715 memcached_free(memc
);
1717 return TEST_SUCCESS
;
1720 #define REGRESSION_BINARY_VS_BLOCK_COUNT 20480
1721 static pairs_st
*global_pairs
= NULL
;
1723 test_return_t
key_setup(memcached_st
*memc
)
1725 test_skip(TEST_SUCCESS
, pre_binary(memc
));
1727 global_pairs
= pairs_generate(REGRESSION_BINARY_VS_BLOCK_COUNT
, 0);
1729 return TEST_SUCCESS
;
1732 test_return_t
key_teardown(memcached_st
*)
1734 pairs_free(global_pairs
);
1737 return TEST_SUCCESS
;
1740 test_return_t
block_add_regression(memcached_st
*memc
)
1742 /* First add all of the items.. */
1743 for (ptrdiff_t x
= 0; x
< REGRESSION_BINARY_VS_BLOCK_COUNT
; ++x
)
1745 libtest::vchar_t blob
;
1746 libtest::vchar::make(blob
, 1024);
1748 memcached_return_t rc
= memcached_add_by_key(memc
,
1749 test_literal_param("bob"),
1750 global_pairs
[x
].key
, global_pairs
[x
].key_length
,
1751 &blob
[0], blob
.size(),
1752 time_t(0), uint32_t(0));
1753 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE
, memcached_strerror(NULL
, rc
));
1756 return TEST_SUCCESS
;
1759 test_return_t
binary_add_regression(memcached_st
*memc
)
1761 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
1762 test_return_t rc
= block_add_regression(memc
);
1767 test_return_t
get_stats_keys(memcached_st
*memc
)
1771 memcached_stat_st memc_stat
;
1772 memcached_return_t rc
;
1774 stat_list
= memcached_stat_get_keys(memc
, &memc_stat
, &rc
);
1775 test_compare(MEMCACHED_SUCCESS
, rc
);
1776 for (ptr
= stat_list
; *ptr
; ptr
++)
1781 return TEST_SUCCESS
;
1784 test_return_t
version_string_test(memcached_st
*)
1786 test_strcmp(LIBMEMCACHED_VERSION_STRING
, memcached_lib_version());
1788 return TEST_SUCCESS
;
1791 test_return_t
get_stats(memcached_st
*memc
)
1793 memcached_return_t rc
;
1795 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
1796 test_compare(MEMCACHED_SUCCESS
, rc
);
1797 test_true(memc_stat
);
1799 for (uint32_t x
= 0; x
< memcached_server_count(memc
); x
++)
1801 char **stat_list
= memcached_stat_get_keys(memc
, memc_stat
+x
, &rc
);
1802 test_compare(MEMCACHED_SUCCESS
, rc
);
1803 for (char **ptr
= stat_list
; *ptr
; ptr
++) {};
1808 memcached_stat_free(NULL
, memc_stat
);
1810 return TEST_SUCCESS
;
1813 test_return_t
add_host_test(memcached_st
*memc
)
1815 char servername
[]= "0.example.com";
1817 memcached_return_t rc
;
1818 memcached_server_st
*servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
1819 test_compare(1U, memcached_server_list_count(servers
));
1821 for (unsigned int x
= 2; x
< 20; x
++)
1823 char buffer
[SMALL_STRING_LEN
];
1825 snprintf(buffer
, SMALL_STRING_LEN
, "%u.example.com", 400+x
);
1826 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
1828 test_compare(MEMCACHED_SUCCESS
, rc
);
1829 test_compare(x
, memcached_server_list_count(servers
));
1832 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
1833 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
1835 memcached_server_list_free(servers
);
1837 return TEST_SUCCESS
;
1840 test_return_t
memcached_fetch_result_NOT_FOUND(memcached_st
*memc
)
1842 memcached_return_t rc
;
1844 const char *key
= "not_found";
1845 size_t key_length
= test_literal_param_size("not_found");
1847 test_compare(MEMCACHED_SUCCESS
,
1848 memcached_mget(memc
, &key
, &key_length
, 1));
1850 memcached_result_st
*result
= memcached_fetch_result(memc
, NULL
, &rc
);
1852 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
1854 memcached_result_free(result
);
1856 return TEST_SUCCESS
;
1859 static memcached_return_t
clone_test_callback(memcached_st
*, memcached_st
*)
1861 return MEMCACHED_SUCCESS
;
1864 static memcached_return_t
cleanup_test_callback(memcached_st
*)
1866 return MEMCACHED_SUCCESS
;
1869 test_return_t
callback_test(memcached_st
*memc
)
1871 /* Test User Data */
1875 memcached_return_t rc
;
1877 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_USER_DATA
, &x
));
1878 test_ptr
= (int *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_USER_DATA
, &rc
);
1879 test_true(*test_ptr
== x
);
1882 /* Test Clone Callback */
1884 memcached_clone_fn clone_cb
= (memcached_clone_fn
)clone_test_callback
;
1885 void *clone_cb_ptr
= *(void **)&clone_cb
;
1886 void *temp_function
= NULL
;
1888 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, clone_cb_ptr
));
1889 memcached_return_t rc
;
1890 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1891 test_true(temp_function
== clone_cb_ptr
);
1892 test_compare(MEMCACHED_SUCCESS
, rc
);
1895 /* Test Cleanup Callback */
1897 memcached_cleanup_fn cleanup_cb
= (memcached_cleanup_fn
)cleanup_test_callback
;
1898 void *cleanup_cb_ptr
= *(void **)&cleanup_cb
;
1899 void *temp_function
= NULL
;
1900 memcached_return_t rc
;
1902 test_compare(MEMCACHED_SUCCESS
, memcached_callback_set(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, cleanup_cb_ptr
));
1903 temp_function
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_CLONE_FUNCTION
, &rc
);
1904 test_true(temp_function
== cleanup_cb_ptr
);
1907 return TEST_SUCCESS
;
1910 /* We don't test the behavior itself, we test the switches */
1911 test_return_t
behavior_test(memcached_st
*memc
)
1913 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 1);
1914 test_compare(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
));
1916 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1);
1917 test_compare(true, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
));
1919 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_MD5
);
1920 test_compare(uint64_t(MEMCACHED_HASH_MD5
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
1922 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 0);
1923 test_zero(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
));
1925 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 0);
1926 test_zero(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
));
1928 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_DEFAULT
);
1929 test_compare(uint64_t(MEMCACHED_HASH_DEFAULT
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
1931 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, MEMCACHED_HASH_CRC
);
1932 test_compare(uint64_t(MEMCACHED_HASH_CRC
), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
));
1934 test_true(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
));
1936 test_true(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
));
1938 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
);
1939 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, value
+1);
1940 test_compare((value
+1), memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
));
1942 return TEST_SUCCESS
;
1945 test_return_t
MEMCACHED_BEHAVIOR_CORK_test(memcached_st
*memc
)
1947 test_compare(MEMCACHED_DEPRECATED
,
1948 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CORK
, true));
1950 // Platform dependent
1952 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_CORK
);
1956 return TEST_SUCCESS
;
1960 test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test(memcached_st
*memc
)
1962 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
, true);
1963 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
1965 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE
);
1967 if (memcached_success(rc
))
1976 return TEST_SUCCESS
;
1980 test_return_t
MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st
*memc
)
1982 memcached_return_t rc
= memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
, true);
1983 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_NOT_SUPPORTED
);
1985 bool value
= (bool)memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE
);
1987 if (memcached_success(rc
))
1996 return TEST_SUCCESS
;
1999 /* Make sure we behave properly if server list has no values */
2000 test_return_t
user_supplied_bug4(memcached_st
*memc
)
2002 const char *keys
[]= {"fudge", "son", "food"};
2003 size_t key_length
[]= {5, 3, 4};
2005 /* Here we free everything before running a bunch of mget tests */
2006 memcached_servers_reset(memc
);
2009 /* We need to empty the server before continueing test */
2010 test_compare(MEMCACHED_NO_SERVERS
,
2011 memcached_flush(memc
, 0));
2013 test_compare(MEMCACHED_NO_SERVERS
,
2014 memcached_mget(memc
, keys
, key_length
, 3));
2017 unsigned int keys_returned
;
2018 memcached_return_t rc
;
2019 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, keys_returned
, rc
));
2020 test_compare(MEMCACHED_NOTFOUND
, rc
);
2021 test_zero(keys_returned
);
2024 for (uint32_t x
= 0; x
< 3; x
++)
2026 test_compare(MEMCACHED_NO_SERVERS
,
2027 memcached_set(memc
, keys
[x
], key_length
[x
],
2028 keys
[x
], key_length
[x
],
2029 (time_t)50, (uint32_t)9));
2032 test_compare(MEMCACHED_NO_SERVERS
,
2033 memcached_mget(memc
, keys
, key_length
, 3));
2037 char return_key
[MEMCACHED_MAX_KEY
];
2038 memcached_return_t rc
;
2039 size_t return_key_length
;
2040 size_t return_value_length
;
2043 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2044 &return_value_length
, &flags
, &rc
)))
2046 test_true(return_value
);
2047 test_compare(MEMCACHED_SUCCESS
, rc
);
2048 test_true(return_key_length
== return_value_length
);
2049 test_memcmp(return_value
, return_key
, return_value_length
);
2055 return TEST_SUCCESS
;
2058 #define VALUE_SIZE_BUG5 1048064
2059 test_return_t
user_supplied_bug5(memcached_st
*memc
)
2061 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2062 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2064 size_t value_length
;
2066 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2068 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2070 insert_data
[x
]= (signed char)rand();
2073 test_compare(MEMCACHED_SUCCESS
,
2074 memcached_flush(memc
, 0));
2076 memcached_return_t rc
;
2077 test_null(memcached_get(memc
, keys
[0], key_length
[0], &value_length
, &flags
, &rc
));
2078 test_compare(MEMCACHED_SUCCESS
,
2079 memcached_mget(memc
, keys
, key_length
, 4));
2082 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
, rc
));
2083 test_compare(MEMCACHED_NOTFOUND
, rc
);
2086 for (uint32_t x
= 0; x
< 4; x
++)
2088 test_compare(MEMCACHED_SUCCESS
,
2089 memcached_set(memc
, keys
[x
], key_length
[x
],
2090 insert_data
, VALUE_SIZE_BUG5
,
2091 (time_t)0, (uint32_t)0));
2094 for (uint32_t x
= 0; x
< 10; x
++)
2096 value
= memcached_get(memc
, keys
[0], key_length
[0],
2097 &value_length
, &flags
, &rc
);
2098 test_compare(rc
, MEMCACHED_SUCCESS
);
2102 test_compare(MEMCACHED_SUCCESS
,
2103 memcached_mget(memc
, keys
, key_length
, 4));
2105 test_compare(TEST_SUCCESS
, fetch_all_results(memc
, count
));
2106 test_compare(4U, count
);
2108 delete [] insert_data
;
2110 return TEST_SUCCESS
;
2113 test_return_t
user_supplied_bug6(memcached_st
*memc
)
2115 const char *keys
[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2116 size_t key_length
[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
2117 char return_key
[MEMCACHED_MAX_KEY
];
2118 size_t return_key_length
;
2120 size_t value_length
;
2122 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2124 for (uint32_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2126 insert_data
[x
]= (signed char)rand();
2129 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc
, 0));
2131 test_compare(TEST_SUCCESS
, confirm_keys_dont_exist(memc
, keys
, test_array_length(keys
)));
2133 // We will now confirm that memcached_mget() returns success, but we will
2134 // then check to make sure that no actual keys are returned.
2135 test_compare(MEMCACHED_SUCCESS
,
2136 memcached_mget(memc
, keys
, key_length
, 4));
2138 memcached_return_t rc
;
2140 while ((value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2141 &value_length
, &flags
, &rc
)))
2146 test_compare_got(MEMCACHED_NOTFOUND
, rc
, memcached_strerror(NULL
, rc
));
2148 for (uint32_t x
= 0; x
< test_array_length(keys
); x
++)
2150 test_compare(MEMCACHED_SUCCESS
,
2151 memcached_set(memc
, keys
[x
], key_length
[x
],
2152 insert_data
, VALUE_SIZE_BUG5
,
2153 (time_t)0, (uint32_t)0));
2155 test_compare(TEST_SUCCESS
, confirm_keys_exist(memc
, keys
, test_array_length(keys
)));
2157 for (uint32_t x
= 0; x
< 2; x
++)
2159 value
= memcached_get(memc
, keys
[0], key_length
[0],
2160 &value_length
, &flags
, &rc
);
2164 test_compare(MEMCACHED_SUCCESS
,
2165 memcached_mget(memc
, keys
, key_length
, 4));
2166 /* We test for purge of partial complete fetches */
2167 for (count
= 3; count
; count
--)
2169 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2170 &value_length
, &flags
, &rc
);
2171 test_compare(MEMCACHED_SUCCESS
, rc
);
2172 test_memcmp(value
, insert_data
, value_length
);
2173 test_true(value_length
);
2177 delete [] insert_data
;
2179 return TEST_SUCCESS
;
2182 test_return_t
user_supplied_bug8(memcached_st
*)
2184 memcached_return_t rc
;
2186 memcached_st
*memc_clone
;
2188 memcached_server_st
*servers
;
2189 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";
2191 servers
= memcached_servers_parse(server_list
);
2194 mine
= memcached_create(NULL
);
2195 rc
= memcached_server_push(mine
, servers
);
2196 test_compare(MEMCACHED_SUCCESS
, rc
);
2197 memcached_server_list_free(servers
);
2200 memc_clone
= memcached_clone(NULL
, mine
);
2202 memcached_quit(mine
);
2203 memcached_quit(memc_clone
);
2206 memcached_free(mine
);
2207 memcached_free(memc_clone
);
2209 return TEST_SUCCESS
;
2212 /* Test flag store/retrieve */
2213 test_return_t
user_supplied_bug7(memcached_st
*memc
)
2215 char *insert_data
= new (std::nothrow
) char[VALUE_SIZE_BUG5
];
2216 test_true(insert_data
);
2218 for (size_t x
= 0; x
< VALUE_SIZE_BUG5
; x
++)
2220 insert_data
[x
]= (signed char)rand();
2223 memcached_flush(memc
, 0);
2225 const char *keys
= "036790384900";
2226 size_t key_length
= strlen(keys
);
2227 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
, keys
, key_length
,
2228 insert_data
, VALUE_SIZE_BUG5
,
2231 memcached_return_t rc
;
2232 size_t value_length
;
2234 char *value
= memcached_get(memc
, keys
, key_length
,
2235 &value_length
, &flags
, &rc
);
2236 test_compare(245U, flags
);
2240 test_compare(MEMCACHED_SUCCESS
, memcached_mget(memc
, &keys
, &key_length
, 1));
2242 char return_key
[MEMCACHED_MAX_KEY
];
2243 size_t return_key_length
;
2245 value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2246 &value_length
, &flags
, &rc
);
2247 test_compare(uint32_t(245), flags
);
2250 delete [] insert_data
;
2253 return TEST_SUCCESS
;
2256 test_return_t
user_supplied_bug9(memcached_st
*memc
)
2258 const char *keys
[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2259 size_t key_length
[3];
2263 char return_key
[MEMCACHED_MAX_KEY
];
2264 size_t return_key_length
;
2266 size_t return_value_length
;
2269 key_length
[0]= strlen("UDATA:edevil@sapo.pt");
2270 key_length
[1]= strlen("fudge&*@#");
2271 key_length
[2]= strlen("for^#@&$not");
2274 for (unsigned int x
= 0; x
< 3; x
++)
2276 memcached_return_t rc
= memcached_set(memc
, keys
[x
], key_length
[x
],
2277 keys
[x
], key_length
[x
],
2278 (time_t)50, (uint32_t)9);
2279 test_compare(MEMCACHED_SUCCESS
, rc
);
2282 memcached_return_t rc
= memcached_mget(memc
, keys
, key_length
, 3);
2283 test_compare(MEMCACHED_SUCCESS
, rc
);
2285 /* We need to empty the server before continueing test */
2286 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2287 &return_value_length
, &flags
, &rc
)) != NULL
)
2289 test_true(return_value
);
2293 test_compare(3U, count
);
2295 return TEST_SUCCESS
;
2298 /* We are testing with aggressive timeout to get failures */
2299 test_return_t
user_supplied_bug10(memcached_st
*memc
)
2301 test_skip(memc
->servers
[0].type
, MEMCACHED_CONNECTION_TCP
);
2303 size_t value_length
= 512;
2304 unsigned int set
= 1;
2305 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2307 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, set
);
2308 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, set
);
2309 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, uint64_t(0));
2311 libtest::vchar_t value
;
2312 value
.reserve(value_length
);
2313 for (uint32_t x
= 0; x
< value_length
; x
++)
2315 value
.push_back(char(x
% 127));
2318 for (unsigned int x
= 1; x
<= 100000; ++x
)
2320 memcached_return_t rc
= memcached_set(mclone
,
2321 test_literal_param("foo"),
2322 &value
[0], value
.size(),
2325 test_true_got((rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_BUFFERED
or rc
== MEMCACHED_TIMEOUT
or rc
== MEMCACHED_CONNECTION_FAILURE
2326 or rc
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
),
2327 memcached_strerror(NULL
, rc
));
2329 if (rc
== MEMCACHED_WRITE_FAILURE
or rc
== MEMCACHED_TIMEOUT
)
2335 memcached_free(mclone
);
2337 return TEST_SUCCESS
;
2341 We are looking failures in the async protocol
2343 test_return_t
user_supplied_bug11(memcached_st
*memc
)
2345 memcached_st
*mclone
= memcached_clone(NULL
, memc
);
2347 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_NO_BLOCK
, true);
2348 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true);
2349 memcached_behavior_set(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, size_t(-1));
2351 test_compare(-1, int32_t(memcached_behavior_get(mclone
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
)));
2354 libtest::vchar_t value
;
2356 for (unsigned int x
= 0; x
< 512; x
++)
2358 value
.push_back(char(x
% 127));
2361 for (unsigned int x
= 1; x
<= 100000; ++x
)
2363 memcached_return_t rc
= memcached_set(mclone
, test_literal_param("foo"), &value
[0], value
.size(), 0, 0);
2367 memcached_free(mclone
);
2369 return TEST_SUCCESS
;
2373 Bug found where incr was not returning MEMCACHED_NOTFOUND when object did not exist.
2375 test_return_t
user_supplied_bug12(memcached_st
*memc
)
2377 memcached_return_t rc
;
2379 size_t value_length
;
2381 uint64_t number_value
;
2383 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"),
2384 &value_length
, &flags
, &rc
);
2386 test_compare(MEMCACHED_NOTFOUND
, rc
);
2388 rc
= memcached_increment(memc
, "autoincrement", strlen("autoincrement"),
2391 /* The binary protocol will set the key if it doesn't exist */
2392 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) == 1)
2394 test_compare(MEMCACHED_SUCCESS
, rc
);
2398 test_compare(MEMCACHED_NOTFOUND
, rc
);
2401 test_compare(MEMCACHED_SUCCESS
,
2402 memcached_set(memc
, "autoincrement", strlen("autoincrement"), "1", 1, 0, 0));
2404 value
= memcached_get(memc
, "autoincrement", strlen("autoincrement"), &value_length
, &flags
, &rc
);
2408 test_compare(MEMCACHED_SUCCESS
,
2409 memcached_increment(memc
, "autoincrement", strlen("autoincrement"), 1, &number_value
));
2410 test_compare(2UL, number_value
);
2412 return TEST_SUCCESS
;
2416 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2417 set key34567890 0 0 8169 \r\n is sent followed by buffer of size 8169, followed by 8169
2419 test_return_t
user_supplied_bug13(memcached_st
*memc
)
2421 char key
[] = "key34567890";
2423 char commandFirst
[]= "set key34567890 0 0 ";
2424 char commandLast
[] = " \r\n"; /* first line of command sent to server */
2425 size_t commandLength
;
2427 commandLength
= strlen(commandFirst
) + strlen(commandLast
) + 4; /* 4 is number of characters in size, probably 8196 */
2429 size_t overflowSize
= MEMCACHED_MAX_BUFFER
- commandLength
;
2431 for (size_t testSize
= overflowSize
- 1; testSize
< overflowSize
+ 1; testSize
++)
2433 char *overflow
= new (std::nothrow
) char[testSize
];
2434 test_true(overflow
);
2436 memset(overflow
, 'x', testSize
);
2437 test_compare(MEMCACHED_SUCCESS
,
2438 memcached_set(memc
, key
, strlen(key
),
2439 overflow
, testSize
, 0, 0));
2443 return TEST_SUCCESS
;
2448 Test values of many different sizes
2449 Bug found where command total one more than MEMCACHED_MAX_BUFFER
2450 set key34567890 0 0 8169 \r\n
2451 is sent followed by buffer of size 8169, followed by 8169
2453 test_return_t
user_supplied_bug14(memcached_st
*memc
)
2455 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true);
2457 libtest::vchar_t value
;
2458 value
.reserve(18000);
2459 for (ptrdiff_t x
= 0; x
< 18000; x
++)
2461 value
.push_back((char) (x
% 127));
2464 for (size_t current_length
= 1; current_length
< value
.size(); current_length
++)
2466 memcached_return_t rc
= memcached_set(memc
, test_literal_param("foo"),
2467 &value
[0], current_length
,
2468 (time_t)0, (uint32_t)0);
2469 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
2471 size_t string_length
;
2473 char *string
= memcached_get(memc
, test_literal_param("foo"),
2474 &string_length
, &flags
, &rc
);
2476 test_compare(MEMCACHED_SUCCESS
, rc
);
2477 test_compare(string_length
, current_length
);
2479 snprintf(buffer
, sizeof(buffer
), "%u", uint32_t(string_length
));
2480 test_memcmp_hint(string
, &value
[0], string_length
, buffer
);
2485 return TEST_SUCCESS
;
2489 Look for zero length value problems
2491 test_return_t
user_supplied_bug15(memcached_st
*memc
)
2493 for (uint32_t x
= 0; x
< 2; x
++)
2495 memcached_return_t rc
= memcached_set(memc
, test_literal_param("mykey"),
2497 (time_t)0, (uint32_t)0);
2499 test_compare(MEMCACHED_SUCCESS
, rc
);
2503 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2504 &length
, &flags
, &rc
);
2506 test_compare(MEMCACHED_SUCCESS
, rc
);
2511 value
= memcached_get(memc
, test_literal_param("mykey"),
2512 &length
, &flags
, &rc
);
2514 test_compare(MEMCACHED_SUCCESS
, rc
);
2520 return TEST_SUCCESS
;
2523 /* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2524 test_return_t
user_supplied_bug16(memcached_st
*memc
)
2526 test_compare_hint(MEMCACHED_SUCCESS
, memcached_set(memc
, test_literal_param("mykey"),
2528 (time_t)0, UINT32_MAX
),
2529 memcached_last_error_message(memc
));
2534 memcached_return_t rc
;
2535 char *value
= memcached_get(memc
, test_literal_param("mykey"),
2536 &length
, &flags
, &rc
);
2538 test_compare(MEMCACHED_SUCCESS
, rc
);
2541 test_compare(flags
, UINT32_MAX
);
2543 return TEST_SUCCESS
;
2546 #if !defined(__sun) && !defined(__OpenBSD__)
2547 /* Check the validity of chinese key*/
2548 test_return_t
user_supplied_bug17(memcached_st
*memc
)
2550 const char *key
= "豆瓣";
2551 const char *value
="我们在炎热抑郁的夏天无法停止豆瓣";
2552 memcached_return_t rc
= memcached_set(memc
, key
, strlen(key
),
2553 value
, strlen(value
),
2556 test_compare(MEMCACHED_SUCCESS
, rc
);
2560 char *value2
= memcached_get(memc
, key
, strlen(key
),
2561 &length
, &flags
, &rc
);
2563 test_compare(length
, strlen(value
));
2564 test_compare(MEMCACHED_SUCCESS
, rc
);
2565 test_memcmp(value
, value2
, length
);
2568 return TEST_SUCCESS
;
2576 test_return_t
user_supplied_bug19(memcached_st
*)
2578 memcached_return_t res
;
2580 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:11311/?100 --server=localhost:11312/?100"));
2582 const memcached_server_st
*server
= memcached_server_by_key(memc
, "a", 1, &res
);
2585 memcached_free(memc
);
2587 return TEST_SUCCESS
;
2590 /* CAS test from Andei */
2591 test_return_t
user_supplied_bug20(memcached_st
*memc
)
2593 const char *key
= "abc";
2594 size_t key_len
= strlen("abc");
2596 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
2598 test_compare(MEMCACHED_SUCCESS
,
2600 test_literal_param("abc"),
2601 test_literal_param("foobar"),
2602 (time_t)0, (uint32_t)0));
2604 test_compare(MEMCACHED_SUCCESS
,
2605 memcached_mget(memc
, &key
, &key_len
, 1));
2607 memcached_result_st result_obj
;
2608 memcached_result_st
*result
= memcached_result_create(memc
, &result_obj
);
2611 memcached_result_create(memc
, &result_obj
);
2612 memcached_return_t status
;
2613 result
= memcached_fetch_result(memc
, &result_obj
, &status
);
2616 test_compare(MEMCACHED_SUCCESS
, status
);
2618 memcached_result_free(result
);
2620 return TEST_SUCCESS
;
2623 /* Large mget() of missing keys with binary proto
2625 * If many binary quiet commands (such as getq's in an mget) fill the output
2626 * buffer and the server chooses not to respond, memcached_flush hangs. See
2627 * http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2630 /* sighandler_t function that always asserts false */
2631 static void fail(int)
2637 test_return_t
_user_supplied_bug21(memcached_st
* memc
, size_t key_count
)
2642 return TEST_SKIPPED
;
2644 void (*oldalarm
)(int);
2646 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
2647 test_true(memc_clone
);
2649 /* only binproto uses getq for mget */
2650 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, true));
2652 /* empty the cache to ensure misses (hence non-responses) */
2653 test_compare(MEMCACHED_SUCCESS
, memcached_flush(memc_clone
, 0));
2655 keys_st
keys(key_count
);
2657 oldalarm
= signal(SIGALRM
, fail
);
2660 test_compare_got(MEMCACHED_SUCCESS
,
2661 memcached_mget(memc_clone
, keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()),
2662 memcached_last_error_message(memc_clone
));
2665 signal(SIGALRM
, oldalarm
);
2667 memcached_return_t rc
;
2669 char return_key
[MEMCACHED_MAX_KEY
];
2670 size_t return_key_length
;
2672 size_t return_value_length
;
2673 while ((return_value
= memcached_fetch(memc
, return_key
, &return_key_length
,
2674 &return_value_length
, &flags
, &rc
)))
2676 test_false(return_value
); // There are no keys to fetch, so the value should never be returned
2678 test_compare(MEMCACHED_NOTFOUND
, rc
);
2679 test_zero(return_value_length
);
2680 test_zero(return_key_length
);
2681 test_false(return_key
[0]);
2682 test_false(return_value
);
2684 memcached_free(memc_clone
);
2686 return TEST_SUCCESS
;
2690 test_return_t
user_supplied_bug21(memcached_st
*memc
)
2692 test_skip(TEST_SUCCESS
, pre_binary(memc
));
2694 /* should work as of r580 */
2695 test_compare(TEST_SUCCESS
,
2696 _user_supplied_bug21(memc
, 10));
2698 /* should fail as of r580 */
2699 test_compare(TEST_SUCCESS
,
2700 _user_supplied_bug21(memc
, 1000));
2702 return TEST_SUCCESS
;
2705 test_return_t
output_ketama_weighted_keys(memcached_st
*)
2707 memcached_st
*memc
= memcached_create(NULL
);
2711 test_compare(MEMCACHED_SUCCESS
,
2712 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
, true));
2714 uint64_t value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
);
2715 test_compare(value
, uint64_t(1));
2717 test_compare(MEMCACHED_SUCCESS
,
2718 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
, MEMCACHED_HASH_MD5
));
2720 value
= memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_HASH
);
2721 test_true(value
== MEMCACHED_HASH_MD5
);
2724 test_true(memcached_behavior_set_distribution(memc
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY
) == MEMCACHED_SUCCESS
);
2726 memcached_server_st
*server_pool
;
2727 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");
2728 memcached_server_push(memc
, server_pool
);
2730 // @todo this needs to be refactored to actually test something.
2733 if ((fp
= fopen("ketama_keys.txt", "w")))
2737 printf("cannot write to file ketama_keys.txt");
2738 return TEST_FAILURE
;
2741 for (int x
= 0; x
< 10000; x
++)
2744 snprintf(key
, sizeof(key
), "%d", x
);
2746 uint32_t server_idx
= memcached_generate_hash(memc
, key
, strlen(key
));
2747 char *hostname
= memc
->hosts
[server_idx
].hostname
;
2748 in_port_t port
= memc
->hosts
[server_idx
].port
;
2749 fprintf(fp
, "key %s is on host /%s:%u\n", key
, hostname
, port
);
2750 memcached_server_instance_st instance
=
2751 memcached_server_instance_by_position(memc
, host_index
);
2755 memcached_server_list_free(server_pool
);
2756 memcached_free(memc
);
2758 return TEST_SUCCESS
;
2762 test_return_t
result_static(memcached_st
*memc
)
2764 memcached_result_st result
;
2765 memcached_result_st
*result_ptr
= memcached_result_create(memc
, &result
);
2766 test_false(result
.options
.is_allocated
);
2767 test_true(memcached_is_initialized(&result
));
2768 test_true(result_ptr
);
2769 test_true(result_ptr
== &result
);
2771 memcached_result_free(&result
);
2773 test_false(result
.options
.is_allocated
);
2774 test_false(memcached_is_initialized(&result
));
2776 return TEST_SUCCESS
;
2779 test_return_t
result_alloc(memcached_st
*memc
)
2781 memcached_result_st
*result_ptr
= memcached_result_create(memc
, NULL
);
2782 test_true(result_ptr
);
2783 test_true(result_ptr
->options
.is_allocated
);
2784 test_true(memcached_is_initialized(result_ptr
));
2785 memcached_result_free(result_ptr
);
2787 return TEST_SUCCESS
;
2791 test_return_t
add_host_test1(memcached_st
*memc
)
2793 memcached_return_t rc
;
2794 char servername
[]= "0.example.com";
2796 memcached_server_st
*servers
= memcached_server_list_append_with_weight(NULL
, servername
, 400, 0, &rc
);
2798 test_compare(1U, memcached_server_list_count(servers
));
2800 for (uint32_t x
= 2; x
< 20; x
++)
2802 char buffer
[SMALL_STRING_LEN
];
2804 snprintf(buffer
, SMALL_STRING_LEN
, "%lu.example.com", (unsigned long)(400 +x
));
2805 servers
= memcached_server_list_append_with_weight(servers
, buffer
, 401, 0,
2807 test_compare(MEMCACHED_SUCCESS
, rc
);
2808 test_compare(x
, memcached_server_list_count(servers
));
2811 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
2812 test_compare(MEMCACHED_SUCCESS
, memcached_server_push(memc
, servers
));
2814 memcached_server_list_free(servers
);
2816 return TEST_SUCCESS
;
2820 static void my_free(const memcached_st
*ptr
, void *mem
, void *context
)
2824 #ifdef HARD_MALLOC_TESTS
2825 void *real_ptr
= (mem
== NULL
) ? mem
: (void*)((caddr_t
)mem
- 8);
2833 static void *my_malloc(const memcached_st
*ptr
, const size_t size
, void *context
)
2837 #ifdef HARD_MALLOC_TESTS
2838 void *ret
= malloc(size
+ 8);
2841 ret
= (void*)((caddr_t
)ret
+ 8);
2844 void *ret
= malloc(size
);
2849 memset(ret
, 0xff, size
);
2856 static void *my_realloc(const memcached_st
*ptr
, void *mem
, const size_t size
, void *)
2858 #ifdef HARD_MALLOC_TESTS
2859 void *real_ptr
= (mem
== NULL
) ? NULL
: (void*)((caddr_t
)mem
- 8);
2860 void *nmem
= realloc(real_ptr
, size
+ 8);
2865 ret
= (void*)((caddr_t
)nmem
+ 8);
2871 return realloc(mem
, size
);
2876 static void *my_calloc(const memcached_st
*ptr
, size_t nelem
, const size_t size
, void *)
2878 #ifdef HARD_MALLOC_TESTS
2879 void *mem
= my_malloc(ptr
, nelem
* size
);
2882 memset(mem
, 0, nelem
* size
);
2888 return calloc(nelem
, size
);
2892 test_return_t
selection_of_namespace_tests(memcached_st
*memc
)
2894 memcached_return_t rc
;
2895 const char *key
= "mine";
2898 /* Make sure be default none exists */
2899 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2901 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2903 /* Test a clean set */
2904 test_compare(MEMCACHED_SUCCESS
,
2905 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
2907 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2909 test_memcmp(value
, key
, 4);
2910 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2912 /* Test that we can turn it off */
2913 test_compare(MEMCACHED_SUCCESS
,
2914 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
2916 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2918 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2920 /* Now setup for main test */
2921 test_compare(MEMCACHED_SUCCESS
,
2922 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
2924 value
= (char *)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2926 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2927 test_memcmp(value
, key
, 4);
2929 /* Set to Zero, and then Set to something too large */
2932 memset(long_key
, 0, 255);
2934 test_compare(MEMCACHED_SUCCESS
,
2935 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, NULL
));
2937 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2939 test_compare(MEMCACHED_SUCCESS
, rc
);
2941 /* Test a long key for failure */
2942 /* TODO, extend test to determine based on setting, what result should be */
2943 strncpy(long_key
, "Thisismorethentheallottednumberofcharacters", sizeof(long_key
));
2944 test_compare(MEMCACHED_SUCCESS
,
2945 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
2947 /* Now test a key with spaces (which will fail from long key, since bad key is not set) */
2948 strncpy(long_key
, "This is more then the allotted number of characters", sizeof(long_key
));
2949 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
2950 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, long_key
));
2952 /* Test for a bad prefix, but with a short key */
2953 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_INVALID_ARGUMENTS
: MEMCACHED_SUCCESS
,
2954 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_VERIFY_KEY
, 1));
2956 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
) ? MEMCACHED_SUCCESS
: MEMCACHED_BAD_KEY_PROVIDED
,
2957 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, "dog cat"));
2960 return TEST_SUCCESS
;
2963 test_return_t
set_namespace(memcached_st
*memc
)
2965 memcached_return_t rc
;
2966 const char *key
= "mine";
2969 // Make sure we default to a null namespace
2970 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2972 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2974 /* Test a clean set */
2975 test_compare(MEMCACHED_SUCCESS
,
2976 memcached_callback_set(memc
, MEMCACHED_CALLBACK_NAMESPACE
, (void *)key
));
2978 value
= (char*)memcached_callback_get(memc
, MEMCACHED_CALLBACK_NAMESPACE
, &rc
);
2980 test_memcmp(value
, key
, 4);
2981 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
2983 return TEST_SUCCESS
;
2986 test_return_t
set_namespace_and_binary(memcached_st
*memc
)
2988 test_return_if(pre_binary(memc
));
2989 test_return_if(set_namespace(memc
));
2991 return TEST_SUCCESS
;
2994 #ifdef MEMCACHED_ENABLE_DEPRECATED
2995 test_return_t
deprecated_set_memory_alloc(memcached_st
*memc
)
2997 void *test_ptr
= NULL
;
3000 memcached_malloc_fn malloc_cb
= (memcached_malloc_fn
)my_malloc
;
3001 cb_ptr
= *(void **)&malloc_cb
;
3002 memcached_return_t rc
;
3004 test_compare(MEMCACHED_SUCCESS
,
3005 memcached_callback_set(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, cb_ptr
));
3006 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_MALLOC_FUNCTION
, &rc
);
3007 test_compare(MEMCACHED_SUCCESS
, rc
);
3008 test_true(test_ptr
== cb_ptr
);
3012 memcached_realloc_fn realloc_cb
=
3013 (memcached_realloc_fn
)my_realloc
;
3014 cb_ptr
= *(void **)&realloc_cb
;
3015 memcached_return_t rc
;
3017 test_compare(MEMCACHED_SUCCESS
,
3018 memcached_callback_set(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, cb_ptr
));
3019 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_REALLOC_FUNCTION
, &rc
);
3020 test_compare(MEMCACHED_SUCCESS
, rc
);
3021 test_true(test_ptr
== cb_ptr
);
3025 memcached_free_fn free_cb
=
3026 (memcached_free_fn
)my_free
;
3027 cb_ptr
= *(void **)&free_cb
;
3028 memcached_return_t rc
;
3030 test_compare(MEMCACHED_SUCCESS
,
3031 memcached_callback_set(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, cb_ptr
));
3032 test_ptr
= memcached_callback_get(memc
, MEMCACHED_CALLBACK_FREE_FUNCTION
, &rc
);
3033 test_compare(MEMCACHED_SUCCESS
, rc
);
3034 test_true(test_ptr
== cb_ptr
);
3037 return TEST_SUCCESS
;
3042 test_return_t
set_memory_alloc(memcached_st
*memc
)
3044 test_compare(MEMCACHED_INVALID_ARGUMENTS
,
3045 memcached_set_memory_allocators(memc
, NULL
, my_free
,
3046 my_realloc
, my_calloc
, NULL
));
3048 test_compare(MEMCACHED_SUCCESS
,
3049 memcached_set_memory_allocators(memc
, my_malloc
, my_free
,
3050 my_realloc
, my_calloc
, NULL
));
3052 memcached_malloc_fn mem_malloc
;
3053 memcached_free_fn mem_free
;
3054 memcached_realloc_fn mem_realloc
;
3055 memcached_calloc_fn mem_calloc
;
3056 memcached_get_memory_allocators(memc
, &mem_malloc
, &mem_free
,
3057 &mem_realloc
, &mem_calloc
);
3059 test_true(mem_malloc
== my_malloc
);
3060 test_true(mem_realloc
== my_realloc
);
3061 test_true(mem_calloc
== my_calloc
);
3062 test_true(mem_free
== my_free
);
3064 return TEST_SUCCESS
;
3067 test_return_t
enable_consistent_crc(memcached_st
*memc
)
3069 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, MEMCACHED_DISTRIBUTION_CONSISTENT
));
3070 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
), uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT
));
3073 if ((rc
= pre_crc(memc
)) != TEST_SUCCESS
)
3078 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
), uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT
));
3080 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
) != MEMCACHED_HASH_CRC
)
3082 return TEST_SKIPPED
;
3085 return TEST_SUCCESS
;
3088 test_return_t
enable_consistent_hsieh(memcached_st
*memc
)
3091 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, MEMCACHED_DISTRIBUTION_CONSISTENT
);
3092 if ((rc
= pre_hsieh(memc
)) != TEST_SUCCESS
)
3097 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
), uint64_t(MEMCACHED_DISTRIBUTION_CONSISTENT
));
3099 if (memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_HASH
) != MEMCACHED_HASH_HSIEH
)
3101 return TEST_SKIPPED
;
3104 return TEST_SUCCESS
;
3107 test_return_t
enable_cas(memcached_st
*memc
)
3109 unsigned int set
= 1;
3111 if (libmemcached_util_version_check(memc
, 1, 2, 4))
3113 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, set
);
3115 return TEST_SUCCESS
;
3118 return TEST_SKIPPED
;
3121 test_return_t
check_for_1_2_3(memcached_st
*memc
)
3123 memcached_version(memc
);
3125 memcached_server_instance_st instance
=
3126 memcached_server_instance_by_position(memc
, 0);
3128 if ((instance
->major_version
>= 1 && (instance
->minor_version
== 2 && instance
->micro_version
>= 4))
3129 or instance
->minor_version
> 2)
3131 return TEST_SUCCESS
;
3134 return TEST_SKIPPED
;
3137 test_return_t
MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test(memcached_st
*memc
)
3139 const uint64_t timeout
= 100; // Not using, just checking that it sets
3141 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, timeout
);
3143 test_compare(timeout
, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
));
3145 return TEST_SUCCESS
;
3148 test_return_t
noreply_test(memcached_st
*memc
)
3150 test_compare(MEMCACHED_SUCCESS
,
3151 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, true));
3152 test_compare(MEMCACHED_SUCCESS
,
3153 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, true));
3154 test_compare(MEMCACHED_SUCCESS
,
3155 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, true));
3156 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_NOREPLY
));
3157 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
));
3158 test_compare(1LLU, memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
));
3160 memcached_return_t ret
;
3161 for (int count
= 0; count
< 5; ++count
)
3163 for (size_t x
= 0; x
< 100; ++x
)
3165 char key
[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH
+1];
3166 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
3167 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
3169 size_t len
= (size_t)check_length
;
3174 ret
= memcached_add(memc
, key
, len
, key
, len
, 0, 0);
3177 ret
= memcached_replace(memc
, key
, len
, key
, len
, 0, 0);
3180 ret
= memcached_set(memc
, key
, len
, key
, len
, 0, 0);
3183 ret
= memcached_append(memc
, key
, len
, key
, len
, 0, 0);
3186 ret
= memcached_prepend(memc
, key
, len
, key
, len
, 0, 0);
3192 test_true_got(ret
== MEMCACHED_SUCCESS
or ret
== MEMCACHED_BUFFERED
,
3193 memcached_strerror(NULL
, ret
));
3197 ** NOTE: Don't ever do this in your code! this is not a supported use of the
3198 ** API and is _ONLY_ done this way to verify that the library works the
3199 ** way it is supposed to do!!!!
3203 for (uint32_t x
= 0; x
< memcached_server_count(memc
); ++x
)
3205 memcached_server_instance_st instance
=
3206 memcached_server_instance_by_position(memc
, x
);
3207 no_msg
+=(int)(instance
->cursor_active
);
3210 test_true(no_msg
== 0);
3212 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
3215 ** Now validate that all items was set properly!
3217 for (size_t x
= 0; x
< 100; ++x
)
3221 int check_length
= (size_t)snprintf(key
, sizeof(key
), "%lu", (unsigned long)x
);
3223 test_false((size_t)check_length
>= sizeof(key
) || check_length
< 0);
3225 size_t len
= (size_t)check_length
;
3228 char* value
=memcached_get(memc
, key
, strlen(key
),
3229 &length
, &flags
, &ret
);
3230 // For the moment we will just go to the next key
3231 if (MEMCACHED_TIMEOUT
== ret
)
3235 test_true(ret
== MEMCACHED_SUCCESS
and value
!= NULL
);
3238 case 0: /* FALLTHROUGH */
3239 case 1: /* FALLTHROUGH */
3241 test_true(strncmp(value
, key
, len
) == 0);
3242 test_true(len
== length
);
3245 test_true(length
== len
* 2);
3248 test_true(length
== len
* 3);
3258 /* Try setting an illegal cas value (should not return an error to
3259 * the caller (because we don't expect a return message from the server)
3261 const char* keys
[]= {"0"};
3262 size_t lengths
[]= {1};
3265 memcached_result_st results_obj
;
3266 memcached_result_st
*results
;
3267 test_compare(MEMCACHED_SUCCESS
,
3268 memcached_mget(memc
, keys
, lengths
, 1));
3270 results
= memcached_result_create(memc
, &results_obj
);
3272 results
= memcached_fetch_result(memc
, &results_obj
, &ret
);
3274 test_compare(MEMCACHED_SUCCESS
, ret
);
3275 uint64_t cas
= memcached_result_cas(results
);
3276 memcached_result_free(&results_obj
);
3278 test_compare(MEMCACHED_SUCCESS
,
3279 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
3282 * The item will have a new cas value, so try to set it again with the old
3283 * value. This should fail!
3285 test_compare(MEMCACHED_SUCCESS
,
3286 memcached_cas(memc
, keys
[0], lengths
[0], keys
[0], lengths
[0], 0, 0, cas
));
3287 test_true(memcached_flush_buffers(memc
) == MEMCACHED_SUCCESS
);
3288 char* value
=memcached_get(memc
, keys
[0], lengths
[0], &length
, &flags
, &ret
);
3289 test_true(ret
== MEMCACHED_SUCCESS
&& value
!= NULL
);
3292 return TEST_SUCCESS
;
3295 test_return_t
analyzer_test(memcached_st
*memc
)
3297 memcached_analysis_st
*report
;
3298 memcached_return_t rc
;
3300 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
3301 test_compare(MEMCACHED_SUCCESS
, rc
);
3302 test_true(memc_stat
);
3304 report
= memcached_analyze(memc
, memc_stat
, &rc
);
3305 test_compare(MEMCACHED_SUCCESS
, rc
);
3309 memcached_stat_free(NULL
, memc_stat
);
3311 return TEST_SUCCESS
;
3314 test_return_t
util_version_test(memcached_st
*memc
)
3316 test_compare_hint(MEMCACHED_SUCCESS
, memcached_version(memc
), memcached_last_error_message(memc
));
3317 test_true(libmemcached_util_version_check(memc
, 0, 0, 0));
3319 bool if_successful
= libmemcached_util_version_check(memc
, 9, 9, 9);
3321 // We expect failure
3324 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
3325 fprintf(stderr
, "\nDumping Server Information\n\n");
3326 memcached_server_fn callbacks
[1];
3328 callbacks
[0]= dump_server_information
;
3329 memcached_server_cursor(memc
, callbacks
, (void *)stderr
, 1);
3330 fprintf(stderr
, "\n----------------------------------------------------------------------\n");
3332 test_true(if_successful
== false);
3334 memcached_server_instance_st instance
=
3335 memcached_server_instance_by_position(memc
, 0);
3337 memcached_version(memc
);
3339 // We only use one binary when we test, so this should be just fine.
3340 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, instance
->micro_version
);
3341 test_true(if_successful
== true);
3343 if (instance
->micro_version
> 0)
3345 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
-1));
3347 else if (instance
->minor_version
> 0)
3349 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
- 1), instance
->micro_version
);
3351 else if (instance
->major_version
> 0)
3353 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
-1), instance
->minor_version
, instance
->micro_version
);
3356 test_true(if_successful
== true);
3358 if (instance
->micro_version
> 0)
3360 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, instance
->minor_version
, (uint8_t)(instance
->micro_version
+1));
3362 else if (instance
->minor_version
> 0)
3364 if_successful
= libmemcached_util_version_check(memc
, instance
->major_version
, (uint8_t)(instance
->minor_version
+1), instance
->micro_version
);
3366 else if (instance
->major_version
> 0)
3368 if_successful
= libmemcached_util_version_check(memc
, (uint8_t)(instance
->major_version
+1), instance
->minor_version
, instance
->micro_version
);
3371 test_true(if_successful
== false);
3373 return TEST_SUCCESS
;
3376 test_return_t
getpid_connection_failure_test(memcached_st
*memc
)
3378 test_skip(memc
->servers
[0].type
, MEMCACHED_CONNECTION_TCP
);
3379 memcached_return_t rc
;
3380 memcached_server_instance_st instance
=
3381 memcached_server_instance_by_position(memc
, 0);
3383 // Test both the version that returns a code, and the one that does not.
3384 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3385 memcached_server_port(instance
) -1, NULL
) == -1);
3387 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3388 memcached_server_port(instance
) -1, &rc
) == -1);
3389 test_compare_got(MEMCACHED_CONNECTION_FAILURE
, rc
, memcached_strerror(memc
, rc
));
3391 return TEST_SUCCESS
;
3395 test_return_t
getpid_test(memcached_st
*memc
)
3397 memcached_return_t rc
;
3398 memcached_server_instance_st instance
=
3399 memcached_server_instance_by_position(memc
, 0);
3401 // Test both the version that returns a code, and the one that does not.
3402 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3403 memcached_server_port(instance
), NULL
) > -1);
3405 test_true(libmemcached_util_getpid(memcached_server_name(instance
),
3406 memcached_server_port(instance
), &rc
) > -1);
3407 test_compare(MEMCACHED_SUCCESS
, rc
);
3409 return TEST_SUCCESS
;
3412 static memcached_return_t
ping_each_server(const memcached_st
*,
3413 const memcached_server_st
*instance
,
3416 // Test both the version that returns a code, and the one that does not.
3417 memcached_return_t rc
;
3418 if (libmemcached_util_ping(memcached_server_name(instance
),
3419 memcached_server_port(instance
), &rc
) == false)
3421 throw libtest::fatal(LIBYATL_DEFAULT_PARAM
, "%s:%d %s", memcached_server_name(instance
),
3422 memcached_server_port(instance
), memcached_strerror(NULL
, rc
));
3425 if (libmemcached_util_ping(memcached_server_name(instance
),
3426 memcached_server_port(instance
), NULL
) == false)
3428 throw libtest::fatal(LIBYATL_DEFAULT_PARAM
, "%s:%d", memcached_server_name(instance
), memcached_server_port(instance
));
3431 return MEMCACHED_SUCCESS
;
3434 test_return_t
libmemcached_util_ping_TEST(memcached_st
*memc
)
3436 memcached_server_fn callbacks
[1]= { ping_each_server
};
3437 memcached_server_cursor(memc
, callbacks
, NULL
, 1);
3439 return TEST_SUCCESS
;
3444 test_return_t
hash_sanity_test (memcached_st
*memc
)
3448 assert(MEMCACHED_HASH_DEFAULT
== MEMCACHED_HASH_DEFAULT
);
3449 assert(MEMCACHED_HASH_MD5
== MEMCACHED_HASH_MD5
);
3450 assert(MEMCACHED_HASH_CRC
== MEMCACHED_HASH_CRC
);
3451 assert(MEMCACHED_HASH_FNV1_64
== MEMCACHED_HASH_FNV1_64
);
3452 assert(MEMCACHED_HASH_FNV1A_64
== MEMCACHED_HASH_FNV1A_64
);
3453 assert(MEMCACHED_HASH_FNV1_32
== MEMCACHED_HASH_FNV1_32
);
3454 assert(MEMCACHED_HASH_FNV1A_32
== MEMCACHED_HASH_FNV1A_32
);
3455 #ifdef HAVE_HSIEH_HASH
3456 assert(MEMCACHED_HASH_HSIEH
== MEMCACHED_HASH_HSIEH
);
3458 assert(MEMCACHED_HASH_MURMUR
== MEMCACHED_HASH_MURMUR
);
3459 assert(MEMCACHED_HASH_JENKINS
== MEMCACHED_HASH_JENKINS
);
3460 assert(MEMCACHED_HASH_MAX
== MEMCACHED_HASH_MAX
);
3462 return TEST_SUCCESS
;
3466 test_return_t
hsieh_avaibility_test (memcached_st
*memc
)
3468 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
3470 test_compare(MEMCACHED_SUCCESS
,
3471 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
,
3472 (uint64_t)MEMCACHED_HASH_HSIEH
));
3474 return TEST_SUCCESS
;
3477 test_return_t
murmur_avaibility_test (memcached_st
*memc
)
3479 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
3481 test_compare(MEMCACHED_SUCCESS
,
3482 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_HASH
, (uint64_t)MEMCACHED_HASH_MURMUR
));
3484 return TEST_SUCCESS
;
3487 test_return_t
one_at_a_time_run (memcached_st
*)
3492 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3494 test_compare(one_at_a_time_values
[x
],
3495 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_DEFAULT
));
3498 return TEST_SUCCESS
;
3501 test_return_t
md5_run (memcached_st
*)
3506 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3508 test_compare(md5_values
[x
],
3509 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MD5
));
3512 return TEST_SUCCESS
;
3515 test_return_t
crc_run (memcached_st
*)
3520 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3522 test_compare(crc_values
[x
],
3523 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_CRC
));
3526 return TEST_SUCCESS
;
3529 test_return_t
fnv1_64_run (memcached_st
*)
3531 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64
));
3536 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3538 test_compare(fnv1_64_values
[x
],
3539 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_64
));
3542 return TEST_SUCCESS
;
3545 test_return_t
fnv1a_64_run (memcached_st
*)
3547 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1A_64
));
3552 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3554 test_compare(fnv1a_64_values
[x
],
3555 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_64
));
3558 return TEST_SUCCESS
;
3561 test_return_t
fnv1_32_run (memcached_st
*)
3566 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3568 test_compare(fnv1_32_values
[x
],
3569 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1_32
));
3572 return TEST_SUCCESS
;
3575 test_return_t
fnv1a_32_run (memcached_st
*)
3580 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3582 test_compare(fnv1a_32_values
[x
],
3583 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_FNV1A_32
));
3586 return TEST_SUCCESS
;
3589 test_return_t
hsieh_run (memcached_st
*)
3591 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH
));
3596 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3598 test_compare(hsieh_values
[x
],
3599 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_HSIEH
));
3602 return TEST_SUCCESS
;
3605 test_return_t
murmur_run (memcached_st
*)
3607 test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR
));
3609 #ifdef WORDS_BIGENDIAN
3610 (void)murmur_values
;
3611 return TEST_SKIPPED
;
3616 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3618 test_compare(murmur_values
[x
],
3619 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_MURMUR
));
3622 return TEST_SUCCESS
;
3626 test_return_t
jenkins_run (memcached_st
*)
3631 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3633 test_compare(jenkins_values
[x
],
3634 memcached_generate_hash_value(*ptr
, strlen(*ptr
), MEMCACHED_HASH_JENKINS
));
3637 return TEST_SUCCESS
;
3640 static uint32_t hash_md5_test_function(const char *string
, size_t string_length
, void *)
3642 return libhashkit_md5(string
, string_length
);
3645 static uint32_t hash_crc_test_function(const char *string
, size_t string_length
, void *)
3647 return libhashkit_crc32(string
, string_length
);
3650 test_return_t
memcached_get_hashkit_test (memcached_st
*)
3656 memcached_st
*memc
= memcached(test_literal_param("--server=localhost:1 --server=localhost:2 --server=localhost:3 --server=localhost:4 --server=localhost5 --DISTRIBUTION=modula"));
3658 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};
3659 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};
3661 const hashkit_st
*kit
= memcached_get_hashkit(memc
);
3663 hashkit_clone(&new_kit
, kit
);
3664 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_md5_test_function
, NULL
));
3666 memcached_set_hashkit(memc
, &new_kit
);
3669 Verify Setting the hash.
3671 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3675 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
3676 test_compare_got(md5_values
[x
], hash_val
, *ptr
);
3681 Now check memcached_st.
3683 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3687 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
3688 test_compare_got(md5_hosts
[x
], hash_val
, *ptr
);
3691 test_compare(HASHKIT_SUCCESS
, hashkit_set_custom_function(&new_kit
, hash_crc_test_function
, NULL
));
3693 memcached_set_hashkit(memc
, &new_kit
);
3696 Verify Setting the hash.
3698 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3702 hash_val
= hashkit_digest(kit
, *ptr
, strlen(*ptr
));
3703 test_true(crc_values
[x
] == hash_val
);
3706 for (ptr
= list_to_hash
, x
= 0; *ptr
; ptr
++, x
++)
3710 hash_val
= memcached_generate_hash(memc
, *ptr
, strlen(*ptr
));
3711 test_compare(crc_hosts
[x
], hash_val
);
3714 memcached_free(memc
);
3716 return TEST_SUCCESS
;
3720 Test case adapted from John Gorman <johngorman2@gmail.com>
3722 We are testing the error condition when we connect to a server via memcached_get()
3723 but find that the server is not available.
3725 test_return_t
memcached_get_MEMCACHED_ERRNO(memcached_st
*)
3729 memcached_return rc
;
3732 memcached_st
*tl_memc_h
= memcached(test_literal_param("--server=localhost:9898 --server=localhost:9899")); // This server should not exist
3734 // See if memcached is reachable.
3735 char *value
= memcached_get(tl_memc_h
,
3736 test_literal_param(__func__
),
3741 test_true(memcached_failed(rc
));
3743 memcached_free(tl_memc_h
);
3745 return TEST_SUCCESS
;
3749 We connect to a server which exists, but search for a key that does not exist.
3751 test_return_t
memcached_get_MEMCACHED_NOTFOUND(memcached_st
*memc
)
3755 memcached_return rc
;
3757 // See if memcached is reachable.
3758 char *value
= memcached_get(memc
,
3759 test_literal_param(__func__
),
3764 test_compare(MEMCACHED_NOTFOUND
, rc
);
3766 return TEST_SUCCESS
;
3770 Test case adapted from John Gorman <johngorman2@gmail.com>
3772 We are testing the error condition when we connect to a server via memcached_get_by_key()
3773 but find that the server is not available.
3775 test_return_t
memcached_get_by_key_MEMCACHED_ERRNO(memcached_st
*)
3779 memcached_return rc
;
3782 memcached_st
*tl_memc_h
= memcached_create(NULL
);
3783 memcached_server_st
*servers
= memcached_servers_parse("localhost:9898,localhost:9899"); // This server should not exist
3784 memcached_server_push(tl_memc_h
, servers
);
3785 memcached_server_list_free(servers
);
3787 // See if memcached is reachable.
3788 char *value
= memcached_get_by_key(tl_memc_h
,
3789 test_literal_param(__func__
), // Key
3790 test_literal_param(__func__
), // Value
3795 test_true(memcached_failed(rc
));
3797 memcached_free(tl_memc_h
);
3799 return TEST_SUCCESS
;
3803 We connect to a server which exists, but search for a key that does not exist.
3805 test_return_t
memcached_get_by_key_MEMCACHED_NOTFOUND(memcached_st
*memc
)
3809 memcached_return rc
;
3811 // See if memcached is reachable.
3812 char *value
= memcached_get_by_key(memc
,
3813 test_literal_param(__func__
), // Key
3814 test_literal_param(__func__
), // Value
3819 test_compare(MEMCACHED_NOTFOUND
, rc
);
3821 return TEST_SUCCESS
;
3824 test_return_t
regression_bug_434484(memcached_st
*memc
)
3826 test_skip(TEST_SUCCESS
, pre_binary(memc
));
3828 test_compare(MEMCACHED_NOTSTORED
,
3829 memcached_append(memc
,
3830 test_literal_param(__func__
), // Key
3831 test_literal_param(__func__
), // Value
3834 libtest::vchar_t data
;
3835 data
.resize(2048 * 1024);
3836 test_compare(MEMCACHED_E2BIG
,
3838 test_literal_param(__func__
), // Key
3839 &data
[0], data
.size(), 0, 0));
3841 return TEST_SUCCESS
;
3844 test_return_t
regression_bug_434843(memcached_st
*original_memc
)
3846 test_skip(TEST_SUCCESS
, pre_binary(original_memc
));
3848 memcached_return_t rc
;
3850 memcached_execute_fn callbacks
[]= { &callback_counter
};
3853 * I only want to hit only _one_ server so I know the number of requests I'm
3854 * sending in the pipleine to the server. Let's try to do a multiget of
3855 * 1024 (that should satisfy most users don't you think?). Future versions
3856 * will include a mget_execute function call if you need a higher number.
3858 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL");
3863 * Run two times.. the first time we should have 100% cache miss,
3864 * and the second time we should have 100% cache hits
3866 for (ptrdiff_t y
= 0; y
< 2; y
++)
3868 test_compare(MEMCACHED_SUCCESS
,
3869 memcached_mget(memc
, keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
3871 // One the first run we should get a NOT_FOUND, but on the second some data
3872 // should be returned.
3873 test_compare(y
? MEMCACHED_SUCCESS
: MEMCACHED_NOTFOUND
,
3874 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
3878 /* The first iteration should give me a 100% cache miss. verify that*/
3879 char blob
[1024]= { 0 };
3881 test_false(counter
);
3883 for (size_t x
= 0; x
< keys
.size(); ++x
)
3885 rc
= memcached_add(memc
,
3886 keys
.key_at(x
), keys
.length_at(x
),
3887 blob
, sizeof(blob
), 0, 0);
3888 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
3893 /* Verify that we received all of the key/value pairs */
3894 test_compare(counter
, keys
.size());
3898 memcached_free(memc
);
3900 return TEST_SUCCESS
;
3903 test_return_t
regression_bug_434843_buffered(memcached_st
*memc
)
3905 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, true));
3907 return regression_bug_434843(memc
);
3910 test_return_t
regression_bug_421108(memcached_st
*memc
)
3912 memcached_return_t rc
;
3913 memcached_stat_st
*memc_stat
= memcached_stat(memc
, NULL
, &rc
);
3914 test_compare(MEMCACHED_SUCCESS
, rc
);
3916 char *bytes_str
= memcached_stat_get_value(memc
, memc_stat
, "bytes", &rc
);
3917 test_compare(MEMCACHED_SUCCESS
, rc
);
3918 test_true(bytes_str
);
3919 char *bytes_read_str
= memcached_stat_get_value(memc
, memc_stat
,
3921 test_compare(MEMCACHED_SUCCESS
, rc
);
3922 test_true(bytes_read_str
);
3924 char *bytes_written_str
= memcached_stat_get_value(memc
, memc_stat
,
3925 "bytes_written", &rc
);
3926 test_compare(MEMCACHED_SUCCESS
, rc
);
3927 test_true(bytes_written_str
);
3929 unsigned long long bytes
= strtoull(bytes_str
, 0, 10);
3930 unsigned long long bytes_read
= strtoull(bytes_read_str
, 0, 10);
3931 unsigned long long bytes_written
= strtoull(bytes_written_str
, 0, 10);
3933 test_true(bytes
!= bytes_read
);
3934 test_true(bytes
!= bytes_written
);
3936 /* Release allocated resources */
3938 free(bytes_read_str
);
3939 free(bytes_written_str
);
3940 memcached_stat_free(NULL
, memc_stat
);
3942 return TEST_SUCCESS
;
3946 * The test case isn't obvious so I should probably document why
3947 * it works the way it does. Bug 442914 was caused by a bug
3948 * in the logic in memcached_purge (it did not handle the case
3949 * where the number of bytes sent was equal to the watermark).
3950 * In this test case, create messages so that we hit that case
3951 * and then disable noreply mode and issue a new command to
3952 * verify that it isn't stuck. If we change the format for the
3953 * delete command or the watermarks, we need to update this
3956 test_return_t
regression_bug_442914(memcached_st
*original_memc
)
3958 test_skip(original_memc
->servers
[0].type
, MEMCACHED_CONNECTION_TCP
);
3960 memcached_st
* memc
= create_single_instance_memcached(original_memc
, "--NOREPLY --TCP-NODELAY");
3962 for (uint32_t x
= 0; x
< 250; ++x
)
3965 size_t len
= (size_t)snprintf(key
, sizeof(key
), "%0250u", x
);
3966 memcached_return_t rc
= memcached_delete(memc
, key
, len
, 0);
3967 char error_buffer
[2048]= { 0 };
3968 snprintf(error_buffer
, sizeof(error_buffer
), "%s key: %s", memcached_last_error_message(memc
), key
);
3969 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, error_buffer
);
3972 // Delete, and then delete again to look for not found
3975 size_t len
= snprintf(key
, sizeof(key
), "%037u", 251U);
3976 memcached_return_t rc
= memcached_delete(memc
, key
, len
, 0);
3977 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
3979 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, false));
3980 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, key
, len
, 0));
3983 memcached_free(memc
);
3985 return TEST_SUCCESS
;
3988 test_return_t
regression_bug_447342(memcached_st
*memc
)
3990 if (memcached_server_count(memc
) < 3 or pre_replication(memc
) != TEST_SUCCESS
)
3992 return TEST_SKIPPED
;
3995 test_compare(MEMCACHED_SUCCESS
,
3996 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS
, 2));
4000 for (size_t x
= 0; x
< keys
.size(); ++x
)
4002 test_compare(MEMCACHED_SUCCESS
,
4004 keys
.key_at(x
), keys
.length_at(x
), // Keys
4005 keys
.key_at(x
), keys
.length_at(x
), // Values
4010 ** We are using the quiet commands to store the replicas, so we need
4011 ** to ensure that all of them are processed before we can continue.
4012 ** In the test we go directly from storing the object to trying to
4013 ** receive the object from all of the different servers, so we
4014 ** could end up in a race condition (the memcached server hasn't yet
4015 ** processed the quiet command from the replication set when it process
4016 ** the request from the other client (created by the clone)). As a
4017 ** workaround for that we call memcached_quit to send the quit command
4018 ** to the server and wait for the response ;-) If you use the test code
4019 ** as an example for your own code, please note that you shouldn't need
4022 memcached_quit(memc
);
4024 /* Verify that all messages are stored, and we didn't stuff too much
4027 test_compare(MEMCACHED_SUCCESS
,
4028 memcached_mget(memc
,
4029 keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
4031 unsigned int counter
= 0;
4032 memcached_execute_fn callbacks
[]= { &callback_counter
};
4033 test_compare(MEMCACHED_SUCCESS
,
4034 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4036 /* Verify that we received all of the key/value pairs */
4037 test_compare(counter
, keys
.size());
4039 memcached_quit(memc
);
4041 * Don't do the following in your code. I am abusing the internal details
4042 * within the library, and this is not a supported interface.
4043 * This is to verify correct behavior in the library. Fake that two servers
4046 memcached_server_instance_st instance_one
= memcached_server_instance_by_position(memc
, 0);
4047 memcached_server_instance_st instance_two
= memcached_server_instance_by_position(memc
, 2);
4048 in_port_t port0
= instance_one
->port
;
4049 in_port_t port2
= instance_two
->port
;
4051 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
4052 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
4054 test_compare(MEMCACHED_SUCCESS
,
4055 memcached_mget(memc
,
4056 keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
4059 test_compare(MEMCACHED_SUCCESS
,
4060 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4061 test_compare(counter
, keys
.size());
4063 /* restore the memc handle */
4064 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
4065 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
4067 memcached_quit(memc
);
4069 /* Remove half of the objects */
4070 for (size_t x
= 0; x
< keys
.size(); ++x
)
4074 test_compare(MEMCACHED_SUCCESS
,
4075 memcached_delete(memc
, keys
.key_at(x
), keys
.length_at(x
), 0));
4079 memcached_quit(memc
);
4080 ((memcached_server_write_instance_st
)instance_one
)->port
= 0;
4081 ((memcached_server_write_instance_st
)instance_two
)->port
= 0;
4083 /* now retry the command, this time we should have cache misses */
4084 test_compare(MEMCACHED_SUCCESS
,
4085 memcached_mget(memc
,
4086 keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size()));
4089 test_compare(MEMCACHED_SUCCESS
,
4090 memcached_fetch_execute(memc
, callbacks
, (void *)&counter
, 1));
4091 test_compare(counter
, (unsigned int)(keys
.size() >> 1));
4093 /* restore the memc handle */
4094 ((memcached_server_write_instance_st
)instance_one
)->port
= port0
;
4095 ((memcached_server_write_instance_st
)instance_two
)->port
= port2
;
4097 return TEST_SUCCESS
;
4100 test_return_t
regression_bug_463297(memcached_st
*memc
)
4102 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(memc
, "foo", 3, 1));
4104 // Since we blocked timed delete, this test is no longer valid.
4106 memcached_st
*memc_clone
= memcached_clone(NULL
, memc
);
4107 test_true(memc_clone
);
4108 test_true(memcached_version(memc_clone
) == MEMCACHED_SUCCESS
);
4110 memcached_server_instance_st instance
=
4111 memcached_server_instance_by_position(memc_clone
, 0);
4113 if (instance
->major_version
> 1 ||
4114 (instance
->major_version
== 1 &&
4115 instance
->minor_version
> 2))
4117 /* Binary protocol doesn't support deferred delete */
4118 memcached_st
*bin_clone
= memcached_clone(NULL
, memc
);
4119 test_true(bin_clone
);
4120 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(bin_clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
4121 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(bin_clone
, "foo", 3, 1));
4122 memcached_free(bin_clone
);
4124 memcached_quit(memc_clone
);
4126 /* If we know the server version, deferred delete should fail
4127 * with invalid arguments */
4128 test_compare(MEMCACHED_INVALID_ARGUMENTS
, memcached_delete(memc_clone
, "foo", 3, 1));
4130 /* If we don't know the server version, we should get a protocol error */
4131 memcached_return_t rc
= memcached_delete(memc
, "foo", 3, 1);
4133 /* but there is a bug in some of the memcached servers (1.4) that treats
4134 * the counter as noreply so it doesn't send the proper error message
4136 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4138 /* And buffered mode should be disabled and we should get protocol error */
4139 test_true(memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 1) == MEMCACHED_SUCCESS
);
4140 rc
= memcached_delete(memc
, "foo", 3, 1);
4141 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4143 /* Same goes for noreply... */
4144 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 1));
4145 rc
= memcached_delete(memc
, "foo", 3, 1);
4146 test_true_got(rc
== MEMCACHED_PROTOCOL_ERROR
|| rc
== MEMCACHED_NOTFOUND
|| rc
== MEMCACHED_CLIENT_ERROR
|| rc
== MEMCACHED_INVALID_ARGUMENTS
, memcached_strerror(NULL
, rc
));
4148 /* but a normal request should go through (and be buffered) */
4149 test_compare(MEMCACHED_BUFFERED
, (rc
= memcached_delete(memc
, "foo", 3, 0)));
4150 test_compare(MEMCACHED_SUCCESS
, memcached_flush_buffers(memc
));
4152 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
, 0));
4153 /* unbuffered noreply should be success */
4154 test_compare(MEMCACHED_SUCCESS
, memcached_delete(memc
, "foo", 3, 0));
4155 /* unbuffered with reply should be not found... */
4156 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NOREPLY
, 0));
4157 test_compare(MEMCACHED_NOTFOUND
, memcached_delete(memc
, "foo", 3, 0));
4160 memcached_free(memc_clone
);
4163 return TEST_SUCCESS
;
4167 /* Test memcached_server_get_last_disconnect
4168 * For a working server set, shall be NULL
4169 * For a set of non existing server, shall not be NULL
4171 test_return_t
test_get_last_disconnect(memcached_st
*memc
)
4173 memcached_return_t rc
;
4174 memcached_server_instance_st disconnected_server
;
4176 /* With the working set of server */
4177 const char *key
= "marmotte";
4178 const char *value
= "milka";
4180 memcached_reset_last_disconnected_server(memc
);
4181 test_false(memc
->last_disconnected_server
);
4182 rc
= memcached_set(memc
, key
, strlen(key
),
4183 value
, strlen(value
),
4184 (time_t)0, (uint32_t)0);
4185 test_true(rc
== MEMCACHED_SUCCESS
|| rc
== MEMCACHED_BUFFERED
);
4187 disconnected_server
= memcached_server_get_last_disconnect(memc
);
4188 test_false(disconnected_server
);
4190 /* With a non existing server */
4192 memcached_server_st
*servers
;
4194 const char *server_list
= "localhost:9";
4196 servers
= memcached_servers_parse(server_list
);
4198 mine
= memcached_create(NULL
);
4199 rc
= memcached_server_push(mine
, servers
);
4200 test_compare(MEMCACHED_SUCCESS
, rc
);
4201 memcached_server_list_free(servers
);
4204 rc
= memcached_set(mine
, key
, strlen(key
),
4205 value
, strlen(value
),
4206 (time_t)0, (uint32_t)0);
4207 test_true(memcached_failed(rc
));
4209 disconnected_server
= memcached_server_get_last_disconnect(mine
);
4210 test_true_got(disconnected_server
, memcached_strerror(mine
, rc
));
4211 test_compare(in_port_t(9), memcached_server_port(disconnected_server
));
4212 test_false(strncmp(memcached_server_name(disconnected_server
),"localhost",9));
4214 memcached_quit(mine
);
4215 memcached_free(mine
);
4217 return TEST_SUCCESS
;
4220 test_return_t
test_multiple_get_last_disconnect(memcached_st
*)
4222 const char *server_string
= "--server=localhost:8888 --server=localhost:8889 --server=localhost:8890 --server=localhost:8891 --server=localhost:8892";
4223 char buffer
[BUFSIZ
];
4225 test_compare(MEMCACHED_SUCCESS
,
4226 libmemcached_check_configuration(server_string
, strlen(server_string
), buffer
, sizeof(buffer
)));
4228 memcached_st
*memc
= memcached(server_string
, strlen(server_string
));
4231 // We will just use the error strings as our keys
4232 uint32_t counter
= 100;
4235 for (int x
= int(MEMCACHED_SUCCESS
); x
< int(MEMCACHED_MAXIMUM_RETURN
); ++x
)
4237 const char *msg
= memcached_strerror(memc
, memcached_return_t(x
));
4238 memcached_return_t ret
= memcached_set(memc
, msg
, strlen(msg
), NULL
, 0, (time_t)0, (uint32_t)0);
4239 test_true_got((ret
== MEMCACHED_CONNECTION_FAILURE
or ret
== MEMCACHED_SERVER_TEMPORARILY_DISABLED
), memcached_last_error_message(memc
));
4241 memcached_server_instance_st disconnected_server
= memcached_server_get_last_disconnect(memc
);
4242 test_true(disconnected_server
);
4243 test_strcmp("localhost", memcached_server_name(disconnected_server
));
4244 test_true(memcached_server_port(disconnected_server
) >= 8888 and memcached_server_port(disconnected_server
) <= 8892);
4248 memcached_reset_last_disconnected_server(memc
);
4253 memcached_free(memc
);
4255 return TEST_SUCCESS
;
4258 test_return_t
test_verbosity(memcached_st
*memc
)
4260 memcached_verbosity(memc
, 3);
4262 return TEST_SUCCESS
;
4266 static memcached_return_t
stat_printer(memcached_server_instance_st server
,
4267 const char *key
, size_t key_length
,
4268 const char *value
, size_t value_length
,
4278 return MEMCACHED_SUCCESS
;
4281 test_return_t
memcached_stat_execute_test(memcached_st
*memc
)
4283 memcached_return_t rc
= memcached_stat_execute(memc
, NULL
, stat_printer
, NULL
);
4284 test_compare(MEMCACHED_SUCCESS
, rc
);
4286 test_compare(MEMCACHED_SUCCESS
,
4287 memcached_stat_execute(memc
, "slabs", stat_printer
, NULL
));
4289 test_compare(MEMCACHED_SUCCESS
,
4290 memcached_stat_execute(memc
, "items", stat_printer
, NULL
));
4292 test_compare(MEMCACHED_SUCCESS
,
4293 memcached_stat_execute(memc
, "sizes", stat_printer
, NULL
));
4295 return TEST_SUCCESS
;
4299 * This test ensures that the failure counter isn't incremented during
4300 * normal termination of the memcached instance.
4302 test_return_t
wrong_failure_counter_test(memcached_st
*original_memc
)
4304 memcached_st
* memc
= create_single_instance_memcached(original_memc
, NULL
);
4306 /* Ensure that we are connected to the server by setting a value */
4307 memcached_return_t rc
= memcached_set(memc
,
4308 test_literal_param(__func__
), // Key
4309 test_literal_param(__func__
), // Value
4310 time_t(0), uint32_t(0));
4311 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
);
4314 memcached_server_instance_st instance
= memcached_server_instance_by_position(memc
, 0);
4316 /* The test is to see that the memcached_quit doesn't increase the
4317 * the server failure conter, so let's ensure that it is zero
4318 * before sending quit
4320 ((memcached_server_write_instance_st
)instance
)->server_failure_counter
= 0;
4322 memcached_quit(memc
);
4324 /* Verify that it memcached_quit didn't increment the failure counter
4325 * Please note that this isn't bullet proof, because an error could
4328 test_zero(instance
->server_failure_counter
);
4330 memcached_free(memc
);
4332 return TEST_SUCCESS
;
4336 * This tests ensures expected disconnections (for some behavior changes
4337 * for instance) do not wrongly increase failure counter
4339 test_return_t
wrong_failure_counter_two_test(memcached_st
*memc
)
4341 /* Set value to force connection to the server */
4342 const char *key
= "marmotte";
4343 const char *value
= "milka";
4345 test_compare_hint(MEMCACHED_SUCCESS
,
4346 memcached_set(memc
, key
, strlen(key
),
4347 value
, strlen(value
),
4348 (time_t)0, (uint32_t)0),
4349 memcached_last_error_message(memc
));
4352 /* put failure limit to 1 */
4353 test_compare(MEMCACHED_SUCCESS
,
4354 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, true));
4356 /* Put a retry timeout to effectively activate failure_limit effect */
4357 test_compare(MEMCACHED_SUCCESS
,
4358 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, true));
4360 /* change behavior that triggers memcached_quit()*/
4361 test_compare(MEMCACHED_SUCCESS
,
4362 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, true));
4365 /* Check if we still are connected */
4367 size_t string_length
;
4368 memcached_return rc
;
4369 char *string
= memcached_get(memc
, key
, strlen(key
),
4370 &string_length
, &flags
, &rc
);
4372 test_compare_got(MEMCACHED_SUCCESS
, rc
, memcached_strerror(NULL
, rc
));
4376 return TEST_SUCCESS
;
4379 test_return_t
regression_996813_TEST(memcached_st
*)
4381 memcached_st
* memc
= memcached_create(NULL
);
4383 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_DISTRIBUTION
, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA
));
4384 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
, 1));
4385 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1));
4386 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
4387 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1));
4388 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
, 300));
4389 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 30));
4391 // We will never connect to these servers
4392 in_port_t base_port
= 11211;
4393 for (size_t x
= 0; x
< 17; x
++)
4395 test_compare(MEMCACHED_SUCCESS
, memcached_server_add(memc
, "10.2.3.4", base_port
+x
));
4397 test_compare(16U, memcached_generate_hash(memc
, test_literal_param("SZ6hu0SHweFmpwpc0w2R")));
4398 test_compare(1U, memcached_generate_hash(memc
, test_literal_param("SQCK9eiCf53YxHWnYA.o")));
4399 test_compare(10U, memcached_generate_hash(memc
, test_literal_param("SUSDkGXuuZC9t9VhMwa.")));
4400 test_compare(8U, memcached_generate_hash(memc
, test_literal_param("SnnqnJARfaCNT679iAF_")));
4402 memcached_free(memc
);
4404 return TEST_SUCCESS
;
4409 * Test that ensures mget_execute does not end into recursive calls that finally fails
4411 test_return_t
regression_bug_490486(memcached_st
*original_memc
)
4415 return TEST_SKIPPED
; // My MAC can't handle this test
4418 test_skip(TEST_SUCCESS
, pre_binary(original_memc
));
4421 * I only want to hit _one_ server so I know the number of requests I'm
4422 * sending in the pipeline.
4424 memcached_st
*memc
= create_single_instance_memcached(original_memc
, "--BINARY-PROTOCOL --POLL-TIMEOUT=1000 --REMOVE-FAILED-SERVERS=1 --RETRY-TIMEOUT=3600");
4427 keys_st
keys(20480);
4429 /* First add all of the items.. */
4430 char blob
[1024]= { 0 };
4431 for (size_t x
= 0; x
< keys
.size(); ++x
)
4433 memcached_return rc
= memcached_set(memc
,
4434 keys
.key_at(x
), keys
.length_at(x
),
4435 blob
, sizeof(blob
), 0, 0);
4436 test_true(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
); // MEMCACHED_TIMEOUT <-- hash been observed on OSX
4441 /* Try to get all of them with a large multiget */
4443 memcached_execute_function callbacks
[]= { &callback_counter
};
4444 memcached_return_t rc
= memcached_mget_execute(memc
,
4445 keys
.keys_ptr(), keys
.lengths_ptr(), keys
.size(),
4446 callbacks
, &counter
, 1);
4447 test_compare(MEMCACHED_SUCCESS
, rc
);
4449 char* the_value
= NULL
;
4450 char the_key
[MEMCACHED_MAX_KEY
];
4451 size_t the_key_length
;
4452 size_t the_value_length
;
4456 the_value
= memcached_fetch(memc
, the_key
, &the_key_length
, &the_value_length
, &the_flags
, &rc
);
4458 if ((the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
))
4464 } while ( (the_value
!= NULL
) && (rc
== MEMCACHED_SUCCESS
));
4467 test_compare(MEMCACHED_END
, rc
);
4469 /* Verify that we got all of the items */
4470 test_compare(counter
, keys
.size());
4473 memcached_free(memc
);
4475 return TEST_SUCCESS
;
4478 test_return_t
regression_bug_583031(memcached_st
*)
4480 memcached_st
*memc
= memcached_create(NULL
);
4482 test_compare(MEMCACHED_SUCCESS
, memcached_server_add(memc
, "10.2.3.4", 11211));
4484 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
, 1000);
4485 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 1000);
4486 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SND_TIMEOUT
, 1000);
4487 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
, 1000);
4488 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
4489 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
, 3);
4491 memcached_return_t rc
;
4495 const char *value
= memcached_get(memc
, "dsf", 3, &length
, &flags
, &rc
);
4499 test_compare_got(MEMCACHED_TIMEOUT
, rc
, memcached_last_error_message(memc
));
4501 memcached_free(memc
);
4503 return TEST_SUCCESS
;
4506 test_return_t
regression_bug_581030(memcached_st
*)
4509 memcached_stat_st
*local_stat
= memcached_stat(NULL
, NULL
, NULL
);
4510 test_false(local_stat
);
4512 memcached_stat_free(NULL
, NULL
);
4515 return TEST_SUCCESS
;
4518 #define regression_bug_655423_COUNT 6000
4519 test_return_t
regression_bug_655423(memcached_st
*memc
)
4521 memcached_st
*clone
= memcached_clone(NULL
, memc
);
4522 memc
= NULL
; // Just to make sure it is not used
4527 return TEST_SKIPPED
;
4530 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
4531 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_SUPPORT_CAS
, 1));
4532 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_TCP_NODELAY
, 1));
4533 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(clone
, MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH
, 1));
4535 memset(payload
, int('x'), sizeof(payload
));
4537 keys_st
keys(regression_bug_655423_COUNT
);
4539 for (size_t x
= 0; x
< keys
.size(); x
++)
4541 test_compare(MEMCACHED_SUCCESS
, memcached_set(clone
,
4544 payload
, sizeof(payload
), 0, 0));
4547 for (size_t x
= 0; x
< keys
.size(); x
++)
4549 size_t value_length
;
4550 memcached_return_t rc
;
4551 char *value
= memcached_get(clone
,
4554 &value_length
, NULL
, &rc
);
4556 if (rc
== MEMCACHED_NOTFOUND
)
4559 test_zero(value_length
);
4563 test_compare(MEMCACHED_SUCCESS
, rc
);
4565 test_compare(100LLU, value_length
);
4569 test_compare(MEMCACHED_SUCCESS
,
4570 memcached_mget(clone
,
4571 keys
.keys_ptr(), keys
.lengths_ptr(),
4575 memcached_result_st
*result
= NULL
;
4576 while ((result
= memcached_fetch_result(clone
, result
, NULL
)))
4578 test_compare(size_t(100), memcached_result_length(result
));
4582 test_true(count
> 100); // If we don't get back atleast this, something is up
4584 memcached_free(clone
);
4586 return TEST_SUCCESS
;
4590 * Test that ensures that buffered set to not trigger problems during io_flush
4592 #define regression_bug_490520_COUNT 200480
4593 test_return_t
regression_bug_490520(memcached_st
*original_memc
)
4595 memcached_st
* memc
= create_single_instance_memcached(original_memc
, NULL
);
4597 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_NO_BLOCK
,1);
4598 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
,1);
4599 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_POLL_TIMEOUT
, 1000);
4600 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
,1);
4601 memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
, 3600);
4603 /* First add all of the items.. */
4604 char blob
[3333] = {0};
4605 for (uint32_t x
= 0; x
< regression_bug_490520_COUNT
; ++x
)
4608 int key_length
= snprintf(key
, sizeof(key
), "0200%u", x
);
4610 memcached_return rc
= memcached_set(memc
, key
, key_length
, blob
, sizeof(blob
), 0, 0);
4611 test_true_got(rc
== MEMCACHED_SUCCESS
or rc
== MEMCACHED_BUFFERED
, memcached_last_error_message(memc
));
4614 memcached_free(memc
);
4616 return TEST_SUCCESS
;
4619 test_return_t
regression_1009493_TEST(memcached_st
*)
4621 memcached_st
* memc
= memcached_create(NULL
);
4623 test_compare(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_KETAMA
, true));
4625 memcached_st
* clone
= memcached_clone(NULL
, memc
);
4628 test_compare(memcached_behavior_get(memc
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
),
4629 memcached_behavior_get(clone
, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
));
4631 memcached_free(memc
);
4632 memcached_free(clone
);
4634 return TEST_SUCCESS
;
4637 test_return_t
regression_994772_TEST(memcached_st
* memc
)
4639 test_skip(MEMCACHED_SUCCESS
, memcached_behavior_set(memc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1));
4641 test_compare(MEMCACHED_SUCCESS
,
4643 test_literal_param(__func__
), // Key
4644 test_literal_param(__func__
), // Value
4645 time_t(0), uint32_t(0)));
4647 const char *keys
[] = { __func__
};
4648 size_t key_length
[]= { strlen(__func__
) };
4649 test_compare(MEMCACHED_SUCCESS
,
4650 memcached_mget(memc
, keys
, key_length
, 1));
4652 memcached_return_t rc
;
4653 memcached_result_st
*results
= memcached_fetch_result(memc
, NULL
, &rc
);
4655 test_compare(MEMCACHED_SUCCESS
, rc
);
4657 test_strcmp(__func__
, memcached_result_value(results
));
4658 uint64_t cas_value
= memcached_result_cas(results
);
4659 test_true(cas_value
);
4661 memcached_result_free(results
);
4663 // Bad cas value, sanity check
4664 test_true(cas_value
!= 9999);
4665 test_compare(MEMCACHED_END
,
4667 test_literal_param(__func__
), // Key
4668 test_literal_param(__FILE__
), // Value
4669 time_t(0), uint32_t(0), 9999));
4671 test_compare(MEMCACHED_SUCCESS
, memcached_set(memc
,
4672 "different", strlen("different"), // Key
4673 test_literal_param(__FILE__
), // Value
4674 time_t(0), uint32_t(0)));
4676 return TEST_SUCCESS
;
4679 test_return_t
regression_bug_854604(memcached_st
*)
4683 test_compare(MEMCACHED_INVALID_ARGUMENTS
, libmemcached_check_configuration(0, 0, buffer
, 0));
4685 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 0));
4687 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 1));
4688 test_compare(buffer
[0], 0);
4690 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, 10));
4691 test_true(strlen(buffer
));
4693 test_compare(MEMCACHED_PARSE_ERROR
, libmemcached_check_configuration(test_literal_param("syntax error"), buffer
, sizeof(buffer
)));
4694 test_true(strlen(buffer
));
4696 return TEST_SUCCESS
;
4699 static void die_message(memcached_st
* mc
, memcached_return error
, const char* what
, uint32_t it
)
4701 fprintf(stderr
, "Iteration #%u: ", it
);
4703 if (error
== MEMCACHED_ERRNO
)
4705 fprintf(stderr
, "system error %d from %s: %s\n",
4706 errno
, what
, strerror(errno
));
4710 fprintf(stderr
, "error %d from %s: %s\n", error
, what
,
4711 memcached_strerror(mc
, error
));
4715 #define TEST_CONSTANT_CREATION 200
4717 test_return_t
regression_bug_(memcached_st
*memc
)
4719 const char *remote_server
;
4722 if (! (remote_server
= getenv("LIBMEMCACHED_REMOTE_SERVER")))
4724 return TEST_SKIPPED
;
4727 for (uint32_t x
= 0; x
< TEST_CONSTANT_CREATION
; x
++)
4729 memcached_st
* mc
= memcached_create(NULL
);
4730 memcached_return rc
;
4732 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, 1);
4733 if (rc
!= MEMCACHED_SUCCESS
)
4735 die_message(mc
, rc
, "memcached_behavior_set", x
);
4738 rc
= memcached_behavior_set(mc
, MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
, 1);
4739 if (rc
!= MEMCACHED_SUCCESS
)
4741 die_message(mc
, rc
, "memcached_behavior_set", x
);
4744 rc
= memcached_server_add(mc
, remote_server
, 0);
4745 if (rc
!= MEMCACHED_SUCCESS
)
4747 die_message(mc
, rc
, "memcached_server_add", x
);
4750 const char *set_key
= "akey";
4751 const size_t set_key_len
= strlen(set_key
);
4752 const char *set_value
= "a value";
4753 const size_t set_value_len
= strlen(set_value
);
4755 if (rc
== MEMCACHED_SUCCESS
)
4759 size_t get_value_len
;
4761 uint32_t get_value_flags
;
4763 get_value
= memcached_get(mc
, set_key
, set_key_len
, &get_value_len
,
4764 &get_value_flags
, &rc
);
4765 if (rc
!= MEMCACHED_SUCCESS
)
4767 die_message(mc
, rc
, "memcached_get", x
);
4773 (get_value_len
!= set_value_len
4774 || 0!=strncmp(get_value
, set_value
, get_value_len
)))
4776 fprintf(stderr
, "Values don't match?\n");
4777 rc
= MEMCACHED_FAILURE
;
4783 rc
= memcached_set(mc
,
4784 set_key
, set_key_len
,
4785 set_value
, set_value_len
,
4789 if (rc
!= MEMCACHED_SUCCESS
)
4791 die_message(mc
, rc
, "memcached_set", x
);
4798 if (rc
!= MEMCACHED_SUCCESS
)
4804 return TEST_SUCCESS
;
4807 test_return_t
kill_HUP_TEST(memcached_st
*original_memc
)
4809 memcached_st
*memc
= create_single_instance_memcached(original_memc
, 0);
4812 memcached_server_instance_st instance
= memcached_server_instance_by_position(memc
, 0);
4815 test_true((pid
= libmemcached_util_getpid(memcached_server_name(instance
),
4816 memcached_server_port(instance
), NULL
)) > -1);
4819 test_compare(MEMCACHED_SUCCESS
,
4821 test_literal_param(__func__
), // Keys
4822 test_literal_param(__func__
), // Values
4824 test_true_got(kill(pid
, SIGHUP
) == 0, strerror(errno
));
4826 test_compare(MEMCACHED_CONNECTION_FAILURE
,
4828 test_literal_param(__func__
), // Keys
4829 test_literal_param(__func__
), // Values
4832 memcached_free(memc
);
4834 return TEST_SUCCESS
;