Update for DNS updates from libtest
[m6w6/libmemcached] / libtest / unittest.cc
1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2 *
3 * Data Differential YATL (i.e. libtest) library
4 *
5 * Copyright (C) 2012 Data Differential, http://datadifferential.com/
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following disclaimer
16 * in the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * * The names of its contributors may not be used to endorse or
20 * promote products derived from this software without specific prior
21 * written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *
35 */
36
37 #include <config.h>
38
39 #include <libtest/test.hpp>
40
41 #if defined(LIBTEST_WITH_LIBMEMCACHED_SUPPORT) && LIBTEST_WITH_LIBMEMCACHED_SUPPORT
42 #include <libmemcached-1.0/memcached.h>
43 #endif
44
45 #if defined(LIBTEST_WITH_LIBGEARMAN_SUPPORT) && LIBTEST_WITH_LIBGEARMAN_SUPPORT
46 #include <libgearman/gearman.h>
47 #endif
48
49 #include <cstdlib>
50 #include <unistd.h>
51
52 using namespace libtest;
53
54 static test_return_t LIBTOOL_COMMAND_test(void *)
55 {
56 test_true(getenv("LIBTOOL_COMMAND"));
57 return TEST_SUCCESS;
58 }
59
60 static test_return_t VALGRIND_COMMAND_test(void *)
61 {
62 test_true(getenv("VALGRIND_COMMAND"));
63 return TEST_SUCCESS;
64 }
65
66 static test_return_t HELGRIND_COMMAND_test(void *)
67 {
68 test_true(getenv("HELGRIND_COMMAND"));
69 return TEST_SUCCESS;
70 }
71
72 static test_return_t GDB_COMMAND_test(void *)
73 {
74 test_true(getenv("GDB_COMMAND"));
75 return TEST_SUCCESS;
76 }
77
78 static test_return_t test_success_equals_one_test(void *)
79 {
80 test_skip(HAVE_LIBMEMCACHED, 1);
81 #if defined(HAVE_LIBMEMCACHED) && HAVE_LIBMEMCACHED
82 test_zero(MEMCACHED_SUCCESS);
83 #endif
84 return TEST_SUCCESS;
85 }
86
87 static test_return_t test_success_test(void *)
88 {
89 return TEST_SUCCESS;
90 }
91
92 static test_return_t test_failure_test(void *)
93 {
94 return TEST_SKIPPED; // Only run this when debugging
95
96 test_compare(1, 2);
97 return TEST_SUCCESS;
98 }
99
100 static test_return_t local_test(void *)
101 {
102 if (getenv("LIBTEST_LOCAL"))
103 {
104 test_true(test_is_local());
105 }
106 else
107 {
108 test_false(test_is_local());
109 }
110
111 return TEST_SUCCESS;
112 }
113
114 static test_return_t local_not_test(void *)
115 {
116 return TEST_SKIPPED;
117
118 std::string temp;
119
120 const char *ptr;
121 if ((ptr= getenv("LIBTEST_LOCAL")) == NULL)
122 {
123 temp.append(ptr);
124 }
125
126 // unsetenv() will cause issues with valgrind
127 _compare(__FILE__, __LINE__, __func__, 0, unsetenv("LIBTEST_LOCAL"), true);
128 test_compare(0, unsetenv("LIBTEST_LOCAL"));
129 test_false(test_is_local());
130
131 test_compare(0, setenv("LIBTEST_LOCAL", "1", 1));
132 test_true(test_is_local());
133
134 if (temp.empty())
135 {
136 test_compare(0, unsetenv("LIBTEST_LOCAL"));
137 }
138 else
139 {
140 char *old_string= strdup(temp.c_str());
141 test_compare(0, setenv("LIBTEST_LOCAL", old_string, 1));
142 }
143
144 return TEST_SUCCESS;
145 }
146
147 static test_return_t var_exists_test(void *)
148 {
149 test_compare(0, access("var", R_OK | W_OK | X_OK));
150 return TEST_SUCCESS;
151 }
152
153 static test_return_t var_tmp_exists_test(void *)
154 {
155 test_compare(0, access("var/tmp", R_OK | W_OK | X_OK));
156 return TEST_SUCCESS;
157 }
158
159 static test_return_t var_run_exists_test(void *)
160 {
161 test_compare(0, access("var/run", R_OK | W_OK | X_OK));
162 return TEST_SUCCESS;
163 }
164
165 static test_return_t var_log_exists_test(void *)
166 {
167 test_compare(0, access("var/log", R_OK | W_OK | X_OK));
168 return TEST_SUCCESS;
169 }
170
171 static test_return_t var_drizzle_exists_test(void *)
172 {
173 test_compare(0, access("var/drizzle", R_OK | W_OK | X_OK));
174 return TEST_SUCCESS;
175 }
176
177 static test_return_t var_tmp_test(void *)
178 {
179 FILE *file= fopen("var/tmp/junk", "w+");
180 char buffer[1024];
181 test_true(file);
182 fclose(file);
183 return TEST_SUCCESS;
184 }
185
186 static test_return_t var_run_test(void *)
187 {
188 FILE *file= fopen("var/run/junk", "w+");
189 test_true(file);
190 fclose(file);
191 return TEST_SUCCESS;
192 }
193
194 static test_return_t var_log_test(void *)
195 {
196 FILE *file= fopen("var/log/junk", "w+");
197 test_true(file);
198 fclose(file);
199 return TEST_SUCCESS;
200 }
201
202 static test_return_t var_drizzle_test(void *)
203 {
204 FILE *file= fopen("var/drizzle/junk", "w+");
205 test_true(file);
206 fclose(file);
207 return TEST_SUCCESS;
208 }
209
210 static test_return_t var_tmp_rm_test(void *)
211 {
212 test_true(unlink("var/tmp/junk") == 0);
213 return TEST_SUCCESS;
214 }
215
216 static test_return_t var_run_rm_test(void *)
217 {
218 test_true(unlink("var/run/junk") == 0);
219 return TEST_SUCCESS;
220 }
221
222 static test_return_t var_log_rm_test(void *)
223 {
224 test_true(unlink("var/log/junk") == 0);
225 return TEST_SUCCESS;
226 }
227
228 static test_return_t var_drizzle_rm_test(void *)
229 {
230 test_true(unlink("var/drizzle/junk") == 0);
231 return TEST_SUCCESS;
232 }
233
234 static test_return_t _compare_test_return_t_test(void *)
235 {
236 test_compare(TEST_SUCCESS, TEST_SUCCESS);
237
238 return TEST_SUCCESS;
239 }
240
241 static test_return_t _compare_memcached_return_t_test(void *)
242 {
243 test_skip(HAVE_LIBMEMCACHED, true);
244 #if defined(HAVE_LIBMEMCACHED) && HAVE_LIBMEMCACHED
245 test_compare(MEMCACHED_SUCCESS, MEMCACHED_SUCCESS);
246 #endif
247
248 return TEST_SUCCESS;
249 }
250
251 static test_return_t _compare_gearman_return_t_test(void *)
252 {
253 test_skip(HAVE_LIBGEARMAN, true);
254 #if defined(HAVE_LIBGEARMAN) && HAVE_LIBGEARMAN
255 test_compare(GEARMAN_SUCCESS, GEARMAN_SUCCESS);
256 #endif
257
258 return TEST_SUCCESS;
259 }
260
261 static test_return_t drizzled_cycle_test(void *object)
262 {
263 server_startup_st *servers= (server_startup_st*)object;
264 test_true(servers and servers->validate());
265
266 #if defined(HAVE_GEARMAND_BINARY) && HAVE_GEARMAND_BINARY
267 test_true(has_drizzled());
268 #endif
269
270 test_skip(true, has_drizzled());
271
272 test_true(server_startup(*servers, "drizzled", get_free_port(), 0, NULL));
273
274 return TEST_SUCCESS;
275 }
276
277 static test_return_t gearmand_cycle_test(void *object)
278 {
279 server_startup_st *servers= (server_startup_st*)object;
280 test_true(servers and servers->validate());
281
282 #if defined(HAVE_GEARMAND_BINARY) && HAVE_GEARMAND_BINARY
283 test_true(has_gearmand());
284 #endif
285
286 test_skip(true, has_gearmand());
287
288 test_true(server_startup(*servers, "gearmand", get_free_port(), 0, NULL));
289
290 return TEST_SUCCESS;
291 }
292
293 static test_return_t memcached_light_cycle_TEST(void *object)
294 {
295 server_startup_st *servers= (server_startup_st*)object;
296 test_true(servers);
297
298 test_skip(true, bool(HAVE_MEMCACHED_LIGHT_BINARY));
299
300 test_true(server_startup(*servers, "memcached-light", get_free_port(), 0, NULL));
301
302 return TEST_SUCCESS;
303 }
304
305 static test_return_t skip_shim(bool a, bool b)
306 {
307 test_skip(a, b);
308 return TEST_SUCCESS;
309 }
310
311 static test_return_t test_skip_true_TEST(void *object)
312 {
313 test_compare(true, true);
314 test_compare(false, false);
315 test_compare(TEST_SUCCESS, skip_shim(true, true));
316 test_compare(TEST_SUCCESS, skip_shim(false, false));
317
318 return TEST_SUCCESS;
319 }
320
321 static test_return_t test_skip_false_TEST(void *object)
322 {
323 test_compare(TEST_SKIPPED, skip_shim(true, false));
324 test_compare(TEST_SKIPPED, skip_shim(false, true));
325 return TEST_SUCCESS;
326 }
327
328 static test_return_t memcached_cycle_test(void *object)
329 {
330 server_startup_st *servers= (server_startup_st*)object;
331 test_true(servers);
332
333 if (MEMCACHED_BINARY and HAVE_LIBMEMCACHED)
334 {
335 test_true(has_memcached());
336 test_true(server_startup(*servers, "memcached", get_free_port(), 0, NULL));
337
338 return TEST_SUCCESS;
339 }
340
341 return TEST_SKIPPED;
342 }
343
344 static test_return_t memcached_socket_cycle_test(void *object)
345 {
346 server_startup_st *servers= (server_startup_st*)object;
347 test_true(servers);
348
349 if (MEMCACHED_BINARY)
350 {
351 if (HAVE_LIBMEMCACHED)
352 {
353 test_true(has_memcached());
354 test_true(servers->start_socket_server("memcached", get_free_port(), 0, NULL));
355
356 return TEST_SUCCESS;
357 }
358 }
359
360 return TEST_SKIPPED;
361 }
362
363 static test_return_t memcached_sasl_test(void *object)
364 {
365 server_startup_st *servers= (server_startup_st*)object;
366 test_true(servers);
367
368 test_skip(false, bool(getenv("TESTS_ENVIRONMENT")));
369
370 if (MEMCACHED_SASL_BINARY)
371 {
372 if (HAVE_LIBMEMCACHED)
373 {
374 test_true(has_memcached_sasl());
375 test_true(server_startup(*servers, "memcached-sasl", get_free_port(), 0, NULL));
376
377 return TEST_SUCCESS;
378 }
379 }
380
381 return TEST_SKIPPED;
382 }
383
384 static test_return_t application_true_BINARY(void *)
385 {
386 Application true_app("true");
387
388 test_compare(Application::SUCCESS, true_app.run());
389 test_compare(Application::SUCCESS, true_app.wait());
390
391 return TEST_SUCCESS;
392 }
393
394 static test_return_t application_gdb_true_BINARY2(void *)
395 {
396 test_skip(0, access("/usr/bin/gdb", X_OK ));
397 Application true_app("true");
398 true_app.use_gdb();
399
400 test_compare(Application::SUCCESS, true_app.run());
401 test_compare(Application::SUCCESS, true_app.wait());
402
403 return TEST_SUCCESS;
404 }
405
406 static test_return_t application_gdb_true_BINARY(void *)
407 {
408 test_skip(0, access("/usr/bin/gdb", X_OK ));
409 Application true_app("true");
410 true_app.use_gdb();
411
412 const char *args[]= { "--fubar", 0 };
413 test_compare(Application::SUCCESS, true_app.run(args));
414 test_compare(Application::SUCCESS, true_app.wait());
415
416 return TEST_SUCCESS;
417 }
418
419 static test_return_t application_true_fubar_BINARY(void *)
420 {
421 Application true_app("true");
422
423 const char *args[]= { "--fubar", 0 };
424 test_compare(Application::SUCCESS, true_app.run(args));
425 test_compare(Application::SUCCESS, true_app.wait());
426 test_compare(0, true_app.stdout_result().size());
427
428 return TEST_SUCCESS;
429 }
430
431 static test_return_t application_doesnotexist_BINARY(void *)
432 {
433
434 test_skip_valgrind();
435 Application true_app("doesnotexist");
436 true_app.will_fail();
437
438 const char *args[]= { "--fubar", 0 };
439 #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
440 test_compare(Application::INVALID, true_app.run(args));
441 #else
442 test_compare(Application::SUCCESS, true_app.run(args));
443 test_compare(Application::INVALID, true_app.wait(false));
444 #endif
445
446 test_compare(0, true_app.stdout_result().size());
447
448 return TEST_SUCCESS;
449 }
450
451 static test_return_t application_true_fubar_eq_doh_BINARY(void *)
452 {
453 Application true_app("true");
454
455 const char *args[]= { "--fubar=doh", 0 };
456 test_compare(Application::SUCCESS, true_app.run(args));
457 test_compare(Application::SUCCESS, true_app.wait());
458 test_compare(0, true_app.stdout_result().size());
459
460 return TEST_SUCCESS;
461 }
462
463 static test_return_t application_true_fubar_eq_doh_option_BINARY(void *)
464 {
465 Application true_app("true");
466
467 true_app.add_option("--fubar=", "doh");
468
469 test_compare(Application::SUCCESS, true_app.run());
470 test_compare(Application::SUCCESS, true_app.wait());
471 test_compare(0, true_app.stdout_result().size());
472
473 return TEST_SUCCESS;
474 }
475
476
477 static test_return_t GET_TEST(void *)
478 {
479 libtest::http::GET get("http://foo.example.com/");
480
481 test_compare(false, get.execute());
482
483 return TEST_SUCCESS;
484 }
485
486 static test_return_t POST_TEST(void *)
487 {
488 libtest::vchar_t body;
489 libtest::http::POST post("http://foo.example.com/", body);
490
491 test_compare(false, post.execute());
492
493 return TEST_SUCCESS;
494 }
495
496 static test_return_t TRACE_TEST(void *)
497 {
498 libtest::vchar_t body;
499 libtest::http::TRACE trace("http://foo.example.com/", body);
500
501 test_compare(false, trace.execute());
502
503 return TEST_SUCCESS;
504 }
505
506
507 static test_return_t vchar_t_TEST(void *)
508 {
509 libtest::vchar_t response;
510 libtest::make_vector(response, test_literal_param("fubar\n"));
511 test_compare(response, response);
512
513 return TEST_SUCCESS;
514 }
515
516 static test_return_t vchar_t_compare_neg_TEST(void *)
517 {
518 libtest::vchar_t response;
519 libtest::vchar_t response2;
520 libtest::make_vector(response, test_literal_param("fubar\n"));
521 libtest::make_vector(response2, test_literal_param(__func__));
522 test_true(response != response2);
523
524 return TEST_SUCCESS;
525 }
526
527 static test_return_t application_echo_fubar_BINARY(void *)
528 {
529 Application true_app("echo");
530
531 const char *args[]= { "fubar", 0 };
532 test_compare(Application::SUCCESS, true_app.run(args));
533 test_compare(Application::SUCCESS, true_app.wait());
534
535 while (true_app.slurp() == false) {} ;
536
537 libtest::vchar_t response;
538 make_vector(response, test_literal_param("fubar\n"));
539 test_compare(response, true_app.stdout_result());
540
541 return TEST_SUCCESS;
542 }
543
544 static test_return_t application_echo_fubar_BINARY2(void *)
545 {
546 Application true_app("echo");
547
548 true_app.add_option("fubar");
549
550 test_compare(Application::SUCCESS, true_app.run());
551 test_compare(Application::SUCCESS, true_app.wait(false));
552
553 libtest::vchar_t response;
554 make_vector(response, test_literal_param("fubar\n"));
555 test_compare(response, true_app.stdout_result());
556
557 return TEST_SUCCESS;
558 }
559
560 static test_return_t true_BINARY(void *)
561 {
562 const char *args[]= { 0 };
563 test_compare(EXIT_SUCCESS, exec_cmdline("true", args));
564
565 return TEST_SUCCESS;
566 }
567
568 static test_return_t true_fubar_BINARY(void *)
569 {
570 const char *args[]= { "--fubar", 0 };
571 test_compare(EXIT_SUCCESS, exec_cmdline("true", args));
572
573 return TEST_SUCCESS;
574 }
575
576 static test_return_t echo_fubar_BINARY(void *)
577 {
578 const char *args[]= { "fubar", 0 };
579 test_compare(EXIT_SUCCESS, exec_cmdline("echo", args));
580
581 return TEST_SUCCESS;
582 }
583
584 static test_return_t wait_BINARY(void *)
585 {
586 const char *args[]= { "--quiet", 0 };
587
588 test_compare(EXIT_FAILURE, exec_cmdline("libtest/wait", args, true));
589
590 return TEST_SUCCESS;
591 }
592
593 static test_return_t wait_help_BINARY(void *)
594 {
595 const char *args[]= { "--quiet", "--help", 0 };
596
597 test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
598
599 return TEST_SUCCESS;
600 }
601
602 static test_return_t wait_version_BINARY(void *)
603 {
604 const char *args[]= { "--quiet", "--version", 0 };
605
606 test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
607
608 return TEST_SUCCESS;
609 }
610
611 static test_return_t wait_services_BINARY(void *)
612 {
613 test_skip(0, access("/etc/services", R_OK ));
614
615 const char *args[]= { "--quiet", "/etc/services", 0 };
616
617 test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
618
619 return TEST_SUCCESS;
620 }
621
622 static test_return_t wait_services_BINARY2(void *)
623 {
624 test_skip(0, access("/etc/services", R_OK ));
625
626 const char *args[]= { "/etc/services", 0 };
627
628 test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
629
630 return TEST_SUCCESS;
631 }
632
633 static test_return_t wait_services_appliction_TEST(void *)
634 {
635 test_skip(0, access("/usr/bin/gdb", X_OK ));
636 test_skip(0, access("/etc/services", R_OK ));
637
638 libtest::Application wait_app("libtest/wait", true);
639 wait_app.use_gdb();
640
641 const char *args[]= { "/etc/services", 0 };
642 test_compare(Application::SUCCESS, wait_app.run(args));
643 test_compare(Application::SUCCESS, wait_app.wait());
644
645 return TEST_SUCCESS;
646 }
647
648 static test_return_t gdb_wait_services_appliction_TEST(void *)
649 {
650 test_skip(true, false);
651 #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
652 test_skip(0, TARGET_OS_OSX);
653 #endif
654
655 test_skip(0, access("/usr/bin/gdb", X_OK ));
656 test_skip(0, access("/etc/services", R_OK ));
657
658 libtest::Application wait_app("libtest/wait", true);
659 wait_app.use_gdb();
660
661 const char *args[]= { "/etc/services", 0 };
662 test_compare(Application::SUCCESS, wait_app.run(args));
663 test_compare(Application::SUCCESS, wait_app.wait());
664
665 return TEST_SUCCESS;
666 }
667
668 static test_return_t gdb_abort_services_appliction_TEST(void *)
669 {
670 test_skip(true, false);
671 test_skip(0, access("/usr/bin/gdb", X_OK ));
672
673 #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
674 test_skip(0, TARGET_OS_OSX);
675 #endif
676
677 libtest::Application abort_app("libtest/abort", true);
678 abort_app.use_gdb();
679
680 test_compare(Application::SUCCESS, abort_app.run());
681 test_compare(Application::SUCCESS, abort_app.wait());
682
683 std::string gdb_filename= abort_app.gdb_filename();
684 test_skip(0, access(gdb_filename.c_str(), R_OK ));
685 const char *args[]= { "SIGABRT", gdb_filename.c_str(), 0 };
686 test_compare(EXIT_SUCCESS, exec_cmdline("grep", args));
687
688 // Sanity test
689 args[0]= "THIS_WILL_NOT_BE_FOUND";
690 test_compare(EXIT_FAILURE, exec_cmdline("grep", args));
691
692 return TEST_SUCCESS;
693 }
694
695 static test_return_t get_free_port_TEST(void *)
696 {
697 in_port_t ret_port;
698 test_true((ret_port= get_free_port()));
699 test_true(get_free_port() != default_port());
700 test_true(get_free_port() != get_free_port());
701
702 return TEST_SUCCESS;
703 }
704
705 static uint32_t fatal_calls= 0;
706
707 static test_return_t fatal_TEST(void *)
708 {
709 test_compare(fatal_calls++, fatal::disabled_counter());
710 throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "Testing va_args based fatal(): %d", 10);
711
712 return TEST_SUCCESS;
713 }
714
715 static test_return_t number_of_cpus_TEST(void *)
716 {
717 test_true(number_of_cpus() >= 1);
718
719 return TEST_SUCCESS;
720 }
721
722 static test_return_t check_dns_TEST(void *)
723 {
724 test_warn_hint(libtest::check_dns(), "Broken DNS server/no DNS server found");
725
726 return TEST_SUCCESS;
727 }
728
729 static test_return_t lookup_true_TEST(void *)
730 {
731 test_warn_hint(libtest::lookup("exist.gearman.info"), "dns is not currently working");
732 return TEST_SUCCESS;
733 }
734
735 static test_return_t lookup_false_TEST(void *)
736 {
737 if (libtest::lookup("does_not_exist.gearman.info"))
738 {
739 Error << "Broken DNS server detected";
740 return TEST_SKIPPED;
741 }
742
743 return TEST_SUCCESS;
744 }
745
746 static test_return_t create_tmpfile_TEST(void *)
747 {
748 std::string tmp= create_tmpfile(__func__);
749 test_compare(-1, access(tmp.c_str(), R_OK));
750 test_compare(-1, access(tmp.c_str(), F_OK));
751
752 Application touch_app("touch");
753 const char *args[]= { tmp.c_str(), 0 };
754 test_compare(Application::SUCCESS, touch_app.run(args));
755 test_compare(Application::SUCCESS, touch_app.wait(false));
756
757 test_compare(0, access(tmp.c_str(), R_OK));
758 test_compare(0, unlink(tmp.c_str()));
759
760 return TEST_SUCCESS;
761 }
762
763 static test_return_t fatal_message_TEST(void *)
764 {
765 test_compare(fatal_calls++, fatal::disabled_counter());
766 fatal_message("Fatal test");
767
768 return TEST_SUCCESS;
769 }
770
771 static test_return_t default_port_TEST(void *)
772 {
773 in_port_t ret_port= default_port();
774 test_compare(ret_port, libtest::default_port());
775 test_compare(ret_port, libtest::default_port());
776
777 return TEST_SUCCESS;
778 }
779
780 static test_return_t check_for_gearman(void *)
781 {
782 test_skip(true, HAVE_LIBGEARMAN);
783 test_skip(true, has_gearmand());
784 return TEST_SUCCESS;
785 }
786
787 static test_return_t check_for_drizzle(void *)
788 {
789 test_skip(true, HAVE_LIBDRIZZLE);
790 test_skip(true, has_drizzled());
791 return TEST_SUCCESS;
792 }
793
794
795 test_st drizzled_tests[] ={
796 {"drizzled startup-shutdown", 0, drizzled_cycle_test },
797 {0, 0, 0}
798 };
799
800 test_st gearmand_tests[] ={
801 #if 0
802 {"pause", 0, pause_test },
803 #endif
804 {"gearmand startup-shutdown", 0, gearmand_cycle_test },
805 {"_compare(gearman_return_t)", 0, _compare_gearman_return_t_test },
806 {0, 0, 0}
807 };
808
809 static test_return_t check_for_libmemcached(void *)
810 {
811 test_skip(true, HAVE_LIBMEMCACHED);
812 test_skip(true, has_memcached());
813 return TEST_SUCCESS;
814 }
815
816 test_st memcached_tests[] ={
817 {"memcached startup-shutdown", 0, memcached_cycle_test },
818 {"memcached-light startup-shutdown", 0, memcached_light_cycle_TEST },
819 {"memcached(socket file) startup-shutdown", 0, memcached_socket_cycle_test },
820 {"memcached_sasl() startup-shutdown", 0, memcached_sasl_test },
821 {"_compare(memcached_return_t)", 0, _compare_memcached_return_t_test },
822 {0, 0, 0}
823 };
824
825 test_st test_skip_TESTS[] ={
826 {"true, true", 0, test_skip_true_TEST },
827 {"true, false", 0, test_skip_false_TEST },
828 {0, 0, 0}
829 };
830
831 test_st environment_tests[] ={
832 {"LIBTOOL_COMMAND", 0, LIBTOOL_COMMAND_test },
833 {"VALGRIND_COMMAND", 0, VALGRIND_COMMAND_test },
834 {"HELGRIND_COMMAND", 0, HELGRIND_COMMAND_test },
835 {"GDB_COMMAND", 0, GDB_COMMAND_test },
836 {0, 0, 0}
837 };
838
839 test_st tests_log[] ={
840 {"TEST_SUCCESS", false, test_success_test },
841 {"TEST_FAILURE", false, test_failure_test },
842 {"TEST_SUCCESS == 0", false, test_success_equals_one_test },
843 {0, 0, 0}
844 };
845
846 test_st local_log[] ={
847 {"test_is_local()", 0, local_test },
848 {"test_is_local(NOT)", 0, local_not_test },
849 {0, 0, 0}
850 };
851
852 test_st directories_tests[] ={
853 {"var exists", 0, var_exists_test },
854 {"var/tmp exists", 0, var_tmp_exists_test },
855 {"var/run exists", 0, var_run_exists_test },
856 {"var/log exists", 0, var_log_exists_test },
857 {"var/drizzle exists", 0, var_drizzle_exists_test },
858 {"var/tmp", 0, var_tmp_test },
859 {"var/run", 0, var_run_test },
860 {"var/log", 0, var_log_test },
861 {"var/drizzle", 0, var_drizzle_test },
862 {"var/tmp rm", 0, var_tmp_rm_test },
863 {"var/run rm", 0, var_run_rm_test },
864 {"var/log rm", 0, var_log_rm_test },
865 {"var/drizzle rm", 0, var_drizzle_rm_test },
866 {0, 0, 0}
867 };
868
869 test_st comparison_tests[] ={
870 {"_compare(test_return_t)", 0, _compare_test_return_t_test },
871 {0, 0, 0}
872 };
873
874 test_st cmdline_tests[] ={
875 {"true", 0, true_BINARY },
876 {"true --fubar", 0, true_fubar_BINARY },
877 {"echo fubar", 0, echo_fubar_BINARY },
878 {"wait --quiet", 0, wait_BINARY },
879 {"wait --quiet --help", 0, wait_help_BINARY },
880 {"wait --quiet --version", 0, wait_version_BINARY },
881 {"wait --quiet /etc/services", 0, wait_services_BINARY },
882 {"wait /etc/services", 0, wait_services_BINARY2 },
883 {"wait /etc/services", 0, wait_services_appliction_TEST },
884 {"gdb wait /etc/services", 0, gdb_wait_services_appliction_TEST },
885 {"gdb abort", 0, gdb_abort_services_appliction_TEST },
886 {0, 0, 0}
887 };
888
889 test_st get_free_port_TESTS[] ={
890 {"get_free_port()", 0, get_free_port_TEST },
891 {"default_port()", 0, default_port_TEST },
892 {0, 0, 0}
893 };
894
895 test_st fatal_message_TESTS[] ={
896 {"libtest::fatal", 0, fatal_TEST },
897 {"fatal_message()", 0, fatal_message_TEST },
898 {0, 0, 0}
899 };
900
901 test_st number_of_cpus_TESTS[] ={
902 {"libtest::number_of_cpus()", 0, number_of_cpus_TEST },
903 {0, 0, 0}
904 };
905
906 test_st create_tmpfile_TESTS[] ={
907 {"libtest::create_tmpfile()", 0, create_tmpfile_TEST },
908 {0, 0, 0}
909 };
910
911 test_st dns_TESTS[] ={
912 {"libtest::lookup(true)", 0, lookup_true_TEST },
913 {"libtest::lookup(false)", 0, lookup_false_TEST },
914 {"libtest::check_dns()", 0, check_dns_TEST },
915 {0, 0, 0}
916 };
917
918 test_st application_tests[] ={
919 {"vchar_t", 0, vchar_t_TEST },
920 {"vchar_t compare()", 0, vchar_t_compare_neg_TEST },
921 {"true", 0, application_true_BINARY },
922 {"gbd true --fubar", 0, application_gdb_true_BINARY },
923 {"gbd true", 0, application_gdb_true_BINARY2 },
924 {"true --fubar", 0, application_true_fubar_BINARY },
925 {"doesnotexist --fubar", 0, application_doesnotexist_BINARY },
926 {"true --fubar=doh", 0, application_true_fubar_eq_doh_BINARY },
927 {"true --fubar=doh add_option()", 0, application_true_fubar_eq_doh_option_BINARY },
928 {"echo fubar", 0, application_echo_fubar_BINARY },
929 {"echo fubar (as option)", 0, application_echo_fubar_BINARY2 },
930 {0, 0, 0}
931 };
932
933 static test_return_t check_for_curl(void *)
934 {
935 test_skip(true, HAVE_LIBCURL);
936 return TEST_SUCCESS;
937 }
938
939 static test_return_t disable_fatal_exception(void *)
940 {
941 fatal::disable();
942 return TEST_SUCCESS;
943 }
944
945 static test_return_t enable_fatal_exception(void *)
946 {
947 fatal::disable();
948 return TEST_SUCCESS;
949 }
950
951 test_st http_tests[] ={
952 {"GET", 0, GET_TEST },
953 {"POST", 0, POST_TEST },
954 {"TRACE", 0, TRACE_TEST },
955 {0, 0, 0}
956 };
957
958 collection_st collection[] ={
959 {"environment", 0, 0, environment_tests},
960 {"return values", 0, 0, tests_log},
961 {"test_skip()", 0, 0, test_skip_TESTS },
962 {"local", 0, 0, local_log},
963 {"directories", 0, 0, directories_tests},
964 {"comparison", 0, 0, comparison_tests},
965 {"gearmand", check_for_gearman, 0, gearmand_tests},
966 {"memcached", check_for_libmemcached, 0, memcached_tests},
967 {"drizzled", check_for_drizzle, 0, drizzled_tests},
968 {"cmdline", 0, 0, cmdline_tests},
969 {"application", 0, 0, application_tests},
970 {"http", check_for_curl, 0, http_tests},
971 {"http", check_for_curl, 0, http_tests},
972 {"get_free_port()", 0, 0, get_free_port_TESTS },
973 {"fatal", disable_fatal_exception, enable_fatal_exception, fatal_message_TESTS },
974 {"number_of_cpus()", 0, 0, number_of_cpus_TESTS },
975 {"create_tmpfile()", 0, 0, create_tmpfile_TESTS },
976 {"dns", 0, 0, dns_TESTS },
977 {0, 0, 0, 0}
978 };
979
980 static void *world_create(server_startup_st& servers, test_return_t&)
981 {
982 return &servers;
983 }
984
985 void get_world(Framework *world)
986 {
987 world->collections(collection);
988 world->create(world_create);
989 }