From e0773bc26ae14d4a19825023307d1496d7c7d0f1 Mon Sep 17 00:00:00 2001 From: Thomas Habets Date: Wed, 20 Jan 2021 22:15:55 +0000 Subject: [PATCH] unit tests: Remove test registry code in favour of code duplication. As of https://github.com/libcheck/check/pull/158 libcheck broke the ability to have a test registry, so we have to resort to code duplication. --- src/arping_test.c | 88 ++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/src/arping_test.c b/src/arping_test.c index 438670b9..0133fe7b 100644 --- a/src/arping_test.c +++ b/src/arping_test.c @@ -40,35 +40,10 @@ extern libnet_t* libnet; extern int mock_libnet_lo_ok; extern int mock_libnet_null_ok; -struct registered_test { - void* fn; - const char* name; -}; - -static int numtests = 0; -static struct registered_test test_registry[1024]; - -static int num_exit_tests = 0; -static struct registered_test test_exit_registry[1024]; - int get_mac_addr(const char *in, char *out); void strip_newline(char* s); -#define MYTEST(a) static void a(int);__attribute__((constructor)) \ -static void cons_##a() { \ - test_registry[numtests].fn = a; \ - test_registry[numtests].name = #a; \ - numtests++; \ -} START_TEST(a) - -#define MY_EXIT_TEST(a) static void a(int);__attribute__((constructor)) \ -static void cons_##a() { \ - test_exit_registry[num_exit_tests].fn = a; \ - test_exit_registry[num_exit_tests].name = #a; \ - num_exit_tests++; \ -} START_TEST(a) - /** * */ @@ -236,7 +211,7 @@ dump_packet(uint8_t* packet, int len) fprintf(stderr, "\n"); } -MYTEST(test_mkpacket) +START_TEST(test_mkpacket) { uint8_t correct_packet[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, @@ -261,7 +236,7 @@ MYTEST(test_mkpacket) // Received uninteresting packet, should not record anything. -MYTEST(pingip_uninteresting_packet) +START_TEST(pingip_uninteresting_packet) { struct pcap_pkthdr pkthdr; uint8_t* packet; @@ -389,7 +364,7 @@ MYTEST(pingip_uninteresting_packet) } END_TEST // Received reply that actually matches. Things should happen. -MYTEST(pingip_interesting_packet) +START_TEST(pingip_interesting_packet) { struct pcap_pkthdr pkthdr; extern uint8_t srcmac[ETH_ALEN]; @@ -449,7 +424,7 @@ MYTEST(pingip_interesting_packet) "numrecvd not incremented second time"); } END_TEST -MYTEST(strip_newline_test) +START_TEST(strip_newline_test) { const char *tests[][2] = { {"", ""}, @@ -469,7 +444,7 @@ MYTEST(strip_newline_test) } } END_TEST -MYTEST(get_mac_addr_success) +START_TEST(get_mac_addr_success) { const char *tests[][2] = { // Null. @@ -501,7 +476,7 @@ MYTEST(get_mac_addr_success) } } END_TEST -MYTEST(get_mac_addr_fail) +START_TEST(get_mac_addr_fail) { const char *tests[] = { "", @@ -517,7 +492,7 @@ MYTEST(get_mac_addr_fail) } } END_TEST -MY_EXIT_TEST(libnet_init_bad_nolo) +START_TEST(libnet_init_bad_nolo) { // It'll only try lo if named interface fails. // So by accepting lo, we make sure it doesn't try lo. @@ -525,27 +500,28 @@ MY_EXIT_TEST(libnet_init_bad_nolo) do_libnet_init("bad", 0); } END_TEST -MY_EXIT_TEST(libnet_init_null_nolo_nonull) +START_TEST(libnet_init_null_nolo_nonull) { mock_libnet_lo_ok = 0; mock_libnet_null_ok = 0; do_libnet_init(NULL, 0); } END_TEST -MYTEST(libnet_init_good) +START_TEST(libnet_init_good) { mock_libnet_lo_ok = 0; // Don't even try falling back to lo. do_libnet_init("good", 0); fail_if(libnet == NULL); } END_TEST -MYTEST(libnet_init_null_nolo) +START_TEST(libnet_init_null_nolo) { mock_libnet_lo_ok = 0; mock_libnet_null_ok = 1; do_libnet_init(NULL, 0); fail_if(libnet == NULL); -} END_TEST +} +END_TEST static Suite* arping_suite(void) @@ -553,17 +529,34 @@ arping_suite(void) int c; Suite* s = suite_create("Arping"); - //tcase_add_checked_fixture (tc_core, setup, teardown); - for (c = 0; c < numtests; c++) { - TCase *tc_core = tcase_create(test_registry[c].name); - tcase_add_test(tc_core, test_registry[c].fn); - suite_add_tcase(s, tc_core); - } - for (c = 0; c < num_exit_tests; c++) { - TCase *tc_core = tcase_create(test_exit_registry[c].name); - tcase_add_exit_test(tc_core, test_exit_registry[c].fn, 1); - suite_add_tcase(s, tc_core); - } + + TCase *tc_core; + + // libcheck broke test registries, so have to resort to code duplication. :-( + // https://github.com/libcheck/check/pull/158/files +#define SIGH_LIBCHECK(tn) \ + tc_core = tcase_create(#tn); \ + tcase_add_test(tc_core, tn); \ + suite_add_tcase(s, tc_core); + + SIGH_LIBCHECK(libnet_init_null_nolo); + SIGH_LIBCHECK(test_mkpacket); + SIGH_LIBCHECK(pingip_uninteresting_packet); + SIGH_LIBCHECK(pingip_interesting_packet); + SIGH_LIBCHECK(strip_newline_test); + SIGH_LIBCHECK(get_mac_addr_success); + SIGH_LIBCHECK(get_mac_addr_fail); + SIGH_LIBCHECK(libnet_init_good); + + +#define SIGH_LIBCHECK_EXIT(tn) \ + tc_core = tcase_create(#tn); \ + tcase_add_exit_test(tc_core, tn, 1); \ + suite_add_tcase(s, tc_core); + + SIGH_LIBCHECK_EXIT(libnet_init_bad_nolo); + SIGH_LIBCHECK_EXIT(libnet_init_null_nolo_nonull); + return s; } @@ -577,6 +570,7 @@ main() number_failed = srunner_ntests_failed (sr); srunner_free (sr); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; + return 0; } /* ---- Emacs Variables ---- * Local Variables: