unittest.cc 25 KB

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