1
0

litest-selftest.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. #include <config.h>
  2. #include <signal.h>
  3. #include <sys/resource.h>
  4. #include <sys/time.h>
  5. #include <valgrind/valgrind.h>
  6. #include "litest.h"
  7. /* This is a bit messy but until we've completely switched over
  8. * to the litest runner it's easier like this */
  9. #undef START_TEST
  10. #undef END_TEST
  11. #include <check.h>
  12. START_TEST(litest_assert_trigger)
  13. {
  14. litest_assert(1 == 2);
  15. }
  16. END_TEST
  17. START_TEST(litest_assert_notrigger)
  18. {
  19. litest_assert(1 == 1);
  20. }
  21. END_TEST
  22. START_TEST(litest_assert_msg_trigger)
  23. {
  24. litest_assert_msg(1 == 2, "1 is not 2\n");
  25. }
  26. END_TEST
  27. START_TEST(litest_assert_msg_NULL_trigger)
  28. {
  29. litest_assert_msg(1 == 2, NULL);
  30. }
  31. END_TEST
  32. START_TEST(litest_assert_msg_notrigger)
  33. {
  34. litest_assert_msg(1 == 1, "1 is not 2\n");
  35. litest_assert_msg(1 == 1, NULL);
  36. }
  37. END_TEST
  38. START_TEST(litest_abort_msg_trigger)
  39. {
  40. litest_abort_msg("message\n");
  41. }
  42. END_TEST
  43. START_TEST(litest_abort_msg_NULL_trigger)
  44. {
  45. litest_abort_msg(NULL);
  46. }
  47. END_TEST
  48. START_TEST(litest_int_eq_trigger)
  49. {
  50. int a = 10;
  51. int b = 20;
  52. litest_assert_int_eq(a, b);
  53. }
  54. END_TEST
  55. START_TEST(litest_int_eq_notrigger)
  56. {
  57. int a = 10;
  58. int b = 10;
  59. litest_assert_int_eq(a, b);
  60. }
  61. END_TEST
  62. START_TEST(litest_int_ne_trigger)
  63. {
  64. int a = 10;
  65. int b = 10;
  66. litest_assert_int_ne(a, b);
  67. }
  68. END_TEST
  69. START_TEST(litest_int_ne_notrigger)
  70. {
  71. int a = 10;
  72. int b = 20;
  73. litest_assert_int_ne(a, b);
  74. }
  75. END_TEST
  76. START_TEST(litest_int_lt_trigger_eq)
  77. {
  78. int a = 10;
  79. int b = 10;
  80. litest_assert_int_lt(a, b);
  81. }
  82. END_TEST
  83. START_TEST(litest_int_lt_trigger_gt)
  84. {
  85. int a = 11;
  86. int b = 10;
  87. litest_assert_int_lt(a, b);
  88. }
  89. END_TEST
  90. START_TEST(litest_int_lt_notrigger)
  91. {
  92. int a = 10;
  93. int b = 11;
  94. litest_assert_int_lt(a, b);
  95. }
  96. END_TEST
  97. START_TEST(litest_int_le_trigger)
  98. {
  99. int a = 11;
  100. int b = 10;
  101. litest_assert_int_le(a, b);
  102. }
  103. END_TEST
  104. START_TEST(litest_int_le_notrigger)
  105. {
  106. int a = 10;
  107. int b = 11;
  108. int c = 10;
  109. litest_assert_int_le(a, b);
  110. litest_assert_int_le(a, c);
  111. }
  112. END_TEST
  113. START_TEST(litest_int_gt_trigger_eq)
  114. {
  115. int a = 10;
  116. int b = 10;
  117. litest_assert_int_gt(a, b);
  118. }
  119. END_TEST
  120. START_TEST(litest_int_gt_trigger_lt)
  121. {
  122. int a = 9;
  123. int b = 10;
  124. litest_assert_int_gt(a, b);
  125. }
  126. END_TEST
  127. START_TEST(litest_int_gt_notrigger)
  128. {
  129. int a = 10;
  130. int b = 9;
  131. litest_assert_int_gt(a, b);
  132. }
  133. END_TEST
  134. START_TEST(litest_int_ge_trigger)
  135. {
  136. int a = 9;
  137. int b = 10;
  138. litest_assert_int_ge(a, b);
  139. }
  140. END_TEST
  141. START_TEST(litest_int_ge_notrigger)
  142. {
  143. int a = 10;
  144. int b = 9;
  145. int c = 10;
  146. litest_assert_int_ge(a, b);
  147. litest_assert_int_ge(a, c);
  148. }
  149. END_TEST
  150. START_TEST(litest_ptr_eq_notrigger)
  151. {
  152. int v = 10;
  153. int *a = &v;
  154. int *b = &v;
  155. int *c = NULL;
  156. int *d = NULL;
  157. litest_assert_ptr_eq(a, b);
  158. litest_assert_ptr_eq(c, d);
  159. }
  160. END_TEST
  161. START_TEST(litest_ptr_eq_trigger)
  162. {
  163. int v = 10;
  164. int v2 = 11;
  165. int *a = &v;
  166. int *b = &v2;
  167. litest_assert_ptr_eq(a, b);
  168. }
  169. END_TEST
  170. START_TEST(litest_ptr_eq_trigger_NULL)
  171. {
  172. int v = 10;
  173. int *a = &v;
  174. int *b = NULL;
  175. litest_assert_ptr_eq(a, b);
  176. }
  177. END_TEST
  178. START_TEST(litest_ptr_eq_trigger_NULL2)
  179. {
  180. int v = 10;
  181. int *a = &v;
  182. int *b = NULL;
  183. litest_assert_ptr_eq(b, a);
  184. }
  185. END_TEST
  186. START_TEST(litest_ptr_ne_trigger)
  187. {
  188. int v = 10;
  189. int *a = &v;
  190. int *b = &v;
  191. litest_assert_ptr_ne(a, b);
  192. }
  193. END_TEST
  194. START_TEST(litest_ptr_ne_trigger_NULL)
  195. {
  196. int *a = NULL;
  197. litest_assert_ptr_ne(a, NULL);
  198. }
  199. END_TEST
  200. START_TEST(litest_ptr_ne_trigger_NULL2)
  201. {
  202. int *a = NULL;
  203. litest_assert_ptr_ne(NULL, a);
  204. }
  205. END_TEST
  206. START_TEST(litest_ptr_ne_notrigger)
  207. {
  208. int v1 = 10;
  209. int v2 = 10;
  210. int *a = &v1;
  211. int *b = &v2;
  212. int *c = NULL;
  213. litest_assert_ptr_ne(a, b);
  214. litest_assert_ptr_ne(a, c);
  215. litest_assert_ptr_ne(c, b);
  216. }
  217. END_TEST
  218. START_TEST(litest_ptr_null_notrigger)
  219. {
  220. int *a = NULL;
  221. litest_assert_ptr_null(a);
  222. litest_assert_ptr_null(NULL);
  223. }
  224. END_TEST
  225. START_TEST(litest_ptr_null_trigger)
  226. {
  227. int v;
  228. int *a = &v;
  229. litest_assert_ptr_null(a);
  230. }
  231. END_TEST
  232. START_TEST(litest_ptr_notnull_notrigger)
  233. {
  234. int v;
  235. int *a = &v;
  236. litest_assert_ptr_notnull(a);
  237. }
  238. END_TEST
  239. START_TEST(litest_ptr_notnull_trigger)
  240. {
  241. int *a = NULL;
  242. litest_assert_ptr_notnull(a);
  243. }
  244. END_TEST
  245. START_TEST(litest_ptr_notnull_trigger_NULL)
  246. {
  247. litest_assert_ptr_notnull(NULL);
  248. }
  249. END_TEST
  250. START_TEST(litest_double_eq_and_ne)
  251. {
  252. litest_assert_double_eq(0.4, 0.4);
  253. litest_assert_double_eq(0.4, 0.4 + 1E-6);
  254. litest_assert_double_ne(0.4, 0.4 + 1E-3);
  255. litest_assert_double_eq_epsilon(0.4, 0.5, 0.1);
  256. litest_assert_double_eq_epsilon(0.4, 0.5, 0.2);
  257. litest_assert_double_ne_epsilon(0.4, 0.6, 0.1);
  258. litest_assert_double_ne_epsilon(0.4, 0.41, 0.005);
  259. }
  260. END_TEST
  261. START_TEST(litest_double_lt_gt)
  262. {
  263. litest_assert_double_lt(12.0, 13.0);
  264. litest_assert_double_gt(15.4, 13.0);
  265. litest_assert_double_le(12.0, 12.0);
  266. litest_assert_double_le(12.0, 20.0);
  267. litest_assert_double_ge(12.0, 12.0);
  268. litest_assert_double_ge(20.0, 12.0);
  269. }
  270. END_TEST
  271. START_TEST(litest_double_eq_fails)
  272. {
  273. litest_assert_double_eq(0.41, 0.4);
  274. }
  275. END_TEST
  276. START_TEST(litest_double_eq_epsilon_fails)
  277. {
  278. litest_assert_double_eq_epsilon(0.4, 0.5, 0.05);
  279. }
  280. END_TEST
  281. START_TEST(litest_double_ne_fails)
  282. {
  283. litest_assert_double_ne(0.4 + 1E-7, 0.4);
  284. }
  285. END_TEST
  286. START_TEST(litest_double_ne_epsilon_fails)
  287. {
  288. litest_assert_double_ne_epsilon(0.4, 0.5, 0.2);
  289. }
  290. END_TEST
  291. START_TEST(litest_double_lt_fails)
  292. {
  293. litest_assert_double_lt(6.0, 5.0);
  294. }
  295. END_TEST
  296. START_TEST(litest_double_gt_fails)
  297. {
  298. litest_assert_double_gt(5.0, 6.0);
  299. }
  300. END_TEST
  301. START_TEST(litest_double_le_fails)
  302. {
  303. litest_assert_double_le(6.0, 5.0);
  304. }
  305. END_TEST
  306. START_TEST(litest_double_ge_fails)
  307. {
  308. litest_assert_double_ge(5.0, 6.0);
  309. }
  310. END_TEST
  311. START_TEST(litest_string_eq_ne)
  312. {
  313. litest_assert_str_eq("foo", "foo");
  314. litest_assert_str_ne("foo", "bar");
  315. litest_assert_str_ne("foo", "foobar");
  316. litest_assert_str_ne("foobar", "foo");
  317. const char *a1 = "a";
  318. const char *a2 = "a";
  319. const char *b = "b";
  320. litest_assert_str_eq(NULL, NULL);
  321. litest_assert_str_eq(a1, a2);
  322. litest_assert_str_ne(a1, b);
  323. litest_assert_str_ne(a2, b);
  324. litest_assert_str_ne(a2, b);
  325. litest_assert_str_ne(b, NULL);
  326. }
  327. END_TEST
  328. START_TEST(litest_string_eq_fails)
  329. {
  330. litest_assert_str_eq("foo", "bar");
  331. }
  332. END_TEST
  333. START_TEST(litest_string_ne_fails)
  334. {
  335. litest_assert_str_ne("foo", "foo");
  336. }
  337. END_TEST
  338. START_TEST(zalloc_overflow)
  339. {
  340. zalloc((size_t)-1);
  341. }
  342. END_TEST
  343. START_TEST(zalloc_max_size)
  344. {
  345. /* Built-in alloc maximum */
  346. free(zalloc(1536 * 1024));
  347. }
  348. END_TEST
  349. START_TEST(zalloc_too_large)
  350. {
  351. zalloc(1536 * 1024 + 1);
  352. }
  353. END_TEST
  354. struct permutation {
  355. int32_t i;
  356. const char *s;
  357. bool b;
  358. bool found;
  359. };
  360. static int
  361. permutation_func(struct litest_parameters_permutation *permutation, void *userdata)
  362. {
  363. struct litest_parameters_permutation_value *value;
  364. int32_t first;
  365. const char *second;
  366. bool third;
  367. value = list_first_entry(&permutation->values, value, link);
  368. multivalue_extract_typed(&value->value, 'i', &first);
  369. value = list_first_entry(&value->link, value, link);
  370. multivalue_extract_typed(&value->value, 's', &second);
  371. value = list_first_entry(&value->link, value, link);
  372. multivalue_extract_typed(&value->value, 'b', &third);
  373. struct permutation *p = userdata;
  374. while (p->s) {
  375. if (p->i == first && streq(p->s, second) && p->b == third) {
  376. p->found = true;
  377. break;
  378. }
  379. p++;
  380. }
  381. return 0;
  382. }
  383. START_TEST(parameter_permutations)
  384. {
  385. struct permutation permutations[] = {
  386. { 1, "a", true }, { 1, "a", false }, { 1, "ab", true },
  387. { 1, "ab", false }, { 1, "abc", true }, { 1, "abc", false },
  388. { 2, "a", true }, { 2, "a", false }, { 2, "ab", true },
  389. { 2, "ab", false }, { 2, "abc", true }, { 2, "abc", false },
  390. { 3, "a", true }, { 3, "a", false }, { 3, "ab", true },
  391. { 3, "ab", false }, { 3, "abc", true }, { 3, "abc", false },
  392. { 0, NULL, false, false },
  393. };
  394. /* clang-format off */
  395. struct litest_parameters *params = litest_parameters_new("first", 'i', 3, 1, 2, 3,
  396. "second", 's', 3, "a", "ab", "abc",
  397. "third", 'b',
  398. NULL);
  399. /* clang-format on */
  400. litest_parameters_permutations(params, permutation_func, permutations);
  401. ARRAY_FOR_EACH(permutations, p) {
  402. if (p->s == NULL)
  403. break;
  404. ck_assert_msg(p->found, "For %d/%s/%s", p->i, p->s, truefalse(p->b));
  405. }
  406. }
  407. END_TEST
  408. static Suite *
  409. litest_assert_macros_suite(void)
  410. {
  411. TCase *tc;
  412. Suite *s;
  413. s = suite_create("litest:assert macros");
  414. tc = tcase_create("assert");
  415. tcase_add_test_raise_signal(tc, litest_assert_trigger, SIGABRT);
  416. tcase_add_test(tc, litest_assert_notrigger);
  417. tcase_add_test_raise_signal(tc, litest_assert_msg_trigger, SIGABRT);
  418. tcase_add_test_raise_signal(tc, litest_assert_msg_NULL_trigger, SIGABRT);
  419. tcase_add_test(tc, litest_assert_msg_notrigger);
  420. suite_add_tcase(s, tc);
  421. tc = tcase_create("abort");
  422. tcase_add_test_raise_signal(tc, litest_abort_msg_trigger, SIGABRT);
  423. tcase_add_test_raise_signal(tc, litest_abort_msg_NULL_trigger, SIGABRT);
  424. suite_add_tcase(s, tc);
  425. tc = tcase_create("int comparison ");
  426. tcase_add_test_raise_signal(tc, litest_int_eq_trigger, SIGABRT);
  427. tcase_add_test(tc, litest_int_eq_notrigger);
  428. tcase_add_test_raise_signal(tc, litest_int_ne_trigger, SIGABRT);
  429. tcase_add_test(tc, litest_int_ne_notrigger);
  430. tcase_add_test_raise_signal(tc, litest_int_le_trigger, SIGABRT);
  431. tcase_add_test(tc, litest_int_le_notrigger);
  432. tcase_add_test_raise_signal(tc, litest_int_lt_trigger_gt, SIGABRT);
  433. tcase_add_test_raise_signal(tc, litest_int_lt_trigger_eq, SIGABRT);
  434. tcase_add_test(tc, litest_int_lt_notrigger);
  435. tcase_add_test_raise_signal(tc, litest_int_ge_trigger, SIGABRT);
  436. tcase_add_test(tc, litest_int_ge_notrigger);
  437. tcase_add_test_raise_signal(tc, litest_int_gt_trigger_eq, SIGABRT);
  438. tcase_add_test_raise_signal(tc, litest_int_gt_trigger_lt, SIGABRT);
  439. tcase_add_test(tc, litest_int_gt_notrigger);
  440. suite_add_tcase(s, tc);
  441. tc = tcase_create("pointer comparison ");
  442. tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger, SIGABRT);
  443. tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger_NULL, SIGABRT);
  444. tcase_add_test_raise_signal(tc, litest_ptr_eq_trigger_NULL2, SIGABRT);
  445. tcase_add_test(tc, litest_ptr_eq_notrigger);
  446. tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger, SIGABRT);
  447. tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger_NULL, SIGABRT);
  448. tcase_add_test_raise_signal(tc, litest_ptr_ne_trigger_NULL2, SIGABRT);
  449. tcase_add_test(tc, litest_ptr_ne_notrigger);
  450. tcase_add_test_raise_signal(tc, litest_ptr_null_trigger, SIGABRT);
  451. tcase_add_test(tc, litest_ptr_null_notrigger);
  452. tcase_add_test_raise_signal(tc, litest_ptr_notnull_trigger, SIGABRT);
  453. tcase_add_test_raise_signal(tc, litest_ptr_notnull_trigger_NULL, SIGABRT);
  454. tcase_add_test(tc, litest_ptr_notnull_notrigger);
  455. suite_add_tcase(s, tc);
  456. tc = tcase_create("double comparison ");
  457. tcase_add_test(tc, litest_double_eq_and_ne);
  458. tcase_add_test(tc, litest_double_lt_gt);
  459. tcase_add_test_raise_signal(tc, litest_double_eq_fails, SIGABRT);
  460. tcase_add_test_raise_signal(tc, litest_double_eq_epsilon_fails, SIGABRT);
  461. tcase_add_test_raise_signal(tc, litest_double_ne_fails, SIGABRT);
  462. tcase_add_test_raise_signal(tc, litest_double_ne_epsilon_fails, SIGABRT);
  463. tcase_add_test_raise_signal(tc, litest_double_lt_fails, SIGABRT);
  464. tcase_add_test_raise_signal(tc, litest_double_gt_fails, SIGABRT);
  465. tcase_add_test_raise_signal(tc, litest_double_le_fails, SIGABRT);
  466. tcase_add_test_raise_signal(tc, litest_double_ge_fails, SIGABRT);
  467. suite_add_tcase(s, tc);
  468. tc = tcase_create("string comparison ");
  469. tcase_add_test(tc, litest_string_eq_ne);
  470. tcase_add_test_raise_signal(tc, litest_string_eq_fails, SIGABRT);
  471. tcase_add_test_raise_signal(tc, litest_string_ne_fails, SIGABRT);
  472. suite_add_tcase(s, tc);
  473. tc = tcase_create("zalloc ");
  474. tcase_add_test(tc, zalloc_max_size);
  475. tcase_add_test_raise_signal(tc, zalloc_overflow, SIGABRT);
  476. tcase_add_test_raise_signal(tc, zalloc_too_large, SIGABRT);
  477. suite_add_tcase(s, tc);
  478. tc = tcase_create("parameters ");
  479. tcase_add_test(tc, parameter_permutations);
  480. suite_add_tcase(s, tc);
  481. return s;
  482. }
  483. int
  484. main(int argc, char **argv)
  485. {
  486. const struct rlimit corelimit = { 0, 0 };
  487. int nfailed;
  488. Suite *s;
  489. SRunner *sr;
  490. /* when running under valgrind we're using nofork mode, so a signal
  491. * raised by a test will fail in valgrind. There's nothing to
  492. * memcheck here anyway, so just skip the valgrind test */
  493. if (RUNNING_ON_VALGRIND)
  494. return 77;
  495. if (setrlimit(RLIMIT_CORE, &corelimit) != 0)
  496. perror("WARNING: Core dumps not disabled");
  497. s = litest_assert_macros_suite();
  498. sr = srunner_create(s);
  499. srunner_run_all(sr, CK_ENV);
  500. nfailed = srunner_ntests_failed(sr);
  501. srunner_free(sr);
  502. return (nfailed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  503. }