diff options
Diffstat (limited to 'contrib/ntp/tests/ntpd/ntp_restrict.c')
-rw-r--r-- | contrib/ntp/tests/ntpd/ntp_restrict.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/contrib/ntp/tests/ntpd/ntp_restrict.c b/contrib/ntp/tests/ntpd/ntp_restrict.c new file mode 100644 index 0000000..98d6e83 --- /dev/null +++ b/contrib/ntp/tests/ntpd/ntp_restrict.c @@ -0,0 +1,198 @@ +#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_target = 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_target)); +} + + +void +test_DeletedRestrictionIsNotMatched(void) { + sockaddr_u resaddr_target = 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_target)); +} + + +void +test_RestrictUnflagWorks(void) { + sockaddr_u resaddr = create_sockaddr_u(AF_INET, 54321, "11.22.30.20"); + sockaddr_u resmask = create_sockaddr_u(AF_INET, 54321, "255.255.0.0"); + + hack_restrict(RESTRICT_FLAGS, &resaddr, &resmask, 0, 11, 0); + + hack_restrict(RESTRICT_UNFLAG, &resaddr, &resmask, 0, 10, 0); + + TEST_ASSERT_EQUAL(1, restrictions(&resaddr)); +} |