3 #include "ntp_stdlib.h"
8 #include "kod_management.h"
10 #include "networking.h"
16 int LfpEquality(const l_fp expected, const l_fp actual);
17 void test_GenerateUnauthenticatedPacket(void);
18 void test_GenerateAuthenticatedPacket(void);
19 void test_OffsetCalculationPositiveOffset(void);
20 void test_OffsetCalculationNegativeOffset(void);
21 void test_HandleUnusableServer(void);
22 void test_HandleUnusablePacket(void);
23 void test_HandleServerAuthenticationFailure(void);
24 void test_HandleKodDemobilize(void);
25 void test_HandleKodRate(void);
26 void test_HandleCorrectPacket(void);
42 return !!(L_ISEQU(&expected, &actual));
47 test_GenerateUnauthenticatedPacket(void)
51 l_fp expected_xmt, actual_xmt;
53 GETTIMEOFDAY(&xmt, NULL);
54 xmt.tv_sec += JAN_1970;
56 TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
57 generate_pkt(&testpkt, &xmt, 0, NULL));
59 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
60 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
61 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
63 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
64 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
66 TVTOTS(&xmt, &expected_xmt);
67 NTOHL_FP(&testpkt.xmt, &actual_xmt);
68 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
73 test_GenerateAuthenticatedPacket(void)
75 static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
80 l_fp expected_xmt, actual_xmt;
81 char expected_mac[MAX_MD5_LEN];
86 memcpy(testkey.key_seq, "123456789", testkey.key_len);
87 memcpy(testkey.type, "MD5", 3);
89 GETTIMEOFDAY(&xmt, NULL);
90 xmt.tv_sec += JAN_1970;
92 TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
93 generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
95 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
96 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
97 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
99 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
100 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
102 TVTOTS(&xmt, &expected_xmt);
103 NTOHL_FP(&testpkt.xmt, &actual_xmt);
104 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
106 TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
108 TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */
109 make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
110 TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
115 test_OffsetCalculationPositiveOffset(void)
120 double offset, precision, synch_distance;
122 rpkt.precision = -16; /* 0,000015259 */
123 rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
124 rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
126 /* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
127 get_systime(&reftime);
128 HTONL_FP(&reftime, &rpkt.reftime);
130 /* T1 - Originate timestamp */
131 tmp.l_ui = 1000000000UL;
133 HTONL_FP(&tmp, &rpkt.org);
135 /* T2 - Receive timestamp */
136 tmp.l_ui = 1000000001UL;
137 tmp.l_uf = 2147483648UL;
138 HTONL_FP(&tmp, &rpkt.rec);
140 /* T3 - Transmit timestamp */
141 tmp.l_ui = 1000000002UL;
143 HTONL_FP(&tmp, &rpkt.xmt);
145 /* T4 - Destination timestamp as standard timeval */
146 tmp.l_ui = 1000000001UL;
149 dst.tv_sec -= JAN_1970;
151 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
153 TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
154 TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
155 /* 1.1250150000000001 ? */
156 TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
161 test_OffsetCalculationNegativeOffset(void)
166 double offset, precision, synch_distance;
169 rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
170 rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
172 /* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
173 get_systime(&reftime);
174 HTONL_FP(&reftime, &rpkt.reftime);
176 /* T1 - Originate timestamp */
177 tmp.l_ui = 1000000001UL;
179 HTONL_FP(&tmp, &rpkt.org);
181 /* T2 - Receive timestamp */
182 tmp.l_ui = 1000000000UL;
183 tmp.l_uf = 2147483648UL;
184 HTONL_FP(&tmp, &rpkt.rec);
186 /*/ T3 - Transmit timestamp */
187 tmp.l_ui = 1000000001UL;
188 tmp.l_uf = 2147483648UL;
189 HTONL_FP(&tmp, &rpkt.xmt);
191 /* T4 - Destination timestamp as standard timeval */
192 tmp.l_ui = 1000000003UL;
196 dst.tv_sec -= JAN_1970;
198 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
200 TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
201 TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
202 TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
207 test_HandleUnusableServer(void)
215 rpktl = SERVER_UNUSEABLE;
216 TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
221 test_HandleUnusablePacket(void)
229 rpktl = PACKET_UNUSEABLE;
230 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
235 test_HandleServerAuthenticationFailure(void)
243 rpktl = SERVER_AUTH_FAIL;
244 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
249 test_HandleKodDemobilize(void)
251 static const char * HOSTNAME = "192.0.2.1";
252 static const char * REASON = "DENY";
256 struct kod_entry * entry;
258 rpktl = KOD_DEMOBILIZE;
260 memcpy(&rpkt.refid, REASON, 4);
262 host.sa4.sin_family = AF_INET;
263 host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
265 /* Test that the KOD-entry is added to the database. */
266 kod_init_kod_db("/dev/null", TRUE);
268 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
270 TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
271 TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
276 test_HandleKodRate(void)
285 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
290 test_HandleCorrectPacket(void)
297 /* We don't want our testing code to actually change the system clock. */
298 TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
299 TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
302 HTONL_FP(&now, &rpkt.reftime);
303 HTONL_FP(&now, &rpkt.org);
304 HTONL_FP(&now, &rpkt.rec);
305 HTONL_FP(&now, &rpkt.xmt);
306 rpktl = LEN_PKT_NOMAC;
310 TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
313 /* packetHandling.c */