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