unittest.cc 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  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. #include "gear_config.h"
  37. #include <libtest/test.hpp>
  38. #if defined(LIBTEST_WITH_LIBMEMCACHED_SUPPORT) && LIBTEST_WITH_LIBMEMCACHED_SUPPORT
  39. #include <libmemcached-1.0/memcached.h>
  40. #endif
  41. #if defined(LIBTEST_WITH_LIBGEARMAN_SUPPORT) && LIBTEST_WITH_LIBGEARMAN_SUPPORT
  42. #include <libgearman/gearman.h>
  43. #endif
  44. #include <cstdlib>
  45. #include <unistd.h>
  46. using namespace libtest;
  47. static std::string testing_service;
  48. // Used to track setups where we see if failure is happening
  49. static uint32_t fatal_calls= 0;
  50. static test_return_t LIBTOOL_COMMAND_test(void *)
  51. {
  52. test_true(getenv("LIBTOOL_COMMAND"));
  53. return TEST_SUCCESS;
  54. }
  55. static test_return_t VALGRIND_COMMAND_test(void *)
  56. {
  57. test_true(getenv("VALGRIND_COMMAND"));
  58. return TEST_SUCCESS;
  59. }
  60. static test_return_t HELGRIND_COMMAND_test(void *)
  61. {
  62. test_true(getenv("HELGRIND_COMMAND"));
  63. return TEST_SUCCESS;
  64. }
  65. static test_return_t GDB_COMMAND_test(void *)
  66. {
  67. test_true(getenv("GDB_COMMAND"));
  68. return TEST_SUCCESS;
  69. }
  70. static test_return_t test_success_equals_one_test(void *)
  71. {
  72. test_skip(HAVE_LIBMEMCACHED, 1);
  73. #if defined(HAVE_LIBMEMCACHED) && HAVE_LIBMEMCACHED
  74. test_zero(MEMCACHED_SUCCESS);
  75. #endif
  76. return TEST_SUCCESS;
  77. }
  78. static test_return_t test_success_test(void *)
  79. {
  80. return TEST_SUCCESS;
  81. }
  82. static test_return_t test_failure_test(void *)
  83. {
  84. return TEST_SKIPPED; // Only run this when debugging
  85. test_compare(1, 2);
  86. return TEST_SUCCESS;
  87. }
  88. static test_return_t local_test(void *)
  89. {
  90. if (getenv("LIBTEST_LOCAL"))
  91. {
  92. test_true(test_is_local());
  93. }
  94. else
  95. {
  96. test_false(test_is_local());
  97. }
  98. return TEST_SUCCESS;
  99. }
  100. static test_return_t local_not_test(void *)
  101. {
  102. return TEST_SKIPPED;
  103. std::string temp;
  104. const char *ptr;
  105. if ((ptr= getenv("LIBTEST_LOCAL")) == NULL)
  106. {
  107. temp.append(ptr);
  108. }
  109. // unsetenv() will cause issues with valgrind
  110. _compare(__FILE__, __LINE__, __func__, 0, unsetenv("LIBTEST_LOCAL"), true);
  111. test_compare(0, unsetenv("LIBTEST_LOCAL"));
  112. test_false(test_is_local());
  113. test_compare(0, setenv("LIBTEST_LOCAL", "1", 1));
  114. test_true(test_is_local());
  115. if (temp.empty())
  116. {
  117. test_compare(0, unsetenv("LIBTEST_LOCAL"));
  118. }
  119. else
  120. {
  121. char *old_string= strdup(temp.c_str());
  122. test_compare(0, setenv("LIBTEST_LOCAL", old_string, 1));
  123. }
  124. return TEST_SUCCESS;
  125. }
  126. static test_return_t var_exists_test(void *)
  127. {
  128. test_compare(0, access("var", R_OK | W_OK | X_OK));
  129. return TEST_SUCCESS;
  130. }
  131. static test_return_t var_tmp_exists_test(void *)
  132. {
  133. test_compare(0, access("var/tmp", R_OK | W_OK | X_OK));
  134. return TEST_SUCCESS;
  135. }
  136. static test_return_t var_run_exists_test(void *)
  137. {
  138. test_compare(0, access("var/run", R_OK | W_OK | X_OK));
  139. return TEST_SUCCESS;
  140. }
  141. static test_return_t var_log_exists_test(void *)
  142. {
  143. test_compare(0, access("var/log", R_OK | W_OK | X_OK));
  144. return TEST_SUCCESS;
  145. }
  146. static test_return_t var_drizzle_exists_test(void *)
  147. {
  148. test_compare(0, access("var/drizzle", R_OK | W_OK | X_OK));
  149. return TEST_SUCCESS;
  150. }
  151. static test_return_t var_tmp_test(void *)
  152. {
  153. FILE *file= fopen("var/tmp/junk", "w+");
  154. test_true(file);
  155. fclose(file);
  156. return TEST_SUCCESS;
  157. }
  158. static test_return_t var_run_test(void *)
  159. {
  160. FILE *file= fopen("var/run/junk", "w+");
  161. test_true(file);
  162. fclose(file);
  163. return TEST_SUCCESS;
  164. }
  165. static test_return_t var_log_test(void *)
  166. {
  167. FILE *file= fopen("var/log/junk", "w+");
  168. test_true(file);
  169. fclose(file);
  170. return TEST_SUCCESS;
  171. }
  172. static test_return_t var_drizzle_test(void *)
  173. {
  174. FILE *file= fopen("var/drizzle/junk", "w+");
  175. test_true(file);
  176. fclose(file);
  177. return TEST_SUCCESS;
  178. }
  179. static test_return_t var_tmp_rm_test(void *)
  180. {
  181. test_true(unlink("var/tmp/junk") == 0);
  182. return TEST_SUCCESS;
  183. }
  184. static test_return_t var_run_rm_test(void *)
  185. {
  186. test_true(unlink("var/run/junk") == 0);
  187. return TEST_SUCCESS;
  188. }
  189. static test_return_t var_log_rm_test(void *)
  190. {
  191. test_true(unlink("var/log/junk") == 0);
  192. return TEST_SUCCESS;
  193. }
  194. static test_return_t var_drizzle_rm_test(void *)
  195. {
  196. test_true(unlink("var/drizzle/junk") == 0);
  197. return TEST_SUCCESS;
  198. }
  199. static test_return_t _compare_test_return_t_test(void *)
  200. {
  201. test_compare(TEST_SUCCESS, TEST_SUCCESS);
  202. return TEST_SUCCESS;
  203. }
  204. static test_return_t _compare_memcached_return_t_test(void *)
  205. {
  206. test_skip(HAVE_LIBMEMCACHED, true);
  207. #if defined(HAVE_LIBMEMCACHED) && HAVE_LIBMEMCACHED
  208. test_compare(MEMCACHED_SUCCESS, MEMCACHED_SUCCESS);
  209. #endif
  210. return TEST_SUCCESS;
  211. }
  212. static test_return_t _compare_gearman_return_t_test(void *)
  213. {
  214. test_skip(HAVE_LIBGEARMAN, true);
  215. #if defined(HAVE_LIBGEARMAN) && HAVE_LIBGEARMAN
  216. test_compare(GEARMAN_SUCCESS, GEARMAN_SUCCESS);
  217. #endif
  218. return TEST_SUCCESS;
  219. }
  220. static test_return_t drizzled_cycle_test(void *object)
  221. {
  222. server_startup_st *servers= (server_startup_st*)object;
  223. test_true(servers and servers->validate());
  224. #if defined(HAVE_GEARMAND_BINARY) && HAVE_GEARMAND_BINARY
  225. test_true(has_drizzled());
  226. #endif
  227. test_skip(true, has_drizzled());
  228. test_skip(true, server_startup(*servers, "drizzled", get_free_port(), 0, NULL, false));
  229. return TEST_SUCCESS;
  230. }
  231. static test_return_t gearmand_cycle_test(void *object)
  232. {
  233. server_startup_st *servers= (server_startup_st*)object;
  234. test_true(servers and servers->validate());
  235. test_skip(true, has_gearmand());
  236. test_skip(true, server_startup(*servers, "gearmand", get_free_port(), 0, NULL, false));
  237. servers->clear();
  238. return TEST_SUCCESS;
  239. }
  240. static test_return_t skip_shim(bool a, bool b)
  241. {
  242. test_skip(a, b);
  243. return TEST_SUCCESS;
  244. }
  245. static test_return_t test_skip_true_TEST(void*)
  246. {
  247. test_compare(true, true);
  248. test_compare(false, false);
  249. test_compare(TEST_SUCCESS, skip_shim(true, true));
  250. test_compare(TEST_SUCCESS, skip_shim(false, false));
  251. return TEST_SUCCESS;
  252. }
  253. static test_return_t test_skip_false_TEST(void*)
  254. {
  255. test_compare(TEST_SKIPPED, skip_shim(true, false));
  256. test_compare(TEST_SKIPPED, skip_shim(false, true));
  257. return TEST_SUCCESS;
  258. }
  259. static test_return_t server_startup_fail_TEST(void *object)
  260. {
  261. server_startup_st *servers= (server_startup_st*)object;
  262. test_true(servers);
  263. fatal::disable();
  264. test_compare(servers->start_server(testing_service, LIBTEST_FAIL_PORT, 0, NULL, false), true);
  265. fatal::enable();
  266. return TEST_SUCCESS;
  267. }
  268. static test_return_t server_startup_TEST(void *object)
  269. {
  270. server_startup_st *servers= (server_startup_st*)object;
  271. test_true(servers);
  272. test_compare(servers->start_server(testing_service, get_free_port(), 0, NULL, false), true);
  273. test_true(servers->last());
  274. pid_t last_pid= servers->last()->pid();
  275. test_compare(servers->last()->pid(), last_pid);
  276. test_true(last_pid > 1);
  277. test_compare(kill(last_pid, 0), 0);
  278. test_true(servers->shutdown());
  279. #if 0
  280. test_compare(servers->last()->pid(), -1);
  281. test_compare(kill(last_pid, 0), -1);
  282. #endif
  283. return TEST_SUCCESS;
  284. }
  285. static test_return_t socket_server_startup_TEST(void *object)
  286. {
  287. server_startup_st *servers= (server_startup_st*)object;
  288. test_true(servers);
  289. test_true(servers->start_socket_server(testing_service, get_free_port(), 0, NULL, false));
  290. return TEST_SUCCESS;
  291. }
  292. #if 0
  293. static test_return_t memcached_sasl_test(void *object)
  294. {
  295. server_startup_st *servers= (server_startup_st*)object;
  296. test_true(servers);
  297. test_skip(false, bool(getenv("TESTS_ENVIRONMENT")));
  298. if (MEMCACHED_SASL_BINARY)
  299. {
  300. if (HAVE_LIBMEMCACHED)
  301. {
  302. test_true(has_memcached_sasl());
  303. test_true(server_startup(*servers, "memcached-sasl", get_free_port(), 0, NULL, false));
  304. return TEST_SUCCESS;
  305. }
  306. }
  307. return TEST_SKIPPED;
  308. }
  309. #endif
  310. static test_return_t application_true_BINARY(void *)
  311. {
  312. test_skip(0, access("/usr/bin/true", X_OK ));
  313. Application true_app("/usr/bin/true");
  314. test_compare(Application::SUCCESS, true_app.run());
  315. test_compare(Application::SUCCESS, true_app.join());
  316. return TEST_SUCCESS;
  317. }
  318. static test_return_t application_gdb_true_BINARY2(void *)
  319. {
  320. test_skip(0, access("/usr/bin/gdb", X_OK ));
  321. Application true_app("/usr/bin/true");
  322. true_app.use_gdb();
  323. test_compare(Application::SUCCESS, true_app.run());
  324. test_compare(Application::SUCCESS, true_app.join());
  325. return TEST_SUCCESS;
  326. }
  327. static test_return_t application_gdb_true_BINARY(void *)
  328. {
  329. test_skip(0, access("/usr/bin/gdb", X_OK ));
  330. Application true_app("/usr/bin/true");
  331. true_app.use_gdb();
  332. const char *args[]= { "--fubar", 0 };
  333. test_compare(Application::SUCCESS, true_app.run(args));
  334. test_compare(Application::SUCCESS, true_app.join());
  335. return TEST_SUCCESS;
  336. }
  337. static test_return_t application_true_fubar_BINARY(void *)
  338. {
  339. test_skip(0, access("/usr/bin/true", X_OK ));
  340. Application true_app("/usr/bin/true");
  341. const char *args[]= { "--fubar", 0 };
  342. test_compare(Application::SUCCESS, true_app.run(args));
  343. test_compare(Application::SUCCESS, true_app.join());
  344. test_zero(true_app.stdout_result().size());
  345. return TEST_SUCCESS;
  346. }
  347. static test_return_t application_doesnotexist_BINARY(void *)
  348. {
  349. test_skip_valgrind();
  350. Application true_app("doesnotexist");
  351. true_app.will_fail();
  352. const char *args[]= { "--fubar", 0 };
  353. #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
  354. test_compare(Application::INVALID_POSIX_SPAWN, true_app.run(args));
  355. #else
  356. test_compare(Application::SUCCESS, true_app.run(args));
  357. test_compare(Application::INVALID_POSIX_SPAWN, true_app.join());
  358. #endif
  359. test_zero(true_app.stdout_result().size());
  360. return TEST_SUCCESS;
  361. }
  362. static test_return_t GET_TEST(void *)
  363. {
  364. libtest::http::GET get("http://foo.example.com/");
  365. test_compare(false, get.execute());
  366. return TEST_SUCCESS;
  367. }
  368. static test_return_t POST_TEST(void *)
  369. {
  370. libtest::vchar_t body;
  371. libtest::http::POST post("http://foo.example.com/", body);
  372. test_compare(false, post.execute());
  373. return TEST_SUCCESS;
  374. }
  375. static test_return_t TRACE_TEST(void *)
  376. {
  377. libtest::vchar_t body;
  378. libtest::http::TRACE trace("http://foo.example.com/", body);
  379. test_compare(false, trace.execute());
  380. return TEST_SUCCESS;
  381. }
  382. static test_return_t vchar_t_TEST(void *)
  383. {
  384. libtest::vchar_t response;
  385. libtest::make_vector(response, test_literal_param("fubar\n"));
  386. test_compare(response, response);
  387. return TEST_SUCCESS;
  388. }
  389. static test_return_t vchar_t_compare_neg_TEST(void *)
  390. {
  391. libtest::vchar_t response;
  392. libtest::vchar_t response2;
  393. libtest::make_vector(response, test_literal_param("fubar\n"));
  394. libtest::make_vector(response2, test_literal_param(__func__));
  395. test_true(response != response2);
  396. return TEST_SUCCESS;
  397. }
  398. static test_return_t application_echo_fubar_BINARY(void *)
  399. {
  400. if (0)
  401. {
  402. test_skip(0, access("/bin/echo", X_OK ));
  403. Application true_app("/bin/echo");
  404. const char *args[]= { "fubar", 0 };
  405. test_compare(Application::SUCCESS, true_app.run(args));
  406. while (true_app.slurp() == false) {} ;
  407. libtest::vchar_t response;
  408. make_vector(response, test_literal_param("fubar\n"));
  409. test_compare(response, true_app.stdout_result());
  410. }
  411. return TEST_SUCCESS;
  412. }
  413. static test_return_t application_echo_fubar_BINARY2(void *)
  414. {
  415. if (0)
  416. {
  417. test_skip(0, access("/bin/echo", X_OK ));
  418. Application true_app("/bin/echo");
  419. true_app.add_option("fubar");
  420. test_compare(Application::SUCCESS, true_app.run());
  421. test_compare(Application::SUCCESS, true_app.join());
  422. libtest::vchar_t response;
  423. make_vector(response, test_literal_param("fubar\n"));
  424. test_compare(response, true_app.stdout_result());
  425. }
  426. return TEST_SUCCESS;
  427. }
  428. static test_return_t echo_fubar_BINARY(void *)
  429. {
  430. const char *args[]= { "fubar", 0 };
  431. test_compare(EXIT_SUCCESS, exec_cmdline("/bin/echo", args));
  432. return TEST_SUCCESS;
  433. }
  434. static test_return_t core_count_BINARY(void *)
  435. {
  436. const char *args[]= { 0 };
  437. test_compare(EXIT_SUCCESS, exec_cmdline("libtest/core-count", args, true));
  438. return TEST_SUCCESS;
  439. }
  440. static test_return_t wait_BINARY(void *)
  441. {
  442. const char *args[]= { "--quiet", 0 };
  443. test_compare(EXIT_FAILURE, exec_cmdline("libtest/wait", args, true));
  444. return TEST_SUCCESS;
  445. }
  446. static test_return_t wait_help_BINARY(void *)
  447. {
  448. const char *args[]= { "--quiet", "--help", 0 };
  449. test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
  450. return TEST_SUCCESS;
  451. }
  452. static test_return_t wait_version_BINARY(void *)
  453. {
  454. const char *args[]= { "--quiet", "--version", 0 };
  455. test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
  456. return TEST_SUCCESS;
  457. }
  458. static test_return_t wait_services_BINARY(void *)
  459. {
  460. test_skip(0, access("/etc/services", R_OK ));
  461. const char *args[]= { "--quiet", "/etc/services", 0 };
  462. test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
  463. return TEST_SUCCESS;
  464. }
  465. static test_return_t wait_services_BINARY2(void *)
  466. {
  467. test_skip(0, access("/etc/services", R_OK ));
  468. const char *args[]= { "/etc/services", 0 };
  469. test_compare(EXIT_SUCCESS, exec_cmdline("libtest/wait", args, true));
  470. return TEST_SUCCESS;
  471. }
  472. static test_return_t wait_services_appliction_TEST(void *)
  473. {
  474. test_skip(0, access("/usr/bin/gdb", X_OK ));
  475. test_skip(0, access("/etc/services", R_OK ));
  476. libtest::Application wait_app("libtest/wait", true);
  477. wait_app.use_gdb();
  478. const char *args[]= { "/etc/services", 0 };
  479. test_compare(Application::SUCCESS, wait_app.run(args));
  480. test_compare(Application::SUCCESS, wait_app.join());
  481. return TEST_SUCCESS;
  482. }
  483. static test_return_t gdb_wait_services_appliction_TEST(void *)
  484. {
  485. test_skip(true, false);
  486. #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
  487. test_skip(0, TARGET_OS_OSX);
  488. #endif
  489. test_skip(0, access("/usr/bin/gdb", X_OK ));
  490. test_skip(0, access("/etc/services", R_OK ));
  491. libtest::Application wait_app("libtest/wait", true);
  492. wait_app.use_gdb();
  493. const char *args[]= { "/etc/services", 0 };
  494. test_compare(Application::SUCCESS, wait_app.run(args));
  495. test_compare(Application::SUCCESS, wait_app.join());
  496. return TEST_SUCCESS;
  497. }
  498. static test_return_t gdb_abort_services_appliction_TEST(void *)
  499. {
  500. test_skip(true, false);
  501. test_skip(0, access("/usr/bin/gdb", X_OK ));
  502. #if defined(TARGET_OS_OSX) && TARGET_OS_OSX
  503. test_skip(0, TARGET_OS_OSX);
  504. #endif
  505. libtest::Application abort_app("libtest/abort", true);
  506. abort_app.use_gdb();
  507. test_compare(Application::SUCCESS, abort_app.run());
  508. test_compare(Application::SUCCESS, abort_app.join());
  509. std::string gdb_filename= abort_app.gdb_filename();
  510. test_skip(0, access(gdb_filename.c_str(), R_OK ));
  511. const char *args[]= { "SIGABRT", gdb_filename.c_str(), 0 };
  512. test_compare(EXIT_SUCCESS, exec_cmdline("grep", args));
  513. // Sanity test
  514. args[0]= "THIS_WILL_NOT_BE_FOUND";
  515. test_compare(EXIT_FAILURE, exec_cmdline("grep", args));
  516. return TEST_SUCCESS;
  517. }
  518. static test_return_t get_free_port_TEST(void *)
  519. {
  520. in_port_t ret_port;
  521. test_true((ret_port= get_free_port()));
  522. test_true(get_free_port() != default_port());
  523. test_true(get_free_port() != get_free_port());
  524. return TEST_SUCCESS;
  525. }
  526. static test_return_t fatal_TEST(void *)
  527. {
  528. test_compare(fatal_calls++, fatal::disabled_counter());
  529. throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "Testing va_args based fatal(): %d", 10);
  530. return TEST_SUCCESS;
  531. }
  532. static test_return_t number_of_cpus_TEST(void *)
  533. {
  534. test_true(number_of_cpus() >= 1);
  535. return TEST_SUCCESS;
  536. }
  537. static test_return_t check_dns_TEST(void *)
  538. {
  539. test_warn(libtest::check_dns(), "Broken DNS server/no DNS server found");
  540. return TEST_SUCCESS;
  541. }
  542. static test_return_t Timer_TEST(void *)
  543. {
  544. int64_t minutes= random() % 50;
  545. minutes++;
  546. Timer check;
  547. check.reset();
  548. check.offset(minutes, 2, 200);
  549. test_compare(check.minutes(), minutes);
  550. return TEST_SUCCESS;
  551. }
  552. static test_return_t lookup_true_TEST(void *)
  553. {
  554. test_warn(libtest::lookup("exist.gearman.info"), "dns is not currently working");
  555. return TEST_SUCCESS;
  556. }
  557. static test_return_t lookup_false_TEST(void *)
  558. {
  559. if (libtest::lookup("does_not_exist.gearman.info"))
  560. {
  561. Error << "Broken DNS server detected";
  562. return TEST_SKIPPED;
  563. }
  564. return TEST_SUCCESS;
  565. }
  566. static test_return_t create_tmpfile_TEST(void *)
  567. {
  568. std::string tmp= create_tmpfile(__func__);
  569. test_compare(-1, access(tmp.c_str(), R_OK));
  570. test_compare(-1, access(tmp.c_str(), F_OK));
  571. Application touch_app("/usr/bin/touch");
  572. const char *args[]= { tmp.c_str(), 0 };
  573. test_compare(Application::SUCCESS, touch_app.run(args));
  574. test_compare(Application::SUCCESS, touch_app.join());
  575. test_compare(0, access(tmp.c_str(), R_OK));
  576. test_compare(0, unlink(tmp.c_str()));
  577. return TEST_SUCCESS;
  578. }
  579. static test_return_t fatal_message_TEST(void *)
  580. {
  581. test_compare(fatal_calls++, fatal::disabled_counter());
  582. fatal_message("Fatal test");
  583. return TEST_SUCCESS;
  584. }
  585. static test_return_t default_port_TEST(void *)
  586. {
  587. in_port_t ret_port= default_port();
  588. test_compare(ret_port, libtest::default_port());
  589. test_compare(ret_port, libtest::default_port());
  590. return TEST_SUCCESS;
  591. }
  592. static test_return_t check_for_gearman(void *)
  593. {
  594. test_skip(true, HAVE_LIBGEARMAN);
  595. test_skip(true, has_gearmand());
  596. testing_service= "gearmand";
  597. return TEST_SUCCESS;
  598. }
  599. static test_return_t check_for_drizzle(void *)
  600. {
  601. test_skip(true, HAVE_LIBDRIZZLE);
  602. test_skip(true, has_drizzled());
  603. testing_service= "drizzled";
  604. return TEST_SUCCESS;
  605. }
  606. test_st drizzled_tests[] ={
  607. {"drizzled startup-shutdown", 0, drizzled_cycle_test },
  608. {0, 0, 0}
  609. };
  610. test_st gearmand_tests[] ={
  611. #if 0
  612. {"pause", 0, pause_test },
  613. #endif
  614. {"gearmand startup-shutdown", 0, gearmand_cycle_test },
  615. {"_compare(gearman_return_t)", 0, _compare_gearman_return_t_test },
  616. {"server_startup(fail)", 0, server_startup_fail_TEST },
  617. {0, 0, 0}
  618. };
  619. static test_return_t clear_servers(void* object)
  620. {
  621. server_startup_st *servers= (server_startup_st*)object;
  622. test_true(servers);
  623. servers->clear();
  624. testing_service.clear();
  625. return TEST_SUCCESS;
  626. }
  627. static test_return_t check_for_libmemcached(void* object)
  628. {
  629. test_skip(true, HAVE_LIBMEMCACHED);
  630. test_skip(true, has_memcached());
  631. server_startup_st *servers= (server_startup_st*)object;
  632. test_true(servers);
  633. servers->clear();
  634. testing_service= "memcached";
  635. return TEST_SUCCESS;
  636. }
  637. test_st memcached_TESTS[] ={
  638. {"memcached startup-shutdown", 0, server_startup_TEST },
  639. {"memcached(socket file) startup-shutdown", 0, socket_server_startup_TEST },
  640. {"_compare(memcached_return_t)", 0, _compare_memcached_return_t_test },
  641. {"server_startup(fail)", 0, server_startup_fail_TEST },
  642. {0, 0, 0}
  643. };
  644. test_st test_skip_TESTS[] ={
  645. {"true, true", 0, test_skip_true_TEST },
  646. {"true, false", 0, test_skip_false_TEST },
  647. {0, 0, 0}
  648. };
  649. test_st environment_tests[] ={
  650. {"LIBTOOL_COMMAND", 0, LIBTOOL_COMMAND_test },
  651. {"VALGRIND_COMMAND", 0, VALGRIND_COMMAND_test },
  652. {"HELGRIND_COMMAND", 0, HELGRIND_COMMAND_test },
  653. {"GDB_COMMAND", 0, GDB_COMMAND_test },
  654. {0, 0, 0}
  655. };
  656. test_st tests_log[] ={
  657. {"TEST_SUCCESS", false, test_success_test },
  658. {"TEST_FAILURE", false, test_failure_test },
  659. {"TEST_SUCCESS == 0", false, test_success_equals_one_test },
  660. {0, 0, 0}
  661. };
  662. test_st local_log[] ={
  663. {"test_is_local()", 0, local_test },
  664. {"test_is_local(NOT)", 0, local_not_test },
  665. {0, 0, 0}
  666. };
  667. test_st directories_tests[] ={
  668. {"var exists", 0, var_exists_test },
  669. {"var/tmp exists", 0, var_tmp_exists_test },
  670. {"var/run exists", 0, var_run_exists_test },
  671. {"var/log exists", 0, var_log_exists_test },
  672. {"var/drizzle exists", 0, var_drizzle_exists_test },
  673. {"var/tmp", 0, var_tmp_test },
  674. {"var/run", 0, var_run_test },
  675. {"var/log", 0, var_log_test },
  676. {"var/drizzle", 0, var_drizzle_test },
  677. {"var/tmp rm", 0, var_tmp_rm_test },
  678. {"var/run rm", 0, var_run_rm_test },
  679. {"var/log rm", 0, var_log_rm_test },
  680. {"var/drizzle rm", 0, var_drizzle_rm_test },
  681. {0, 0, 0}
  682. };
  683. test_st comparison_tests[] ={
  684. {"_compare(test_return_t)", 0, _compare_test_return_t_test },
  685. {0, 0, 0}
  686. };
  687. test_st cmdline_tests[] ={
  688. {"echo fubar", 0, echo_fubar_BINARY },
  689. {"core-count", 0, core_count_BINARY },
  690. {"wait --quiet", 0, wait_BINARY },
  691. {"wait --quiet --help", 0, wait_help_BINARY },
  692. {"wait --quiet --version", 0, wait_version_BINARY },
  693. {"wait --quiet /etc/services", 0, wait_services_BINARY },
  694. {"wait /etc/services", 0, wait_services_BINARY2 },
  695. {"wait /etc/services", 0, wait_services_appliction_TEST },
  696. {"gdb wait /etc/services", 0, gdb_wait_services_appliction_TEST },
  697. {"gdb abort", 0, gdb_abort_services_appliction_TEST },
  698. {0, 0, 0}
  699. };
  700. test_st get_free_port_TESTS[] ={
  701. {"get_free_port()", 0, get_free_port_TEST },
  702. {"default_port()", 0, default_port_TEST },
  703. {0, 0, 0}
  704. };
  705. test_st fatal_message_TESTS[] ={
  706. {"libtest::fatal", 0, fatal_TEST },
  707. {"fatal_message()", 0, fatal_message_TEST },
  708. {0, 0, 0}
  709. };
  710. test_st number_of_cpus_TESTS[] ={
  711. {"libtest::number_of_cpus()", 0, number_of_cpus_TEST },
  712. {0, 0, 0}
  713. };
  714. test_st create_tmpfile_TESTS[] ={
  715. {"libtest::create_tmpfile()", 0, create_tmpfile_TEST },
  716. {0, 0, 0}
  717. };
  718. test_st timer_TESTS[] ={
  719. {"libtest::Timer", 0, Timer_TEST },
  720. {0, 0, 0}
  721. };
  722. test_st dns_TESTS[] ={
  723. {"libtest::lookup(true)", 0, lookup_true_TEST },
  724. {"libtest::lookup(false)", 0, lookup_false_TEST },
  725. {"libtest::check_dns()", 0, check_dns_TEST },
  726. {0, 0, 0}
  727. };
  728. test_st application_tests[] ={
  729. {"vchar_t", 0, vchar_t_TEST },
  730. {"vchar_t compare()", 0, vchar_t_compare_neg_TEST },
  731. {"true", 0, application_true_BINARY },
  732. {"gbd true --fubar", 0, application_gdb_true_BINARY },
  733. {"gbd true", 0, application_gdb_true_BINARY2 },
  734. {"true --fubar", 0, application_true_fubar_BINARY },
  735. {"doesnotexist --fubar", 0, application_doesnotexist_BINARY },
  736. {"echo fubar", 0, application_echo_fubar_BINARY },
  737. {"echo fubar (as option)", 0, application_echo_fubar_BINARY2 },
  738. {0, 0, 0}
  739. };
  740. static test_return_t check_for_curl(void *)
  741. {
  742. test_skip(true, HAVE_LIBCURL);
  743. return TEST_SUCCESS;
  744. }
  745. static test_return_t disable_fatal_exception(void *)
  746. {
  747. fatal_calls= 0;
  748. fatal::disable();
  749. return TEST_SUCCESS;
  750. }
  751. static test_return_t enable_fatal_exception(void *)
  752. {
  753. fatal::enable();
  754. return TEST_SUCCESS;
  755. }
  756. test_st http_tests[] ={
  757. {"GET", 0, GET_TEST },
  758. {"POST", 0, POST_TEST },
  759. {"TRACE", 0, TRACE_TEST },
  760. {0, 0, 0}
  761. };
  762. collection_st collection[] ={
  763. {"environment", 0, 0, environment_tests},
  764. {"return values", 0, 0, tests_log},
  765. {"test_skip()", 0, 0, test_skip_TESTS },
  766. {"local", 0, 0, local_log},
  767. {"directories", 0, 0, directories_tests},
  768. {"comparison", 0, 0, comparison_tests},
  769. {"gearmand", check_for_gearman, clear_servers, gearmand_tests},
  770. {"memcached", check_for_libmemcached, clear_servers, memcached_TESTS },
  771. {"drizzled", check_for_drizzle, clear_servers, drizzled_tests},
  772. {"cmdline", 0, 0, cmdline_tests},
  773. {"application", 0, 0, application_tests},
  774. {"http", check_for_curl, 0, http_tests},
  775. {"http", check_for_curl, 0, http_tests},
  776. {"get_free_port()", 0, 0, get_free_port_TESTS },
  777. {"fatal", disable_fatal_exception, enable_fatal_exception, fatal_message_TESTS },
  778. {"number_of_cpus()", 0, 0, number_of_cpus_TESTS },
  779. {"create_tmpfile()", 0, 0, create_tmpfile_TESTS },
  780. {"dns", 0, 0, dns_TESTS },
  781. {"libtest::Timer", 0, 0, timer_TESTS },
  782. {0, 0, 0, 0}
  783. };
  784. static void *world_create(server_startup_st& servers, test_return_t&)
  785. {
  786. return &servers;
  787. }
  788. void get_world(libtest::Framework *world)
  789. {
  790. world->collections(collection);
  791. world->create(world_create);
  792. }