fetch_result() implemented for memcached_result_st.
[awesomized/libmemcached] / tests / test.c
1 /*
2 Sample test application.
3 */
4 #include <assert.h>
5 #include <memcached.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/time.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <unistd.h>
13 #include <time.h>
14 #include "../lib/common.h"
15
16 long int timedif(struct timeval a, struct timeval b)
17 {
18 register int us, s;
19
20 us = a.tv_usec - b.tv_usec;
21 us /= 1000;
22 s = a.tv_sec - b.tv_sec;
23 s *= 1000;
24 return s + us;
25 }
26
27 void init_test(memcached_st *not_used)
28 {
29 memcached_st memc;
30
31 (void)memcached_create(&memc);
32 memcached_free(&memc);
33 }
34
35 void allocation_test(memcached_st *not_used)
36 {
37 memcached_st *memc;
38 memc= memcached_create(NULL);
39 assert(memc);
40 memcached_free(memc);
41 }
42
43 void clone_test(memcached_st *memc)
44 {
45 /* All null? */
46 {
47 memcached_st *clone;
48 clone= memcached_clone(NULL, NULL);
49 assert(clone);
50 memcached_free(clone);
51 }
52
53 /* Can we init from null? */
54 {
55 memcached_st *clone;
56 clone= memcached_clone(NULL, memc);
57 assert(clone);
58 memcached_free(clone);
59 }
60
61 /* Can we init from struct? */
62 {
63 memcached_st declared_clone;
64 memcached_st *clone;
65 clone= memcached_clone(&declared_clone, NULL);
66 assert(clone);
67 memcached_free(clone);
68 }
69
70 /* Can we init from struct? */
71 {
72 memcached_st declared_clone;
73 memcached_st *clone;
74 clone= memcached_clone(&declared_clone, memc);
75 assert(clone);
76 memcached_free(clone);
77 }
78 }
79
80 void connection_test(memcached_st *memc)
81 {
82 memcached_return rc;
83
84 rc= memcached_server_add(memc, "localhost", 0);
85 assert(rc == MEMCACHED_SUCCESS);
86 }
87
88 void error_test(memcached_st *memc)
89 {
90 memcached_return rc;
91
92 for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
93 {
94 printf("Error %d -> %s\n", rc, memcached_strerror(memc, rc));
95 }
96 }
97
98 void set_test(memcached_st *memc)
99 {
100 memcached_return rc;
101 char *key= "foo";
102 char *value= "when we sanitize";
103
104 rc= memcached_set(memc, key, strlen(key),
105 value, strlen(value),
106 (time_t)0, (uint16_t)0);
107 assert(rc == MEMCACHED_SUCCESS);
108 }
109
110 void add_test(memcached_st *memc)
111 {
112 memcached_return rc;
113 char *key= "foo";
114 char *value= "when we sanitize";
115
116 rc= memcached_add(memc, key, strlen(key),
117 value, strlen(value),
118 (time_t)0, (uint16_t)0);
119 assert(rc == MEMCACHED_NOTSTORED);
120 }
121
122 void replace_test(memcached_st *memc)
123 {
124 memcached_return rc;
125 char *key= "foo";
126 char *value= "when we sanitize";
127
128 rc= memcached_replace(memc, key, strlen(key),
129 value, strlen(value),
130 (time_t)0, (uint16_t)0);
131 assert(rc == MEMCACHED_SUCCESS);
132 }
133
134 void delete_test(memcached_st *memc)
135 {
136 memcached_return rc;
137 char *key= "foo";
138 char *value= "when we sanitize";
139
140 rc= memcached_set(memc, key, strlen(key),
141 value, strlen(value),
142 (time_t)0, (uint16_t)0);
143 assert(rc == MEMCACHED_SUCCESS);
144
145 rc= memcached_delete(memc, key, strlen(key), (time_t)0);
146 assert(rc == MEMCACHED_SUCCESS);
147 }
148
149 void flush_test(memcached_st *memc)
150 {
151 memcached_return rc;
152
153 rc= memcached_flush(memc, 0);
154 assert(rc == MEMCACHED_SUCCESS);
155 }
156
157 void get_test(memcached_st *memc)
158 {
159 memcached_return rc;
160 char *key= "foo";
161 char *string;
162 size_t string_length;
163 uint16_t flags;
164
165 rc= memcached_delete(memc, key, strlen(key), (time_t)0);
166 assert(rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOTFOUND);
167
168 string= memcached_get(memc, key, strlen(key),
169 &string_length, &flags, &rc);
170
171 assert(rc == MEMCACHED_NOTFOUND);
172 assert(string_length == 0);
173 assert(!string);
174 }
175
176 void get_test2(memcached_st *memc)
177 {
178 memcached_return rc;
179 char *key= "foo";
180 char *value= "when we sanitize";
181 char *string;
182 size_t string_length;
183 uint16_t flags;
184
185 rc= memcached_set(memc, key, strlen(key),
186 value, strlen(value),
187 (time_t)0, (uint16_t)0);
188 assert(rc == MEMCACHED_SUCCESS);
189
190 string= memcached_get(memc, key, strlen(key),
191 &string_length, &flags, &rc);
192
193 assert(string);
194 assert(rc == MEMCACHED_SUCCESS);
195 assert(string_length == strlen(value));
196 assert(!memcmp(string, value, string_length));
197
198 free(string);
199 }
200
201 void set_test2(memcached_st *memc)
202 {
203 memcached_return rc;
204 char *key= "foo";
205 char *value= "train in the brain";
206 size_t value_length= strlen(value);
207 unsigned int x;
208
209 for (x= 0; x < 10; x++)
210 {
211 rc= memcached_set(memc, key, strlen(key),
212 value, value_length,
213 (time_t)0, (uint16_t)0);
214 assert(rc == MEMCACHED_SUCCESS);
215 }
216 }
217
218 void set_test3(memcached_st *memc)
219 {
220 memcached_return rc;
221 char *key= "foo";
222 char *value;
223 size_t value_length= 8191;
224 unsigned int x;
225
226 value = (char*)malloc(value_length);
227 assert(value);
228
229 for (x= 0; x < value_length; x++)
230 value[x] = (char) (x % 127);
231
232 for (x= 0; x < 1; x++)
233 {
234 rc= memcached_set(memc, key, strlen(key),
235 value, value_length,
236 (time_t)0, (uint16_t)0);
237 assert(rc == MEMCACHED_SUCCESS);
238 }
239
240 free(value);
241 }
242
243 void get_test3(memcached_st *memc)
244 {
245 memcached_return rc;
246 char *key= "foo";
247 char *value;
248 size_t value_length= 8191;
249 char *string;
250 size_t string_length;
251 uint16_t flags;
252 int x;
253
254 value = (char*)malloc(value_length);
255 assert(value);
256
257 for (x= 0; x < value_length; x++)
258 value[x] = (char) (x % 127);
259
260 rc= memcached_set(memc, key, strlen(key),
261 value, value_length,
262 (time_t)0, (uint16_t)0);
263 assert(rc == MEMCACHED_SUCCESS);
264
265 string= memcached_get(memc, key, strlen(key),
266 &string_length, &flags, &rc);
267
268 assert(rc == MEMCACHED_SUCCESS);
269 assert(string);
270 assert(string_length == value_length);
271 assert(!memcmp(string, value, string_length));
272
273 free(string);
274 free(value);
275 }
276
277 void get_test4(memcached_st *memc)
278 {
279 memcached_return rc;
280 char *key= "foo";
281 char *value;
282 size_t value_length= 8191;
283 char *string;
284 size_t string_length;
285 uint16_t flags;
286 int x;
287
288 value = (char*)malloc(value_length);
289 assert(value);
290
291 for (x= 0; x < value_length; x++)
292 value[x] = (char) (x % 127);
293
294 rc= memcached_set(memc, key, strlen(key),
295 value, value_length,
296 (time_t)0, (uint16_t)0);
297 assert(rc == MEMCACHED_SUCCESS);
298
299 for (x= 0; x < 10; x++)
300 {
301 string= memcached_get(memc, key, strlen(key),
302 &string_length, &flags, &rc);
303
304 assert(rc == MEMCACHED_SUCCESS);
305 assert(string);
306 assert(string_length == value_length);
307 assert(!memcmp(string, value, string_length));
308 free(string);
309 }
310
311 free(value);
312 }
313
314 void stats_servername_test(memcached_st *memc)
315 {
316 memcached_return rc;
317 memcached_stat_st stat;
318 rc= memcached_stat_servername(&stat, NULL,
319 "localhost",
320 MEMCACHED_DEFAULT_PORT);
321 }
322
323 void increment_test(memcached_st *memc)
324 {
325 unsigned int new_number;
326 memcached_return rc;
327 char *key= "number";
328 char *value= "0";
329
330 rc= memcached_set(memc, key, strlen(key),
331 value, strlen(value),
332 (time_t)0, (uint16_t)0);
333 assert(rc == MEMCACHED_SUCCESS);
334
335 rc= memcached_increment(memc, key, strlen(key),
336 1, &new_number);
337 assert(rc == MEMCACHED_SUCCESS);
338 assert(new_number == 1);
339
340 rc= memcached_increment(memc, key, strlen(key),
341 1, &new_number);
342 assert(rc == MEMCACHED_SUCCESS);
343 assert(new_number == 2);
344 }
345
346 void decrement_test(memcached_st *memc)
347 {
348 unsigned int new_number;
349 memcached_return rc;
350 char *key= "number";
351 char *value= "3";
352
353 rc= memcached_set(memc, key, strlen(key),
354 value, strlen(value),
355 (time_t)0, (uint16_t)0);
356 assert(rc == MEMCACHED_SUCCESS);
357
358 rc= memcached_decrement(memc, key, strlen(key),
359 1, &new_number);
360 assert(rc == MEMCACHED_SUCCESS);
361 assert(new_number == 2);
362
363 rc= memcached_decrement(memc, key, strlen(key),
364 1, &new_number);
365 assert(rc == MEMCACHED_SUCCESS);
366 assert(new_number == 1);
367 }
368
369 void quit_test(memcached_st *memc)
370 {
371 memcached_return rc;
372 char *key= "fudge";
373 char *value= "sanford and sun";
374
375 rc= memcached_set(memc, key, strlen(key),
376 value, strlen(value),
377 (time_t)10, (uint16_t)3);
378 assert(rc == MEMCACHED_SUCCESS);
379 memcached_quit(memc);
380
381 rc= memcached_set(memc, key, strlen(key),
382 value, strlen(value),
383 (time_t)50, (uint16_t)9);
384 assert(rc == MEMCACHED_SUCCESS);
385 }
386
387 void mget_result_test(memcached_st *memc)
388 {
389 memcached_return rc;
390 char *keys[]= {"fudge", "son", "food"};
391 size_t key_length[]= {5, 3, 4};
392 unsigned int x;
393
394 memcached_result_st results_obj;
395 memcached_result_st *results;
396
397 results= memcached_result_create(memc, &results_obj);
398 assert(results);
399 assert(&results_obj == results);
400
401 /* We need to empty the server before continueing test */
402 rc= memcached_flush(memc, 0);
403 assert(rc == MEMCACHED_SUCCESS);
404
405 rc= memcached_mget(memc, keys, key_length, 3);
406 assert(rc == MEMCACHED_SUCCESS);
407
408 while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
409 {
410 assert(results);
411 }
412 while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
413 assert(!results);
414 assert(rc == MEMCACHED_NOTFOUND);
415
416 for (x= 0; x < 3; x++)
417 {
418 rc= memcached_set(memc, keys[x], key_length[x],
419 keys[x], key_length[x],
420 (time_t)50, (uint16_t)9);
421 assert(rc == MEMCACHED_SUCCESS);
422 }
423
424 rc= memcached_mget(memc, keys, key_length, 3);
425 assert(rc == MEMCACHED_SUCCESS);
426
427 while ((results= memcached_fetch_result(memc, &results_obj, &rc)))
428 {
429 assert(results);
430 assert(&results_obj == results);
431 assert(rc == MEMCACHED_SUCCESS);
432 assert(memcached_result_key_length(results) == memcached_result_length(results));
433 assert(!memcmp(memcached_result_key_value(results),
434 memcached_result_value(results),
435 memcached_result_length(results)));
436 }
437
438 WATCHPOINT;
439 memcached_result_free(&results_obj);
440 WATCHPOINT;
441 }
442
443 void mget_result_alloc_test(memcached_st *memc)
444 {
445 memcached_return rc;
446 char *keys[]= {"fudge", "son", "food"};
447 size_t key_length[]= {5, 3, 4};
448 unsigned int x;
449
450 memcached_result_st *results;
451
452 /* We need to empty the server before continueing test */
453 rc= memcached_flush(memc, 0);
454 assert(rc == MEMCACHED_SUCCESS);
455
456 rc= memcached_mget(memc, keys, key_length, 3);
457 assert(rc == MEMCACHED_SUCCESS);
458
459 while ((results= memcached_fetch_result(memc, NULL, &rc)) != NULL)
460 {
461 assert(results);
462 }
463 assert(!results);
464 assert(rc == MEMCACHED_NOTFOUND);
465
466 for (x= 0; x < 3; x++)
467 {
468 rc= memcached_set(memc, keys[x], key_length[x],
469 keys[x], key_length[x],
470 (time_t)50, (uint16_t)9);
471 assert(rc == MEMCACHED_SUCCESS);
472 }
473
474 rc= memcached_mget(memc, keys, key_length, 3);
475 assert(rc == MEMCACHED_SUCCESS);
476
477 x= 0;
478 while ((results= memcached_fetch_result(memc, NULL, &rc)))
479 {
480 assert(results);
481 assert(rc == MEMCACHED_SUCCESS);
482 assert(memcached_result_key_length(results) == memcached_result_length(results));
483 assert(!memcmp(memcached_result_key_value(results),
484 memcached_result_value(results),
485 memcached_result_length(results)));
486 memcached_result_free(results);
487 x++;
488 }
489 }
490
491 void mget_test(memcached_st *memc)
492 {
493 memcached_return rc;
494 char *keys[]= {"fudge", "son", "food"};
495 size_t key_length[]= {5, 3, 4};
496 unsigned int x;
497 uint16_t flags;
498
499 char return_key[MEMCACHED_MAX_KEY];
500 size_t return_key_length;
501 char *return_value;
502 size_t return_value_length;
503
504 /* We need to empty the server before continueing test */
505 rc= memcached_flush(memc, 0);
506 assert(rc == MEMCACHED_SUCCESS);
507
508 rc= memcached_mget(memc, keys, key_length, 3);
509 assert(rc == MEMCACHED_SUCCESS);
510
511 while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
512 &return_value_length, &flags, &rc)) != NULL)
513 {
514 assert(return_value);
515 }
516 assert(!return_value);
517 assert(return_value_length == 0);
518 assert(rc == MEMCACHED_NOTFOUND);
519
520 for (x= 0; x < 3; x++)
521 {
522 rc= memcached_set(memc, keys[x], key_length[x],
523 keys[x], key_length[x],
524 (time_t)50, (uint16_t)9);
525 assert(rc == MEMCACHED_SUCCESS);
526 }
527
528 rc= memcached_mget(memc, keys, key_length, 3);
529 assert(rc == MEMCACHED_SUCCESS);
530
531 x= 0;
532 while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
533 &return_value_length, &flags, &rc)))
534 {
535 assert(return_value);
536 assert(rc == MEMCACHED_SUCCESS);
537 assert(return_key_length == return_value_length);
538 assert(!memcmp(return_value, return_key, return_value_length));
539 free(return_value);
540 x++;
541 }
542 }
543
544 void get_stats_keys(memcached_st *memc)
545 {
546 char **list;
547 char **ptr;
548 memcached_stat_st stat;
549 memcached_return rc;
550
551 list= memcached_stat_get_keys(memc, &stat, &rc);
552 assert(rc == MEMCACHED_SUCCESS);
553 for (ptr= list; *ptr; ptr++)
554 printf("Found key %s\n", *ptr);
555 fflush(stdout);
556
557 free(list);
558 }
559
560 void get_stats(memcached_st *memc)
561 {
562 unsigned int x;
563 char **list;
564 char **ptr;
565 memcached_return rc;
566 memcached_stat_st *stat;
567
568 stat= memcached_stat(memc, NULL, &rc);
569 assert(rc == MEMCACHED_SUCCESS);
570
571 assert(rc == MEMCACHED_SUCCESS);
572 assert(stat);
573
574 for (x= 0; x < memcached_server_count(memc); x++)
575 {
576 list= memcached_stat_get_keys(memc, &stat[x], &rc);
577 assert(rc == MEMCACHED_SUCCESS);
578 for (ptr= list; *ptr; ptr++)
579 printf("Found key %s\n", *ptr);
580
581 free(list);
582 }
583
584 memcached_stat_free(NULL, stat);
585 }
586
587 void add_host_test(memcached_st *memc)
588 {
589 unsigned int x;
590 memcached_server_st *servers;
591 memcached_return rc;
592 char servername[]= "0.example.com";
593
594 servers= memcached_server_list_append(NULL, servername, 400, &rc);
595 assert(servers);
596 assert(1 == memcached_server_list_count(servers));
597
598 for (x= 2; x < 20; x++)
599 {
600 char buffer[SMALL_STRING_LEN];
601
602 snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
603 servers= memcached_server_list_append(servers, buffer, 401,
604 &rc);
605 assert(rc == MEMCACHED_SUCCESS);
606 assert(x == memcached_server_list_count(servers));
607 }
608
609 rc= memcached_server_push(memc, servers);
610 assert(rc == MEMCACHED_SUCCESS);
611 rc= memcached_server_push(memc, servers);
612 assert(rc == MEMCACHED_SUCCESS);
613
614 memcached_server_list_free(servers);
615 }
616
617 /* We don't test the behavior itself, we test the switches */
618 void behavior_test(memcached_st *memc)
619 {
620 unsigned long long value;
621 unsigned int set= 1;
622
623 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &set);
624 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
625 assert(value == 1);
626
627 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &set);
628 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
629 assert(value == 1);
630
631 set= MEMCACHED_HASH_MD5;
632 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
633 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
634 assert(value == MEMCACHED_HASH_MD5);
635
636 set= 0;
637
638 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &set);
639 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK);
640 assert(value == 0);
641
642 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &set);
643 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
644 assert(value == 0);
645
646 set= MEMCACHED_HASH_DEFAULT;
647 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
648 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
649 assert(value == MEMCACHED_HASH_DEFAULT);
650
651 set= MEMCACHED_HASH_CRC;
652 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
653 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
654 assert(value == MEMCACHED_HASH_CRC);
655
656 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
657 assert(value > 0);
658
659 value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
660 assert(value > 0);
661 }
662
663 /* Test case provided by Cal Haldenbrand */
664 void user_supplied_bug1(memcached_st *memc)
665 {
666 unsigned int setter= 1;
667 unsigned int x;
668
669 unsigned long long total= 0;
670 int size= 0;
671 char key[10];
672 char randomstuff[6 * 1024];
673 memcached_return rc;
674
675 memset(randomstuff, 0, 6 * 1024);
676
677 /* We just keep looking at the same values over and over */
678 srandom(10);
679
680 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &setter);
681 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &setter);
682
683
684 /* add key */
685 for (x= 0 ; total < 20 * 1024576 ; x++ )
686 {
687 unsigned int j= 0;
688
689 size= (rand() % ( 5 * 1024 ) ) + 400;
690 memset(randomstuff, 0, 6 * 1024);
691 assert(size < 6 * 1024); /* Being safe here */
692
693 for (j= 0 ; j < size ;j++)
694 randomstuff[j] = (char) (rand() % 26) + 97;
695
696 total += size;
697 sprintf(key, "%d", x);
698 rc = memcached_set(memc, key, strlen(key),
699 randomstuff, strlen(randomstuff), 10, 0);
700 /* If we fail, lets try again */
701 if (rc != MEMCACHED_SUCCESS)
702 rc = memcached_set(memc, key, strlen(key),
703 randomstuff, strlen(randomstuff), 10, 0);
704 assert(rc == MEMCACHED_SUCCESS);
705 }
706 }
707
708 /* Test case provided by Cal Haldenbrand */
709 void user_supplied_bug2(memcached_st *memc)
710 {
711 int errors;
712 unsigned int setter;
713 unsigned int x;
714 unsigned long long total;
715
716 setter= 1;
717 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &setter);
718 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &setter);
719 #ifdef NOT_YET
720 setter = 20 * 1024576;
721 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, &setter);
722 setter = 20 * 1024576;
723 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, &setter);
724 getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
725 getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
726
727 for (x= 0, errors= 0, total= 0 ; total < 20 * 1024576 ; x++)
728 #endif
729
730 for (x= 0, errors= 0, total= 0 ; total < 24576 ; x++)
731 {
732 memcached_return rc= MEMCACHED_SUCCESS;
733 char buffer[SMALL_STRING_LEN];
734 uint16_t flags= 0;
735 size_t val_len= 0;
736 char *getval;
737
738 memset(buffer, 0, SMALL_STRING_LEN);
739
740 snprintf(buffer, SMALL_STRING_LEN, "%u", x);
741 getval= memcached_get(memc, buffer, strlen(buffer),
742 &val_len, &flags, &rc);
743 if (rc != MEMCACHED_SUCCESS)
744 {
745 if (rc == MEMCACHED_NOTFOUND)
746 errors++;
747 else
748 assert(0);
749
750 continue;
751 }
752 total+= val_len;
753 errors= 0;
754 free(getval);
755 }
756 }
757
758 /* Do a large mget() over all the keys we think exist */
759 #define KEY_COUNT 3000 // * 1024576
760 void user_supplied_bug3(memcached_st *memc)
761 {
762 memcached_return rc;
763 unsigned int setter;
764 unsigned int x;
765 char **keys;
766 size_t key_lengths[KEY_COUNT];
767
768 setter= 1;
769 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, &setter);
770 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, &setter);
771 #ifdef NOT_YET
772 setter = 20 * 1024576;
773 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE, &setter);
774 setter = 20 * 1024576;
775 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE, &setter);
776 getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
777 getter = memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE);
778 #endif
779
780 keys= (char **)malloc(sizeof(char *) * KEY_COUNT);
781 assert(keys);
782 memset(keys, 0, (sizeof(char *) * KEY_COUNT));
783 for (x= 0; x < KEY_COUNT; x++)
784 {
785 char buffer[30];
786
787 snprintf(buffer, 30, "%u", x);
788 keys[x]= strdup(buffer);
789 key_lengths[x]= strlen(keys[x]);
790 }
791
792 rc= memcached_mget(memc, keys, key_lengths, KEY_COUNT);
793 assert(rc == MEMCACHED_SUCCESS);
794
795 /* Turn this into a help function */
796 {
797 char return_key[MEMCACHED_MAX_KEY];
798 size_t return_key_length;
799 char *return_value;
800 size_t return_value_length;
801 uint16_t flags;
802
803 while ((return_value= memcached_fetch(memc, return_key, &return_key_length,
804 &return_value_length, &flags, &rc)))
805 {
806 assert(return_value);
807 assert(rc == MEMCACHED_SUCCESS);
808 free(return_value);
809 }
810 }
811
812 for (x= 0; x < KEY_COUNT; x++)
813 free(keys[x]);
814 free(keys);
815 }
816
817 void result_static(memcached_st *memc)
818 {
819 memcached_result_st result;
820 memcached_result_st *result_ptr;
821
822 result_ptr= memcached_result_create(memc, &result);
823 assert(result.is_allocated == MEMCACHED_NOT_ALLOCATED);
824 assert(result_ptr);
825 memcached_result_free(&result);
826 }
827
828 void result_alloc(memcached_st *memc)
829 {
830 memcached_result_st *result;
831
832 result= memcached_result_create(memc, NULL);
833 assert(result);
834 memcached_result_free(result);
835 }
836
837 void string_static_null(memcached_st *memc)
838 {
839 memcached_string_st string;
840 memcached_string_st *string_ptr;
841
842 string_ptr= memcached_string_create(memc, &string, 0);
843 assert(string.is_allocated == MEMCACHED_NOT_ALLOCATED);
844 assert(string_ptr);
845 memcached_string_free(&string);
846 }
847
848 void string_alloc_null(memcached_st *memc)
849 {
850 memcached_string_st *string;
851
852 string= memcached_string_create(memc, NULL, 0);
853 assert(string);
854 memcached_string_free(string);
855 }
856
857 void string_alloc_with_size(memcached_st *memc)
858 {
859 memcached_string_st *string;
860
861 string= memcached_string_create(memc, NULL, 1024);
862 assert(string);
863 memcached_string_free(string);
864 }
865
866 void string_alloc_with_size_toobig(memcached_st *memc)
867 {
868 memcached_string_st *string;
869
870 string= memcached_string_create(memc, NULL, INT64_MAX);
871 assert(string == NULL);
872 }
873
874 void string_alloc_append(memcached_st *memc)
875 {
876 unsigned int x;
877 char buffer[SMALL_STRING_LEN];
878 memcached_string_st *string;
879
880 /* Ring the bell! */
881 memset(buffer, 6, SMALL_STRING_LEN);
882
883 string= memcached_string_create(memc, NULL, 100);
884 assert(string);
885
886 for (x= 0; x < 1024; x++)
887 {
888 memcached_return rc;
889 rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
890 assert(rc == MEMCACHED_SUCCESS);
891 }
892 memcached_string_free(string);
893 }
894
895 void string_alloc_append_toobig(memcached_st *memc)
896 {
897 memcached_return rc;
898 unsigned int x;
899 char buffer[SMALL_STRING_LEN];
900 memcached_string_st *string;
901
902 /* Ring the bell! */
903 memset(buffer, 6, SMALL_STRING_LEN);
904
905 string= memcached_string_create(memc, NULL, 100);
906 assert(string);
907
908 for (x= 0; x < 1024; x++)
909 {
910 rc= memcached_string_append(string, buffer, SMALL_STRING_LEN);
911 assert(rc == MEMCACHED_SUCCESS);
912 }
913 rc= memcached_string_append(string, buffer, INT64_MAX);
914 assert(rc == MEMCACHED_MEMORY_ALLOCATION_FAILURE);
915 memcached_string_free(string);
916 }
917
918 void add_host_test1(memcached_st *memc)
919 {
920 unsigned int x;
921 memcached_return rc;
922 char servername[]= "0.example.com";
923 memcached_server_st *servers;
924
925 servers= memcached_server_list_append(NULL, servername, 400, &rc);
926 assert(servers);
927 assert(1 == memcached_server_list_count(servers));
928
929 for (x= 2; x < 20; x++)
930 {
931 char buffer[SMALL_STRING_LEN];
932
933 snprintf(buffer, SMALL_STRING_LEN, "%u.example.com", 400+x);
934 servers= memcached_server_list_append(servers, buffer, 401,
935 &rc);
936 assert(rc == MEMCACHED_SUCCESS);
937 assert(x == memcached_server_list_count(servers));
938 }
939
940 rc= memcached_server_push(memc, servers);
941 assert(rc == MEMCACHED_SUCCESS);
942 rc= memcached_server_push(memc, servers);
943 assert(rc == MEMCACHED_SUCCESS);
944
945 memcached_server_list_free(servers);
946 }
947
948 memcached_return pre_nonblock(memcached_st *memc)
949 {
950 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL);
951
952 return MEMCACHED_SUCCESS;
953 }
954
955 memcached_return pre_md5(memcached_st *memc)
956 {
957 memcached_hash value= MEMCACHED_HASH_MD5;
958 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
959
960 return MEMCACHED_SUCCESS;
961 }
962
963 memcached_return pre_crc(memcached_st *memc)
964 {
965 memcached_hash value= MEMCACHED_HASH_CRC;
966 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
967
968 return MEMCACHED_SUCCESS;
969 }
970
971 memcached_return pre_hash_fnv1_64(memcached_st *memc)
972 {
973 memcached_hash value= MEMCACHED_HASH_FNV1_64;
974 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
975
976 return MEMCACHED_SUCCESS;
977 }
978
979 memcached_return pre_hash_fnv1a_64(memcached_st *memc)
980 {
981 memcached_hash value= MEMCACHED_HASH_FNV1A_64;
982 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
983
984 return MEMCACHED_SUCCESS;
985 }
986
987 memcached_return pre_hash_fnv1_32(memcached_st *memc)
988 {
989 memcached_hash value= MEMCACHED_HASH_FNV1_32;
990 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
991
992 return MEMCACHED_SUCCESS;
993 }
994
995 memcached_return pre_hash_fnv1a_32(memcached_st *memc)
996 {
997 memcached_hash value= MEMCACHED_HASH_FNV1A_32;
998 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
999
1000 return MEMCACHED_SUCCESS;
1001 }
1002
1003 memcached_return pre_hash_ketama(memcached_st *memc)
1004 {
1005 memcached_hash value= MEMCACHED_HASH_KETAMA;
1006 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
1007
1008 return MEMCACHED_SUCCESS;
1009 }
1010
1011 memcached_return pre_unix_socket(memcached_st *memc)
1012 {
1013 memcached_return rc;
1014 struct stat buf;
1015
1016 memcached_server_list_free(memc->hosts);
1017 memc->hosts= NULL;
1018 memc->number_of_hosts= 0;
1019
1020 if (stat("/tmp/memcached.socket", &buf))
1021 return MEMCACHED_FAILURE;
1022
1023 rc= memcached_server_add_unix_socket(memc, "/tmp/memcached.socket");
1024
1025 return rc;
1026 }
1027
1028 memcached_return pre_nodelay(memcached_st *memc)
1029 {
1030 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_NO_BLOCK, NULL);
1031 memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY, NULL);
1032
1033 return MEMCACHED_SUCCESS;
1034 }
1035
1036 typedef struct collection_st collection_st;
1037 typedef struct test_st test_st;
1038
1039 struct test_st {
1040 char *name;
1041 unsigned int requires_flush;
1042 void (*function)(memcached_st *memc);
1043 };
1044
1045 struct collection_st {
1046 char *name;
1047 memcached_return (*pre)(memcached_st *memc);
1048 memcached_return (*post)(memcached_st *memc);
1049 test_st *tests;
1050 };
1051
1052 int main(int argc, char *argv[])
1053 {
1054 unsigned int x;
1055 char *server_list;
1056 char *collection_to_run= NULL;
1057 char *wildcard= NULL;
1058 memcached_server_st *servers;
1059
1060
1061 if (argc > 1)
1062 collection_to_run= argv[1];
1063
1064 if (argc == 3)
1065 wildcard= argv[2];
1066
1067 if (!(server_list= getenv("MEMCACHED_SERVERS")))
1068 server_list= "localhost";
1069
1070 printf("servers %s\n", server_list);
1071 srandom(time(NULL));
1072
1073 servers= memcached_servers_parse(server_list);
1074 assert(servers);
1075
1076 for (x= 0; x < memcached_server_list_count(servers); x++)
1077 {
1078 printf("\t%s : %u\n", servers[x].hostname, servers[x].port);
1079 assert(servers[x].stack_responses == 0);
1080 assert(servers[x].fd == -1);
1081 assert(servers[x].cursor_active == 0);
1082 }
1083
1084 printf("\n");
1085
1086 /* Clean the server before beginning testing */
1087 test_st tests[] ={
1088 {"flush", 0, flush_test },
1089 {"init", 0, init_test },
1090 {"allocation", 0, allocation_test },
1091 {"clone_test", 0, clone_test },
1092 {"error", 0, error_test },
1093 {"set", 0, set_test },
1094 {"set2", 0, set_test2 },
1095 {"set3", 0, set_test3 },
1096 {"add", 0, add_test },
1097 {"replace", 0, replace_test },
1098 {"delete", 1, delete_test },
1099 {"get", 1, get_test },
1100 {"get2", 0, get_test2 },
1101 {"get3", 0, get_test3 },
1102 {"get4", 0, get_test4 },
1103 {"stats_servername", 0, stats_servername_test },
1104 {"increment", 0, increment_test },
1105 {"decrement", 0, decrement_test },
1106 {"quit", 0, quit_test },
1107 {"mget", 1, mget_test },
1108 {"mget_result", 1, mget_result_test },
1109 {"mget_result_alloc", 1, mget_result_alloc_test },
1110 {"get_stats", 0, get_stats },
1111 {"add_host_test", 0, add_host_test },
1112 {"get_stats_keys", 0, get_stats_keys },
1113 {"behavior_test", 0, get_stats_keys },
1114 {0, 0, 0}
1115 };
1116
1117 test_st string_tests[] ={
1118 {"string static with null", 0, string_static_null },
1119 {"string alloc with null", 0, string_alloc_null },
1120 {"string alloc with 1K", 0, string_alloc_with_size },
1121 {"string alloc with malloc failure", 0, string_alloc_with_size_toobig },
1122 {"string append", 0, string_alloc_append },
1123 {"string append failure (too big)", 0, string_alloc_append_toobig },
1124 {0, 0, 0}
1125 };
1126
1127 test_st result_tests[] ={
1128 {"result static", 0, result_static},
1129 {"result alloc", 0, result_alloc},
1130 {0, 0, 0}
1131 };
1132
1133 test_st user_tests[] ={
1134 {"user_supplied_bug1", 0, user_supplied_bug1 },
1135 {"user_supplied_bug2", 0, user_supplied_bug2 },
1136 {"user_supplied_bug3", 0, user_supplied_bug3 },
1137 {0, 0, 0}
1138 };
1139
1140
1141 collection_st collection[] ={
1142 {"block", 0, 0, tests},
1143 {"nonblock", pre_nonblock, 0, tests},
1144 {"nodelay", pre_nodelay, 0, tests},
1145 {"md5", pre_md5, 0, tests},
1146 {"crc", pre_crc, 0, tests},
1147 {"fnv1_64", pre_hash_fnv1_64, 0, tests},
1148 {"fnv1a_64", pre_hash_fnv1a_64, 0, tests},
1149 {"fnv1_32", pre_hash_fnv1_32, 0, tests},
1150 {"fnv1a_32", pre_hash_fnv1a_32, 0, tests},
1151 {"ketama", pre_hash_ketama, 0, tests},
1152 {"unix_socket", pre_unix_socket, 0, tests},
1153 {"unix_socket_nodelay", pre_nodelay, 0, tests},
1154 {"string", 0, 0, string_tests},
1155 {"result", 0, 0, result_tests},
1156 {"user", 0, 0, user_tests},
1157 {0, 0, 0, 0}
1158 };
1159
1160 collection_st *next;
1161 for (next= collection; next->name; next++)
1162 {
1163 test_st *run;
1164
1165 run= next->tests;
1166
1167 if (collection_to_run && strcmp(collection_to_run, next->name))
1168 continue;
1169
1170 fprintf(stderr, "\n%s\n\n", next->name);
1171
1172 for (x= 0; run->name; run++)
1173 {
1174 if (wildcard && strcmp(wildcard, run->name))
1175 continue;
1176
1177 fprintf(stderr, "Testing %s", run->name);
1178
1179 memcached_st *memc;
1180 memcached_return rc;
1181 struct timeval start_time, end_time;
1182
1183 memc= memcached_create(NULL);
1184 assert(memc);
1185
1186 if (run->requires_flush)
1187 memcached_flush(memc, 0);
1188
1189 rc= memcached_server_push(memc, servers);
1190 assert(rc == MEMCACHED_SUCCESS);
1191
1192 unsigned int loop;
1193 for (loop= 0; loop < memcached_server_list_count(servers); loop++)
1194 {
1195 assert(memc->hosts[loop].stack_responses == 0);
1196 assert(memc->hosts[loop].fd == -1);
1197 assert(memc->hosts[loop].cursor_active == 0);
1198 }
1199
1200 if (next->pre)
1201 {
1202 memcached_return rc;
1203 rc= next->pre(memc);
1204
1205 if (rc != MEMCACHED_SUCCESS)
1206 {
1207 fprintf(stderr, "\t\t\t\t\t [ skipping ]\n");
1208 goto error;
1209 }
1210 }
1211
1212 gettimeofday(&start_time, NULL);
1213 run->function(memc);
1214 gettimeofday(&end_time, NULL);
1215 long int load_time= timedif(end_time, start_time);
1216 fprintf(stderr, "\t\t\t\t\t %ld.%03ld [ ok ]\n", load_time / 1000,
1217 load_time % 1000);
1218
1219 if (next->post)
1220 (void)next->post(memc);
1221
1222 assert(memc);
1223 error:
1224 memcached_free(memc);
1225 }
1226 }
1227
1228 /* Clean up whatever we might have left */
1229 {
1230 memcached_st *memc;
1231 memc= memcached_create(NULL);
1232 assert(memc);
1233 flush_test(memc);
1234 memcached_free(memc);
1235 }
1236
1237 fprintf(stderr, "All tests completed successfully\n\n");
1238
1239 memcached_server_list_free(servers);
1240
1241 return 0;
1242 }