1276da39aSCy Schubert #include "config.h"
2276da39aSCy Schubert
3276da39aSCy Schubert #include "sntptest.h"
4276da39aSCy Schubert #include "fileHandlingTest.h"
5276da39aSCy Schubert #include "main.h"
6276da39aSCy Schubert #include "utilities.h"
7276da39aSCy Schubert
8276da39aSCy Schubert #include "unity.h"
9276da39aSCy Schubert
109034852cSGleb Smirnoff #include <math.h>
119034852cSGleb Smirnoff
129034852cSGleb Smirnoff sockaddr_u CreateSockaddr4(const char* address);
139034852cSGleb Smirnoff struct addrinfo CreateAddrinfo(sockaddr_u* sock);
149034852cSGleb Smirnoff void InitDebugTest(const char * filename);
159034852cSGleb Smirnoff void FinishDebugTest(const char * expected,const char * actual);
169034852cSGleb Smirnoff void test_IPv4Address(void);
179034852cSGleb Smirnoff void test_IPv6Address(void);
189034852cSGleb Smirnoff void test_SetLiVnMode1(void);
199034852cSGleb Smirnoff void test_SetLiVnMode2(void);
209034852cSGleb Smirnoff void test_PktOutput(void);
219034852cSGleb Smirnoff void test_LfpOutputBinaryFormat(void);
229034852cSGleb Smirnoff void test_LfpOutputDecimalFormat(void);
239034852cSGleb Smirnoff
249034852cSGleb Smirnoff
259034852cSGleb Smirnoff sockaddr_u
CreateSockaddr4(const char * address)269034852cSGleb Smirnoff CreateSockaddr4(const char* address) {
27276da39aSCy Schubert sockaddr_u s;
28276da39aSCy Schubert s.sa4.sin_family = AF_INET;
29276da39aSCy Schubert s.sa4.sin_addr.s_addr = inet_addr(address);
30276da39aSCy Schubert SET_PORT(&s, 123);
31276da39aSCy Schubert
32276da39aSCy Schubert return s;
33276da39aSCy Schubert }
34276da39aSCy Schubert
359034852cSGleb Smirnoff
369034852cSGleb Smirnoff struct addrinfo
CreateAddrinfo(sockaddr_u * sock)379034852cSGleb Smirnoff CreateAddrinfo(sockaddr_u* sock) {
38276da39aSCy Schubert struct addrinfo a;
39276da39aSCy Schubert a.ai_family = sock->sa.sa_family;
40276da39aSCy Schubert a.ai_addrlen = SIZEOF_SOCKADDR(a.ai_family);
41276da39aSCy Schubert a.ai_addr = &sock->sa;
42276da39aSCy Schubert return a;
43276da39aSCy Schubert }
44276da39aSCy Schubert
45276da39aSCy Schubert
46276da39aSCy Schubert bool outputFileOpened;
47276da39aSCy Schubert FILE* outputFile;
48276da39aSCy Schubert
49276da39aSCy Schubert
509034852cSGleb Smirnoff void
InitDebugTest(const char * filename)519034852cSGleb Smirnoff InitDebugTest(const char * filename) {
52276da39aSCy Schubert // Clear the contents of the current file.
53276da39aSCy Schubert // Open the output file
54276da39aSCy Schubert outputFile = fopen(filename, "w+");
559034852cSGleb Smirnoff TEST_ASSERT_NOT_NULL(outputFile);
56276da39aSCy Schubert outputFileOpened = true;
57276da39aSCy Schubert }
58276da39aSCy Schubert
599034852cSGleb Smirnoff
60276da39aSCy Schubert // Closes outputFile, and compare contents.
619034852cSGleb Smirnoff void
FinishDebugTest(const char * expected,const char * actual)629034852cSGleb Smirnoff FinishDebugTest(const char * expected,
63276da39aSCy Schubert const char * actual) {
64276da39aSCy Schubert if (outputFileOpened)
65276da39aSCy Schubert fclose(outputFile);
66276da39aSCy Schubert
67276da39aSCy Schubert FILE * e = fopen(expected,"rb");
68276da39aSCy Schubert FILE * a = fopen(actual,"rb");
699034852cSGleb Smirnoff TEST_ASSERT_NOT_NULL(e);
709034852cSGleb Smirnoff TEST_ASSERT_NOT_NULL(a);
71276da39aSCy Schubert
72276da39aSCy Schubert CompareFileContent(e, a);
73276da39aSCy Schubert }
74276da39aSCy Schubert
75276da39aSCy Schubert
76276da39aSCy Schubert /*
77276da39aSCy Schubert * These tests are essentially a copy of the tests for socktoa()
78276da39aSCy Schubert * in libntp. If sntp switches to using that functions, these
79276da39aSCy Schubert * tests can be removed.
80276da39aSCy Schubert */
81276da39aSCy Schubert
829034852cSGleb Smirnoff void
test_IPv4Address(void)839034852cSGleb Smirnoff test_IPv4Address(void) {
84276da39aSCy Schubert const char* ADDR = "192.0.2.10";
85276da39aSCy Schubert
86276da39aSCy Schubert sockaddr_u input = CreateSockaddr4(ADDR);
87276da39aSCy Schubert struct addrinfo inputA = CreateAddrinfo(&input);
88276da39aSCy Schubert
89276da39aSCy Schubert TEST_ASSERT_EQUAL_STRING(ADDR, ss_to_str(&input));
90276da39aSCy Schubert TEST_ASSERT_EQUAL_STRING(ADDR, addrinfo_to_str(&inputA));
91276da39aSCy Schubert }
92276da39aSCy Schubert
939034852cSGleb Smirnoff
949034852cSGleb Smirnoff void
test_IPv6Address(void)959034852cSGleb Smirnoff test_IPv6Address(void) {
96*3311ff84SXin LI const struct in6_addr address = { { {
97276da39aSCy Schubert 0x20, 0x01, 0x0d, 0xb8,
98276da39aSCy Schubert 0x85, 0xa3, 0x08, 0xd3,
99276da39aSCy Schubert 0x13, 0x19, 0x8a, 0x2e,
100276da39aSCy Schubert 0x03, 0x70, 0x73, 0x34
101*3311ff84SXin LI } } };
102276da39aSCy Schubert const char * expected = "2001:db8:85a3:8d3:1319:8a2e:370:7334";
103276da39aSCy Schubert sockaddr_u input;
104276da39aSCy Schubert struct addrinfo inputA;
105276da39aSCy Schubert
106276da39aSCy Schubert memset(&input, 0, sizeof(input));
107276da39aSCy Schubert input.sa6.sin6_family = AF_INET6;
108276da39aSCy Schubert input.sa6.sin6_addr = address;
109276da39aSCy Schubert TEST_ASSERT_EQUAL_STRING(expected, ss_to_str(&input));
110276da39aSCy Schubert
111276da39aSCy Schubert inputA = CreateAddrinfo(&input);
112276da39aSCy Schubert TEST_ASSERT_EQUAL_STRING(expected, addrinfo_to_str(&inputA));
113276da39aSCy Schubert }
114276da39aSCy Schubert
1159034852cSGleb Smirnoff
1169034852cSGleb Smirnoff void
test_SetLiVnMode1(void)1179034852cSGleb Smirnoff test_SetLiVnMode1(void) {
118276da39aSCy Schubert struct pkt expected;
119276da39aSCy Schubert expected.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
120276da39aSCy Schubert NTP_VERSION,
121276da39aSCy Schubert MODE_SERVER);
122276da39aSCy Schubert
123276da39aSCy Schubert struct pkt actual;
124276da39aSCy Schubert set_li_vn_mode(&actual, LEAP_NOWARNING, NTP_VERSION,
125276da39aSCy Schubert MODE_SERVER);
126276da39aSCy Schubert
127276da39aSCy Schubert TEST_ASSERT_EQUAL(expected.li_vn_mode, actual.li_vn_mode);
128276da39aSCy Schubert }
129276da39aSCy Schubert
1309034852cSGleb Smirnoff
1319034852cSGleb Smirnoff void
test_SetLiVnMode2(void)1329034852cSGleb Smirnoff test_SetLiVnMode2(void) {
133276da39aSCy Schubert struct pkt expected;
134276da39aSCy Schubert expected.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
135276da39aSCy Schubert NTP_OLDVERSION,
136276da39aSCy Schubert MODE_BROADCAST);
137276da39aSCy Schubert
138276da39aSCy Schubert struct pkt actual;
139276da39aSCy Schubert set_li_vn_mode(&actual, LEAP_NOTINSYNC, NTP_OLDVERSION,
140276da39aSCy Schubert MODE_BROADCAST);
141276da39aSCy Schubert
142276da39aSCy Schubert TEST_ASSERT_EQUAL(expected.li_vn_mode, actual.li_vn_mode);
143276da39aSCy Schubert }
144276da39aSCy Schubert
145276da39aSCy Schubert /* Debug utilities tests */
146276da39aSCy Schubert
1479034852cSGleb Smirnoff void
test_PktOutput(void)1489034852cSGleb Smirnoff test_PktOutput(void) {
1499034852cSGleb Smirnoff char * filename = "debug-output-pkt";
150276da39aSCy Schubert InitDebugTest(filename);
151276da39aSCy Schubert
152276da39aSCy Schubert struct pkt testpkt;
153276da39aSCy Schubert memset(&testpkt, 0, sizeof(struct pkt));
154276da39aSCy Schubert testpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOWARNING,
155276da39aSCy Schubert NTP_VERSION,
156276da39aSCy Schubert MODE_SERVER);
157276da39aSCy Schubert
158276da39aSCy Schubert l_fp test;
159276da39aSCy Schubert test.l_ui = 8;
160276da39aSCy Schubert test.l_uf = 2147483647; // Lots of ones.
161276da39aSCy Schubert HTONL_FP(&test, &testpkt.xmt);
162276da39aSCy Schubert
163276da39aSCy Schubert pkt_output(&testpkt, LEN_PKT_NOMAC, outputFile);
164276da39aSCy Schubert
165276da39aSCy Schubert FinishDebugTest(CreatePath("debug-input-pkt", INPUT_DIR), filename);
166276da39aSCy Schubert }
167276da39aSCy Schubert
1689034852cSGleb Smirnoff
1699034852cSGleb Smirnoff void
test_LfpOutputBinaryFormat(void)1709034852cSGleb Smirnoff test_LfpOutputBinaryFormat(void) {
171276da39aSCy Schubert char * filename = "debug-output-lfp-bin";//CreatePath("debug-output-lfp-bin", OUTPUT_DIR);
172276da39aSCy Schubert InitDebugTest(filename);
173276da39aSCy Schubert
174276da39aSCy Schubert l_fp test;
175276da39aSCy Schubert test.l_ui = 63; // 00000000 00000000 00000000 00111111
176276da39aSCy Schubert test.l_uf = 127; // 00000000 00000000 00000000 01111111
177276da39aSCy Schubert
178276da39aSCy Schubert l_fp network;
179276da39aSCy Schubert HTONL_FP(&test, &network);
180276da39aSCy Schubert
181276da39aSCy Schubert l_fp_output_bin(&network, outputFile);
182276da39aSCy Schubert
183276da39aSCy Schubert FinishDebugTest(CreatePath("debug-input-lfp-bin", INPUT_DIR), filename);
184276da39aSCy Schubert }
185276da39aSCy Schubert
1869034852cSGleb Smirnoff
1879034852cSGleb Smirnoff void
test_LfpOutputDecimalFormat(void)1889034852cSGleb Smirnoff test_LfpOutputDecimalFormat(void) {
1899034852cSGleb Smirnoff char * filename = "debug-output-lfp-dec";
190276da39aSCy Schubert InitDebugTest(filename);
191276da39aSCy Schubert
192276da39aSCy Schubert l_fp test;
193276da39aSCy Schubert test.l_ui = 6310; // 0x000018A6
194276da39aSCy Schubert test.l_uf = 308502; // 0x00004B516
195276da39aSCy Schubert
196276da39aSCy Schubert l_fp network;
197276da39aSCy Schubert HTONL_FP(&test, &network);
198276da39aSCy Schubert
199276da39aSCy Schubert l_fp_output_dec(&network, outputFile);
200276da39aSCy Schubert
201276da39aSCy Schubert FinishDebugTest(CreatePath("debug-input-lfp-dec", INPUT_DIR), filename);
202276da39aSCy Schubert }
203