From: Tomek Mrugalski Date: Thu, 23 Jul 2015 17:19:08 +0000 (+0200) Subject: Wrote tests for ntpd/ntp_restrict.c X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a0e374aaa541eec0a5ff6fa2d762c673cedbeec9;p=thirdparty%2Fntp.git Wrote tests for ntpd/ntp_restrict.c ntp_restrict.c, run-ntp_restrict.c: new file Makefile.am: added ntp_restrict.c test ntp_restrict.c: added assertions (I prefer them to a segfault) bk: 55b1220cZjqnvqfhuXQ_3lJVhwGGMw --- diff --git a/ntpd/ntp_restrict.c b/ntpd/ntp_restrict.c index 9cc924897..82bbaef25 100644 --- a/ntpd/ntp_restrict.c +++ b/ntpd/ntp_restrict.c @@ -435,6 +435,9 @@ restrictions( match = match_restrict4_addr(SRCADR(srcadr), SRCPORT(srcadr)); + + INSIST(match != NULL); + match->count++; /* * res_not_found counts only use of the final default @@ -461,6 +464,7 @@ restrictions( return (int)RES_IGNORE; match = match_restrict6_addr(pin6, SRCPORT(srcadr)); + INSIST(match != NULL); match->count++; if (&restrict_def6 == match) res_not_found++; @@ -651,10 +655,12 @@ restrict_source( */ if (IS_IPV4(addr)) { res = match_restrict4_addr(SRCADR(addr), SRCPORT(addr)); + INSIST(res != NULL); found_specific = (SRCADR(&onesmask) == res->u.v4.mask); } else { res = match_restrict6_addr(&SOCK_ADDR6(addr), SRCPORT(addr)); + INSIST(res != NULL); found_specific = ADDR6_EQ(&res->u.v6.mask, &SOCK_ADDR6(&onesmask)); } diff --git a/tests/ntpd/Makefile.am b/tests/ntpd/Makefile.am index 2ec47f250..edfb8fdd0 100644 --- a/tests/ntpd/Makefile.am +++ b/tests/ntpd/Makefile.am @@ -7,6 +7,7 @@ run_unity = cd $(srcdir) && ruby ../../sntp/unity/auto/generate_test_runner.rb check_PROGRAMS = \ test-leapsec \ test-ntp_prio_q \ + test-ntp_restrict \ test-rc_cmdlength \ $(NULL) @@ -50,6 +51,7 @@ tests_SOURCES = $(top_srcdir)/sntp/tests_main.cpp \ g_ntpdtest.cpp \ $(top_srcdir)/ntpd/ntp_leapsec.c \ $(top_srcdir)/ntpd/ntp_prio_q.c \ + $(top_srcdir)/ntpd/ntp_restrict.c \ $(top_srcdir)/ntpd/rc_cmdlength.c \ g_leapsec.cpp \ $(NULL) @@ -57,6 +59,7 @@ tests_SOURCES = $(top_srcdir)/sntp/tests_main.cpp \ BUILT_SOURCES += \ $(srcdir)/run-leapsec.c \ $(srcdir)/run-ntp_prio_q.c \ + $(srcdir)/run-ntp_restrict.c \ $(srcdir)/run-rc_cmdlength.c \ $(NULL) @@ -104,6 +107,25 @@ $(srcdir)/run-ntp_prio_q.c: $(srcdir)/ntp_prio_q.c $(std_unity_list) $(run_unity) ntp_prio_q.c run-ntp_prio_q.c +### +test_ntp_restrict_CFLAGS = \ + -I$(top_srcdir)/sntp/unity \ + $(NULL) + +test_ntp_restrict_LDADD = \ + $(unity_tests_LDADD) \ + $(NULL) + +test_ntp_restrict_SOURCES = \ + ntp_restrict.c \ + run-ntp_restrict.c \ + $(srcdir)/../libntp/test-libntp.c \ + $(NULL) + +$(srcdir)/run-ntp_restrict.c: $(srcdir)/ntp_restrict.c $(std_unity_list) + $(run_unity) ntp_restrict.c run-ntp_restrict.c + + ### test_rc_cmdlength_CFLAGS = \ -I$(top_srcdir)/sntp/unity \ @@ -159,5 +181,8 @@ check-libunity: ../../sntp/unity/libunity.a $(top_builddir)/ntpd/ntpdsim-ntp_prio_q.o: cd ../../ntpd/ && $(MAKE) $(AM_MAKEFLAGS) ntpdsim-ntp_prio_q.o +#$(top_builddir)/ntpd/ntpdsim-ntp_restrict.o: +# cd ../../ntpd/ && $(MAKE) $(AM_MAKEFLAGS) ntpdsim-ntp_restrict.o + include $(top_srcdir)/depsver.mf include $(top_srcdir)/includes.mf diff --git a/tests/ntpd/ntp_restrict.c b/tests/ntpd/ntp_restrict.c new file mode 100644 index 000000000..285b5b248 --- /dev/null +++ b/tests/ntpd/ntp_restrict.c @@ -0,0 +1,185 @@ +#include "config.h" + +#include "ntpd.h" +#include "ntp_lists.h" + +#include "unity.h" + +/* Helper functions */ + +sockaddr_u +create_sockaddr_u(short sin_family, unsigned short sin_port, char* ip_addr) { + sockaddr_u sockaddr; + + sockaddr.sa4.sin_family = AF_INET; + sockaddr.sa4.sin_port = htons(sin_port); + memset(sockaddr.sa4.sin_zero, 0, 8); + sockaddr.sa4.sin_addr.s_addr = inet_addr(ip_addr); + + return sockaddr; +} + + +void +setUp(void) { + init_restrict(); +} + + +tearDown(void) { + restrict_u *empty_restrict = malloc(sizeof(restrict_u)); + memset(empty_restrict, 0, sizeof(restrict_u)); + + restrict_u *current; + + do { + UNLINK_HEAD_SLIST(current, restrictlist4, link); + if (current != NULL) + { + *current = *empty_restrict; + } + } while (current != NULL); + + do { + UNLINK_HEAD_SLIST(current, restrictlist6, link); + if (current != NULL) + { + *current = *empty_restrict; + } + } while (current != NULL); + + free(empty_restrict); +} + + +/* Tests */ + + +void +test_RestrictionsAreEmptyAfterInit(void) { + + restrict_u *rl4 = malloc(sizeof(restrict_u)); + restrict_u *rl6 = malloc(sizeof(restrict_u)); + + memset(rl4, 0, sizeof(restrict_u)); + memset(rl6, 0, sizeof(restrict_u)); + + TEST_ASSERT_EQUAL(rl4->count, restrictlist4->count); + TEST_ASSERT_EQUAL(rl4->flags, restrictlist4->flags); + TEST_ASSERT_EQUAL(rl4->mflags, restrictlist4->mflags); + TEST_ASSERT_EQUAL(rl4->expire, restrictlist4->expire); + TEST_ASSERT_EQUAL(rl4->u.v4.addr, restrictlist4->u.v4.addr); + TEST_ASSERT_EQUAL(rl4->u.v4.mask, restrictlist4->u.v4.mask); + + TEST_ASSERT_EQUAL(rl6->count, restrictlist6->count); + TEST_ASSERT_EQUAL(rl6->flags, restrictlist6->flags); + TEST_ASSERT_EQUAL(rl6->mflags, restrictlist6->mflags); + TEST_ASSERT_EQUAL(rl6->expire, restrictlist6->expire); + + free(rl4); + free(rl6); +} + + +void +test_ReturnsCorrectDefaultRestrictions(void) { + sockaddr_u sockaddr = create_sockaddr_u(AF_INET, + 54321, "63.161.169.137"); + + u_short retval = restrictions(&sockaddr); + + TEST_ASSERT_EQUAL(0, retval); +} + + +void +test_HackingDefaultRestriction(void) { + /* + * We change the flag of the default restriction, + * and check if restriction() returns that flag + */ + + const u_short flags = 42; + + sockaddr_u resaddr = create_sockaddr_u(AF_INET, + 54321, "0.0.0.0"); + sockaddr_u resmask = create_sockaddr_u(AF_INET, + 54321, "0.0.0.0"); + + hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, flags, 0); + + sockaddr_u sockaddr = create_sockaddr_u(AF_INET, + 54321, "111.123.251.124"); + + TEST_ASSERT_EQUAL(flags, restrictions(&sockaddr)); +} + + +void +test_CantRemoveDefaultEntry(void) { + sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "0.0.0.0"); + sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "0.0.0.0"); + + hack_restrict(RESTRICT_REMOVE, &resaddr, &resmask, 0, 0, 0); + + TEST_ASSERT_EQUAL(0, restrictions(&resaddr)); +} + + +void +test_AddingNewRestriction(void) { + sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.33.44"); + sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "128.0.0.0"); + + const u_short flags = 42; + + hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, flags, 0); + + TEST_ASSERT_EQUAL(flags, restrictions(&resaddr)); +} + + +void +test_TheMostFittingRestrictionIsMatched(void) { + sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.33.44"); + + sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44"); + sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0"); + + sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20"); + sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0"); + + /* it also matches, but we prefer the one above, as it's more specific */ + sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44"); + sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0"); + + hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, 0, 11, 0); + hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, 0, 22, 0); + hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, 0, 128, 0); + + TEST_ASSERT_EQUAL(22, restrictions(&resaddr)); +} + + +void +test_DeletedRestrictionIsNotMatched(void) { + sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.33.44"); + + sockaddr_u resaddr_not_matching = create_sockaddr_u(AF_INET, 54321, "11.99.33.44"); + sockaddr_u resmask_not_matching = create_sockaddr_u(AF_INET, 54321, "255.255.0.0"); + + sockaddr_u resaddr_best_match = create_sockaddr_u(AF_INET, 54321, "11.22.30.20"); + sockaddr_u resmask_best_match = create_sockaddr_u(AF_INET, 54321, "255.255.0.0"); + + sockaddr_u resaddr_second_match = create_sockaddr_u(AF_INET, 54321, "11.99.33.44"); + sockaddr_u resmask_second_match = create_sockaddr_u(AF_INET, 54321, "255.0.0.0"); + + hack_restrict(RESTRICT_FLAGS, &resaddr_not_matching, &resmask_not_matching, 0, 11, 0); + hack_restrict(RESTRICT_FLAGS, &resaddr_best_match, &resmask_best_match, 0, 22, 0); + hack_restrict(RESTRICT_FLAGS, &resaddr_second_match, &resmask_second_match, 0, 128, 0); + + /* deleting the best match*/ + hack_restrict(RESTRICT_REMOVE, &resaddr_best_match, &resmask_best_match, 0, 22, 0); + + TEST_ASSERT_EQUAL(128, restrictions(&resaddr)); +} diff --git a/tests/ntpd/run-ntp_restrict.c b/tests/ntpd/run-ntp_restrict.c new file mode 100644 index 000000000..26b1ef66b --- /dev/null +++ b/tests/ntpd/run-ntp_restrict.c @@ -0,0 +1,64 @@ +/* AUTOGENERATED FILE. DO NOT EDIT. */ + +//=======Test Runner Used To Run Each Test Below===== +#define RUN_TEST(TestFunc, TestLineNum) \ +{ \ + Unity.CurrentTestName = #TestFunc; \ + Unity.CurrentTestLineNumber = TestLineNum; \ + Unity.NumberOfTests++; \ + if (TEST_PROTECT()) \ + { \ + setUp(); \ + TestFunc(); \ + } \ + if (TEST_PROTECT() && !TEST_IS_IGNORED) \ + { \ + tearDown(); \ + } \ + UnityConcludeTest(); \ +} + +//=======Automagically Detected Files To Include===== +#include "unity.h" +#include +#include + +//=======External Functions This Runner Calls===== +extern void setUp(void); +extern void tearDown(void); +void resetTest(void); +extern void test_RestrictionsAreEmptyAfterInit(void); +extern void test_ReturnsCorrectDefaultRestrictions(void); +extern void test_HackingDefaultRestriction(void); +extern void test_CantRemoveDefaultEntry(void); +extern void test_AddingNewRestriction(void); +extern void test_TheMostFittingRestrictionIsMatched(void); +extern void test_DeletedRestrictionIsNotMatched(void); + + +//=======Test Reset Option===== +void resetTest() +{ + tearDown(); + setUp(); +} + +char *progname; + + +//=======MAIN===== +int main(int argc, char *argv[]) +{ + progname = argv[0]; + Unity.TestFile = "ntp_restrict.c"; + UnityBegin("ntp_restrict.c"); + RUN_TEST(test_RestrictionsAreEmptyAfterInit, 59); + RUN_TEST(test_ReturnsCorrectDefaultRestrictions, 85); + RUN_TEST(test_HackingDefaultRestriction, 96); + RUN_TEST(test_CantRemoveDefaultEntry, 119); + RUN_TEST(test_AddingNewRestriction, 130); + RUN_TEST(test_TheMostFittingRestrictionIsMatched, 143); + RUN_TEST(test_DeletedRestrictionIsNotMatched, 165); + + return (UnityEnd()); +}