1/* $NetBSD: utilities.c,v 1.2 2020/05/25 20:47:35 christos Exp $ */ 2 3#include "config.h" 4 5#include "sntptest.h" 6#include "fileHandlingTest.h" 7#include "main.h" 8#include "utilities.h" 9 10#include "unity.h" 11 12#include <math.h> 13 14sockaddr_u CreateSockaddr4(const char* address); 15struct addrinfo CreateAddrinfo(sockaddr_u* sock); 16void InitDebugTest(const char * filename); 17void FinishDebugTest(const char * expected,const char * actual); 18void test_IPv4Address(void); 19void test_IPv6Address(void); 20void test_SetLiVnMode1(void); 21void test_SetLiVnMode2(void); 22void test_PktOutput(void); 23void test_LfpOutputBinaryFormat(void); 24void test_LfpOutputDecimalFormat(void); 25 26 27const char * Version = "stub unit test Version string"; 28 29 30sockaddr_u 31CreateSockaddr4(const char* address) { 32 sockaddr_u s; 33 s.sa4.sin_family = AF_INET; 34 s.sa4.sin_addr.s_addr = inet_addr(address); 35 SET_PORT(&s, 123); 36 37 return s; 38} 39 40 41struct addrinfo 42CreateAddrinfo(sockaddr_u* sock) { 43 struct addrinfo a; 44 a.ai_family = sock->sa.sa_family; 45 a.ai_addrlen = SIZEOF_SOCKADDR(a.ai_family); 46 a.ai_addr = &sock->sa; 47 return a; 48} 49 50 51bool outputFileOpened; 52FILE* outputFile; 53 54 55void 56InitDebugTest(const char * filename) { 57 // Clear the contents of the current file. 58 // Open the output file 59 outputFile = fopen(filename, "w+"); 60 TEST_ASSERT_NOT_NULL(outputFile); 61 outputFileOpened = true; 62} 63 64 65// Closes outputFile, and compare contents. 66void 67FinishDebugTest(const char * expected, 68 const char * actual) { 69 if (outputFileOpened) 70 fclose(outputFile); 71 72 FILE * e = fopen(expected,"rb"); 73 FILE * a = fopen(actual,"rb"); 74 TEST_ASSERT_NOT_NULL(e); 75 TEST_ASSERT_NOT_NULL(a); 76 77 CompareFileContent(e, a); 78} 79 80 81/* 82 * These tests are essentially a copy of the tests for socktoa() 83 * in libntp. If sntp switches to using that functions, these 84 * tests can be removed. 85 */ 86 87void 88test_IPv4Address(void) { 89 const char* ADDR = "192.0.2.10"; 90 91 sockaddr_u input = CreateSockaddr4(ADDR); 92 struct addrinfo inputA = CreateAddrinfo(&input); 93 94 TEST_ASSERT_EQUAL_STRING(ADDR, ss_to_str(&input)); 95 TEST_ASSERT_EQUAL_STRING(ADDR, addrinfo_to_str(&inputA)); 96} 97 98 99void 100test_IPv6Address(void) { 101 const struct in6_addr address = { { { 102 0x20, 0x01, 0x0d, 0xb8, 103 0x85, 0xa3, 0x08, 0xd3, 104 0x13, 0x19, 0x8a, 0x2e, 105 0x03, 0x70, 0x73, 0x34 106 } } }; 107 const char * expected = "2001:db8:85a3:8d3:1319:8a2e:370:7334"; 108 sockaddr_u input; 109 struct addrinfo inputA; 110 111 memset(&input, 0, sizeof(input)); 112 input.sa6.sin6_family = AF_INET6; 113 input.sa6.sin6_addr = address; 114 TEST_ASSERT_EQUAL_STRING(expected, ss_to_str(&input)); 115 116 inputA = CreateAddrinfo(&input); 117 TEST_ASSERT_EQUAL_STRING(expected, addrinfo_to_str(&inputA)); 118} 119 120 121void 122test_SetLiVnMode1(void) { 123 struct pkt expected; 124 expected.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING, 125 NTP_VERSION, 126 MODE_SERVER); 127 128 struct pkt actual; 129 set_li_vn_mode(&actual, LEAP_NOWARNING, NTP_VERSION, 130 MODE_SERVER); 131 132 TEST_ASSERT_EQUAL(expected.li_vn_mode, actual.li_vn_mode); 133} 134 135 136void 137test_SetLiVnMode2(void) { 138 struct pkt expected; 139 expected.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC, 140 NTP_OLDVERSION, 141 MODE_BROADCAST); 142 143 struct pkt actual; 144 set_li_vn_mode(&actual, LEAP_NOTINSYNC, NTP_OLDVERSION, 145 MODE_BROADCAST); 146 147 TEST_ASSERT_EQUAL(expected.li_vn_mode, actual.li_vn_mode); 148} 149 150/* Debug utilities tests */ 151 152void 153test_PktOutput(void) { 154 char * filename = "debug-output-pkt"; 155 InitDebugTest(filename); 156 157 struct pkt testpkt; 158 memset(&testpkt, 0, sizeof(struct pkt)); 159 testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING, 160 NTP_VERSION, 161 MODE_SERVER); 162 163 l_fp test; 164 test.l_ui = 8; 165 test.l_uf = 2147483647; // Lots of ones. 166 HTONL_FP(&test, &testpkt.xmt); 167 168 pkt_output(&testpkt, LEN_PKT_NOMAC, outputFile); 169 170 FinishDebugTest(CreatePath("debug-input-pkt", INPUT_DIR), filename); 171} 172 173 174void 175test_LfpOutputBinaryFormat(void) { 176 char * filename = "debug-output-lfp-bin";//CreatePath("debug-output-lfp-bin", OUTPUT_DIR); 177 InitDebugTest(filename); 178 179 l_fp test; 180 test.l_ui = 63; // 00000000 00000000 00000000 00111111 181 test.l_uf = 127; // 00000000 00000000 00000000 01111111 182 183 l_fp network; 184 HTONL_FP(&test, &network); 185 186 l_fp_output_bin(&network, outputFile); 187 188 FinishDebugTest(CreatePath("debug-input-lfp-bin", INPUT_DIR), filename); 189} 190 191 192void 193test_LfpOutputDecimalFormat(void) { 194 char * filename = "debug-output-lfp-dec"; 195 InitDebugTest(filename); 196 197 l_fp test; 198 test.l_ui = 6310; // 0x000018A6 199 test.l_uf = 308502; // 0x00004B516 200 201 l_fp network; 202 HTONL_FP(&test, &network); 203 204 l_fp_output_dec(&network, outputFile); 205 206 FinishDebugTest(CreatePath("debug-input-lfp-dec", INPUT_DIR), filename); 207} 208