146
443
memcached_free(local_memc);
151
test_return allocation_test(memcached_st *not_used)
448
test_return_t allocation_test(memcached_st *not_used)
153
451
memcached_st *memc;
154
452
memc= memcached_create(NULL);
156
454
memcached_free(memc);
161
test_return clone_test(memcached_st *memc)
459
test_return_t clone_test(memcached_st *memc)
166
clone= memcached_clone(NULL, NULL);
168
memcached_free(clone);
463
memcached_st *memc_clone;
464
memc_clone= memcached_clone(NULL, NULL);
465
test_true(memc_clone);
466
memcached_free(memc_clone);
171
469
/* Can we init from null? */
174
clone= memcached_clone(NULL, memc);
176
memcached_free(clone);
179
/* Can we init from struct? */
181
memcached_st declared_clone;
183
clone= memcached_clone(&declared_clone, NULL);
185
memcached_free(clone);
188
/* Can we init from struct? */
190
memcached_st declared_clone;
192
clone= memcached_clone(&declared_clone, memc);
194
memcached_free(clone);
200
test_return connection_test(memcached_st *memc)
204
rc= memcached_server_add(memc, "localhost", 0);
205
assert(rc == MEMCACHED_SUCCESS);
210
test_return error_test(memcached_st *memc)
214
for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
216
printf("Error %d -> %s\n", rc, memcached_strerror(memc, rc));
222
test_return set_test(memcached_st *memc)
226
char *value= "when we sanitize";
228
rc= memcached_set(memc, key, strlen(key),
229
value, strlen(value),
230
(time_t)0, (uint32_t)0);
231
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
236
test_return append_test(memcached_st *memc)
244
rc= memcached_flush(memc, 0);
245
assert(rc == MEMCACHED_SUCCESS);
247
rc= memcached_set(memc, key, strlen(key),
248
value, strlen(value),
249
(time_t)0, (uint32_t)0);
250
assert(rc == MEMCACHED_SUCCESS);
252
rc= memcached_append(memc, key, strlen(key),
253
" the", strlen(" the"),
254
(time_t)0, (uint32_t)0);
255
assert(rc == MEMCACHED_SUCCESS);
257
rc= memcached_append(memc, key, strlen(key),
258
" people", strlen(" people"),
259
(time_t)0, (uint32_t)0);
260
assert(rc == MEMCACHED_SUCCESS);
262
value= memcached_get(memc, key, strlen(key),
263
&value_length, &flags, &rc);
264
assert(!memcmp(value, "we the people", strlen("we the people")));
265
assert(strlen("we the people") == value_length);
266
assert(rc == MEMCACHED_SUCCESS);
272
test_return append_binary_test(memcached_st *memc)
275
char *key= "numbers";
276
unsigned int *store_ptr;
277
unsigned int store_list[] = { 23, 56, 499, 98, 32847, 0 };
283
rc= memcached_flush(memc, 0);
284
assert(rc == MEMCACHED_SUCCESS);
286
rc= memcached_set(memc,
289
(time_t)0, (uint32_t)0);
290
assert(rc == MEMCACHED_SUCCESS);
292
for (x= 0; store_list[x] ; x++)
294
rc= memcached_append(memc,
296
(char *)&store_list[x], sizeof(unsigned int),
297
(time_t)0, (uint32_t)0);
298
assert(rc == MEMCACHED_SUCCESS);
301
value= memcached_get(memc, key, strlen(key),
302
&value_length, &flags, &rc);
303
assert((value_length == (sizeof(unsigned int) * x)));
304
assert(rc == MEMCACHED_SUCCESS);
306
store_ptr= (unsigned int *)value;
308
while ((size_t)store_ptr < (size_t)(value + value_length))
310
assert(*store_ptr == store_list[x++]);
318
test_return cas2_test(memcached_st *memc)
321
char *keys[]= {"fudge", "son", "food"};
471
memcached_st *memc_clone;
472
memc_clone= memcached_clone(NULL, memc);
473
test_true(memc_clone);
476
test_true(memc_clone->allocators.free == memc->allocators.free);
477
test_true(memc_clone->allocators.malloc == memc->allocators.malloc);
478
test_true(memc_clone->allocators.realloc == memc->allocators.realloc);
479
test_true(memc_clone->allocators.calloc == memc->allocators.calloc);
482
test_true(memc_clone->connect_timeout == memc->connect_timeout);
483
test_true(memc_clone->delete_trigger == memc->delete_trigger);
484
test_true(memc_clone->distribution == memc->distribution);
485
{ // Test all of the flags
486
test_true(memc_clone->flags.no_block == memc->flags.no_block);
487
test_true(memc_clone->flags.tcp_nodelay == memc->flags.tcp_nodelay);
488
test_true(memc_clone->flags.support_cas == memc->flags.support_cas);
489
test_true(memc_clone->flags.buffer_requests == memc->flags.buffer_requests);
490
test_true(memc_clone->flags.use_sort_hosts == memc->flags.use_sort_hosts);
491
test_true(memc_clone->flags.verify_key == memc->flags.verify_key);
492
test_true(memc_clone->ketama.weighted == memc->ketama.weighted);
493
test_true(memc_clone->flags.binary_protocol == memc->flags.binary_protocol);
494
test_true(memc_clone->flags.hash_with_namespace == memc->flags.hash_with_namespace);
495
test_true(memc_clone->flags.reply == memc->flags.reply);
496
test_true(memc_clone->flags.use_udp == memc->flags.use_udp);
497
test_true(memc_clone->flags.auto_eject_hosts == memc->flags.auto_eject_hosts);
498
test_true(memc_clone->flags.randomize_replica_read == memc->flags.randomize_replica_read);
500
test_true(memc_clone->get_key_failure == memc->get_key_failure);
501
test_true(hashkit_compare(&memc_clone->hashkit, &memc->hashkit));
502
test_true(memc_clone->io_bytes_watermark == memc->io_bytes_watermark);
503
test_true(memc_clone->io_msg_watermark == memc->io_msg_watermark);
504
test_true(memc_clone->io_key_prefetch == memc->io_key_prefetch);
505
test_true(memc_clone->on_cleanup == memc->on_cleanup);
506
test_true(memc_clone->on_clone == memc->on_clone);
507
test_true(memc_clone->poll_timeout == memc->poll_timeout);
508
test_true(memc_clone->rcv_timeout == memc->rcv_timeout);
509
test_true(memc_clone->recv_size == memc->recv_size);
510
test_true(memc_clone->retry_timeout == memc->retry_timeout);
511
test_true(memc_clone->send_size == memc->send_size);
512
test_true(memc_clone->server_failure_limit == memc->server_failure_limit);
513
test_true(memc_clone->snd_timeout == memc->snd_timeout);
514
test_true(memc_clone->user_data == memc->user_data);
516
memcached_free(memc_clone);
519
/* Can we init from struct? */
521
memcached_st declared_clone;
522
memcached_st *memc_clone;
523
memset(&declared_clone, 0 , sizeof(memcached_st));
524
memc_clone= memcached_clone(&declared_clone, NULL);
525
test_true(memc_clone);
526
memcached_free(memc_clone);
529
/* Can we init from struct? */
531
memcached_st declared_clone;
532
memcached_st *memc_clone;
533
memset(&declared_clone, 0 , sizeof(memcached_st));
534
memc_clone= memcached_clone(&declared_clone, memc);
535
test_true(memc_clone);
536
memcached_free(memc_clone);
542
test_return_t userdata_test(memcached_st *memc)
545
test_false(memcached_set_user_data(memc, foo));
546
test_true(memcached_get_user_data(memc) == foo);
547
test_true(memcached_set_user_data(memc, NULL) == foo);
552
test_return_t connection_test(memcached_st *memc)
554
test_compare(MEMCACHED_SUCCESS,
555
memcached_server_add_with_weight(memc, "localhost", 0, 0));
560
test_return_t libmemcached_string_behavior_test(memcached_st *)
562
for (int x= MEMCACHED_BEHAVIOR_NO_BLOCK; x < int(MEMCACHED_BEHAVIOR_MAX); ++x)
564
test_true(libmemcached_string_behavior(memcached_behavior_t(x)));
566
test_compare(37, int(MEMCACHED_BEHAVIOR_MAX));
571
test_return_t libmemcached_string_distribution_test(memcached_st *)
573
for (int x= MEMCACHED_DISTRIBUTION_MODULA; x < int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX); ++x)
575
test_true(libmemcached_string_distribution(memcached_server_distribution_t(x)));
577
test_compare(7, int(MEMCACHED_DISTRIBUTION_CONSISTENT_MAX));
582
test_return_t memcached_return_t_TEST(memcached_st *memc)
584
uint32_t values[] = { 851992627U, 2337886783U, 4109241422U, 4001849190U,
585
982370485U, 1263635348U, 4242906218U, 3829656100U,
586
1891735253U, 334139633U, 2257084983U, 3351789013U,
587
13199785U, 2542027183U, 1097051614U, 199566778U,
588
2748246961U, 2465192557U, 1664094137U, 2405439045U,
589
1842224848U, 692413798U, 3479807801U, 919913813U,
590
4269430871U, 610793021U, 527273862U, 1437122909U,
591
2300930706U, 2943759320U, 674306647U, 2400528935U,
592
54481931U, 4186304426U, 1741088401U, 2979625118U,
593
4159057246U, 3425930182U, 2593724503U, 1868899624U,
594
1769812374U, 2302537950U, 1110330676U, 3365377466U,
595
1336171666U, 3021258493U, 2334992265U, 3861994737U,
596
3582734124U, 3365377466U };
598
// You have updated the memcache_error messages but not updated docs/tests.
599
for (int rc= int(MEMCACHED_SUCCESS); rc < int(MEMCACHED_MAXIMUM_RETURN); ++rc)
602
const char *msg= memcached_strerror(memc, memcached_return_t(rc));
603
hash_val= memcached_generate_hash_value(msg, strlen(msg),
604
MEMCACHED_HASH_JENKINS);
605
if (values[rc] != hash_val)
607
fprintf(stderr, "\n\nYou have updated memcached_return_t without updating the memcached_return_t_TEST\n");
608
fprintf(stderr, "%u, %s, (%u)\n\n", (uint32_t)rc, memcached_strerror(memc, memcached_return_t(rc)), hash_val);
610
test_compare(values[rc], hash_val);
612
test_compare(49, int(MEMCACHED_MAXIMUM_RETURN));
617
test_return_t set_test(memcached_st *memc)
619
memcached_return_t rc= memcached_set(memc,
620
test_literal_param("foo"),
621
test_literal_param("when we sanitize"),
622
time_t(0), (uint32_t)0);
623
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, memcached_strerror(NULL, rc));
628
test_return_t append_test(memcached_st *memc)
630
memcached_return_t rc;
631
const char *in_value= "we";
635
test_compare(MEMCACHED_SUCCESS,
636
memcached_flush(memc, 0));
638
test_compare(MEMCACHED_SUCCESS,
640
test_literal_param(__func__),
641
in_value, strlen(in_value),
642
time_t(0), uint32_t(0)));
644
test_compare(MEMCACHED_SUCCESS,
645
memcached_append(memc,
646
test_literal_param(__func__),
647
" the", strlen(" the"),
648
time_t(0), uint32_t(0)));
650
test_compare(MEMCACHED_SUCCESS,
651
memcached_append(memc,
652
test_literal_param(__func__),
653
" people", strlen(" people"),
654
time_t(0), uint32_t(0)));
656
char *out_value= memcached_get(memc,
657
test_literal_param(__func__),
658
&value_length, &flags, &rc);
659
test_memcmp(out_value, "we the people", strlen("we the people"));
660
test_compare(strlen("we the people"), value_length);
661
test_compare(MEMCACHED_SUCCESS, rc);
667
test_return_t append_binary_test(memcached_st *memc)
669
uint32_t store_list[] = { 23, 56, 499, 98, 32847, 0 };
671
test_compare(MEMCACHED_SUCCESS,
672
memcached_flush(memc, 0));
674
test_compare(MEMCACHED_SUCCESS,
676
test_literal_param(__func__),
678
time_t(0), uint32_t(0)));
681
for (uint32_t x= 0; store_list[x] ; x++)
683
test_compare(MEMCACHED_SUCCESS,
684
memcached_append(memc,
685
test_literal_param(__func__),
686
(char *)&store_list[x], sizeof(uint32_t),
687
time_t(0), uint32_t(0)));
693
memcached_return_t rc;
694
uint32_t *value= (uint32_t *)memcached_get(memc,
695
test_literal_param(__func__),
696
&value_length, &flags, &rc);
697
test_compare(value_length, sizeof(uint32_t) * count);
698
test_compare(MEMCACHED_SUCCESS, rc);
700
for (uint32_t counter= count, *ptr= value; counter; counter--)
702
test_compare(*ptr, store_list[count - counter]);
710
test_return_t memcached_mget_mixed_memcached_get_TEST(memcached_st *memc)
714
for (libtest::vchar_ptr_t::iterator iter= keys.begin();
718
test_compare(MEMCACHED_SUCCESS,
722
time_t(0), uint32_t(0)));
725
for (ptrdiff_t loop= 0; loop < 20; loop++)
729
test_compare(MEMCACHED_SUCCESS,
730
memcached_mget(memc, keys.keys_ptr(), keys.lengths_ptr(), keys.size()));
732
memcached_result_st *results= memcached_result_create(memc, NULL);
735
size_t result_count= 0;
736
memcached_return_t rc;
737
while (memcached_fetch_result(memc, results, &rc))
741
test_compare(keys.size(), result_count);
745
int which_key= random() %keys.size();
748
memcached_return_t rc;
749
char *out_value= memcached_get(memc, keys.key_at(which_key), keys.length_at(which_key),
750
&value_length, &flags, &rc);
751
test_compare(MEMCACHED_SUCCESS, rc);
752
test_null(out_value);
753
test_zero(value_length);
761
test_return_t cas2_test(memcached_st *memc)
763
const char *keys[]= {"fudge", "son", "food"};
322
764
size_t key_length[]= {5, 3, 4};
323
char *value= "we the people";
765
const char *value= "we the people";
324
766
size_t value_length= strlen("we the people");
326
memcached_result_st results_obj;
327
memcached_result_st *results;
330
rc= memcached_flush(memc, 0);
331
assert(rc == MEMCACHED_SUCCESS);
333
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
335
for (x= 0; x < 3; x++)
768
test_compare(MEMCACHED_SUCCESS, memcached_flush(memc, 0));
770
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, true));
772
for (uint32_t x= 0; x < 3; x++)
337
rc= memcached_set(memc, keys[x], key_length[x],
338
keys[x], key_length[x],
339
(time_t)50, (uint32_t)9);
340
assert(rc == MEMCACHED_SUCCESS);
774
test_compare(MEMCACHED_SUCCESS,
775
memcached_set(memc, keys[x], key_length[x],
776
keys[x], key_length[x],
777
time_t(50), uint32_t(9)));
343
rc= memcached_mget(memc, keys, key_length, 3);
345
results= memcached_result_create(memc, &results_obj);
347
results= memcached_fetch_result(memc, &results_obj, &rc);
349
assert(results->cas);
350
assert(rc == MEMCACHED_SUCCESS);
351
WATCHPOINT_ASSERT(memcached_result_cas(results));
353
assert(!memcmp(value, "we the people", strlen("we the people")));
354
assert(strlen("we the people") == value_length);
355
assert(rc == MEMCACHED_SUCCESS);
357
memcached_result_free(&results_obj);
780
test_compare(MEMCACHED_SUCCESS,
781
memcached_mget(memc, keys, key_length, 3));
783
memcached_result_st *results= memcached_result_create(memc, NULL);
786
memcached_return_t rc;
787
results= memcached_fetch_result(memc, results, &rc);
789
test_true(results->item_cas);
790
test_compare(MEMCACHED_SUCCESS, rc);
791
test_true(memcached_result_cas(results));
793
test_memcmp(value, "we the people", strlen("we the people"));
794
test_compare(strlen("we the people"), value_length);
795
test_compare(MEMCACHED_SUCCESS, rc);
797
memcached_result_free(results);
362
test_return cas_test(memcached_st *memc)
802
test_return_t cas_test(memcached_st *memc)
366
size_t key_length= strlen("fun");
367
char *value= "we the people";
368
size_t value_length= strlen("we the people");
804
const char* keys[2] = { __func__, NULL };
805
size_t keylengths[2] = { strlen(__func__), 0 };
369
807
memcached_result_st results_obj;
370
memcached_result_st *results;
373
rc= memcached_flush(memc, 0);
374
assert(rc == MEMCACHED_SUCCESS);
376
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
378
rc= memcached_set(memc, key, strlen(key),
379
value, strlen(value),
380
(time_t)0, (uint32_t)0);
381
assert(rc == MEMCACHED_SUCCESS);
383
rc= memcached_mget(memc, &key, &key_length, 1);
385
results= memcached_result_create(memc, &results_obj);
387
results= memcached_fetch_result(memc, &results_obj, &rc);
389
assert(rc == MEMCACHED_SUCCESS);
390
WATCHPOINT_ASSERT(memcached_result_cas(results));
392
assert(!memcmp(value, "we the people", strlen("we the people")));
393
assert(strlen("we the people") == value_length);
394
assert(rc == MEMCACHED_SUCCESS);
396
rc= memcached_cas(memc, key, key_length,
397
"change the value", strlen("change the value"),
398
0, 0, memcached_result_cas(results));
400
assert(rc == MEMCACHED_SUCCESS);
402
rc= memcached_cas(memc, key, key_length,
403
"change the value", strlen("change the value"),
406
assert(rc == MEMCACHED_DATA_EXISTS);
809
test_compare(MEMCACHED_SUCCESS, memcached_flush(memc, 0));
811
test_skip(true, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, true));
813
test_compare(MEMCACHED_SUCCESS,
815
test_literal_param(__func__),
816
test_literal_param("we the people"),
817
(time_t)0, (uint32_t)0));
819
test_compare(MEMCACHED_SUCCESS,
820
memcached_mget(memc, keys, keylengths, 1));
822
memcached_result_st *results= memcached_result_create(memc, &results_obj);
825
memcached_return_t rc;
826
results= memcached_fetch_result(memc, &results_obj, &rc);
828
test_compare(MEMCACHED_SUCCESS, rc);
829
test_true(memcached_result_cas(results));
830
test_memcmp("we the people", memcached_result_value(results), test_literal_param_size("we the people"));
831
test_compare(test_literal_param_size("we the people"),
832
strlen(memcached_result_value(results)));
834
uint64_t cas= memcached_result_cas(results);
837
results= memcached_fetch_result(memc, &results_obj, &rc);
838
test_true(rc == MEMCACHED_END);
839
test_true(results == NULL);
842
test_compare(MEMCACHED_SUCCESS,
844
test_literal_param(__func__),
845
test_literal_param("change the value"),
849
* The item will have a new cas value, so try to set it again with the old
850
* value. This should fail!
852
test_compare(MEMCACHED_DATA_EXISTS,
854
test_literal_param(__func__),
855
test_literal_param("change the value"),
409
858
memcached_result_free(&results_obj);
414
test_return prepend_test(memcached_st *memc)
864
test_return_t prepend_test(memcached_st *memc)
418
char *value= "people";
866
const char *key= "fig";
867
const char *value= "people";
869
test_compare(MEMCACHED_SUCCESS,
870
memcached_flush(memc, 0));
872
test_compare(MEMCACHED_SUCCESS,
873
memcached_set(memc, key, strlen(key),
874
value, strlen(value),
875
time_t(0), uint32_t(0)));
877
test_compare(MEMCACHED_SUCCESS,
878
memcached_prepend(memc, key, strlen(key),
879
"the ", strlen("the "),
880
time_t(0), uint32_t(0)));
882
test_compare(MEMCACHED_SUCCESS,
883
memcached_prepend(memc, key, strlen(key),
884
"we ", strlen("we "),
885
time_t(0), uint32_t(0)));
419
887
size_t value_length;
422
rc= memcached_flush(memc, 0);
423
assert(rc == MEMCACHED_SUCCESS);
425
rc= memcached_set(memc, key, strlen(key),
426
value, strlen(value),
427
(time_t)0, (uint32_t)0);
428
assert(rc == MEMCACHED_SUCCESS);
430
rc= memcached_prepend(memc, key, strlen(key),
431
"the ", strlen("the "),
432
(time_t)0, (uint32_t)0);
433
assert(rc == MEMCACHED_SUCCESS);
435
rc= memcached_prepend(memc, key, strlen(key),
436
"we ", strlen("we "),
437
(time_t)0, (uint32_t)0);
438
assert(rc == MEMCACHED_SUCCESS);
440
value= memcached_get(memc, key, strlen(key),
889
memcached_return_t rc;
890
char *out_value= memcached_get(memc, key, strlen(key),
441
891
&value_length, &flags, &rc);
442
assert(!memcmp(value, "we the people", strlen("we the people")));
443
assert(strlen("we the people") == value_length);
444
assert(rc == MEMCACHED_SUCCESS);
892
test_memcmp(out_value, "we the people", strlen("we the people"));
893
test_compare(strlen("we the people"), value_length);
894
test_compare(MEMCACHED_SUCCESS, rc);
451
901
Set the value, then quit to make sure it is flushed.
452
902
Come back in and test that add fails.
454
test_return add_test(memcached_st *memc)
904
test_return_t add_test(memcached_st *memc)
458
char *value= "when we sanitize";
459
unsigned long long setting_value;
461
setting_value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
463
rc= memcached_set(memc, key, strlen(key),
464
value, strlen(value),
465
(time_t)0, (uint32_t)0);
466
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
906
test_compare_hint(return_value_based_on_buffering(memc),
908
test_literal_param(__func__),
909
test_literal_param("when we sanitize"),
910
time_t(0), uint32_t(0)),
911
memcached_last_error_message(memc));
467
913
memcached_quit(memc);
468
rc= memcached_add(memc, key, strlen(key),
469
value, strlen(value),
470
(time_t)0, (uint32_t)0);
472
/* Too many broken OS'es have broken loopback in async, so we can't be sure of the result */
474
assert(rc == MEMCACHED_NOTSTORED || rc == MEMCACHED_STORED);
476
assert(rc == MEMCACHED_NOTSTORED);
915
test_compare_hint(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) ? MEMCACHED_DATA_EXISTS : MEMCACHED_NOTSTORED,
917
test_literal_param(__func__),
918
test_literal_param("try something else"),
919
time_t(0), uint32_t(0)),
920
memcached_last_error_message(memc));
481
test_return add_wrapper(memcached_st *memc)
926
** There was a problem of leaking filedescriptors in the initial release
927
** of MacOSX 10.5. This test case triggers the problem. On some Solaris
928
** systems it seems that the kernel is slow on reclaiming the resources
929
** because the connects starts to time out (the test doesn't do much
930
** anyway, so just loop 10 iterations)
932
test_return_t add_wrapper(memcached_st *memc)
934
unsigned int max= 10000;
485
for (x= 0; x < 10000; x++)
942
for (uint32_t x= 0; x < max; x++)
491
test_return replace_test(memcached_st *memc)
495
char *value= "when we sanitize";
496
char *original= "first we insert some data";
498
rc= memcached_set(memc, key, strlen(key),
499
original, strlen(original),
500
(time_t)0, (uint32_t)0);
501
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
503
rc= memcached_replace(memc, key, strlen(key),
504
value, strlen(value),
505
(time_t)0, (uint32_t)0);
506
assert(rc == MEMCACHED_SUCCESS);
511
test_return delete_test(memcached_st *memc)
515
char *value= "when we sanitize";
517
rc= memcached_set(memc, key, strlen(key),
518
value, strlen(value),
519
(time_t)0, (uint32_t)0);
520
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
522
rc= memcached_delete(memc, key, strlen(key), (time_t)0);
523
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
528
test_return flush_test(memcached_st *memc)
532
rc= memcached_flush(memc, 0);
533
assert(rc == MEMCACHED_SUCCESS);
538
memcached_return server_function(memcached_st *ptr, memcached_server_st *server, void *context)
948
test_return_t replace_test(memcached_st *memc)
950
test_compare(return_value_based_on_buffering(memc),
952
test_literal_param(__func__),
953
test_literal_param("when we sanitize"),
954
time_t(0), uint32_t(0)));
956
test_compare(MEMCACHED_SUCCESS,
957
memcached_replace(memc,
958
test_literal_param(__func__),
959
test_literal_param("first we insert some data"),
960
time_t(0), uint32_t(0)));
965
test_return_t delete_test(memcached_st *memc)
967
test_compare(return_value_based_on_buffering(memc),
969
test_literal_param(__func__),
970
test_literal_param("when we sanitize"),
971
time_t(0), uint32_t(0)));
973
test_compare_hint(return_value_based_on_buffering(memc),
974
memcached_delete(memc,
975
test_literal_param(__func__),
977
memcached_last_error_message(memc));
982
test_return_t flush_test(memcached_st *memc)
984
uint64_t query_id= memcached_query_id(memc);
985
test_compare(MEMCACHED_SUCCESS,
986
memcached_flush(memc, 0));
987
test_compare(query_id +1, memcached_query_id(memc));
992
static memcached_return_t server_function(const memcached_st *,
993
const memcached_server_st *,
542
997
return MEMCACHED_SUCCESS;
545
test_return memcached_server_cursor_test(memcached_st *memc)
1000
test_return_t memcached_server_cursor_test(memcached_st *memc)
547
char *context= "foo bad";
548
memcached_server_function callbacks[1];
1003
strncpy(context, "foo bad", sizeof(context));
1004
memcached_server_fn callbacks[1];
550
1006
callbacks[0]= server_function;
551
1007
memcached_server_cursor(memc, callbacks, context, 1);
1008
return TEST_SUCCESS;
556
test_return bad_key_test(memcached_st *memc)
1011
test_return_t bad_key_test(memcached_st *memc)
559
char *key= "foo bad";
561
size_t string_length;
1013
memcached_return_t rc;
1014
const char *key= "foo bad";
566
clone= memcached_clone(NULL, memc);
569
(void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
571
string= memcached_get(clone, key, strlen(key),
572
&string_length, &flags, &rc);
573
assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
574
assert(string_length == 0);
578
(void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, set);
579
string= memcached_get(clone, key, strlen(key),
580
&string_length, &flags, &rc);
581
assert(rc == MEMCACHED_NOTFOUND);
582
assert(string_length == 0);
585
memcached_free(clone);
1017
uint64_t query_id= memcached_query_id(memc);
1019
// Just skip if we are in binary mode.
1020
test_skip(false, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1022
test_compare(query_id, memcached_query_id(memc)); // We should not increase the query_id for memcached_behavior_get()
1024
memcached_st *memc_clone= memcached_clone(NULL, memc);
1025
test_true(memc_clone);
1027
query_id= memcached_query_id(memc_clone);
1028
test_compare(MEMCACHED_SUCCESS,
1029
memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true));
1030
test_compare(query_id, memcached_query_id(memc_clone)); // We should not increase the query_id for memcached_behavior_set()
1032
/* All keys are valid in the binary protocol (except for length) */
1033
if (memcached_behavior_get(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) == false)
1035
uint64_t before_query_id= memcached_query_id(memc_clone);
1037
size_t string_length;
1038
char *string= memcached_get(memc_clone, key, strlen(key),
1039
&string_length, &flags, &rc);
1040
test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc);
1041
test_zero(string_length);
1044
test_compare(before_query_id +1, memcached_query_id(memc_clone));
1046
query_id= memcached_query_id(memc_clone);
1047
test_compare(MEMCACHED_SUCCESS,
1048
memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, false));
1049
test_compare(query_id, memcached_query_id(memc_clone)); // We should not increase the query_id for memcached_behavior_set()
1051
size_t string_length;
1052
char *string= memcached_get(memc_clone, key, strlen(key),
1053
&string_length, &flags, &rc);
1054
test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc));
1055
test_zero(string_length);
1059
/* Test multi key for bad keys */
1060
const char *keys[] = { "GoodKey", "Bad Key", "NotMine" };
1061
size_t key_lengths[] = { 7, 7, 7 };
1062
query_id= memcached_query_id(memc_clone);
1063
test_compare(MEMCACHED_SUCCESS,
1064
memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true));
1065
test_compare(query_id, memcached_query_id(memc_clone));
1067
query_id= memcached_query_id(memc_clone);
1068
test_compare(MEMCACHED_BAD_KEY_PROVIDED,
1069
memcached_mget(memc_clone, keys, key_lengths, 3));
1070
test_compare(query_id +1, memcached_query_id(memc_clone));
1072
query_id= memcached_query_id(memc_clone);
1073
// Grouping keys are not required to follow normal key behaviors
1074
test_compare(MEMCACHED_SUCCESS,
1075
memcached_mget_by_key(memc_clone, "foo daddy", 9, keys, key_lengths, 1));
1076
test_compare(query_id +1, memcached_query_id(memc_clone));
1078
/* The following test should be moved to the end of this function when the
1079
memcached server is updated to allow max size length of the keys in the
1082
test_compare(MEMCACHED_SUCCESS,
1083
memcached_callback_set(memc_clone, MEMCACHED_CALLBACK_NAMESPACE, NULL));
1085
libtest::vchar_t longkey;
1087
libtest::vchar_t::iterator it= longkey.begin();
1088
longkey.insert(it, MEMCACHED_MAX_KEY, 'a');
1091
test_compare(longkey.size(), size_t(MEMCACHED_MAX_KEY));
1093
size_t string_length;
1095
test_null(memcached_get(memc_clone, &longkey[0], longkey.size() -1, &string_length, &flags, &rc));
1096
test_compare(MEMCACHED_NOTFOUND, rc);
1097
test_zero(string_length);
1099
test_null(memcached_get(memc_clone, &longkey[0], longkey.size(), &string_length, &flags, &rc));
1100
test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc);
1101
test_zero(string_length);
1105
/* Make sure zero length keys are marked as bad */
1107
test_compare(MEMCACHED_SUCCESS,
1108
memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, true));
1109
size_t string_length;
1110
char *string= memcached_get(memc_clone, key, 0,
1111
&string_length, &flags, &rc);
1112
test_compare(MEMCACHED_BAD_KEY_PROVIDED, rc);
1113
test_zero(string_length);
1117
memcached_free(memc_clone);
1119
return TEST_SUCCESS;
590
1122
#define READ_THROUGH_VALUE "set for me"
591
memcached_return read_through_trigger(memcached_st *memc,
592
char *key, size_t key_length,
593
memcached_result_st *result)
1123
static memcached_return_t read_through_trigger(memcached_st *memc,
1126
memcached_result_st *result)
1128
(void)memc;(void)key;(void)key_length;
596
1129
return memcached_result_set_value(result, READ_THROUGH_VALUE, strlen(READ_THROUGH_VALUE));
599
test_return read_through(memcached_st *memc)
604
size_t string_length;
607
string= memcached_get(memc, key, strlen(key),
608
&string_length, &flags, &rc);
610
assert(rc == MEMCACHED_NOTFOUND);
611
assert(string_length == 0);
614
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, read_through_trigger);
615
assert(rc == MEMCACHED_SUCCESS);
617
string= memcached_get(memc, key, strlen(key),
618
&string_length, &flags, &rc);
620
assert(rc == MEMCACHED_SUCCESS);
621
assert(string_length == strlen(READ_THROUGH_VALUE));
622
assert(!strcmp(READ_THROUGH_VALUE, string));
625
string= memcached_get(memc, key, strlen(key),
626
&string_length, &flags, &rc);
628
assert(rc == MEMCACHED_SUCCESS);
629
assert(string_length == strlen(READ_THROUGH_VALUE));
630
assert(!strcmp(READ_THROUGH_VALUE, string));
636
memcached_return delete_trigger(memcached_st *ptr, char *key, size_t key_length)
640
return MEMCACHED_SUCCESS;
643
test_return delete_through(memcached_st *memc)
645
memcached_trigger_delete_key callback;
648
callback= delete_trigger;
650
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_DELETE_TRIGGER, callback);
651
assert(rc == MEMCACHED_SUCCESS);
656
test_return get_test(memcached_st *memc)
661
size_t string_length;
664
rc= memcached_delete(memc, key, strlen(key), (time_t)0);
665
assert(rc == MEMCACHED_BUFFERED || rc == MEMCACHED_NOTFOUND);
667
string= memcached_get(memc, key, strlen(key),
668
&string_length, &flags, &rc);
670
assert(rc == MEMCACHED_NOTFOUND);
671
assert(string_length == 0);
677
test_return get_test2(memcached_st *memc)
681
char *value= "when we sanitize";
683
size_t string_length;
686
rc= memcached_set(memc, key, strlen(key),
687
value, strlen(value),
688
(time_t)0, (uint32_t)0);
689
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
691
string= memcached_get(memc, key, strlen(key),
692
&string_length, &flags, &rc);
695
assert(rc == MEMCACHED_SUCCESS);
696
assert(string_length == strlen(value));
697
assert(!memcmp(string, value, string_length));
704
test_return set_test2(memcached_st *memc)
708
char *value= "train in the brain";
709
size_t value_length= strlen(value);
712
for (x= 0; x < 10; x++)
714
rc= memcached_set(memc, key, strlen(key),
716
(time_t)0, (uint32_t)0);
717
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
723
test_return set_test3(memcached_st *memc)
728
size_t value_length= 8191;
731
value = (char*)malloc(value_length);
734
for (x= 0; x < value_length; x++)
735
value[x] = (char) (x % 127);
737
for (x= 0; x < 1; x++)
739
rc= memcached_set(memc, key, strlen(key),
741
(time_t)0, (uint32_t)0);
742
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
750
test_return get_test3(memcached_st *memc)
755
size_t value_length= 8191;
757
size_t string_length;
761
value = (char*)malloc(value_length);
764
for (x= 0; x < value_length; x++)
765
value[x] = (char) (x % 127);
767
rc= memcached_set(memc, key, strlen(key),
769
(time_t)0, (uint32_t)0);
770
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
772
string= memcached_get(memc, key, strlen(key),
773
&string_length, &flags, &rc);
775
assert(rc == MEMCACHED_SUCCESS);
777
assert(string_length == value_length);
778
assert(!memcmp(string, value, string_length));
786
test_return get_test4(memcached_st *memc)
791
size_t value_length= 8191;
793
size_t string_length;
797
value = (char*)malloc(value_length);
800
for (x= 0; x < value_length; x++)
801
value[x] = (char) (x % 127);
803
rc= memcached_set(memc, key, strlen(key),
805
(time_t)0, (uint32_t)0);
806
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
808
for (x= 0; x < 10; x++)
810
string= memcached_get(memc, key, strlen(key),
811
&string_length, &flags, &rc);
813
assert(rc == MEMCACHED_SUCCESS);
815
assert(string_length == value_length);
816
assert(!memcmp(string, value, string_length));
1132
#ifndef __INTEL_COMPILER
1133
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
1136
test_return_t read_through(memcached_st *memc)
1138
memcached_trigger_key_fn cb= (memcached_trigger_key_fn)read_through_trigger;
1140
size_t string_length;
1142
memcached_return_t rc;
1143
char *string= memcached_get(memc,
1144
test_literal_param(__func__),
1145
&string_length, &flags, &rc);
1147
test_compare(MEMCACHED_NOTFOUND, rc);
1148
test_false(string_length);
1151
test_compare(MEMCACHED_SUCCESS,
1152
memcached_callback_set(memc, MEMCACHED_CALLBACK_GET_FAILURE, *(void **)&cb));
1154
string= memcached_get(memc,
1155
test_literal_param(__func__),
1156
&string_length, &flags, &rc);
1158
test_compare(MEMCACHED_SUCCESS, rc);
1159
test_compare(string_length, sizeof(READ_THROUGH_VALUE) -1);
1160
test_true(string[sizeof(READ_THROUGH_VALUE) -1] == 0);
1161
test_strcmp(READ_THROUGH_VALUE, string);
1164
string= memcached_get(memc,
1165
test_literal_param(__func__),
1166
&string_length, &flags, &rc);
1168
test_compare(MEMCACHED_SUCCESS, rc);
1170
test_compare(string_length, sizeof(READ_THROUGH_VALUE) -1);
1171
test_true(string[sizeof(READ_THROUGH_VALUE) -1] == 0);
1172
test_strcmp(READ_THROUGH_VALUE, string);
1175
return TEST_SUCCESS;
1178
test_return_t set_test2(memcached_st *memc)
1180
for (uint32_t x= 0; x < 10; x++)
1182
test_compare(return_value_based_on_buffering(memc),
1184
test_literal_param("foo"),
1185
test_literal_param("train in the brain"),
1186
time_t(0), uint32_t(0)));
1189
return TEST_SUCCESS;
1192
test_return_t set_test3(memcached_st *memc)
1194
size_t value_length= 8191;
1196
libtest::vchar_t value;
1197
value.reserve(value_length);
1198
for (uint32_t x= 0; x < value_length; x++)
1200
value.push_back(char(x % 127));
1203
/* The dump test relies on there being at least 32 items in memcached */
1204
for (uint32_t x= 0; x < 32; x++)
1208
snprintf(key, sizeof(key), "foo%u", x);
1210
uint64_t query_id= memcached_query_id(memc);
1211
test_compare_hint(return_value_based_on_buffering(memc),
1212
memcached_set(memc, key, strlen(key),
1213
&value[0], value.size(),
1214
time_t(0), uint32_t(0)),
1215
memcached_last_error_message(memc));
1216
test_compare(query_id +1, memcached_query_id(memc));
1219
return TEST_SUCCESS;
1222
test_return_t mget_end(memcached_st *memc)
1224
const char *keys[]= { "foo", "foo2" };
1225
size_t lengths[]= { 3, 4 };
1226
const char *values[]= { "fjord", "41" };
1229
for (size_t x= 0; x < test_array_length(keys); x++)
1231
test_compare(MEMCACHED_SUCCESS,
1233
keys[x], lengths[x],
1234
values[x], strlen(values[x]),
1235
time_t(0), uint32_t(0)));
1239
size_t string_length;
1242
// retrieve both via mget
1243
test_compare(MEMCACHED_SUCCESS,
1244
memcached_mget(memc,
1246
test_array_length(keys)));
1248
char key[MEMCACHED_MAX_KEY];
1250
memcached_return_t rc;
1252
// this should get both
1253
for (size_t x= 0; x < test_array_length(keys); x++)
1255
string= memcached_fetch(memc, key, &key_length, &string_length,
1257
test_compare(MEMCACHED_SUCCESS, rc);
1259
if (key_length == 4)
1264
test_compare(string_length, strlen(values[val]));
1265
test_true(strncmp(values[val], string, string_length) == 0);
1269
// this should indicate end
1270
string= memcached_fetch(memc, key, &key_length, &string_length, &flags, &rc);
1271
test_compare(MEMCACHED_END, rc);
1275
test_compare(MEMCACHED_SUCCESS,
1276
memcached_mget(memc, keys, lengths, 1));
1278
string= memcached_fetch(memc, key, &key_length, &string_length, &flags, &rc);
1279
test_compare(key_length, lengths[0]);
1280
test_true(strncmp(keys[0], key, key_length) == 0);
1281
test_compare(string_length, strlen(values[0]));
1282
test_true(strncmp(values[0], string, string_length) == 0);
1283
test_compare(MEMCACHED_SUCCESS, rc);
1286
// this should indicate end
1287
string= memcached_fetch(memc, key, &key_length, &string_length, &flags, &rc);
1288
test_compare(MEMCACHED_END, rc);
1291
return TEST_SUCCESS;
825
1294
/* Do not copy the style of this code, I just access hosts to testthis function */
826
test_return stats_servername_test(memcached_st *memc)
829
memcached_stat_st stat;
830
rc= memcached_stat_servername(&stat, NULL,
831
memc->hosts[0].hostname,
832
memc->hosts[0].port);
837
test_return increment_test(memcached_st *memc)
844
rc= memcached_set(memc, key, strlen(key),
845
value, strlen(value),
846
(time_t)0, (uint32_t)0);
847
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
849
rc= memcached_increment(memc, key, strlen(key),
851
assert(rc == MEMCACHED_SUCCESS);
852
assert(new_number == 1);
854
rc= memcached_increment(memc, key, strlen(key),
856
assert(rc == MEMCACHED_SUCCESS);
857
assert(new_number == 2);
862
test_return decrement_test(memcached_st *memc)
869
rc= memcached_set(memc, key, strlen(key),
870
value, strlen(value),
871
(time_t)0, (uint32_t)0);
872
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
874
rc= memcached_decrement(memc, key, strlen(key),
876
assert(rc == MEMCACHED_SUCCESS);
877
assert(new_number == 2);
879
rc= memcached_decrement(memc, key, strlen(key),
881
assert(rc == MEMCACHED_SUCCESS);
882
assert(new_number == 1);
887
test_return quit_test(memcached_st *memc)
891
char *value= "sanford and sun";
893
rc= memcached_set(memc, key, strlen(key),
894
value, strlen(value),
895
(time_t)10, (uint32_t)3);
896
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1295
test_return_t stats_servername_test(memcached_st *memc)
1297
memcached_stat_st memc_stat;
1298
memcached_server_instance_st instance=
1299
memcached_server_instance_by_position(memc, 0);
1301
if (LIBMEMCACHED_WITH_SASL_SUPPORT and memcached_get_sasl_callbacks(memc))
1303
return TEST_SKIPPED;
1306
test_compare(MEMCACHED_SUCCESS, memcached_stat_servername(&memc_stat, NULL,
1307
memcached_server_name(instance),
1308
memcached_server_port(instance)));
1310
return TEST_SUCCESS;
1313
test_return_t increment_test(memcached_st *memc)
1315
uint64_t new_number;
1317
test_compare(MEMCACHED_SUCCESS,
1319
test_literal_param("number"),
1320
test_literal_param("0"),
1321
(time_t)0, (uint32_t)0));
1323
test_compare(MEMCACHED_SUCCESS,
1324
memcached_increment(memc, test_literal_param("number"), 1, &new_number));
1325
test_compare(uint64_t(1), new_number);
1327
test_compare(MEMCACHED_SUCCESS,
1328
memcached_increment(memc, test_literal_param("number"), 1, &new_number));
1329
test_compare(uint64_t(2), new_number);
1331
return TEST_SUCCESS;
1334
test_return_t increment_with_initial_test(memcached_st *memc)
1336
test_skip(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1338
uint64_t new_number;
1339
uint64_t initial= 0;
1341
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
1343
test_compare(MEMCACHED_SUCCESS,
1344
memcached_increment_with_initial(memc, test_literal_param("number"), 1, initial, 0, &new_number));
1345
test_compare(new_number, initial);
1347
test_compare(MEMCACHED_SUCCESS,
1348
memcached_increment_with_initial(memc, test_literal_param("number"), 1, initial, 0, &new_number));
1349
test_compare(new_number, (initial +1));
1351
return TEST_SUCCESS;
1354
test_return_t decrement_test(memcached_st *memc)
1356
test_compare(return_value_based_on_buffering(memc),
1358
test_literal_param(__func__),
1359
test_literal_param("3"),
1360
time_t(0), uint32_t(0)));
1361
// Make sure we flush the value we just set
1362
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
1364
uint64_t new_number;
1365
test_compare(MEMCACHED_SUCCESS,
1366
memcached_decrement(memc,
1367
test_literal_param(__func__),
1369
test_compare(uint64_t(2), new_number);
1371
test_compare(MEMCACHED_SUCCESS,
1372
memcached_decrement(memc,
1373
test_literal_param(__func__),
1375
test_compare(uint64_t(1), new_number);
1377
return TEST_SUCCESS;
1380
test_return_t decrement_with_initial_test(memcached_st *memc)
1382
test_skip(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1384
uint64_t initial= 3;
1386
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
1388
uint64_t new_number;
1389
test_compare(MEMCACHED_SUCCESS,
1390
memcached_decrement_with_initial(memc,
1391
test_literal_param(__func__),
1394
test_compare(new_number, initial);
1396
test_compare(MEMCACHED_SUCCESS,
1397
memcached_decrement_with_initial(memc,
1398
test_literal_param(__func__),
1401
test_compare(new_number, (initial - 1));
1403
return TEST_SUCCESS;
1406
test_return_t increment_by_key_test(memcached_st *memc)
1408
const char *master_key= "foo";
1409
const char *key= "number";
1410
const char *value= "0";
1412
test_compare(return_value_based_on_buffering(memc),
1413
memcached_set_by_key(memc, master_key, strlen(master_key),
1415
value, strlen(value),
1416
time_t(0), uint32_t(0)));
1418
// Make sure we flush the value we just set
1419
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
1421
uint64_t new_number;
1422
test_compare(MEMCACHED_SUCCESS,
1423
memcached_increment_by_key(memc, master_key, strlen(master_key),
1424
key, strlen(key), 1, &new_number));
1425
test_compare(uint64_t(1), new_number);
1427
test_compare(MEMCACHED_SUCCESS,
1428
memcached_increment_by_key(memc, master_key, strlen(master_key),
1429
key, strlen(key), 1, &new_number));
1430
test_compare(uint64_t(2), new_number);
1432
return TEST_SUCCESS;
1435
test_return_t increment_with_initial_by_key_test(memcached_st *memc)
1437
test_skip(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1439
uint64_t new_number;
1440
const char *master_key= "foo";
1441
const char *key= "number";
1442
uint64_t initial= 0;
1444
test_compare(MEMCACHED_SUCCESS,
1445
memcached_increment_with_initial_by_key(memc, master_key, strlen(master_key),
1447
1, initial, 0, &new_number));
1448
test_compare(new_number, initial);
1450
test_compare(MEMCACHED_SUCCESS,
1451
memcached_increment_with_initial_by_key(memc, master_key, strlen(master_key),
1453
1, initial, 0, &new_number));
1454
test_compare(new_number, (initial +1));
1456
return TEST_SUCCESS;
1459
test_return_t decrement_by_key_test(memcached_st *memc)
1461
uint64_t new_number;
1462
const char *value= "3";
1464
test_compare(return_value_based_on_buffering(memc),
1465
memcached_set_by_key(memc,
1466
test_literal_param("foo"),
1467
test_literal_param("number"),
1468
value, strlen(value),
1469
(time_t)0, (uint32_t)0));
1471
test_compare(MEMCACHED_SUCCESS,
1472
memcached_decrement_by_key(memc,
1473
test_literal_param("foo"),
1474
test_literal_param("number"),
1476
test_compare(uint64_t(2), new_number);
1478
test_compare(MEMCACHED_SUCCESS,
1479
memcached_decrement_by_key(memc,
1480
test_literal_param("foo"),
1481
test_literal_param("number"),
1483
test_compare(uint64_t(1), new_number);
1485
return TEST_SUCCESS;
1488
test_return_t decrement_with_initial_by_key_test(memcached_st *memc)
1490
test_skip(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1492
uint64_t new_number;
1493
uint64_t initial= 3;
1495
test_compare(MEMCACHED_SUCCESS,
1496
memcached_decrement_with_initial_by_key(memc,
1497
test_literal_param("foo"),
1498
test_literal_param("number"),
1499
1, initial, 0, &new_number));
1500
test_compare(new_number, initial);
1502
test_compare(MEMCACHED_SUCCESS,
1503
memcached_decrement_with_initial_by_key(memc,
1504
test_literal_param("foo"),
1505
test_literal_param("number"),
1506
1, initial, 0, &new_number));
1507
test_compare(new_number, (initial - 1));
1509
return TEST_SUCCESS;
1511
test_return_t binary_increment_with_prefix_test(memcached_st *memc)
1513
test_skip(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1515
test_compare(MEMCACHED_SUCCESS, memcached_callback_set(memc, MEMCACHED_CALLBACK_PREFIX_KEY, (void *)"namespace:"));
1517
test_compare(return_value_based_on_buffering(memc),
1519
test_literal_param("number"),
1520
test_literal_param("0"),
1521
(time_t)0, (uint32_t)0));
1523
uint64_t new_number;
1524
test_compare(MEMCACHED_SUCCESS, memcached_increment(memc,
1525
test_literal_param("number"),
1527
test_compare(uint64_t(1), new_number);
1529
test_compare(MEMCACHED_SUCCESS, memcached_increment(memc,
1530
test_literal_param("number"),
1532
test_compare(uint64_t(2), new_number);
1534
return TEST_SUCCESS;
1537
test_return_t quit_test(memcached_st *memc)
1539
const char *value= "sanford and sun";
1541
test_compare(return_value_based_on_buffering(memc),
1543
test_literal_param(__func__),
1544
value, strlen(value),
1545
(time_t)10, (uint32_t)3));
897
1546
memcached_quit(memc);
899
rc= memcached_set(memc, key, strlen(key),
900
value, strlen(value),
901
(time_t)50, (uint32_t)9);
902
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1548
test_compare(return_value_based_on_buffering(memc),
1550
test_literal_param(__func__),
1551
value, strlen(value),
1552
(time_t)50, (uint32_t)9));
1554
return TEST_SUCCESS;
907
test_return mget_result_test(memcached_st *memc)
1557
test_return_t mget_result_test(memcached_st *memc)
910
char *keys[]= {"fudge", "son", "food"};
1559
const char *keys[]= {"fudge", "son", "food"};
911
1560
size_t key_length[]= {5, 3, 4};
914
1562
memcached_result_st results_obj;
915
1563
memcached_result_st *results;
917
1565
results= memcached_result_create(memc, &results_obj);
919
assert(&results_obj == results);
1567
test_true(&results_obj == results);
921
1569
/* We need to empty the server before continueing test */
922
rc= memcached_flush(memc, 0);
923
assert(rc == MEMCACHED_SUCCESS);
925
rc= memcached_mget(memc, keys, key_length, 3);
926
assert(rc == MEMCACHED_SUCCESS);
928
while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
1570
test_compare(MEMCACHED_SUCCESS,
1571
memcached_flush(memc, 0));
1573
test_compare(MEMCACHED_SUCCESS,
1574
memcached_mget(memc, keys, key_length, 3));
1576
memcached_return_t rc;
1577
while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
933
while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
935
assert(rc == MEMCACHED_END);
1582
while ((results= memcached_fetch_result(memc, &results_obj, &rc))) { test_true(false); /* We should never see a value returned */ };
1583
test_false(results);
1584
test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc));
937
for (x= 0; x < 3; x++)
1586
for (uint32_t x= 0; x < 3; x++)
939
rc= memcached_set(memc, keys[x], key_length[x],
1588
rc= memcached_set(memc, keys[x], key_length[x],
940
1589
keys[x], key_length[x],
941
1590
(time_t)50, (uint32_t)9);
942
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1591
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, memcached_strerror(NULL, rc));
945
rc= memcached_mget(memc, keys, key_length, 3);
946
assert(rc == MEMCACHED_SUCCESS);
1594
test_compare(MEMCACHED_SUCCESS,
1595
memcached_mget(memc, keys, key_length, 3));
948
1597
while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
951
assert(&results_obj == results);
952
assert(rc == MEMCACHED_SUCCESS);
953
assert(memcached_result_key_length(results) == memcached_result_length(results));
954
assert(!memcmp(memcached_result_key_value(results),
955
memcached_result_value(results),
956
memcached_result_length(results)));
1600
test_true(&results_obj == results);
1601
test_compare(MEMCACHED_SUCCESS, rc);
1602
test_memcmp(memcached_result_key_value(results),
1603
memcached_result_value(results),
1604
memcached_result_length(results));
1605
test_compare(memcached_result_key_length(results), memcached_result_length(results));
959
1608
memcached_result_free(&results_obj);
1610
return TEST_SUCCESS;
964
test_return mget_result_alloc_test(memcached_st *memc)
1613
test_return_t mget_result_alloc_test(memcached_st *memc)
967
char *keys[]= {"fudge", "son", "food"};
1615
const char *keys[]= {"fudge", "son", "food"};
968
1616
size_t key_length[]= {5, 3, 4};
971
1618
memcached_result_st *results;
973
1620
/* We need to empty the server before continueing test */
974
rc= memcached_flush(memc, 0);
975
assert(rc == MEMCACHED_SUCCESS);
977
rc= memcached_mget(memc, keys, key_length, 3);
978
assert(rc == MEMCACHED_SUCCESS);
980
while ((results= memcached_fetch_result(memc, NULL, &rc)) != NULL)
1621
test_compare(MEMCACHED_SUCCESS,
1622
memcached_flush(memc, 0));
1624
test_compare(MEMCACHED_SUCCESS,
1625
memcached_mget(memc, keys, key_length, 3));
1627
memcached_return_t rc;
1628
while ((results= memcached_fetch_result(memc, NULL, &rc)))
985
assert(rc == MEMCACHED_END);
1632
test_false(results);
1633
test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc));
987
for (x= 0; x < 3; x++)
1635
for (uint32_t x= 0; x < 3; x++)
989
rc= memcached_set(memc, keys[x], key_length[x],
1637
rc= memcached_set(memc, keys[x], key_length[x],
990
1638
keys[x], key_length[x],
991
1639
(time_t)50, (uint32_t)9);
992
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1640
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, memcached_strerror(NULL, rc));
995
rc= memcached_mget(memc, keys, key_length, 3);
996
assert(rc == MEMCACHED_SUCCESS);
1643
test_compare(MEMCACHED_SUCCESS,
1644
memcached_mget(memc, keys, key_length, 3));
999
1647
while ((results= memcached_fetch_result(memc, NULL, &rc)))
1002
assert(rc == MEMCACHED_SUCCESS);
1003
assert(memcached_result_key_length(results) == memcached_result_length(results));
1004
assert(!memcmp(memcached_result_key_value(results),
1005
memcached_result_value(results),
1006
memcached_result_length(results)));
1650
test_compare(MEMCACHED_SUCCESS, rc);
1651
test_compare(memcached_result_key_length(results), memcached_result_length(results));
1652
test_memcmp(memcached_result_key_value(results),
1653
memcached_result_value(results),
1654
memcached_result_length(results));
1007
1655
memcached_result_free(results);
1014
/* Count the results */
1015
unsigned int callback_counter(memcached_st *ptr, memcached_result_st *result, void *context)
1017
unsigned int *counter= (unsigned int *)context;
1019
*counter= *counter + 1;
1024
test_return mget_result_function(memcached_st *memc)
1026
memcached_return rc;
1027
char *keys[]= {"fudge", "son", "food"};
1659
return TEST_SUCCESS;
1662
test_return_t mget_result_function(memcached_st *memc)
1664
const char *keys[]= {"fudge", "son", "food"};
1028
1665
size_t key_length[]= {5, 3, 4};
1030
unsigned int counter;
1031
memcached_execute_function callbacks[1];
1667
memcached_execute_fn callbacks[1];
1033
/* We need to empty the server before continueing test */
1034
rc= memcached_flush(memc, 0);
1035
for (x= 0; x < 3; x++)
1669
for (uint32_t x= 0; x < 3; x++)
1037
rc= memcached_set(memc, keys[x], key_length[x],
1038
keys[x], key_length[x],
1039
(time_t)50, (uint32_t)9);
1040
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1671
test_compare(return_value_based_on_buffering(memc),
1672
memcached_set(memc, keys[x], key_length[x],
1673
keys[x], key_length[x],
1674
time_t(50), uint32_t(9)));
1676
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
1677
memcached_quit(memc);
1043
rc= memcached_mget(memc, keys, key_length, 3);
1044
assert(rc == MEMCACHED_SUCCESS);
1679
test_compare(MEMCACHED_SUCCESS,
1680
memcached_mget(memc, keys, key_length, 3));
1046
1682
callbacks[0]= &callback_counter;
1048
rc= memcached_fetch_execute(memc, callbacks, (void *)&counter, 1);
1050
assert(counter == 3);
1685
test_compare(MEMCACHED_SUCCESS,
1686
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
1688
test_compare(size_t(3), counter);
1690
return TEST_SUCCESS;
1055
test_return mget_test(memcached_st *memc)
1693
test_return_t mget_test(memcached_st *memc)
1057
memcached_return rc;
1058
char *keys[]= {"fudge", "son", "food"};
1695
const char *keys[]= {"fudge", "son", "food"};
1059
1696
size_t key_length[]= {5, 3, 4};
1063
1698
char return_key[MEMCACHED_MAX_KEY];
1064
1699
size_t return_key_length;
1065
1700
char *return_value;
1066
1701
size_t return_value_length;
1068
/* We need to empty the server before continueing test */
1069
rc= memcached_flush(memc, 0);
1070
assert(rc == MEMCACHED_SUCCESS);
1072
rc= memcached_mget(memc, keys, key_length, 3);
1073
assert(rc == MEMCACHED_SUCCESS);
1075
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1076
&return_value_length, &flags, &rc)) != NULL)
1703
test_compare(MEMCACHED_SUCCESS,
1704
memcached_mget(memc, keys, key_length, 3));
1707
memcached_return_t rc;
1708
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1709
&return_value_length, &flags, &rc)))
1078
assert(return_value);
1711
test_true(return_value);
1080
assert(!return_value);
1081
assert(return_value_length == 0);
1082
assert(rc == MEMCACHED_END);
1713
test_false(return_value);
1714
test_zero(return_value_length);
1715
test_compare(MEMCACHED_NOTFOUND, rc);
1084
for (x= 0; x < 3; x++)
1717
for (uint32_t x= 0; x < 3; x++)
1086
rc= memcached_set(memc, keys[x], key_length[x],
1719
rc= memcached_set(memc, keys[x], key_length[x],
1087
1720
keys[x], key_length[x],
1088
1721
(time_t)50, (uint32_t)9);
1089
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1722
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, memcached_strerror(NULL, rc));
1092
rc= memcached_mget(memc, keys, key_length, 3);
1093
assert(rc == MEMCACHED_SUCCESS);
1096
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1724
test_compare(MEMCACHED_SUCCESS,
1725
memcached_mget(memc, keys, key_length, 3));
1728
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1097
1729
&return_value_length, &flags, &rc)))
1099
assert(return_value);
1100
assert(rc == MEMCACHED_SUCCESS);
1101
assert(return_key_length == return_value_length);
1102
assert(!memcmp(return_value, return_key, return_value_length));
1731
test_true(return_value);
1732
test_compare(MEMCACHED_SUCCESS, rc);
1733
if (not memc->_namespace)
1735
test_compare(return_key_length, return_value_length);
1736
test_memcmp(return_value, return_key, return_value_length);
1103
1738
free(return_value);
1110
test_return get_stats_keys(memcached_st *memc)
1114
memcached_stat_st stat;
1115
memcached_return rc;
1117
list= memcached_stat_get_keys(memc, &stat, &rc);
1118
assert(rc == MEMCACHED_SUCCESS);
1119
for (ptr= list; *ptr; ptr++)
1128
test_return version_string_test(memcached_st *memc)
1130
const char *version_string;
1132
version_string= memcached_lib_version();
1134
assert(!strcmp(version_string, LIBMEMCACHED_VERSION_STRING));
1139
test_return get_stats(memcached_st *memc)
1144
memcached_return rc;
1145
memcached_stat_st *stat;
1147
stat= memcached_stat(memc, NULL, &rc);
1148
assert(rc == MEMCACHED_SUCCESS);
1150
assert(rc == MEMCACHED_SUCCESS);
1153
for (x= 0; x < memcached_server_count(memc); x++)
1742
return TEST_SUCCESS;
1745
test_return_t mget_execute(memcached_st *original_memc)
1747
test_skip(true, memcached_behavior_get(original_memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL));
1749
memcached_st *memc= create_single_instance_memcached(original_memc, "--BINARY-PROTOCOL");
1752
keys_st keys(20480);
1754
/* First add all of the items.. */
1755
char blob[1024] = {0};
1757
for (size_t x= 0; x < keys.size(); ++x)
1759
uint64_t query_id= memcached_query_id(memc);
1760
memcached_return_t rc= memcached_add(memc,
1761
keys.key_at(x), keys.length_at(x),
1764
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED,
1765
memcached_strerror(NULL, rc));
1766
test_compare(query_id +1, memcached_query_id(memc));
1769
/* Try to get all of them with a large multiget */
1771
memcached_execute_fn callbacks[]= { &callback_counter };
1772
test_compare(MEMCACHED_SUCCESS,
1773
memcached_mget_execute(memc,
1774
keys.keys_ptr(), keys.lengths_ptr(),
1775
keys.size(), callbacks, &counter, 1));
1778
uint64_t query_id= memcached_query_id(memc);
1779
test_compare(MEMCACHED_SUCCESS,
1780
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
1781
test_compare(query_id, memcached_query_id(memc));
1783
/* Verify that we got all of the items */
1784
test_compare(keys.size(), counter);
1787
memcached_free(memc);
1789
return TEST_SUCCESS;
1792
#define REGRESSION_BINARY_VS_BLOCK_COUNT 20480
1793
static pairs_st *global_pairs;
1795
test_return_t key_setup(memcached_st *memc)
1797
test_skip(TEST_SUCCESS, pre_binary(memc));
1799
global_pairs= pairs_generate(REGRESSION_BINARY_VS_BLOCK_COUNT, 0);
1801
return TEST_SUCCESS;
1804
test_return_t key_teardown(memcached_st *)
1806
pairs_free(global_pairs);
1808
return TEST_SUCCESS;
1811
test_return_t block_add_regression(memcached_st *memc)
1813
/* First add all of the items.. */
1814
for (ptrdiff_t x= 0; x < REGRESSION_BINARY_VS_BLOCK_COUNT; ++x)
1816
char blob[1024] = {0};
1818
memcached_return_t rc= memcached_add_by_key(memc, "bob", 3, global_pairs[x].key, global_pairs[x].key_length, blob, sizeof(blob), 0, 0);
1819
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_SERVER_MEMORY_ALLOCATION_FAILURE, memcached_strerror(NULL, rc));
1822
return TEST_SUCCESS;
1825
test_return_t binary_add_regression(memcached_st *memc)
1827
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, true));
1828
test_return_t rc= block_add_regression(memc);
1833
test_return_t get_stats_keys(memcached_st *memc)
1837
memcached_stat_st memc_stat;
1838
memcached_return_t rc;
1840
stat_list= memcached_stat_get_keys(memc, &memc_stat, &rc);
1841
test_compare(MEMCACHED_SUCCESS, rc);
1842
for (ptr= stat_list; *ptr; ptr++)
1847
return TEST_SUCCESS;
1850
test_return_t version_string_test(memcached_st *)
1852
test_strcmp(LIBMEMCACHED_VERSION_STRING, memcached_lib_version());
1854
return TEST_SUCCESS;
1857
test_return_t get_stats(memcached_st *memc)
1859
memcached_return_t rc;
1861
memcached_stat_st *memc_stat= memcached_stat(memc, NULL, &rc);
1862
test_compare(MEMCACHED_SUCCESS, rc);
1863
test_true(memc_stat);
1865
for (uint32_t x= 0; x < memcached_server_count(memc); x++)
1155
list= memcached_stat_get_keys(memc, stat+x, &rc);
1156
assert(rc == MEMCACHED_SUCCESS);
1157
for (ptr= list; *ptr; ptr++);
1867
char **stat_list= memcached_stat_get_keys(memc, memc_stat+x, &rc);
1868
test_compare(MEMCACHED_SUCCESS, rc);
1869
for (char **ptr= stat_list; *ptr; ptr++) {};
1162
memcached_stat_free(NULL, stat);
1874
memcached_stat_free(NULL, memc_stat);
1876
return TEST_SUCCESS;
1167
test_return add_host_test(memcached_st *memc)
1879
test_return_t add_host_test(memcached_st *memc)
1170
memcached_server_st *servers;
1171
memcached_return rc;
1172
1881
char servername[]= "0.example.com";
1174
servers= memcached_server_list_append(NULL, servername, 400, &rc);
1176
assert(1 == memcached_server_list_count(servers));
1883
memcached_return_t rc;
1884
memcached_server_st *servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
1885
test_compare(1U, memcached_server_list_count(servers));
1178
for (x= 2; x < 20; x++)
1887
for (unsigned int x= 2; x < 20; x++)
1180
1889
char buffer[SMALL_STRING_LEN];
1182
1891
snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
1183
servers= memcached_server_list_append(servers, buffer, 401,
1892
servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0,
1185
assert(rc == MEMCACHED_SUCCESS);
1186
assert(x == memcached_server_list_count(servers));
1894
test_compare(MEMCACHED_SUCCESS, rc);
1895
test_compare(x, memcached_server_list_count(servers));
1189
rc= memcached_server_push(memc, servers);
1190
assert(rc == MEMCACHED_SUCCESS);
1191
rc= memcached_server_push(memc, servers);
1192
assert(rc == MEMCACHED_SUCCESS);
1898
test_compare(MEMCACHED_SUCCESS, memcached_server_push(memc, servers));
1899
test_compare(MEMCACHED_SUCCESS, memcached_server_push(memc, servers));
1194
1901
memcached_server_list_free(servers);
1199
memcached_return clone_test_callback(memcached_st *parent, memcached_st *clone)
1201
return MEMCACHED_SUCCESS;
1204
memcached_return cleanup_test_callback(memcached_st *ptr)
1206
return MEMCACHED_SUCCESS;
1209
test_return callback_test(memcached_st *memc)
1903
return TEST_SUCCESS;
1906
test_return_t memcached_fetch_result_NOT_FOUND(memcached_st *memc)
1908
memcached_return_t rc;
1910
const char *key= "not_found";
1911
size_t key_length= test_literal_param_size("not_found");
1913
test_compare(MEMCACHED_SUCCESS,
1914
memcached_mget(memc, &key, &key_length, 1));
1916
memcached_result_st *result= memcached_fetch_result(memc, NULL, &rc);
1918
test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc));
1920
memcached_result_free(result);
1922
return TEST_SUCCESS;
1925
static memcached_return_t clone_test_callback(memcached_st *, memcached_st *)
1927
return MEMCACHED_SUCCESS;
1930
static memcached_return_t cleanup_test_callback(memcached_st *)
1932
return MEMCACHED_SUCCESS;
1935
test_return_t callback_test(memcached_st *memc)
1211
1937
/* Test User Data */
1215
memcached_return rc;
1941
memcached_return_t rc;
1217
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_USER_DATA, &x);
1218
assert(rc == MEMCACHED_SUCCESS);
1943
test_compare(MEMCACHED_SUCCESS, memcached_callback_set(memc, MEMCACHED_CALLBACK_USER_DATA, &x));
1219
1944
test_ptr= (int *)memcached_callback_get(memc, MEMCACHED_CALLBACK_USER_DATA, &rc);
1220
assert(*test_ptr == x);
1945
test_true(*test_ptr == x);
1223
1948
/* Test Clone Callback */
1225
memcached_clone_func temp_function;
1226
memcached_return rc;
1950
memcached_clone_fn clone_cb= (memcached_clone_fn)clone_test_callback;
1951
void *clone_cb_ptr= *(void **)&clone_cb;
1952
void *temp_function= NULL;
1228
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, clone_test_callback);
1229
assert(rc == MEMCACHED_SUCCESS);
1230
temp_function= (memcached_clone_func)memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1231
assert(temp_function == clone_test_callback);
1954
test_compare(MEMCACHED_SUCCESS, memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, clone_cb_ptr));
1955
memcached_return_t rc;
1956
temp_function= memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1957
test_true(temp_function == clone_cb_ptr);
1958
test_compare(MEMCACHED_SUCCESS, rc);
1234
1961
/* Test Cleanup Callback */
1236
memcached_cleanup_func temp_function;
1237
memcached_return rc;
1963
memcached_cleanup_fn cleanup_cb= (memcached_cleanup_fn)cleanup_test_callback;
1964
void *cleanup_cb_ptr= *(void **)&cleanup_cb;
1965
void *temp_function= NULL;
1966
memcached_return_t rc;
1239
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, cleanup_test_callback);
1240
assert(rc == MEMCACHED_SUCCESS);
1241
temp_function= (memcached_cleanup_func)memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1242
assert(temp_function == cleanup_test_callback);
1968
test_compare(MEMCACHED_SUCCESS, memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, cleanup_cb_ptr));
1969
temp_function= memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
1970
test_true(temp_function == cleanup_cb_ptr);
1973
return TEST_SUCCESS;
1248
1976
/* We don't test the behavior itself, we test the switches */
1249
test_return behavior_test(memcached_st *memc)
1251
unsigned long long value;
1252
unsigned int set= 1;
1254
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
1255
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
1258
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
1259
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
1262
set= MEMCACHED_HASH_MD5;
1263
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1264
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1265
assert(value == MEMCACHED_HASH_MD5);
1269
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, set);
1270
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
1273
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, set);
1274
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
1277
set= MEMCACHED_HASH_DEFAULT;
1278
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1279
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1280
assert(value == MEMCACHED_HASH_DEFAULT);
1282
set= MEMCACHED_HASH_CRC;
1283
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, set);
1284
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
1285
assert(value == MEMCACHED_HASH_CRC);
1287
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
1290
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
1296
/* Test case provided by Cal Haldenbrand */
1297
test_return user_supplied_bug1(memcached_st *memc)
1299
unsigned int setter= 1;
1302
unsigned long long total= 0;
1305
char randomstuff[6 * 1024];
1306
memcached_return rc;
1308
memset(randomstuff, 0, 6 * 1024);
1310
/* We just keep looking at the same values over and over */
1313
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
1314
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1318
for (x= 0 ; total < 20 * 1024576 ; x++ )
1322
size= (rand() % ( 5 * 1024 ) ) + 400;
1323
memset(randomstuff, 0, 6 * 1024);
1324
assert(size < 6 * 1024); /* Being safe here */
1326
for (j= 0 ; j < size ;j++)
1327
randomstuff[j] = (char) (rand() % 26) + 97;
1330
sprintf(key, "%d", x);
1331
rc = memcached_set(memc, key, strlen(key),
1332
randomstuff, strlen(randomstuff), 10, 0);
1333
/* If we fail, lets try again */
1334
if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_BUFFERED)
1335
rc = memcached_set(memc, key, strlen(key),
1336
randomstuff, strlen(randomstuff), 10, 0);
1337
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1343
/* Test case provided by Cal Haldenbrand */
1344
test_return user_supplied_bug2(memcached_st *memc)
1347
unsigned int setter;
1349
unsigned long long total;
1352
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
1353
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1355
setter = 20 * 1024576;
1356
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, setter);
1357
setter = 20 * 1024576;
1358
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, setter);
1359
getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
1360
getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
1362
for (x= 0, errors= 0, total= 0 ; total < 20 * 1024576 ; x++)
1365
for (x= 0, errors= 0, total= 0 ; total < 24576 ; x++)
1367
memcached_return rc= MEMCACHED_SUCCESS;
1368
char buffer[SMALL_STRING_LEN];
1373
memset(buffer, 0, SMALL_STRING_LEN);
1375
snprintf(buffer, SMALL_STRING_LEN, "%u", x);
1376
getval= memcached_get(memc, buffer, strlen(buffer),
1377
&val_len, &flags, &rc);
1378
if (rc != MEMCACHED_SUCCESS)
1380
if (rc == MEMCACHED_NOTFOUND)
1384
WATCHPOINT_ERROR(rc);
1398
/* Do a large mget() over all the keys we think exist */
1399
#define KEY_COUNT 3000 // * 1024576
1400
test_return user_supplied_bug3(memcached_st *memc)
1402
memcached_return rc;
1403
unsigned int setter;
1406
size_t key_lengths[KEY_COUNT];
1409
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, setter);
1410
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1412
setter = 20 * 1024576;
1413
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, setter);
1414
setter = 20 * 1024576;
1415
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, setter);
1416
getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
1417
getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
1420
keys= (char **)malloc(sizeof(char *) * KEY_COUNT);
1422
memset(keys, 0, (sizeof(char *) * KEY_COUNT));
1423
for (x= 0; x < KEY_COUNT; x++)
1427
snprintf(buffer, 30, "%u", x);
1428
keys[x]= strdup(buffer);
1429
key_lengths[x]= strlen(keys[x]);
1432
rc= memcached_mget(memc, keys, key_lengths, KEY_COUNT);
1433
assert(rc == MEMCACHED_SUCCESS);
1435
/* Turn this into a help function */
1437
char return_key[MEMCACHED_MAX_KEY];
1438
size_t return_key_length;
1440
size_t return_value_length;
1443
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1444
&return_value_length, &flags, &rc)))
1446
assert(return_value);
1447
assert(rc == MEMCACHED_SUCCESS);
1452
for (x= 0; x < KEY_COUNT; x++)
1977
test_return_t behavior_test(memcached_st *memc)
1979
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 1);
1980
test_compare(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK));
1982
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1);
1983
test_compare(true, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY));
1985
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, MEMCACHED_HASH_MD5);
1986
test_compare(uint64_t(MEMCACHED_HASH_MD5), memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH));
1988
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
1989
test_zero(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK));
1991
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0);
1992
test_zero(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY));
1994
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, MEMCACHED_HASH_DEFAULT);
1995
test_compare(uint64_t(MEMCACHED_HASH_DEFAULT), memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH));
1997
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, MEMCACHED_HASH_CRC);
1998
test_compare(uint64_t(MEMCACHED_HASH_CRC), memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH));
2000
test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE));
2002
test_true(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE));
2004
uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS);
2005
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, value +1);
2006
test_compare((value +1), memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS));
2008
return TEST_SUCCESS;
2011
test_return_t MEMCACHED_BEHAVIOR_CORK_test(memcached_st *memc)
2013
test_compare(MEMCACHED_DEPRECATED,
2014
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CORK, true));
2016
// Platform dependent
2018
bool value= (bool)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_CORK);
2022
return TEST_SUCCESS;
2026
test_return_t MEMCACHED_BEHAVIOR_TCP_KEEPALIVE_test(memcached_st *memc)
2028
memcached_return_t rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, true);
2029
test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOT_SUPPORTED);
2031
bool value= (bool)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_KEEPALIVE);
2033
if (memcached_success(rc))
2042
return TEST_SUCCESS;
2046
test_return_t MEMCACHED_BEHAVIOR_TCP_KEEPIDLE_test(memcached_st *memc)
2048
memcached_return_t rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE, true);
2049
test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOT_SUPPORTED);
2051
bool value= (bool)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_KEEPIDLE);
2053
if (memcached_success(rc))
2062
return TEST_SUCCESS;
1459
2065
/* Make sure we behave properly if server list has no values */
1460
test_return user_supplied_bug4(memcached_st *memc)
2066
test_return_t user_supplied_bug4(memcached_st *memc)
1462
memcached_return rc;
1463
char *keys[]= {"fudge", "son", "food"};
2068
const char *keys[]= {"fudge", "son", "food"};
1464
2069
size_t key_length[]= {5, 3, 4};
1467
char return_key[MEMCACHED_MAX_KEY];
1468
size_t return_key_length;
1470
size_t return_value_length;
1472
2071
/* Here we free everything before running a bunch of mget tests */
1474
memcached_server_list_free(memc->hosts);
1476
memc->number_of_hosts= 0;
2072
memcached_servers_reset(memc);
1480
2075
/* We need to empty the server before continueing test */
1481
rc= memcached_flush(memc, 0);
1482
assert(rc == MEMCACHED_NO_SERVERS);
1484
rc= memcached_mget(memc, keys, key_length, 3);
1485
assert(rc == MEMCACHED_NO_SERVERS);
1487
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1488
&return_value_length, &flags, &rc)) != NULL)
1490
assert(return_value);
1492
assert(!return_value);
1493
assert(return_value_length == 0);
1494
assert(rc == MEMCACHED_NO_SERVERS);
1496
for (x= 0; x < 3; x++)
1498
rc= memcached_set(memc, keys[x], key_length[x],
1499
keys[x], key_length[x],
1500
(time_t)50, (uint32_t)9);
1501
assert(rc == MEMCACHED_NO_SERVERS);
1504
rc= memcached_mget(memc, keys, key_length, 3);
1505
assert(rc == MEMCACHED_NO_SERVERS);
1508
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
1509
&return_value_length, &flags, &rc)))
1511
assert(return_value);
1512
assert(rc == MEMCACHED_SUCCESS);
1513
assert(return_key_length == return_value_length);
1514
assert(!memcmp(return_value, return_key, return_value_length));
2076
test_compare(MEMCACHED_NO_SERVERS,
2077
memcached_flush(memc, 0));
2079
test_compare(MEMCACHED_NO_SERVERS,
2080
memcached_mget(memc, keys, key_length, 3));
2083
unsigned int keys_returned;
2084
memcached_return_t rc;
2085
test_compare(TEST_SUCCESS, fetch_all_results(memc, keys_returned, rc));
2086
test_compare(MEMCACHED_NOTFOUND, rc);
2087
test_zero(keys_returned);
2090
for (uint32_t x= 0; x < 3; x++)
2092
test_compare(MEMCACHED_NO_SERVERS,
2093
memcached_set(memc, keys[x], key_length[x],
2094
keys[x], key_length[x],
2095
(time_t)50, (uint32_t)9));
2098
test_compare(MEMCACHED_NO_SERVERS,
2099
memcached_mget(memc, keys, key_length, 3));
2103
char return_key[MEMCACHED_MAX_KEY];
2104
memcached_return_t rc;
2105
size_t return_key_length;
2106
size_t return_value_length;
2109
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2110
&return_value_length, &flags, &rc)))
2112
test_true(return_value);
2113
test_compare(MEMCACHED_SUCCESS, rc);
2114
test_true(return_key_length == return_value_length);
2115
test_memcmp(return_value, return_key, return_value_length);
2121
return TEST_SUCCESS;
1522
2124
#define VALUE_SIZE_BUG5 1048064
1523
test_return user_supplied_bug5(memcached_st *memc)
2125
test_return_t user_supplied_bug5(memcached_st *memc)
1525
memcached_return rc;
1526
char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2127
const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
1527
2128
size_t key_length[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
1528
char return_key[MEMCACHED_MAX_KEY];
1529
size_t return_key_length;
1531
2130
size_t value_length;
1532
2131
uint32_t flags;
2132
char *insert_data= new (std::nothrow) char[VALUE_SIZE_BUG5];
2134
for (uint32_t x= 0; x < VALUE_SIZE_BUG5; x++)
2136
insert_data[x]= (signed char)rand();
2139
test_compare(MEMCACHED_SUCCESS,
2140
memcached_flush(memc, 0));
2142
memcached_return_t rc;
2143
test_null(memcached_get(memc, keys[0], key_length[0], &value_length, &flags, &rc));
2144
test_compare(MEMCACHED_SUCCESS,
2145
memcached_mget(memc, keys, key_length, 4));
1533
2147
unsigned int count;
1535
char insert_data[VALUE_SIZE_BUG5];
1537
for (x= 0; x < VALUE_SIZE_BUG5; x++)
1538
insert_data[x]= rand();
1540
memcached_flush(memc, 0);
1541
value= memcached_get(memc, keys[0], key_length[0],
1542
&value_length, &flags, &rc);
1543
assert(value == NULL);
1544
rc= memcached_mget(memc, keys, key_length, 4);
1547
while ((value= memcached_fetch(memc, return_key, &return_key_length,
1548
&value_length, &flags, &rc)))
1552
for (x= 0; x < 4; x++)
2148
test_compare(TEST_SUCCESS, fetch_all_results(memc, count, rc));
2149
test_compare(MEMCACHED_NOTFOUND, rc);
2152
for (uint32_t x= 0; x < 4; x++)
1554
rc= memcached_set(memc, keys[x], key_length[x],
1555
insert_data, VALUE_SIZE_BUG5,
1556
(time_t)0, (uint32_t)0);
1557
assert(rc == MEMCACHED_SUCCESS);
2154
test_compare(MEMCACHED_SUCCESS,
2155
memcached_set(memc, keys[x], key_length[x],
2156
insert_data, VALUE_SIZE_BUG5,
2157
(time_t)0, (uint32_t)0));
1560
for (x= 0; x < 10; x++)
2160
for (uint32_t x= 0; x < 10; x++)
1562
2162
value= memcached_get(memc, keys[0], key_length[0],
1563
&value_length, &flags, &rc);
1567
rc= memcached_mget(memc, keys, key_length, 4);
1569
while ((value= memcached_fetch(memc, return_key, &return_key_length,
1570
&value_length, &flags, &rc)))
2163
&value_length, &flags, &rc);
2164
test_compare(rc, MEMCACHED_SUCCESS);
2168
test_compare(MEMCACHED_SUCCESS,
2169
memcached_mget(memc, keys, key_length, 4));
2171
test_compare(TEST_SUCCESS, fetch_all_results(memc, count));
2172
test_compare(4U, count);
2174
delete [] insert_data;
2176
return TEST_SUCCESS;
1581
test_return user_supplied_bug6(memcached_st *memc)
2179
test_return_t user_supplied_bug6(memcached_st *memc)
1583
memcached_return rc;
1584
char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
2181
const char *keys[]= {"036790384900", "036790384902", "036790384904", "036790384906"};
1585
2182
size_t key_length[]= {strlen("036790384900"), strlen("036790384902"), strlen("036790384904"), strlen("036790384906")};
1586
2183
char return_key[MEMCACHED_MAX_KEY];
1587
2184
size_t return_key_length;
1589
2186
size_t value_length;
1590
2187
uint32_t flags;
1593
char insert_data[VALUE_SIZE_BUG5];
1595
for (x= 0; x < VALUE_SIZE_BUG5; x++)
1596
insert_data[x]= rand();
1598
memcached_flush(memc, 0);
1599
value= memcached_get(memc, keys[0], key_length[0],
1600
&value_length, &flags, &rc);
1601
assert(value == NULL);
1602
assert(rc == MEMCACHED_NOTFOUND);
1603
rc= memcached_mget(memc, keys, key_length, 4);
1604
assert(rc == MEMCACHED_SUCCESS);
1607
while ((value= memcached_fetch(memc, return_key, &return_key_length,
1608
&value_length, &flags, &rc)))
2188
char *insert_data= new (std::nothrow) char[VALUE_SIZE_BUG5];
2190
for (uint32_t x= 0; x < VALUE_SIZE_BUG5; x++)
2192
insert_data[x]= (signed char)rand();
2195
test_compare(MEMCACHED_SUCCESS, memcached_flush(memc, 0));
2197
test_compare(TEST_SUCCESS, confirm_keys_dont_exist(memc, keys, test_array_length(keys)));
2199
// We will now confirm that memcached_mget() returns success, but we will
2200
// then check to make sure that no actual keys are returned.
2201
test_compare(MEMCACHED_SUCCESS,
2202
memcached_mget(memc, keys, key_length, 4));
2204
memcached_return_t rc;
2206
while ((value= memcached_fetch(memc, return_key, &return_key_length,
2207
&value_length, &flags, &rc)))
1611
assert(rc == MEMCACHED_END);
2212
test_compare_got(MEMCACHED_NOTFOUND, rc, memcached_strerror(NULL, rc));
1613
for (x= 0; x < 4; x++)
2214
for (uint32_t x= 0; x < test_array_length(keys); x++)
1615
rc= memcached_set(memc, keys[x], key_length[x],
1616
insert_data, VALUE_SIZE_BUG5,
1617
(time_t)0, (uint32_t)0);
1618
assert(rc == MEMCACHED_SUCCESS);
2216
test_compare(MEMCACHED_SUCCESS,
2217
memcached_set(memc, keys[x], key_length[x],
2218
insert_data, VALUE_SIZE_BUG5,
2219
(time_t)0, (uint32_t)0));
2221
test_compare(TEST_SUCCESS, confirm_keys_exist(memc, keys, test_array_length(keys)));
1621
for (x= 0; x < 2; x++)
2223
for (uint32_t x= 0; x < 2; x++)
1623
2225
value= memcached_get(memc, keys[0], key_length[0],
1624
&value_length, &flags, &rc);
2226
&value_length, &flags, &rc);
1628
rc= memcached_mget(memc, keys, key_length, 4);
1629
assert(rc == MEMCACHED_SUCCESS);
2230
test_compare(MEMCACHED_SUCCESS,
2231
memcached_mget(memc, keys, key_length, 4));
1631
2232
/* We test for purge of partial complete fetches */
1632
2233
for (count= 3; count; count--)
1634
value= memcached_fetch(memc, return_key, &return_key_length,
2235
value= memcached_fetch(memc, return_key, &return_key_length,
1635
2236
&value_length, &flags, &rc);
1636
assert(rc == MEMCACHED_SUCCESS);
1637
assert(!(memcmp(value, insert_data, value_length)));
1638
assert(value_length);
2237
test_compare(MEMCACHED_SUCCESS, rc);
2238
test_memcmp(value, insert_data, value_length);
2239
test_true(value_length);
2243
delete [] insert_data;
2245
return TEST_SUCCESS;
1646
test_return user_supplied_bug8(memcached_st *memc)
2248
test_return_t user_supplied_bug8(memcached_st *)
1648
memcached_return rc;
2250
memcached_return_t rc;
1649
2251
memcached_st *mine;
1650
memcached_st *clone;
2252
memcached_st *memc_clone;
1652
2254
memcached_server_st *servers;
1653
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";
2255
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";
1655
2257
servers= memcached_servers_parse(server_list);
1658
2260
mine= memcached_create(NULL);
1659
2261
rc= memcached_server_push(mine, servers);
1660
assert(rc == MEMCACHED_SUCCESS);
2262
test_compare(MEMCACHED_SUCCESS, rc);
1661
2263
memcached_server_list_free(servers);
1664
clone= memcached_clone(NULL, mine);
2266
memc_clone= memcached_clone(NULL, mine);
1666
2268
memcached_quit(mine);
1667
memcached_quit(clone);
2269
memcached_quit(memc_clone);
1670
2272
memcached_free(mine);
1671
memcached_free(clone);
2273
memcached_free(memc_clone);
2275
return TEST_SUCCESS;
1676
2278
/* Test flag store/retrieve */
1677
test_return user_supplied_bug7(memcached_st *memc)
2279
test_return_t user_supplied_bug7(memcached_st *memc)
1679
memcached_return rc;
1680
char *keys= "036790384900";
1681
size_t key_length= strlen("036790384900");
2281
char *insert_data= new (std::nothrow) char[VALUE_SIZE_BUG5];
2282
test_true(insert_data);
2284
for (size_t x= 0; x < VALUE_SIZE_BUG5; x++)
2286
insert_data[x]= (signed char)rand();
2289
memcached_flush(memc, 0);
2291
const char *keys= "036790384900";
2292
size_t key_length= strlen(keys);
2293
test_compare_hint(MEMCACHED_SUCCESS, memcached_set(memc, keys, key_length,
2294
insert_data, VALUE_SIZE_BUG5,
2296
memcached_last_error_message(memc));
2298
memcached_return_t rc;
2299
size_t value_length;
2301
char *value= memcached_get(memc, keys, key_length,
2302
&value_length, &flags, &rc);
2303
test_compare(245U, flags);
2307
test_compare(MEMCACHED_SUCCESS, memcached_mget(memc, &keys, &key_length, 1));
1682
2309
char return_key[MEMCACHED_MAX_KEY];
1683
2310
size_t return_key_length;
1685
size_t value_length;
1688
char insert_data[VALUE_SIZE_BUG5];
1690
for (x= 0; x < VALUE_SIZE_BUG5; x++)
1691
insert_data[x]= rand();
1693
memcached_flush(memc, 0);
1696
rc= memcached_set(memc, keys, key_length,
1697
insert_data, VALUE_SIZE_BUG5,
1699
assert(rc == MEMCACHED_SUCCESS);
1702
value= memcached_get(memc, keys, key_length,
1703
&value_length, &flags, &rc);
1704
assert(flags == 245);
1708
rc= memcached_mget(memc, &keys, &key_length, 1);
1711
value= memcached_fetch(memc, return_key, &return_key_length,
2312
value= memcached_fetch(memc, return_key, &return_key_length,
1712
2313
&value_length, &flags, &rc);
1713
assert(flags == 245);
2314
test_compare(uint32_t(245), flags);
2317
delete [] insert_data;
2320
return TEST_SUCCESS;
1721
test_return user_supplied_bug9(memcached_st *memc)
2323
test_return_t user_supplied_bug9(memcached_st *memc)
1723
memcached_return rc;
1724
char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
2325
const char *keys[]= {"UDATA:edevil@sapo.pt", "fudge&*@#", "for^#@&$not"};
1725
2326
size_t key_length[3];
1727
2327
uint32_t flags;
1728
2328
unsigned count= 0;
1920
2516
Bug found where command total one more than MEMCACHED_MAX_BUFFER
1921
2517
set key34567890 0 0 8169 \r\n
1922
2518
is sent followed by buffer of size 8169, followed by 8169
1924
test_return user_supplied_bug14(memcached_st *memc)
2520
test_return_t user_supplied_bug14(memcached_st *memc)
1927
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, setter);
1928
memcached_return rc;
1931
size_t value_length= 18000;
1933
size_t string_length;
1936
size_t current_length;
1938
value = (char*)malloc(value_length);
1941
for (x= 0; x < value_length; x++)
1942
value[x] = (char) (x % 127);
1944
for (current_length= 0; current_length < value_length; current_length++)
1946
rc= memcached_set(memc, key, strlen(key),
1947
value, current_length,
1948
(time_t)0, (uint32_t)0);
1949
assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
1951
string= memcached_get(memc, key, strlen(key),
1952
&string_length, &flags, &rc);
1954
assert(rc == MEMCACHED_SUCCESS);
1955
assert(string_length == current_length);
1956
assert(!memcmp(string, value, string_length));
2522
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, true);
2524
libtest::vchar_t value;
2525
value.reserve(18000);
2526
for (ptrdiff_t x= 0; x < 18000; x++)
2528
value.push_back((char) (x % 127));
2531
for (size_t current_length= 1; current_length < value.size(); current_length++)
2533
memcached_return_t rc= memcached_set(memc, test_literal_param("foo"),
2534
&value[0], current_length,
2535
(time_t)0, (uint32_t)0);
2536
test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED);
2538
size_t string_length;
2540
char *string= memcached_get(memc, test_literal_param("foo"),
2541
&string_length, &flags, &rc);
2543
test_compare(MEMCACHED_SUCCESS, rc);
2544
test_compare(string_length, current_length);
2546
snprintf(buffer, sizeof(buffer), "%u", uint32_t(string_length));
2547
test_memcmp_hint(string, &value[0], string_length, buffer);
2552
return TEST_SUCCESS;
1967
2556
Look for zero length value problems
1969
test_return user_supplied_bug15(memcached_st *memc)
1972
memcached_return rc;
1978
for (x= 0; x < 2; x++)
1980
rc= memcached_set(memc, key, strlen(key),
1982
(time_t)0, (uint32_t)0);
1984
assert(rc == MEMCACHED_SUCCESS);
1986
value= memcached_get(memc, key, strlen(key),
1987
&length, &flags, &rc);
1989
assert(rc == MEMCACHED_SUCCESS);
1990
assert(value == NULL);
1991
assert(length == 0);
1994
value= memcached_get(memc, key, strlen(key),
1995
&length, &flags, &rc);
1997
assert(rc == MEMCACHED_SUCCESS);
1998
assert(value == NULL);
1999
assert(length == 0);
2006
test_return result_static(memcached_st *memc)
2558
test_return_t user_supplied_bug15(memcached_st *memc)
2560
for (uint32_t x= 0; x < 2; x++)
2562
memcached_return_t rc= memcached_set(memc, test_literal_param("mykey"),
2564
(time_t)0, (uint32_t)0);
2566
test_compare(MEMCACHED_SUCCESS, rc);
2570
char *value= memcached_get(memc, test_literal_param("mykey"),
2571
&length, &flags, &rc);
2573
test_compare(MEMCACHED_SUCCESS, rc);
2578
value= memcached_get(memc, test_literal_param("mykey"),
2579
&length, &flags, &rc);
2581
test_compare(MEMCACHED_SUCCESS, rc);
2587
return TEST_SUCCESS;
2590
/* Check the return sizes on FLAGS to make sure it stores 32bit unsigned values correctly */
2591
test_return_t user_supplied_bug16(memcached_st *memc)
2593
test_compare_hint(MEMCACHED_SUCCESS, memcached_set(memc, test_literal_param("mykey"),
2595
(time_t)0, UINT32_MAX),
2596
memcached_last_error_message(memc));
2601
memcached_return_t rc;
2602
char *value= memcached_get(memc, test_literal_param("mykey"),
2603
&length, &flags, &rc);
2605
test_compare(MEMCACHED_SUCCESS, rc);
2608
test_compare(flags, UINT32_MAX);
2610
return TEST_SUCCESS;
2613
#if !defined(__sun) && !defined(__OpenBSD__)
2614
/* Check the validity of chinese key*/
2615
test_return_t user_supplied_bug17(memcached_st *memc)
2617
const char *key= "豆瓣";
2618
const char *value="我们在炎热抑郁的夏天无法停止豆瓣";
2619
memcached_return_t rc= memcached_set(memc, key, strlen(key),
2620
value, strlen(value),
2623
test_compare(MEMCACHED_SUCCESS, rc);
2627
char *value2= memcached_get(memc, key, strlen(key),
2628
&length, &flags, &rc);
2630
test_true(length==strlen(value));
2631
test_compare(MEMCACHED_SUCCESS, rc);
2632
test_memcmp(value, value2, length);
2635
return TEST_SUCCESS;
2643
test_return_t user_supplied_bug19(memcached_st *)
2645
memcached_return_t res;
2647
memcached_st *memc= memcached(test_literal_param("--server=localhost:11311/?100 --server=localhost:11312/?100"));
2649
const memcached_server_st *server= memcached_server_by_key(memc, "a", 1, &res);
2652
memcached_free(memc);
2654
return TEST_SUCCESS;
2657
/* CAS test from Andei */
2658
test_return_t user_supplied_bug20(memcached_st *memc)
2660
const char *key= "abc";
2661
size_t key_len= strlen("abc");
2663
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, true));
2665
test_compare(MEMCACHED_SUCCESS,
2667
test_literal_param("abc"),
2668
test_literal_param("foobar"),
2669
(time_t)0, (uint32_t)0));
2671
test_compare(MEMCACHED_SUCCESS,
2672
memcached_mget(memc, &key, &key_len, 1));
2674
memcached_result_st result_obj;
2675
memcached_result_st *result= memcached_result_create(memc, &result_obj);
2678
memcached_result_create(memc, &result_obj);
2679
memcached_return_t status;
2680
result= memcached_fetch_result(memc, &result_obj, &status);
2683
test_compare(MEMCACHED_SUCCESS, status);
2685
memcached_result_free(result);
2687
return TEST_SUCCESS;
2690
/* Large mget() of missing keys with binary proto
2692
* If many binary quiet commands (such as getq's in an mget) fill the output
2693
* buffer and the server chooses not to respond, memcached_flush hangs. See
2694
* http://lists.tangent.org/pipermail/libmemcached/2009-August/000918.html
2697
/* sighandler_t function that always asserts false */
2698
static void fail(int)
2704
test_return_t _user_supplied_bug21(memcached_st* memc, size_t key_count)
2709
return TEST_SKIPPED;
2711
void (*oldalarm)(int);
2713
memcached_st *memc_clone= memcached_clone(NULL, memc);
2714
test_true(memc_clone);
2716
/* only binproto uses getq for mget */
2717
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, true));
2719
/* empty the cache to ensure misses (hence non-responses) */
2720
test_compare(MEMCACHED_SUCCESS, memcached_flush(memc_clone, 0));
2722
keys_st keys(key_count);
2724
oldalarm= signal(SIGALRM, fail);
2727
test_compare_got(MEMCACHED_SUCCESS,
2728
memcached_mget(memc_clone, keys.keys_ptr(), keys.lengths_ptr(), keys.size()),
2729
memcached_last_error_message(memc_clone));
2732
signal(SIGALRM, oldalarm);
2734
memcached_return_t rc;
2736
char return_key[MEMCACHED_MAX_KEY];
2737
size_t return_key_length;
2739
size_t return_value_length;
2740
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2741
&return_value_length, &flags, &rc)))
2743
test_false(return_value); // There are no keys to fetch, so the value should never be returned
2745
test_compare(MEMCACHED_NOTFOUND, rc);
2746
test_zero(return_value_length);
2747
test_zero(return_key_length);
2748
test_false(return_key[0]);
2749
test_false(return_value);
2751
memcached_free(memc_clone);
2753
return TEST_SUCCESS;
2757
test_return_t user_supplied_bug21(memcached_st *memc)
2759
test_skip(TEST_SUCCESS, pre_binary(memc));
2761
/* should work as of r580 */
2762
test_compare(TEST_SUCCESS,
2763
_user_supplied_bug21(memc, 10));
2765
/* should fail as of r580 */
2766
test_compare(TEST_SUCCESS,
2767
_user_supplied_bug21(memc, 1000));
2769
return TEST_SUCCESS;
2772
test_return_t output_ketama_weighted_keys(memcached_st *)
2774
memcached_st *memc= memcached_create(NULL);
2778
test_compare(MEMCACHED_SUCCESS,
2779
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, true));
2781
uint64_t value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
2782
test_compare(value, uint64_t(1));
2784
test_compare(MEMCACHED_SUCCESS,
2785
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5));
2787
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA_HASH);
2788
test_true(value == MEMCACHED_HASH_MD5);
2791
test_true(memcached_behavior_set_distribution(memc, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY) == MEMCACHED_SUCCESS);
2793
memcached_server_st *server_pool;
2794
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");
2795
memcached_server_push(memc, server_pool);
2797
// @todo this needs to be refactored to actually test something.
2800
if ((fp = fopen("ketama_keys.txt", "w")))
2804
printf("cannot write to file ketama_keys.txt");
2805
return TEST_FAILURE;
2808
for (int x= 0; x < 10000; x++)
2811
snprintf(key, sizeof(key), "%d", x);
2813
uint32_t server_idx = memcached_generate_hash(memc, key, strlen(key));
2814
char *hostname = memc->hosts[server_idx].hostname;
2815
in_port_t port = memc->hosts[server_idx].port;
2816
fprintf(fp, "key %s is on host /%s:%u\n", key, hostname, port);
2817
memcached_server_instance_st instance=
2818
memcached_server_instance_by_position(memc, host_index);
2822
memcached_server_list_free(server_pool);
2823
memcached_free(memc);
2825
return TEST_SUCCESS;
2829
test_return_t result_static(memcached_st *memc)
2008
2831
memcached_result_st result;
2009
memcached_result_st *result_ptr;
2832
memcached_result_st *result_ptr= memcached_result_create(memc, &result);
2833
test_false(result.options.is_allocated);
2834
test_true(memcached_is_initialized(&result));
2835
test_true(result_ptr);
2836
test_true(result_ptr == &result);
2011
result_ptr= memcached_result_create(memc, &result);
2012
assert(result.is_allocated == MEMCACHED_NOT_ALLOCATED);
2014
2838
memcached_result_free(&result);
2019
test_return result_alloc(memcached_st *memc)
2021
memcached_result_st *result;
2023
result= memcached_result_create(memc, NULL);
2025
memcached_result_free(result);
2030
test_return string_static_null(memcached_st *memc)
2032
memcached_string_st string;
2033
memcached_string_st *string_ptr;
2035
string_ptr= memcached_string_create(memc, &string, 0);
2036
assert(string.is_allocated == MEMCACHED_NOT_ALLOCATED);
2038
memcached_string_free(&string);
2043
test_return string_alloc_null(memcached_st *memc)
2045
memcached_string_st *string;
2047
string= memcached_string_create(memc, NULL, 0);
2049
memcached_string_free(string);
2054
test_return string_alloc_with_size(memcached_st *memc)
2056
memcached_string_st *string;
2058
string= memcached_string_create(memc, NULL, 1024);
2060
memcached_string_free(string);
2065
test_return string_alloc_with_size_toobig(memcached_st *memc)
2067
memcached_string_st *string;
2069
string= memcached_string_create(memc, NULL, INT64_MAX);
2070
assert(string == NULL);
2075
test_return string_alloc_append(memcached_st *memc)
2078
char buffer[SMALL_STRING_LEN];
2079
memcached_string_st *string;
2081
/* Ring the bell! */
2082
memset(buffer, 6, SMALL_STRING_LEN);
2084
string= memcached_string_create(memc, NULL, 100);
2087
for (x= 0; x < 1024; x++)
2089
memcached_return rc;
2090
rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
2091
assert(rc == MEMCACHED_SUCCESS);
2093
memcached_string_free(string);
2098
test_return string_alloc_append_toobig(memcached_st *memc)
2100
memcached_return rc;
2102
char buffer[SMALL_STRING_LEN];
2103
memcached_string_st *string;
2105
/* Ring the bell! */
2106
memset(buffer, 6, SMALL_STRING_LEN);
2108
string= memcached_string_create(memc, NULL, 100);
2111
for (x= 0; x < 1024; x++)
2113
rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
2114
assert(rc == MEMCACHED_SUCCESS);
2116
rc= memcached_string_append(string, buffer, INT64_MAX);
2117
assert(rc == MEMCACHED_MEMORY_ALLOCATION_FAILURE);
2118
memcached_string_free(string);
2123
test_return cleanup_pairs(memcached_st *memc)
2125
pairs_free(global_pairs);
2130
test_return generate_pairs(memcached_st *memc)
2132
unsigned long long x;
2133
global_pairs= pairs_generate(GLOBAL_COUNT, 400);
2134
global_count= GLOBAL_COUNT;
2136
for (x= 0; x < global_count; x++)
2138
global_keys[x]= global_pairs[x].key;
2139
global_keys_length[x]= global_pairs[x].key_length;
2145
test_return generate_large_pairs(memcached_st *memc)
2147
unsigned long long x;
2148
global_pairs= pairs_generate(GLOBAL2_COUNT, MEMCACHED_MAX_BUFFER+10);
2149
global_count= GLOBAL2_COUNT;
2151
for (x= 0; x < global_count; x++)
2153
global_keys[x]= global_pairs[x].key;
2154
global_keys_length[x]= global_pairs[x].key_length;
2160
test_return generate_data(memcached_st *memc)
2162
execute_set(memc, global_pairs, global_count);
2167
test_return generate_buffer_data(memcached_st *memc)
2172
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch);
2173
generate_data(memc);
2178
test_return get_read_count(memcached_st *memc)
2181
memcached_return rc;
2182
memcached_st *clone;
2184
clone= memcached_clone(NULL, memc);
2187
memcached_server_add(clone, "localhost", 6666);
2191
size_t return_value_length;
2195
for (x= count= 0; x < global_count; x++)
2197
return_value= memcached_get(clone, global_keys[x], global_keys_length[x],
2198
&return_value_length, &flags, &rc);
2199
if (rc == MEMCACHED_SUCCESS)
2206
fprintf(stderr, "\t%u -> %u", global_count, count);
2209
memcached_free(clone);
2214
test_return get_read(memcached_st *memc)
2217
memcached_return rc;
2221
size_t return_value_length;
2224
for (x= 0; x < global_count; x++)
2226
return_value= memcached_get(memc, global_keys[x], global_keys_length[x],
2227
&return_value_length, &flags, &rc);
2229
assert(return_value);
2230
assert(rc == MEMCACHED_SUCCESS);
2232
if (rc == MEMCACHED_SUCCESS && return_value)
2240
test_return mget_read(memcached_st *memc)
2242
memcached_return rc;
2244
rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
2245
assert(rc == MEMCACHED_SUCCESS);
2246
/* Turn this into a help function */
2248
char return_key[MEMCACHED_MAX_KEY];
2249
size_t return_key_length;
2251
size_t return_value_length;
2254
while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
2255
&return_value_length, &flags, &rc)))
2257
assert(return_value);
2258
assert(rc == MEMCACHED_SUCCESS);
2266
test_return mget_read_result(memcached_st *memc)
2268
memcached_return rc;
2270
rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
2271
assert(rc == MEMCACHED_SUCCESS);
2272
/* Turn this into a help function */
2274
memcached_result_st results_obj;
2275
memcached_result_st *results;
2277
results= memcached_result_create(memc, &results_obj);
2279
while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
2282
assert(rc == MEMCACHED_SUCCESS);
2285
memcached_result_free(&results_obj);
2291
test_return mget_read_function(memcached_st *memc)
2293
memcached_return rc;
2294
unsigned int counter;
2295
unsigned int (*callbacks[1])(memcached_st *, memcached_result_st *, void *);
2297
rc= memcached_mget(memc, global_keys, global_keys_length, global_count);
2298
assert(rc == MEMCACHED_SUCCESS);
2300
callbacks[0]= &callback_counter;
2302
rc= memcached_fetch_execute(memc, callbacks, (void *)&counter, 1);
2307
test_return delete_generate(memcached_st *memc)
2311
for (x= 0; x < global_count; x++)
2313
(void)memcached_delete(memc, global_keys[x], global_keys_length[x], (time_t)0);
2319
test_return delete_buffer_generate(memcached_st *memc)
2325
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, latch);
2327
for (x= 0; x < global_count; x++)
2329
(void)memcached_delete(memc, global_keys[x], global_keys_length[x], (time_t)0);
2335
test_return free_data(memcached_st *memc)
2337
pairs_free(global_pairs);
2342
test_return add_host_test1(memcached_st *memc)
2345
memcached_return rc;
2840
test_false(result.options.is_allocated);
2841
test_false(memcached_is_initialized(&result));
2843
return TEST_SUCCESS;
2846
test_return_t result_alloc(memcached_st *memc)
2848
memcached_result_st *result_ptr= memcached_result_create(memc, NULL);
2849
test_true(result_ptr);
2850
test_true(result_ptr->options.is_allocated);
2851
test_true(memcached_is_initialized(result_ptr));
2852
memcached_result_free(result_ptr);
2854
return TEST_SUCCESS;
2858
test_return_t add_host_test1(memcached_st *memc)
2860
memcached_return_t rc;
2346
2861
char servername[]= "0.example.com";
2347
memcached_server_st *servers;
2349
servers= memcached_server_list_append(NULL, servername, 400, &rc);
2351
assert(1 == memcached_server_list_count(servers));
2353
for (x= 2; x < 20; x++)
2863
memcached_server_st *servers= memcached_server_list_append_with_weight(NULL, servername, 400, 0, &rc);
2865
test_compare(1U, memcached_server_list_count(servers));
2867
for (uint32_t x= 2; x < 20; x++)
2355
2869
char buffer[SMALL_STRING_LEN];
2357
snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
2358
servers= memcached_server_list_append(servers, buffer, 401,
2360
assert(rc == MEMCACHED_SUCCESS);
2361
assert(x == memcached_server_list_count(servers));
2871
snprintf(buffer, SMALL_STRING_LEN, "%lu.example.com", (unsigned long)(400 +x));
2872
servers= memcached_server_list_append_with_weight(servers, buffer, 401, 0,
2874
test_compare(MEMCACHED_SUCCESS, rc);
2875
test_compare(x, memcached_server_list_count(servers));
2364
rc= memcached_server_push(memc, servers);
2365
assert(rc == MEMCACHED_SUCCESS);
2366
rc= memcached_server_push(memc, servers);
2367
assert(rc == MEMCACHED_SUCCESS);
2878
test_compare(MEMCACHED_SUCCESS, memcached_server_push(memc, servers));
2879
test_compare(MEMCACHED_SUCCESS, memcached_server_push(memc, servers));
2369
2881
memcached_server_list_free(servers);
2374
memcached_return pre_nonblock(memcached_st *memc)
2376
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
2378
return MEMCACHED_SUCCESS;
2381
memcached_return pre_murmur(memcached_st *memc)
2383
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR);
2385
return MEMCACHED_SUCCESS;
2388
memcached_return pre_md5(memcached_st *memc)
2390
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MD5);
2392
return MEMCACHED_SUCCESS;
2395
memcached_return pre_crc(memcached_st *memc)
2397
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_CRC);
2399
return MEMCACHED_SUCCESS;
2402
memcached_return pre_hsieh(memcached_st *memc)
2404
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH);
2406
return MEMCACHED_SUCCESS;
2409
memcached_return pre_hash_fnv1_64(memcached_st *memc)
2411
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_64);
2413
return MEMCACHED_SUCCESS;
2416
memcached_return pre_hash_fnv1a_64(memcached_st *memc)
2418
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_64);
2420
return MEMCACHED_SUCCESS;
2423
memcached_return pre_hash_fnv1_32(memcached_st *memc)
2425
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1_32);
2427
return MEMCACHED_SUCCESS;
2430
memcached_return pre_hash_fnv1a_32(memcached_st *memc)
2432
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_FNV1A_32);
2434
return MEMCACHED_SUCCESS;
2437
memcached_return pre_behavior_ketama(memcached_st *memc)
2439
memcached_return rc;
2442
rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_KETAMA, 1);
2443
assert(rc == MEMCACHED_SUCCESS);
2445
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_KETAMA);
2448
return MEMCACHED_SUCCESS;
2451
void my_free(memcached_st *ptr, void *mem)
2883
return TEST_SUCCESS;
2887
static void my_free(const memcached_st *ptr, void *mem, void *context)
2891
#ifdef HARD_MALLOC_TESTS
2892
void *real_ptr= (mem == NULL) ? mem : (void*)((caddr_t)mem - 8);
2456
void *my_malloc(memcached_st *ptr, const size_t size)
2458
return malloc(size);
2461
void *my_realloc(memcached_st *ptr, void *mem, const size_t size)
2900
static void *my_malloc(const memcached_st *ptr, const size_t size, void *context)
2904
#ifdef HARD_MALLOC_TESTS
2905
void *ret= malloc(size + 8);
2908
ret= (void*)((caddr_t)ret + 8);
2911
void *ret= malloc(size);
2916
memset(ret, 0xff, size);
2923
static void *my_realloc(const memcached_st *ptr, void *mem, const size_t size, void *)
2925
#ifdef HARD_MALLOC_TESTS
2926
void *real_ptr= (mem == NULL) ? NULL : (void*)((caddr_t)mem - 8);
2927
void *nmem= realloc(real_ptr, size + 8);
2932
ret= (void*)((caddr_t)nmem + 8);
2463
2938
return realloc(mem, size);
2466
memcached_return set_memory_alloc(memcached_st *memc)
2469
memcached_malloc_function test_ptr;
2470
memcached_return rc;
2472
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, &my_malloc);
2473
assert(rc == MEMCACHED_SUCCESS);
2474
test_ptr= (memcached_malloc_function)memcached_callback_get(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, &rc);
2475
assert(rc == MEMCACHED_SUCCESS);
2476
assert(test_ptr == my_malloc);
2480
memcached_realloc_function test_ptr;
2481
memcached_return rc;
2483
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, &my_realloc);
2484
assert(rc == MEMCACHED_SUCCESS);
2485
test_ptr= (memcached_realloc_function)memcached_callback_get(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, &rc);
2486
assert(rc == MEMCACHED_SUCCESS);
2487
assert(test_ptr == my_realloc);
2491
memcached_free_function test_ptr;
2492
memcached_return rc;
2494
rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, my_free);
2495
assert(rc == MEMCACHED_SUCCESS);
2496
test_ptr= (memcached_free_function)memcached_callback_get(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, &rc);
2497
assert(rc == MEMCACHED_SUCCESS);
2498
assert(test_ptr == my_free);
2501
return MEMCACHED_SUCCESS;
2504
memcached_return enable_wheel(memcached_st *memc)
2506
memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT_WHEEL;
2507
memcached_hash hash;
2508
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
2511
value= (memcached_server_distribution)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
2512
assert(value == MEMCACHED_DISTRIBUTION_CONSISTENT_WHEEL);
2514
hash= (memcached_hash)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
2515
assert(hash == MEMCACHED_HASH_HSIEH);
2518
return MEMCACHED_SUCCESS;
2521
memcached_return enable_consistent(memcached_st *memc)
2523
memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT;
2524
memcached_hash hash;
2525
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
2528
value= (memcached_server_distribution)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
2529
assert(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
2531
hash= (memcached_hash)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
2532
assert(hash == MEMCACHED_HASH_HSIEH);
2535
return MEMCACHED_SUCCESS;
2538
memcached_return enable_cas(memcached_st *memc)
2943
static void *my_calloc(const memcached_st *ptr, size_t nelem, const size_t size, void *)
2945
#ifdef HARD_MALLOC_TESTS
2946
void *mem= my_malloc(ptr, nelem * size);
2949
memset(mem, 0, nelem * size);
2955
return calloc(nelem, size);
2959
test_return_t selection_of_namespace_tests(memcached_st *memc)
2961
memcached_return_t rc;
2962
const char *key= "mine";
2965
/* Make sure be default none exists */
2966
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
2968
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
2970
/* Test a clean set */
2971
test_compare(MEMCACHED_SUCCESS,
2972
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, (void *)key));
2974
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
2976
test_memcmp(value, key, 4);
2977
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
2979
/* Test that we can turn it off */
2980
test_compare(MEMCACHED_SUCCESS,
2981
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, NULL));
2983
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
2985
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
2987
/* Now setup for main test */
2988
test_compare(MEMCACHED_SUCCESS,
2989
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, (void *)key));
2991
value= (char *)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
2993
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
2994
test_memcmp(value, key, 4);
2996
/* Set to Zero, and then Set to something too large */
2999
memset(long_key, 0, 255);
3001
test_compare(MEMCACHED_SUCCESS,
3002
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, NULL));
3004
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
3006
test_compare(MEMCACHED_SUCCESS, rc);
3008
/* Test a long key for failure */
3009
/* TODO, extend test to determine based on setting, what result should be */
3010
strncpy(long_key, "Thisismorethentheallottednumberofcharacters", sizeof(long_key));
3011
test_compare(MEMCACHED_SUCCESS,
3012
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, long_key));
3014
/* Now test a key with spaces (which will fail from long key, since bad key is not set) */
3015
strncpy(long_key, "This is more then the allotted number of characters", sizeof(long_key));
3016
test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) ? MEMCACHED_SUCCESS : MEMCACHED_BAD_KEY_PROVIDED,
3017
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, long_key));
3019
/* Test for a bad prefix, but with a short key */
3020
test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) ? MEMCACHED_INVALID_ARGUMENTS : MEMCACHED_SUCCESS,
3021
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_VERIFY_KEY, 1));
3023
test_compare(memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) ? MEMCACHED_SUCCESS : MEMCACHED_BAD_KEY_PROVIDED,
3024
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, "dog cat"));
3027
return TEST_SUCCESS;
3030
test_return_t set_namespace(memcached_st *memc)
3032
memcached_return_t rc;
3033
const char *key= "mine";
3036
// Make sure we default to a null namespace
3037
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
3039
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
3041
/* Test a clean set */
3042
test_compare(MEMCACHED_SUCCESS,
3043
memcached_callback_set(memc, MEMCACHED_CALLBACK_NAMESPACE, (void *)key));
3045
value= (char*)memcached_callback_get(memc, MEMCACHED_CALLBACK_NAMESPACE, &rc);
3047
test_memcmp(value, key, 4);
3048
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
3050
return TEST_SUCCESS;
3053
test_return_t set_namespace_and_binary(memcached_st *memc)
3055
test_return_if(pre_binary(memc));
3056
test_return_if(set_namespace(memc));
3058
return TEST_SUCCESS;
3061
#ifdef MEMCACHED_ENABLE_DEPRECATED
3062
test_return_t deprecated_set_memory_alloc(memcached_st *memc)
3064
void *test_ptr= NULL;
3067
memcached_malloc_fn malloc_cb= (memcached_malloc_fn)my_malloc;
3068
cb_ptr= *(void **)&malloc_cb;
3069
memcached_return_t rc;
3071
test_compare(MEMCACHED_SUCCESS,
3072
memcached_callback_set(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, cb_ptr));
3073
test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_MALLOC_FUNCTION, &rc);
3074
test_compare(MEMCACHED_SUCCESS, rc);
3075
test_true(test_ptr == cb_ptr);
3079
memcached_realloc_fn realloc_cb=
3080
(memcached_realloc_fn)my_realloc;
3081
cb_ptr= *(void **)&realloc_cb;
3082
memcached_return_t rc;
3084
test_compare(MEMCACHED_SUCCESS,
3085
memcached_callback_set(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, cb_ptr));
3086
test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_REALLOC_FUNCTION, &rc);
3087
test_compare(MEMCACHED_SUCCESS, rc);
3088
test_true(test_ptr == cb_ptr);
3092
memcached_free_fn free_cb=
3093
(memcached_free_fn)my_free;
3094
cb_ptr= *(void **)&free_cb;
3095
memcached_return_t rc;
3097
test_compare(MEMCACHED_SUCCESS,
3098
memcached_callback_set(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, cb_ptr));
3099
test_ptr= memcached_callback_get(memc, MEMCACHED_CALLBACK_FREE_FUNCTION, &rc);
3100
test_compare(MEMCACHED_SUCCESS, rc);
3101
test_true(test_ptr == cb_ptr);
3104
return TEST_SUCCESS;
3109
test_return_t set_memory_alloc(memcached_st *memc)
3111
test_compare(MEMCACHED_INVALID_ARGUMENTS,
3112
memcached_set_memory_allocators(memc, NULL, my_free,
3113
my_realloc, my_calloc, NULL));
3115
test_compare(MEMCACHED_SUCCESS,
3116
memcached_set_memory_allocators(memc, my_malloc, my_free,
3117
my_realloc, my_calloc, NULL));
3119
memcached_malloc_fn mem_malloc;
3120
memcached_free_fn mem_free;
3121
memcached_realloc_fn mem_realloc;
3122
memcached_calloc_fn mem_calloc;
3123
memcached_get_memory_allocators(memc, &mem_malloc, &mem_free,
3124
&mem_realloc, &mem_calloc);
3126
test_true(mem_malloc == my_malloc);
3127
test_true(mem_realloc == my_realloc);
3128
test_true(mem_calloc == my_calloc);
3129
test_true(mem_free == my_free);
3131
return TEST_SUCCESS;
3134
test_return_t enable_consistent_crc(memcached_st *memc)
3137
memcached_server_distribution_t value= MEMCACHED_DISTRIBUTION_CONSISTENT;
3138
memcached_hash_t hash;
3139
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
3140
if ((rc= pre_crc(memc)) != TEST_SUCCESS)
3143
value= (memcached_server_distribution_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
3144
test_true(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
3146
hash= (memcached_hash_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
3148
if (hash != MEMCACHED_HASH_CRC)
3149
return TEST_SKIPPED;
3151
return TEST_SUCCESS;
3154
test_return_t enable_consistent_hsieh(memcached_st *memc)
3157
memcached_server_distribution_t value= MEMCACHED_DISTRIBUTION_CONSISTENT;
3158
memcached_hash_t hash;
3159
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
3160
if ((rc= pre_hsieh(memc)) != TEST_SUCCESS)
3165
value= (memcached_server_distribution_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
3166
test_true(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
3168
hash= (memcached_hash_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
3170
if (hash != MEMCACHED_HASH_HSIEH)
3171
return TEST_SKIPPED;
3174
return TEST_SUCCESS;
3177
test_return_t enable_cas(memcached_st *memc)
2540
3179
unsigned int set= 1;
2542
memcached_version(memc);
2544
if (memc->hosts[0].major_version >= 1 &&
2545
memc->hosts[0].minor_version >= 2 &&
2546
memc->hosts[0].micro_version >= 4)
3181
if (libmemcached_util_version_check(memc, 1, 2, 4))
2548
3183
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, set);
2550
return MEMCACHED_SUCCESS;
3185
return TEST_SUCCESS;
2553
return MEMCACHED_FAILURE;
3188
return TEST_SKIPPED;
2556
memcached_return check_for_1_2_3(memcached_st *memc)
3191
test_return_t check_for_1_2_3(memcached_st *memc)
2558
3193
memcached_version(memc);
2560
if (memc->hosts[0].major_version >= 1 &&
2561
memc->hosts[0].minor_version >= 2 &&
2562
memc->hosts[0].micro_version >= 4)
2563
return MEMCACHED_SUCCESS;
2565
return MEMCACHED_FAILURE;
2568
memcached_return pre_unix_socket(memcached_st *memc)
2570
memcached_return rc;
2573
memcached_server_list_free(memc->hosts);
2575
memc->number_of_hosts= 0;
2577
if (stat("/tmp/memcached.socket", &buf))
2578
return MEMCACHED_FAILURE;
2580
rc= memcached_server_add_unix_socket(memc, "/tmp/memcached.socket");
2585
memcached_return pre_udp(memcached_st *memc)
2587
memcached_return rc;
2589
memcached_server_list_free(memc->hosts);
2591
memc->number_of_hosts= 0;
2594
return MEMCACHED_FAILURE;
2596
rc= memcached_server_add_udp(memc, "localhost", MEMCACHED_DEFAULT_PORT);
2601
memcached_return pre_nodelay(memcached_st *memc)
2603
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, 0);
2604
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, 0);
2606
return MEMCACHED_SUCCESS;
2609
memcached_return poll_timeout(memcached_st *memc)
3195
memcached_server_instance_st instance=
3196
memcached_server_instance_by_position(memc, 0);
3198
if ((instance->major_version >= 1 && (instance->minor_version == 2 && instance->micro_version >= 4))
3199
or instance->minor_version > 2)
3201
return TEST_SUCCESS;
3204
return TEST_SKIPPED;
3207
test_return_t MEMCACHED_BEHAVIOR_POLL_TIMEOUT_test(memcached_st *memc)
3209
const uint64_t timeout= 100; // Not using, just checking that it sets
2615
3211
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, timeout);
2617
timeout= (int32_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
2619
assert(timeout == 100);
3213
test_compare(timeout, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT));
3215
return TEST_SUCCESS;
3218
test_return_t noreply_test(memcached_st *memc)
3220
test_compare(MEMCACHED_SUCCESS,
3221
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, true));
3222
test_compare(MEMCACHED_SUCCESS,
3223
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, true));
3224
test_compare(MEMCACHED_SUCCESS,
3225
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS, true));
3226
test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY));
3227
test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS));
3228
test_compare(1LLU, memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SUPPORT_CAS));
3230
memcached_return_t ret;
3231
for (int count= 0; count < 5; ++count)
3233
for (size_t x= 0; x < 100; ++x)
3235
char key[MEMCACHED_MAXIMUM_INTEGER_DISPLAY_LENGTH +1];
3236
int check_length= (size_t)snprintf(key, sizeof(key), "%lu", (unsigned long)x);
3237
test_false((size_t)check_length >= sizeof(key) || check_length < 0);
3239
size_t len= (size_t)check_length;
3244
ret= memcached_add(memc, key, len, key, len, 0, 0);
3247
ret= memcached_replace(memc, key, len, key, len, 0, 0);
3250
ret= memcached_set(memc, key, len, key, len, 0, 0);
3253
ret= memcached_append(memc, key, len, key, len, 0, 0);
3256
ret= memcached_prepend(memc, key, len, key, len, 0, 0);
3262
test_true_got(ret == MEMCACHED_SUCCESS or ret == MEMCACHED_BUFFERED,
3263
memcached_strerror(NULL, ret));
3267
** NOTE: Don't ever do this in your code! this is not a supported use of the
3268
** API and is _ONLY_ done this way to verify that the library works the
3269
** way it is supposed to do!!!!
3273
for (uint32_t x= 0; x < memcached_server_count(memc); ++x)
3275
memcached_server_instance_st instance=
3276
memcached_server_instance_by_position(memc, x);
3277
no_msg+=(int)(instance->cursor_active);
3280
test_true(no_msg == 0);
3282
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
3285
** Now validate that all items was set properly!
3287
for (size_t x= 0; x < 100; ++x)
3291
int check_length= (size_t)snprintf(key, sizeof(key), "%lu", (unsigned long)x);
3293
test_false((size_t)check_length >= sizeof(key) || check_length < 0);
3295
size_t len= (size_t)check_length;
3298
char* value=memcached_get(memc, key, strlen(key),
3299
&length, &flags, &ret);
3300
test_true_got(ret == MEMCACHED_SUCCESS && value != NULL, memcached_strerror(NULL, ret));
3303
case 0: /* FALLTHROUGH */
3304
case 1: /* FALLTHROUGH */
3306
test_true(strncmp(value, key, len) == 0);
3307
test_true(len == length);
3310
test_true(length == len * 2);
3313
test_true(length == len * 3);
3323
/* Try setting an illegal cas value (should not return an error to
3324
* the caller (because we don't expect a return message from the server)
3326
const char* keys[]= {"0"};
3327
size_t lengths[]= {1};
3330
memcached_result_st results_obj;
3331
memcached_result_st *results;
3332
test_compare(MEMCACHED_SUCCESS,
3333
memcached_mget(memc, keys, lengths, 1));
3335
results= memcached_result_create(memc, &results_obj);
3337
results= memcached_fetch_result(memc, &results_obj, &ret);
3339
test_compare(MEMCACHED_SUCCESS, ret);
3340
uint64_t cas= memcached_result_cas(results);
3341
memcached_result_free(&results_obj);
3343
test_compare(MEMCACHED_SUCCESS,
3344
memcached_cas(memc, keys[0], lengths[0], keys[0], lengths[0], 0, 0, cas));
3347
* The item will have a new cas value, so try to set it again with the old
3348
* value. This should fail!
3350
test_compare(MEMCACHED_SUCCESS,
3351
memcached_cas(memc, keys[0], lengths[0], keys[0], lengths[0], 0, 0, cas));
3352
test_true(memcached_flush_buffers(memc) == MEMCACHED_SUCCESS);
3353
char* value=memcached_get(memc, keys[0], lengths[0], &length, &flags, &ret);
3354
test_true(ret == MEMCACHED_SUCCESS && value != NULL);
3357
return TEST_SUCCESS;
3360
test_return_t analyzer_test(memcached_st *memc)
3362
memcached_analysis_st *report;
3363
memcached_return_t rc;
3365
memcached_stat_st *memc_stat= memcached_stat(memc, NULL, &rc);
3366
test_compare(MEMCACHED_SUCCESS, rc);
3367
test_true(memc_stat);
3369
report= memcached_analyze(memc, memc_stat, &rc);
3370
test_compare(MEMCACHED_SUCCESS, rc);
3374
memcached_stat_free(NULL, memc_stat);
3376
return TEST_SUCCESS;
3379
test_return_t util_version_test(memcached_st *memc)
3381
test_compare_hint(MEMCACHED_SUCCESS, memcached_version(memc), memcached_last_error_message(memc));
3382
test_true(libmemcached_util_version_check(memc, 0, 0, 0));
3384
bool if_successful= libmemcached_util_version_check(memc, 9, 9, 9);
3386
// We expect failure
3389
fprintf(stderr, "\n----------------------------------------------------------------------\n");
3390
fprintf(stderr, "\nDumping Server Information\n\n");
3391
memcached_server_fn callbacks[1];
3393
callbacks[0]= dump_server_information;
3394
memcached_server_cursor(memc, callbacks, (void *)stderr, 1);
3395
fprintf(stderr, "\n----------------------------------------------------------------------\n");
3397
test_true(if_successful == false);
3399
memcached_server_instance_st instance=
3400
memcached_server_instance_by_position(memc, 0);
3402
memcached_version(memc);
3404
// We only use one binary when we test, so this should be just fine.
3405
if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->minor_version, instance->micro_version);
3406
test_true(if_successful == true);
3408
if (instance->micro_version > 0)
3410
if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->minor_version, (uint8_t)(instance->micro_version -1));
3412
else if (instance->minor_version > 0)
3414
if_successful= libmemcached_util_version_check(memc, instance->major_version, (uint8_t)(instance->minor_version - 1), instance->micro_version);
3416
else if (instance->major_version > 0)
3418
if_successful= libmemcached_util_version_check(memc, (uint8_t)(instance->major_version -1), instance->minor_version, instance->micro_version);
3421
test_true(if_successful == true);
3423
if (instance->micro_version > 0)
3425
if_successful= libmemcached_util_version_check(memc, instance->major_version, instance->minor_version, (uint8_t)(instance->micro_version +1));
3427
else if (instance->minor_version > 0)
3429
if_successful= libmemcached_util_version_check(memc, instance->major_version, (uint8_t)(instance->minor_version +1), instance->micro_version);
3431
else if (instance->major_version > 0)
3433
if_successful= libmemcached_util_version_check(memc, (uint8_t)(instance->major_version +1), instance->minor_version, instance->micro_version);
3436
test_true(if_successful == false);
3438
return TEST_SUCCESS;
3441
test_return_t getpid_connection_failure_test(memcached_st *memc)
3443
test_skip(memc->servers[0].type, MEMCACHED_CONNECTION_TCP);
3444
memcached_return_t rc;
3445
memcached_server_instance_st instance=
3446
memcached_server_instance_by_position(memc, 0);
3448
// Test both the version that returns a code, and the one that does not.
3449
test_true(libmemcached_util_getpid(memcached_server_name(instance),
3450
memcached_server_port(instance) -1, NULL) == -1);
3452
test_true(libmemcached_util_getpid(memcached_server_name(instance),
3453
memcached_server_port(instance) -1, &rc) == -1);
3454
test_compare_got(MEMCACHED_CONNECTION_FAILURE, rc, memcached_strerror(memc, rc));
3456
return TEST_SUCCESS;
3460
test_return_t getpid_test(memcached_st *memc)
3462
memcached_return_t rc;
3463
memcached_server_instance_st instance=
3464
memcached_server_instance_by_position(memc, 0);
3466
// Test both the version that returns a code, and the one that does not.
3467
test_true(libmemcached_util_getpid(memcached_server_name(instance),
3468
memcached_server_port(instance), NULL) > -1);
3470
test_true(libmemcached_util_getpid(memcached_server_name(instance),
3471
memcached_server_port(instance), &rc) > -1);
3472
test_compare(MEMCACHED_SUCCESS, rc);
3474
return TEST_SUCCESS;
3477
test_return_t ping_test(memcached_st *memc)
3479
memcached_return_t rc;
3480
memcached_server_instance_st instance=
3481
memcached_server_instance_by_position(memc, 0);
3483
// Test both the version that returns a code, and the one that does not.
3484
test_true(libmemcached_util_ping(memcached_server_name(instance),
3485
memcached_server_port(instance), NULL));
3487
test_true(libmemcached_util_ping(memcached_server_name(instance),
3488
memcached_server_port(instance), &rc));
3490
test_compare(MEMCACHED_SUCCESS, rc);
3492
return TEST_SUCCESS;
3497
test_return_t hash_sanity_test (memcached_st *memc)
3501
assert(MEMCACHED_HASH_DEFAULT == MEMCACHED_HASH_DEFAULT);
3502
assert(MEMCACHED_HASH_MD5 == MEMCACHED_HASH_MD5);
3503
assert(MEMCACHED_HASH_CRC == MEMCACHED_HASH_CRC);
3504
assert(MEMCACHED_HASH_FNV1_64 == MEMCACHED_HASH_FNV1_64);
3505
assert(MEMCACHED_HASH_FNV1A_64 == MEMCACHED_HASH_FNV1A_64);
3506
assert(MEMCACHED_HASH_FNV1_32 == MEMCACHED_HASH_FNV1_32);
3507
assert(MEMCACHED_HASH_FNV1A_32 == MEMCACHED_HASH_FNV1A_32);
3508
#ifdef HAVE_HSIEH_HASH
3509
assert(MEMCACHED_HASH_HSIEH == MEMCACHED_HASH_HSIEH);
3511
assert(MEMCACHED_HASH_MURMUR == MEMCACHED_HASH_MURMUR);
3512
assert(MEMCACHED_HASH_JENKINS == MEMCACHED_HASH_JENKINS);
3513
assert(MEMCACHED_HASH_MAX == MEMCACHED_HASH_MAX);
3515
return TEST_SUCCESS;
3519
test_return_t hsieh_avaibility_test (memcached_st *memc)
3521
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH));
3523
test_compare(MEMCACHED_SUCCESS,
3524
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH,
3525
(uint64_t)MEMCACHED_HASH_HSIEH));
3527
return TEST_SUCCESS;
3530
test_return_t murmur_avaibility_test (memcached_st *memc)
3532
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR));
3534
test_compare(MEMCACHED_SUCCESS,
3535
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MURMUR));
3537
return TEST_SUCCESS;
3540
test_return_t one_at_a_time_run (memcached_st *)
3545
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3547
test_compare(one_at_a_time_values[x],
3548
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_DEFAULT));
3551
return TEST_SUCCESS;
3554
test_return_t md5_run (memcached_st *)
3559
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3561
test_compare(md5_values[x],
3562
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MD5));
3565
return TEST_SUCCESS;
3568
test_return_t crc_run (memcached_st *)
3573
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3575
test_compare(crc_values[x],
3576
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_CRC));
3579
return TEST_SUCCESS;
3582
test_return_t fnv1_64_run (memcached_st *)
3584
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1_64));
3589
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3591
test_compare(fnv1_64_values[x],
3592
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_64));
3595
return TEST_SUCCESS;
3598
test_return_t fnv1a_64_run (memcached_st *)
3600
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_FNV1A_64));
3605
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3607
test_compare(fnv1a_64_values[x],
3608
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_64));
3611
return TEST_SUCCESS;
3614
test_return_t fnv1_32_run (memcached_st *)
3619
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3621
test_compare(fnv1_32_values[x],
3622
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1_32));
3625
return TEST_SUCCESS;
3628
test_return_t fnv1a_32_run (memcached_st *)
3633
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3635
test_compare(fnv1a_32_values[x],
3636
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_FNV1A_32));
3639
return TEST_SUCCESS;
3642
test_return_t hsieh_run (memcached_st *)
3644
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_HSIEH));
3649
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3651
test_compare(hsieh_values[x],
3652
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_HSIEH));
3655
return TEST_SUCCESS;
3658
test_return_t murmur_run (memcached_st *)
3660
test_skip(true, libhashkit_has_algorithm(HASHKIT_HASH_MURMUR));
3662
#ifdef WORDS_BIGENDIAN
3663
(void)murmur_values;
3664
return TEST_SKIPPED;
3669
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3671
test_compare(murmur_values[x],
3672
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_MURMUR));
3675
return TEST_SUCCESS;
3679
test_return_t jenkins_run (memcached_st *)
3684
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3686
test_compare(jenkins_values[x],
3687
memcached_generate_hash_value(*ptr, strlen(*ptr), MEMCACHED_HASH_JENKINS));
3690
return TEST_SUCCESS;
3693
static uint32_t hash_md5_test_function(const char *string, size_t string_length, void *)
3695
return libhashkit_md5(string, string_length);
3698
static uint32_t hash_crc_test_function(const char *string, size_t string_length, void *)
3700
return libhashkit_crc32(string, string_length);
3703
test_return_t memcached_get_hashkit_test (memcached_st *)
3709
memcached_st *memc= memcached(test_literal_param("--server=localhost:1 --server=localhost:2 --server=localhost:3 --server=localhost:4 --server=localhost5 --DISTRIBUTION=modula"));
3711
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};
3712
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};
3714
const hashkit_st *kit= memcached_get_hashkit(memc);
3716
hashkit_clone(&new_kit, kit);
3717
test_compare(HASHKIT_SUCCESS, hashkit_set_custom_function(&new_kit, hash_md5_test_function, NULL));
3719
memcached_set_hashkit(memc, &new_kit);
3722
Verify Setting the hash.
3724
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3728
hash_val= hashkit_digest(kit, *ptr, strlen(*ptr));
3729
test_compare_got(md5_values[x], hash_val, *ptr);
3734
Now check memcached_st.
3736
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3740
hash_val= memcached_generate_hash(memc, *ptr, strlen(*ptr));
3741
test_compare_got(md5_hosts[x], hash_val, *ptr);
3744
test_compare(HASHKIT_SUCCESS, hashkit_set_custom_function(&new_kit, hash_crc_test_function, NULL));
3746
memcached_set_hashkit(memc, &new_kit);
3749
Verify Setting the hash.
3751
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3755
hash_val= hashkit_digest(kit, *ptr, strlen(*ptr));
3756
test_true(crc_values[x] == hash_val);
3759
for (ptr= list_to_hash, x= 0; *ptr; ptr++, x++)
3763
hash_val= memcached_generate_hash(memc, *ptr, strlen(*ptr));
3764
test_compare(crc_hosts[x], hash_val);
3767
memcached_free(memc);
3769
return TEST_SUCCESS;
3773
Test case adapted from John Gorman <johngorman2@gmail.com>
3775
We are testing the error condition when we connect to a server via memcached_get()
3776
but find that the server is not available.
3778
test_return_t memcached_get_MEMCACHED_ERRNO(memcached_st *)
3782
memcached_return rc;
3785
memcached_st *tl_memc_h= memcached(test_literal_param("--server=localhost:9898 --server=localhost:9899")); // This server should not exist
3787
// See if memcached is reachable.
3788
char *value= memcached_get(tl_memc_h,
3789
test_literal_param(__func__),
3794
test_true(memcached_failed(rc));
3796
memcached_free(tl_memc_h);
3798
return TEST_SUCCESS;
3802
We connect to a server which exists, but search for a key that does not exist.
3804
test_return_t memcached_get_MEMCACHED_NOTFOUND(memcached_st *memc)
3808
memcached_return rc;
3810
// See if memcached is reachable.
3811
char *value= memcached_get(memc,
3812
test_literal_param(__func__),
3817
test_compare(MEMCACHED_NOTFOUND, rc);
3819
return TEST_SUCCESS;
3823
Test case adapted from John Gorman <johngorman2@gmail.com>
3825
We are testing the error condition when we connect to a server via memcached_get_by_key()
3826
but find that the server is not available.
3828
test_return_t memcached_get_by_key_MEMCACHED_ERRNO(memcached_st *)
3832
memcached_return rc;
3835
memcached_st *tl_memc_h= memcached_create(NULL);
3836
memcached_server_st *servers= memcached_servers_parse("localhost:9898,localhost:9899"); // This server should not exist
3837
memcached_server_push(tl_memc_h, servers);
3838
memcached_server_list_free(servers);
3840
// See if memcached is reachable.
3841
char *value= memcached_get_by_key(tl_memc_h,
3842
test_literal_param(__func__), // Key
3843
test_literal_param(__func__), // Value
3848
test_true(memcached_failed(rc));
3850
memcached_free(tl_memc_h);
3852
return TEST_SUCCESS;
3856
We connect to a server which exists, but search for a key that does not exist.
3858
test_return_t memcached_get_by_key_MEMCACHED_NOTFOUND(memcached_st *memc)
3862
memcached_return rc;
3864
// See if memcached is reachable.
3865
char *value= memcached_get_by_key(memc,
3866
test_literal_param(__func__), // Key
3867
test_literal_param(__func__), // Value
3872
test_compare(MEMCACHED_NOTFOUND, rc);
3874
return TEST_SUCCESS;
3877
test_return_t regression_bug_434484(memcached_st *memc)
3879
test_skip(TEST_SUCCESS, pre_binary(memc));
3881
test_compare(MEMCACHED_NOTSTORED,
3882
memcached_append(memc,
3883
test_literal_param(__func__), // Key
3884
test_literal_param(__func__), // Value
3887
libtest::vchar_t data;
3888
data.resize(2048 * 1024);
3889
test_compare(MEMCACHED_E2BIG,
3891
test_literal_param(__func__), // Key
3892
&data[0], data.size(), 0, 0));
3894
return TEST_SUCCESS;
3897
test_return_t regression_bug_434843(memcached_st *original_memc)
3899
test_skip(TEST_SUCCESS, pre_binary(original_memc));
3901
memcached_return_t rc;
3903
memcached_execute_fn callbacks[]= { &callback_counter };
3906
* I only want to hit only _one_ server so I know the number of requests I'm
3907
* sending in the pipleine to the server. Let's try to do a multiget of
3908
* 1024 (that should satisfy most users don't you think?). Future versions
3909
* will include a mget_execute function call if you need a higher number.
3911
memcached_st *memc= create_single_instance_memcached(original_memc, "--BINARY-PROTOCOL");
3916
* Run two times.. the first time we should have 100% cache miss,
3917
* and the second time we should have 100% cache hits
3919
for (ptrdiff_t y= 0; y < 2; y++)
3921
test_compare(MEMCACHED_SUCCESS,
3922
memcached_mget(memc, keys.keys_ptr(), keys.lengths_ptr(), keys.size()));
3924
// One the first run we should get a NOT_FOUND, but on the second some data
3925
// should be returned.
3926
test_compare(y ? MEMCACHED_SUCCESS : MEMCACHED_NOTFOUND,
3927
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
3931
/* The first iteration should give me a 100% cache miss. verify that*/
3932
char blob[1024]= { 0 };
3934
test_false(counter);
3936
for (size_t x= 0; x < keys.size(); ++x)
3938
rc= memcached_add(memc,
3939
keys.key_at(x), keys.length_at(x),
3940
blob, sizeof(blob), 0, 0);
3941
test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
3946
/* Verify that we received all of the key/value pairs */
3947
test_compare(counter, keys.size());
3951
memcached_free(memc);
3953
return TEST_SUCCESS;
3956
test_return_t regression_bug_434843_buffered(memcached_st *memc)
3958
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, true));
3960
return regression_bug_434843(memc);
3963
test_return_t regression_bug_421108(memcached_st *memc)
3965
memcached_return_t rc;
3966
memcached_stat_st *memc_stat= memcached_stat(memc, NULL, &rc);
3967
test_compare(MEMCACHED_SUCCESS, rc);
3969
char *bytes_str= memcached_stat_get_value(memc, memc_stat, "bytes", &rc);
3970
test_compare(MEMCACHED_SUCCESS, rc);
3971
test_true(bytes_str);
3972
char *bytes_read_str= memcached_stat_get_value(memc, memc_stat,
3974
test_compare(MEMCACHED_SUCCESS, rc);
3975
test_true(bytes_read_str);
3977
char *bytes_written_str= memcached_stat_get_value(memc, memc_stat,
3978
"bytes_written", &rc);
3979
test_compare(MEMCACHED_SUCCESS, rc);
3980
test_true(bytes_written_str);
3982
unsigned long long bytes= strtoull(bytes_str, 0, 10);
3983
unsigned long long bytes_read= strtoull(bytes_read_str, 0, 10);
3984
unsigned long long bytes_written= strtoull(bytes_written_str, 0, 10);
3986
test_true(bytes != bytes_read);
3987
test_true(bytes != bytes_written);
3989
/* Release allocated resources */
3991
free(bytes_read_str);
3992
free(bytes_written_str);
3993
memcached_stat_free(NULL, memc_stat);
3995
return TEST_SUCCESS;
3999
* The test case isn't obvious so I should probably document why
4000
* it works the way it does. Bug 442914 was caused by a bug
4001
* in the logic in memcached_purge (it did not handle the case
4002
* where the number of bytes sent was equal to the watermark).
4003
* In this test case, create messages so that we hit that case
4004
* and then disable noreply mode and issue a new command to
4005
* verify that it isn't stuck. If we change the format for the
4006
* delete command or the watermarks, we need to update this
4009
test_return_t regression_bug_442914(memcached_st *original_memc)
4011
test_skip(original_memc->servers[0].type, MEMCACHED_CONNECTION_TCP);
4013
memcached_st* memc= create_single_instance_memcached(original_memc, "--NOREPLY --TCP-NODELAY");
4015
for (uint32_t x= 0; x < 250; ++x)
4018
size_t len= (size_t)snprintf(key, sizeof(key), "%0250u", x);
4019
memcached_return_t rc= memcached_delete(memc, key, len, 0);
4020
char error_buffer[2048]= { 0 };
4021
snprintf(error_buffer, sizeof(error_buffer), "%s key: %s", memcached_last_error_message(memc), key);
4022
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, error_buffer);
4025
// Delete, and then delete again to look for not found
4028
size_t len= snprintf(key, sizeof(key), "%037u", 251U);
4029
memcached_return_t rc= memcached_delete(memc, key, len, 0);
4030
test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED);
4032
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, false));
4033
test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, key, len, 0));
4036
memcached_free(memc);
4038
return TEST_SUCCESS;
4041
test_return_t regression_bug_447342(memcached_st *memc)
4043
if (memcached_server_count(memc) < 3 or pre_replication(memc) != TEST_SUCCESS)
4045
return TEST_SKIPPED;
4048
test_compare(MEMCACHED_SUCCESS,
4049
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS, 2));
4053
for (size_t x= 0; x < keys.size(); ++x)
4055
test_compare(MEMCACHED_SUCCESS,
4057
keys.key_at(x), keys.length_at(x), // Keys
4058
keys.key_at(x), keys.length_at(x), // Values
4063
** We are using the quiet commands to store the replicas, so we need
4064
** to ensure that all of them are processed before we can continue.
4065
** In the test we go directly from storing the object to trying to
4066
** receive the object from all of the different servers, so we
4067
** could end up in a race condition (the memcached server hasn't yet
4068
** processed the quiet command from the replication set when it process
4069
** the request from the other client (created by the clone)). As a
4070
** workaround for that we call memcached_quit to send the quit command
4071
** to the server and wait for the response ;-) If you use the test code
4072
** as an example for your own code, please note that you shouldn't need
4075
memcached_quit(memc);
4077
/* Verify that all messages are stored, and we didn't stuff too much
4080
test_compare(MEMCACHED_SUCCESS,
4081
memcached_mget(memc,
4082
keys.keys_ptr(), keys.lengths_ptr(), keys.size()));
4084
unsigned int counter= 0;
4085
memcached_execute_fn callbacks[]= { &callback_counter };
4086
test_compare(MEMCACHED_SUCCESS,
4087
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
4089
/* Verify that we received all of the key/value pairs */
4090
test_compare(counter, keys.size());
4092
memcached_quit(memc);
4094
* Don't do the following in your code. I am abusing the internal details
4095
* within the library, and this is not a supported interface.
4096
* This is to verify correct behavior in the library. Fake that two servers
4099
memcached_server_instance_st instance_one= memcached_server_instance_by_position(memc, 0);
4100
memcached_server_instance_st instance_two= memcached_server_instance_by_position(memc, 2);
4101
in_port_t port0= instance_one->port;
4102
in_port_t port2= instance_two->port;
4104
((memcached_server_write_instance_st)instance_one)->port= 0;
4105
((memcached_server_write_instance_st)instance_two)->port= 0;
4107
test_compare(MEMCACHED_SUCCESS,
4108
memcached_mget(memc,
4109
keys.keys_ptr(), keys.lengths_ptr(), keys.size()));
4112
test_compare(MEMCACHED_SUCCESS,
4113
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
4114
test_compare(counter, keys.size());
4116
/* restore the memc handle */
4117
((memcached_server_write_instance_st)instance_one)->port= port0;
4118
((memcached_server_write_instance_st)instance_two)->port= port2;
4120
memcached_quit(memc);
4122
/* Remove half of the objects */
4123
for (size_t x= 0; x < keys.size(); ++x)
4127
test_compare(MEMCACHED_SUCCESS,
4128
memcached_delete(memc, keys.key_at(x), keys.length_at(x), 0));
4132
memcached_quit(memc);
4133
((memcached_server_write_instance_st)instance_one)->port= 0;
4134
((memcached_server_write_instance_st)instance_two)->port= 0;
4136
/* now retry the command, this time we should have cache misses */
4137
test_compare(MEMCACHED_SUCCESS,
4138
memcached_mget(memc,
4139
keys.keys_ptr(), keys.lengths_ptr(), keys.size()));
4142
test_compare(MEMCACHED_SUCCESS,
4143
memcached_fetch_execute(memc, callbacks, (void *)&counter, 1));
4144
test_compare(counter, (unsigned int)(keys.size() >> 1));
4146
/* restore the memc handle */
4147
((memcached_server_write_instance_st)instance_one)->port= port0;
4148
((memcached_server_write_instance_st)instance_two)->port= port2;
4150
return TEST_SUCCESS;
4153
test_return_t regression_bug_463297(memcached_st *memc)
4155
test_compare(MEMCACHED_INVALID_ARGUMENTS, memcached_delete(memc, "foo", 3, 1));
4157
// Since we blocked timed delete, this test is no longer valid.
4159
memcached_st *memc_clone= memcached_clone(NULL, memc);
4160
test_true(memc_clone);
4161
test_true(memcached_version(memc_clone) == MEMCACHED_SUCCESS);
4163
memcached_server_instance_st instance=
4164
memcached_server_instance_by_position(memc_clone, 0);
4166
if (instance->major_version > 1 ||
4167
(instance->major_version == 1 &&
4168
instance->minor_version > 2))
4170
/* Binary protocol doesn't support deferred delete */
4171
memcached_st *bin_clone= memcached_clone(NULL, memc);
4172
test_true(bin_clone);
4173
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(bin_clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1));
4174
test_compare(MEMCACHED_INVALID_ARGUMENTS, memcached_delete(bin_clone, "foo", 3, 1));
4175
memcached_free(bin_clone);
4177
memcached_quit(memc_clone);
4179
/* If we know the server version, deferred delete should fail
4180
* with invalid arguments */
4181
test_compare(MEMCACHED_INVALID_ARGUMENTS, memcached_delete(memc_clone, "foo", 3, 1));
4183
/* If we don't know the server version, we should get a protocol error */
4184
memcached_return_t rc= memcached_delete(memc, "foo", 3, 1);
4186
/* but there is a bug in some of the memcached servers (1.4) that treats
4187
* the counter as noreply so it doesn't send the proper error message
4189
test_true_got(rc == MEMCACHED_PROTOCOL_ERROR || rc == MEMCACHED_NOTFOUND || rc == MEMCACHED_CLIENT_ERROR || rc == MEMCACHED_INVALID_ARGUMENTS, memcached_strerror(NULL, rc));
4191
/* And buffered mode should be disabled and we should get protocol error */
4192
test_true(memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1) == MEMCACHED_SUCCESS);
4193
rc= memcached_delete(memc, "foo", 3, 1);
4194
test_true_got(rc == MEMCACHED_PROTOCOL_ERROR || rc == MEMCACHED_NOTFOUND || rc == MEMCACHED_CLIENT_ERROR || rc == MEMCACHED_INVALID_ARGUMENTS, memcached_strerror(NULL, rc));
4196
/* Same goes for noreply... */
4197
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 1));
4198
rc= memcached_delete(memc, "foo", 3, 1);
4199
test_true_got(rc == MEMCACHED_PROTOCOL_ERROR || rc == MEMCACHED_NOTFOUND || rc == MEMCACHED_CLIENT_ERROR || rc == MEMCACHED_INVALID_ARGUMENTS, memcached_strerror(NULL, rc));
4201
/* but a normal request should go through (and be buffered) */
4202
test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, "foo", 3, 0)));
4203
test_compare(MEMCACHED_SUCCESS, memcached_flush_buffers(memc));
4205
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0));
4206
/* unbuffered noreply should be success */
4207
test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, "foo", 3, 0));
4208
/* unbuffered with reply should be not found... */
4209
test_compare(MEMCACHED_SUCCESS, memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NOREPLY, 0));
4210
test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, "foo", 3, 0));
4213
memcached_free(memc_clone);
4216
return TEST_SUCCESS;
4220
/* Test memcached_server_get_last_disconnect
4221
* For a working server set, shall be NULL
4222
* For a set of non existing server, shall not be NULL
4224
test_return_t test_get_last_disconnect(memcached_st *memc)
4226
memcached_return_t rc;
4227
memcached_server_instance_st disconnected_server;
4229
/* With the working set of server */
4230
const char *key= "marmotte";
4231
const char *value= "milka";
4233
memcached_reset_last_disconnected_server(memc);
4234
test_false(memc->last_disconnected_server);
4235
rc= memcached_set(memc, key, strlen(key),
4236
value, strlen(value),
4237
(time_t)0, (uint32_t)0);
4238
test_true(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
4240
disconnected_server = memcached_server_get_last_disconnect(memc);
4241
test_false(disconnected_server);
4243
/* With a non existing server */
4245
memcached_server_st *servers;
4247
const char *server_list= "localhost:9";
4249
servers= memcached_servers_parse(server_list);
4251
mine= memcached_create(NULL);
4252
rc= memcached_server_push(mine, servers);
4253
test_compare(MEMCACHED_SUCCESS, rc);
4254
memcached_server_list_free(servers);
4257
rc= memcached_set(mine, key, strlen(key),
4258
value, strlen(value),
4259
(time_t)0, (uint32_t)0);
4260
test_true(memcached_failed(rc));
4262
disconnected_server= memcached_server_get_last_disconnect(mine);
4263
test_true_got(disconnected_server, memcached_strerror(mine, rc));
4264
test_compare(in_port_t(9), memcached_server_port(disconnected_server));
4265
test_false(strncmp(memcached_server_name(disconnected_server),"localhost",9));
4267
memcached_quit(mine);
4268
memcached_free(mine);
4270
return TEST_SUCCESS;
4273
test_return_t test_multiple_get_last_disconnect(memcached_st *)
4275
const char *server_string= "--server=localhost:8888 --server=localhost:8889 --server=localhost:8890 --server=localhost:8891 --server=localhost:8892";
4276
char buffer[BUFSIZ];
4278
test_compare(MEMCACHED_SUCCESS,
4279
libmemcached_check_configuration(server_string, strlen(server_string), buffer, sizeof(buffer)));
4281
memcached_st *memc= memcached(server_string, strlen(server_string));
4284
// We will just use the error strings as our keys
4285
uint32_t counter= 100;
4288
for (int x= int(MEMCACHED_SUCCESS); x < int(MEMCACHED_MAXIMUM_RETURN); ++x)
4290
const char *msg= memcached_strerror(memc, memcached_return_t(x));
4291
memcached_return_t ret= memcached_set(memc, msg, strlen(msg), NULL, 0, (time_t)0, (uint32_t)0);
4292
test_true_got((ret == MEMCACHED_CONNECTION_FAILURE or ret == MEMCACHED_SERVER_TEMPORARILY_DISABLED), memcached_last_error_message(memc));
4294
memcached_server_instance_st disconnected_server= memcached_server_get_last_disconnect(memc);
4295
test_true(disconnected_server);
4296
test_strcmp("localhost", memcached_server_name(disconnected_server));
4297
test_true(memcached_server_port(disconnected_server) >= 8888 and memcached_server_port(disconnected_server) <= 8892);
4301
memcached_reset_last_disconnected_server(memc);
4306
memcached_free(memc);
4308
return TEST_SUCCESS;
4311
test_return_t test_verbosity(memcached_st *memc)
4313
memcached_verbosity(memc, 3);
4315
return TEST_SUCCESS;
4319
static memcached_return_t stat_printer(memcached_server_instance_st server,
4320
const char *key, size_t key_length,
4321
const char *value, size_t value_length,
2621
4331
return MEMCACHED_SUCCESS;
2625
/* Clean the server before beginning testing */
2627
{"flush", 0, flush_test },
2628
{"init", 0, init_test },
2629
{"allocation", 0, allocation_test },
2630
{"server_list_null_test", 0, server_list_null_test},
2631
{"server_unsort", 0, server_unsort_test},
2632
{"server_sort", 0, server_sort_test},
2633
{"clone_test", 0, clone_test },
2634
{"error", 0, error_test },
2635
{"set", 0, set_test },
2636
{"set2", 0, set_test2 },
2637
{"set3", 0, set_test3 },
2638
{"add", 1, add_test },
2639
{"replace", 1, replace_test },
2640
{"delete", 1, delete_test },
2641
{"get", 1, get_test },
2642
{"get2", 0, get_test2 },
2643
{"get3", 0, get_test3 },
2644
{"get4", 0, get_test4 },
2645
{"stats_servername", 0, stats_servername_test },
2646
{"increment", 0, increment_test },
2647
{"decrement", 0, decrement_test },
2648
{"quit", 0, quit_test },
2649
{"mget", 1, mget_test },
2650
{"mget_result", 1, mget_result_test },
2651
{"mget_result_alloc", 1, mget_result_alloc_test },
2652
{"mget_result_function", 1, mget_result_function },
2653
{"get_stats", 0, get_stats },
2654
{"add_host_test", 0, add_host_test },
2655
{"get_stats_keys", 0, get_stats_keys },
2656
{"behavior_test", 0, get_stats_keys },
2657
{"callback_test", 0, get_stats_keys },
2658
{"version_string_test", 0, version_string_test},
2659
{"bad_key", 1, bad_key_test },
2660
{"memcached_server_cursor", 1, memcached_server_cursor_test },
2661
{"read_through", 1, read_through },
2662
{"delete_through", 1, delete_through },
2666
test_st async_tests[] ={
2667
{"add", 1, add_wrapper },
2671
test_st string_tests[] ={
2672
{"string static with null", 0, string_static_null },
2673
{"string alloc with null", 0, string_alloc_null },
2674
{"string alloc with 1K", 0, string_alloc_with_size },
2675
{"string alloc with malloc failure", 0, string_alloc_with_size_toobig },
2676
{"string append", 0, string_alloc_append },
2677
{"string append failure (too big)", 0, string_alloc_append_toobig },
2681
test_st result_tests[] ={
2682
{"result static", 0, result_static},
2683
{"result alloc", 0, result_alloc},
2687
test_st version_1_2_3[] ={
2688
{"append", 0, append_test },
2689
{"prepend", 0, prepend_test },
2690
{"cas", 0, cas_test },
2691
{"cas2", 0, cas2_test },
2692
{"append_binary", 0, append_binary_test },
2696
test_st user_tests[] ={
2697
{"user_supplied_bug1", 0, user_supplied_bug1 },
2698
{"user_supplied_bug2", 0, user_supplied_bug2 },
2699
{"user_supplied_bug3", 0, user_supplied_bug3 },
2700
{"user_supplied_bug4", 0, user_supplied_bug4 },
2701
{"user_supplied_bug5", 1, user_supplied_bug5 },
2702
{"user_supplied_bug6", 1, user_supplied_bug6 },
2703
{"user_supplied_bug7", 1, user_supplied_bug7 },
2704
{"user_supplied_bug8", 1, user_supplied_bug8 },
2705
{"user_supplied_bug9", 1, user_supplied_bug9 },
2706
{"user_supplied_bug10", 1, user_supplied_bug10 },
2707
{"user_supplied_bug11", 1, user_supplied_bug11 },
2708
{"user_supplied_bug12", 1, user_supplied_bug12 },
2709
{"user_supplied_bug13", 1, user_supplied_bug13 },
2710
{"user_supplied_bug14", 1, user_supplied_bug14 },
2711
{"user_supplied_bug15", 1, user_supplied_bug15 },
2715
test_st generate_tests[] ={
2716
{"generate_pairs", 1, generate_pairs },
2717
{"generate_data", 1, generate_data },
2718
{"get_read", 0, get_read },
2719
{"delete_generate", 0, delete_generate },
2720
{"generate_buffer_data", 1, generate_buffer_data },
2721
{"delete_buffer", 0, delete_buffer_generate},
2722
{"generate_data", 1, generate_data },
2723
{"mget_read", 0, mget_read },
2724
{"mget_read_result", 0, mget_read_result },
2725
{"mget_read_function", 0, mget_read_function },
2726
{"cleanup", 1, cleanup_pairs },
2727
{"generate_large_pairs", 1, generate_large_pairs },
2728
{"generate_data", 1, generate_data },
2729
{"generate_buffer_data", 1, generate_buffer_data },
2730
{"cleanup", 1, cleanup_pairs },
2734
test_st consistent_tests[] ={
2735
{"generate_pairs", 1, generate_pairs },
2736
{"generate_data", 1, generate_data },
2737
{"get_read", 0, get_read_count },
2738
{"cleanup", 1, cleanup_pairs },
2742
collection_st collection[] ={
2743
{"block", 0, 0, tests},
2744
{"nonblock", pre_nonblock, 0, tests},
2745
{"nodelay", pre_nodelay, 0, tests},
2746
{"md5", pre_md5, 0, tests},
2747
{"crc", pre_crc, 0, tests},
2748
{"hsieh", pre_hsieh, 0, tests},
2749
{"fnv1_64", pre_hash_fnv1_64, 0, tests},
2750
{"fnv1a_64", pre_hash_fnv1a_64, 0, tests},
2751
{"fnv1_32", pre_hash_fnv1_32, 0, tests},
2752
{"fnv1a_32", pre_hash_fnv1a_32, 0, tests},
2753
{"ketama", pre_behavior_ketama, 0, tests},
2754
{"unix_socket", pre_unix_socket, 0, tests},
2755
{"unix_socket_nodelay", pre_nodelay, 0, tests},
2756
{"poll_timeout", poll_timeout, 0, tests},
2757
{"gets", enable_cas, 0, tests},
2758
{"consistent", enable_consistent, 0, tests},
2759
{"wheel", enable_wheel, 0, tests},
2760
{"memory_allocators", set_memory_alloc, 0, tests},
2761
// {"udp", pre_udp, 0, tests},
2762
{"version_1_2_3", check_for_1_2_3, 0, version_1_2_3},
2763
{"string", 0, 0, string_tests},
2764
{"result", 0, 0, result_tests},
2765
{"async", pre_nonblock, 0, async_tests},
2766
{"user", 0, 0, user_tests},
2767
{"generate", 0, 0, generate_tests},
2768
{"generate_hsieh", pre_hsieh, 0, generate_tests},
2769
{"generate_ketama", pre_behavior_ketama, 0, generate_tests},
2770
{"generate_hsieh_consistent", enable_consistent, 0, generate_tests},
2771
{"generate_md5", pre_md5, 0, generate_tests},
2772
{"generate_murmur", pre_murmur, 0, generate_tests},
2773
{"generate_nonblock", pre_nonblock, 0, generate_tests},
2774
{"consistent_not", 0, 0, consistent_tests},
2775
{"consistent_ketama", pre_behavior_ketama, 0, consistent_tests},
2776
{"consistent_wheel", enable_wheel, 0, consistent_tests},
2780
#define SERVERS_TO_CREATE 5
2782
void *world_create(void)
2784
server_startup_st *construct;
2786
construct= (server_startup_st *)malloc(sizeof(server_startup_st));
2787
memset(construct, 0, sizeof(server_startup_st));
2788
construct->count= SERVERS_TO_CREATE;
2790
server_startup(construct);
2795
void world_destroy(void *p)
2797
server_startup_st *construct= (server_startup_st *)p;
2798
memcached_server_st *servers= (memcached_server_st *)construct->servers;
2799
memcached_server_list_free(servers);
2801
server_shutdown(construct);
2805
void get_world(world_st *world)
2807
world->collections= collection;
2808
world->create= world_create;
2809
world->destroy= world_destroy;
4334
test_return_t memcached_stat_execute_test(memcached_st *memc)
4336
memcached_return_t rc= memcached_stat_execute(memc, NULL, stat_printer, NULL);
4337
test_compare(MEMCACHED_SUCCESS, rc);
4339
test_compare(MEMCACHED_SUCCESS,
4340
memcached_stat_execute(memc, "slabs", stat_printer, NULL));
4342
test_compare(MEMCACHED_SUCCESS,
4343
memcached_stat_execute(memc, "items", stat_printer, NULL));
4345
test_compare(MEMCACHED_SUCCESS,
4346
memcached_stat_execute(memc, "sizes", stat_printer, NULL));
4348
return TEST_SUCCESS;
4352
* This test ensures that the failure counter isn't incremented during
4353
* normal termination of the memcached instance.
4355
test_return_t wrong_failure_counter_test(memcached_st *original_memc)
4357
memcached_st* memc= create_single_instance_memcached(original_memc, NULL);
4359
/* Ensure that we are connected to the server by setting a value */
4360
memcached_return_t rc= memcached_set(memc,
4361
test_literal_param(__func__), // Key
4362
test_literal_param(__func__), // Value
4363
time_t(0), uint32_t(0));
4364
test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED);
4367
memcached_server_instance_st instance= memcached_server_instance_by_position(memc, 0);
4369
/* The test is to see that the memcached_quit doesn't increase the
4370
* the server failure conter, so let's ensure that it is zero
4371
* before sending quit
4373
((memcached_server_write_instance_st)instance)->server_failure_counter= 0;
4375
memcached_quit(memc);
4377
/* Verify that it memcached_quit didn't increment the failure counter
4378
* Please note that this isn't bullet proof, because an error could
4381
test_zero(instance->server_failure_counter);
4383
memcached_free(memc);
4385
return TEST_SUCCESS;
4389
* This tests ensures expected disconnections (for some behavior changes
4390
* for instance) do not wrongly increase failure counter
4392
test_return_t wrong_failure_counter_two_test(memcached_st *memc)
4394
/* Set value to force connection to the server */
4395
const char *key= "marmotte";
4396
const char *value= "milka";
4398
test_compare_hint(MEMCACHED_SUCCESS,
4399
memcached_set(memc, key, strlen(key),
4400
value, strlen(value),
4401
(time_t)0, (uint32_t)0),
4402
memcached_last_error_message(memc));
4405
/* put failure limit to 1 */
4406
test_compare(MEMCACHED_SUCCESS,
4407
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, true));
4409
/* Put a retry timeout to effectively activate failure_limit effect */
4410
test_compare(MEMCACHED_SUCCESS,
4411
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, true));
4413
/* change behavior that triggers memcached_quit()*/
4414
test_compare(MEMCACHED_SUCCESS,
4415
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, true));
4418
/* Check if we still are connected */
4420
size_t string_length;
4421
memcached_return rc;
4422
char *string= memcached_get(memc, key, strlen(key),
4423
&string_length, &flags, &rc);
4425
test_compare_got(MEMCACHED_SUCCESS, rc, memcached_strerror(NULL, rc));
4429
return TEST_SUCCESS;
4434
* Test that ensures mget_execute does not end into recursive calls that finally fails
4436
test_return_t regression_bug_490486(memcached_st *original_memc)
4440
return TEST_SKIPPED; // My MAC can't handle this test
4443
test_skip(TEST_SUCCESS, pre_binary(original_memc));
4446
* I only want to hit _one_ server so I know the number of requests I'm
4447
* sending in the pipeline.
4449
memcached_st *memc= create_single_instance_memcached(original_memc, "--BINARY-PROTOCOL --POLL-TIMEOUT=1000 --REMOVE-FAILED-SERVERS=1 --RETRY-TIMEOUT=3600");
4452
keys_st keys(20480);
4454
/* First add all of the items.. */
4455
char blob[1024]= { 0 };
4456
for (size_t x= 0; x < keys.size(); ++x)
4458
memcached_return rc= memcached_set(memc,
4459
keys.key_at(x), keys.length_at(x),
4460
blob, sizeof(blob), 0, 0);
4461
test_true(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED); // MEMCACHED_TIMEOUT <-- hash been observed on OSX
4466
/* Try to get all of them with a large multiget */
4468
memcached_execute_function callbacks[]= { &callback_counter };
4469
memcached_return_t rc= memcached_mget_execute(memc,
4470
keys.keys_ptr(), keys.lengths_ptr(), keys.size(),
4471
callbacks, &counter, 1);
4472
test_compare(MEMCACHED_SUCCESS, rc);
4474
char* the_value= NULL;
4475
char the_key[MEMCACHED_MAX_KEY];
4476
size_t the_key_length;
4477
size_t the_value_length;
4481
the_value= memcached_fetch(memc, the_key, &the_key_length, &the_value_length, &the_flags, &rc);
4483
if ((the_value!= NULL) && (rc == MEMCACHED_SUCCESS))
4489
} while ( (the_value!= NULL) && (rc == MEMCACHED_SUCCESS));
4492
test_compare(MEMCACHED_END, rc);
4494
/* Verify that we got all of the items */
4495
test_compare(counter, keys.size());
4498
memcached_free(memc);
4500
return TEST_SUCCESS;
4503
test_return_t regression_bug_583031(memcached_st *)
4505
memcached_st *memc= memcached_create(NULL);
4507
test_compare(MEMCACHED_SUCCESS, memcached_server_add(memc, "10.2.3.4", 11211));
4509
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 1000);
4510
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1000);
4511
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
4512
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
4513
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 1000);
4514
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 3);
4516
memcached_return_t rc;
4520
const char *value= memcached_get(memc, "dsf", 3, &length, &flags, &rc);
4524
test_compare_got(MEMCACHED_TIMEOUT, rc, memcached_last_error_message(memc));
4526
memcached_free(memc);
4528
return TEST_SUCCESS;
4531
test_return_t regression_bug_581030(memcached_st *)
4534
memcached_stat_st *local_stat= memcached_stat(NULL, NULL, NULL);
4535
test_false(local_stat);
4537
memcached_stat_free(NULL, NULL);
4540
return TEST_SUCCESS;
4543
#define regression_bug_655423_COUNT 6000
4544
test_return_t regression_bug_655423(memcached_st *memc)
4546
memcached_st *clone= memcached_clone(NULL, memc);
4547
memc= NULL; // Just to make sure it is not used
4552
return TEST_SKIPPED;
4555
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1));
4556
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_SUPPORT_CAS, 1));
4557
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_TCP_NODELAY, 1));
4558
test_skip(MEMCACHED_SUCCESS, memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH, 1));
4560
memset(payload, int('x'), sizeof(payload));
4562
keys_st keys(regression_bug_655423_COUNT);
4564
for (size_t x= 0; x < keys.size(); x++)
4566
test_compare(MEMCACHED_SUCCESS, memcached_set(clone,
4569
payload, sizeof(payload), 0, 0));
4572
for (size_t x= 0; x < keys.size(); x++)
4574
size_t value_length;
4575
memcached_return_t rc;
4576
char *value= memcached_get(clone,
4579
&value_length, NULL, &rc);
4581
if (rc == MEMCACHED_NOTFOUND)
4584
test_zero(value_length);
4588
test_compare(MEMCACHED_SUCCESS, rc);
4590
test_compare(100LLU, value_length);
4594
test_compare(MEMCACHED_SUCCESS,
4595
memcached_mget(clone,
4596
keys.keys_ptr(), keys.lengths_ptr(),
4600
memcached_result_st *result= NULL;
4601
while ((result= memcached_fetch_result(clone, result, NULL)))
4603
test_compare(size_t(100), memcached_result_length(result));
4607
test_true(count > 100); // If we don't get back atleast this, something is up
4609
memcached_free(clone);
4611
return TEST_SUCCESS;
4615
* Test that ensures that buffered set to not trigger problems during io_flush
4617
#define regression_bug_490520_COUNT 200480
4618
test_return_t regression_bug_490520(memcached_st *original_memc)
4620
memcached_st* memc= create_single_instance_memcached(original_memc, NULL);
4622
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK,1);
4623
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS,1);
4624
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 1000);
4625
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT,1);
4626
memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 3600);
4628
/* First add all of the items.. */
4629
char blob[3333] = {0};
4630
for (uint32_t x= 0; x < regression_bug_490520_COUNT; ++x)
4633
int key_length= snprintf(key, sizeof(key), "0200%u", x);
4635
memcached_return rc= memcached_set(memc, key, key_length, blob, sizeof(blob), 0, 0);
4636
test_true_got(rc == MEMCACHED_SUCCESS or rc == MEMCACHED_BUFFERED, memcached_last_error_message(memc));
4639
memcached_free(memc);
4641
return TEST_SUCCESS;
4645
test_return_t regression_bug_854604(memcached_st *)
4649
test_compare(MEMCACHED_INVALID_ARGUMENTS, libmemcached_check_configuration(0, 0, buffer, 0));
4651
test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 0));
4653
test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 1));
4654
test_compare(buffer[0], 0);
4656
test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, 10));
4657
test_true(strlen(buffer));
4659
test_compare(MEMCACHED_PARSE_ERROR, libmemcached_check_configuration(test_literal_param("syntax error"), buffer, sizeof(buffer)));
4660
test_true(strlen(buffer));
4662
return TEST_SUCCESS;
4665
static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
4667
fprintf(stderr, "Iteration #%u: ", it);
4669
if (error == MEMCACHED_ERRNO)
4671
fprintf(stderr, "system error %d from %s: %s\n",
4672
errno, what, strerror(errno));
4676
fprintf(stderr, "error %d from %s: %s\n", error, what,
4677
memcached_strerror(mc, error));
4681
#define TEST_CONSTANT_CREATION 200
4683
test_return_t regression_bug_(memcached_st *memc)
4685
const char *remote_server;
4688
if (! (remote_server= getenv("LIBMEMCACHED_REMOTE_SERVER")))
4690
return TEST_SKIPPED;
4693
for (uint32_t x= 0; x < TEST_CONSTANT_CREATION; x++)
4695
memcached_st* mc= memcached_create(NULL);
4696
memcached_return rc;
4698
rc= memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
4699
if (rc != MEMCACHED_SUCCESS)
4701
memcached_die(mc, rc, "memcached_behavior_set", x);
4704
rc= memcached_behavior_set(mc, MEMCACHED_BEHAVIOR_CACHE_LOOKUPS, 1);
4705
if (rc != MEMCACHED_SUCCESS)
4707
memcached_die(mc, rc, "memcached_behavior_set", x);
4710
rc= memcached_server_add(mc, remote_server, 0);
4711
if (rc != MEMCACHED_SUCCESS)
4713
memcached_die(mc, rc, "memcached_server_add", x);
4716
const char *set_key= "akey";
4717
const size_t set_key_len= strlen(set_key);
4718
const char *set_value= "a value";
4719
const size_t set_value_len= strlen(set_value);
4721
if (rc == MEMCACHED_SUCCESS)
4725
size_t get_value_len;
4727
uint32_t get_value_flags;
4729
get_value= memcached_get(mc, set_key, set_key_len, &get_value_len,
4730
&get_value_flags, &rc);
4731
if (rc != MEMCACHED_SUCCESS)
4733
memcached_die(mc, rc, "memcached_get", x);
4739
(get_value_len != set_value_len
4740
|| 0!=strncmp(get_value, set_value, get_value_len)))
4742
fprintf(stderr, "Values don't match?\n");
4743
rc= MEMCACHED_FAILURE;
4749
rc= memcached_set(mc,
4750
set_key, set_key_len,
4751
set_value, set_value_len,
4755
if (rc != MEMCACHED_SUCCESS)
4757
memcached_die(mc, rc, "memcached_set", x);
4764
if (rc != MEMCACHED_SUCCESS)
4770
return TEST_SUCCESS;
4773
test_return_t kill_HUP_TEST(memcached_st *original_memc)
4775
memcached_st *memc= create_single_instance_memcached(original_memc, 0);
4778
memcached_server_instance_st instance= memcached_server_instance_by_position(memc, 0);
4781
test_true((pid= libmemcached_util_getpid(memcached_server_name(instance),
4782
memcached_server_port(instance), NULL)) > -1);
4785
test_compare(MEMCACHED_SUCCESS,
4787
test_literal_param(__func__), // Keys
4788
test_literal_param(__func__), // Values
4790
test_true_got(kill(pid, SIGHUP) == 0, strerror(errno));
4792
test_compare(MEMCACHED_SUCCESS,
4794
test_literal_param(__func__), // Keys
4795
test_literal_param(__func__), // Values
4798
memcached_free(memc);
4800
return TEST_SUCCESS;