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);
36 LfpEquality(const l_fp expected, const l_fp actual) {
37 if (L_ISEQU(&expected, &actual))
45 test_GenerateUnauthenticatedPacket(void) {
49 GETTIMEOFDAY(&xmt, NULL);
50 xmt.tv_sec += JAN_1970;
52 TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
53 generate_pkt(&testpkt, &xmt, 0, NULL));
55 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
56 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
57 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
59 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
60 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
62 l_fp expected_xmt, actual_xmt;
63 TVTOTS(&xmt, &expected_xmt);
64 NTOHL_FP(&testpkt.xmt, &actual_xmt);
65 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
70 test_GenerateAuthenticatedPacket(void) {
75 memcpy(testkey.key_seq, "123456789", testkey.key_len);
76 memcpy(testkey.type, "MD5", 3);
81 GETTIMEOFDAY(&xmt, NULL);
82 xmt.tv_sec += JAN_1970;
84 const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
86 TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
87 generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
89 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
90 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
91 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
93 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
94 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
96 l_fp expected_xmt, actual_xmt;
97 TVTOTS(&xmt, &expected_xmt);
98 NTOHL_FP(&testpkt.xmt, &actual_xmt);
99 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
101 TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
103 char expected_mac[MAX_MD5_LEN];
104 TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, // Remove the key_id, only keep the mac.
105 make_mac((char*)&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
106 TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
111 test_OffsetCalculationPositiveOffset(void) {
114 rpkt.precision = -16; // 0,000015259
115 rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
116 rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
117 // Synch Distance: (0.125+0.25)/2.0 == 0.1875
119 get_systime(&reftime);
120 HTONL_FP(&reftime, &rpkt.reftime);
124 // T1 - Originate timestamp
125 tmp.l_ui = 1000000000UL;
127 HTONL_FP(&tmp, &rpkt.org);
129 // T2 - Receive timestamp
130 tmp.l_ui = 1000000001UL;
131 tmp.l_uf = 2147483648UL;
132 HTONL_FP(&tmp, &rpkt.rec);
134 // T3 - Transmit timestamp
135 tmp.l_ui = 1000000002UL;
137 HTONL_FP(&tmp, &rpkt.xmt);
139 // T4 - Destination timestamp as standard timeval
140 tmp.l_ui = 1000000001UL;
144 dst.tv_sec -= JAN_1970;
146 double offset, precision, synch_distance;
147 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
149 TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
150 TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
151 // 1.1250150000000001 ?
152 TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
157 test_OffsetCalculationNegativeOffset(void) {
161 rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
162 rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
163 // Synch Distance is (0.5+0.5)/2.0, or 0.5
165 get_systime(&reftime);
166 HTONL_FP(&reftime, &rpkt.reftime);
170 // T1 - Originate timestamp
171 tmp.l_ui = 1000000001UL;
173 HTONL_FP(&tmp, &rpkt.org);
175 // T2 - Receive timestamp
176 tmp.l_ui = 1000000000UL;
177 tmp.l_uf = 2147483648UL;
178 HTONL_FP(&tmp, &rpkt.rec);
180 // T3 - Transmit timestamp
181 tmp.l_ui = 1000000001UL;
182 tmp.l_uf = 2147483648UL;
183 HTONL_FP(&tmp, &rpkt.xmt);
185 // T4 - Destination timestamp as standard timeval
186 tmp.l_ui = 1000000003UL;
190 dst.tv_sec -= JAN_1970;
192 double offset, precision, synch_distance;
193 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
195 TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
196 TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
197 TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
202 test_HandleUnusableServer(void) {
209 rpktl = SERVER_UNUSEABLE;
210 TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
215 test_HandleUnusablePacket(void) {
222 rpktl = PACKET_UNUSEABLE;
223 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
228 test_HandleServerAuthenticationFailure(void) {
235 rpktl = SERVER_AUTH_FAIL;
236 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
241 test_HandleKodDemobilize(void) {
242 const char * HOSTNAME = "192.0.2.1";
243 const char * REASON = "DENY";
247 struct kod_entry * entry;
249 rpktl = KOD_DEMOBILIZE;
251 memcpy(&rpkt.refid, REASON, 4);
253 host.sa4.sin_family = AF_INET;
254 host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
256 // Test that the KOD-entry is added to the database.
257 kod_init_kod_db("/dev/null", TRUE);
259 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
261 TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
262 TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
267 test_HandleKodRate(void) {
275 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
280 test_HandleCorrectPacket(void) {
286 // We don't want our testing code to actually change the system clock.
287 TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
288 TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
291 HTONL_FP(&now, &rpkt.reftime);
292 HTONL_FP(&now, &rpkt.org);
293 HTONL_FP(&now, &rpkt.rec);
294 HTONL_FP(&now, &rpkt.xmt);
295 rpktl = LEN_PKT_NOMAC;
299 TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
302 /* packetHandling.c */