3 #include "ntp_stdlib.h"
8 #include "kod_management.h"
10 #include "networking.h"
19 // old code from google test framework, moved to SetUp() for unity
27 int LfpEquality(const l_fp expected, const l_fp actual) {
28 if (L_ISEQU(&expected, &actual)) {
35 void test_GenerateUnauthenticatedPacket(void) {
39 GETTIMEOFDAY(&xmt, NULL);
40 xmt.tv_sec += JAN_1970;
42 TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
43 generate_pkt(&testpkt, &xmt, 0, NULL));
45 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
46 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
47 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
49 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
50 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
52 l_fp expected_xmt, actual_xmt;
53 TVTOTS(&xmt, &expected_xmt);
54 NTOHL_FP(&testpkt.xmt, &actual_xmt);
55 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
58 void test_GenerateAuthenticatedPacket(void) {
63 memcpy(testkey.key_seq, "123456789", testkey.key_len);
64 memcpy(testkey.type, "MD5", 3);
69 GETTIMEOFDAY(&xmt, NULL);
70 xmt.tv_sec += JAN_1970;
72 const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
74 TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
75 generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
77 TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
78 TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
79 TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
81 TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
82 TEST_ASSERT_EQUAL(8, testpkt.ppoll);
84 l_fp expected_xmt, actual_xmt;
85 TVTOTS(&xmt, &expected_xmt);
86 NTOHL_FP(&testpkt.xmt, &actual_xmt);
87 TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
89 TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
91 char expected_mac[MAX_MD5_LEN];
92 TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, // Remove the key_id, only keep the mac.
93 make_mac((char*)&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
94 TEST_ASSERT_TRUE(memcmp(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4) == 0);
97 void test_OffsetCalculationPositiveOffset(void) {
100 rpkt.precision = -16; // 0,000015259
101 rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
102 rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
103 // Synch Distance: (0.125+0.25)/2.0 == 0.1875
105 get_systime(&reftime);
106 HTONL_FP(&reftime, &rpkt.reftime);
110 // T1 - Originate timestamp
111 tmp.l_ui = 1000000000UL;
113 HTONL_FP(&tmp, &rpkt.org);
115 // T2 - Receive timestamp
116 tmp.l_ui = 1000000001UL;
117 tmp.l_uf = 2147483648UL;
118 HTONL_FP(&tmp, &rpkt.rec);
120 // T3 - Transmit timestamp
121 tmp.l_ui = 1000000002UL;
123 HTONL_FP(&tmp, &rpkt.xmt);
125 // T4 - Destination timestamp as standard timeval
126 tmp.l_ui = 1000000001UL;
130 dst.tv_sec -= JAN_1970;
132 double offset, precision, synch_distance;
133 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
135 TEST_ASSERT_EQUAL_FLOAT(1.25, offset);
136 TEST_ASSERT_EQUAL_FLOAT(1. / ULOGTOD(16), precision);
137 // 1.1250150000000001 ?
138 TEST_ASSERT_EQUAL_FLOAT(1.125015, synch_distance);
141 void test_OffsetCalculationNegativeOffset(void) {
145 rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
146 rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
147 // Synch Distance is (0.5+0.5)/2.0, or 0.5
149 get_systime(&reftime);
150 HTONL_FP(&reftime, &rpkt.reftime);
154 // T1 - Originate timestamp
155 tmp.l_ui = 1000000001UL;
157 HTONL_FP(&tmp, &rpkt.org);
159 // T2 - Receive timestamp
160 tmp.l_ui = 1000000000UL;
161 tmp.l_uf = 2147483648UL;
162 HTONL_FP(&tmp, &rpkt.rec);
164 // T3 - Transmit timestamp
165 tmp.l_ui = 1000000001UL;
166 tmp.l_uf = 2147483648UL;
167 HTONL_FP(&tmp, &rpkt.xmt);
169 // T4 - Destination timestamp as standard timeval
170 tmp.l_ui = 1000000003UL;
174 dst.tv_sec -= JAN_1970;
176 double offset, precision, synch_distance;
177 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
179 TEST_ASSERT_EQUAL_FLOAT(-1, offset);
180 TEST_ASSERT_EQUAL_FLOAT(1. / ULOGTOD(1), precision);
181 TEST_ASSERT_EQUAL_FLOAT(1.3333483333333334, synch_distance);
184 void test_HandleUnusableServer(void) {
191 rpktl = SERVER_UNUSEABLE;
192 TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
195 void test_HandleUnusablePacket(void) {
202 rpktl = PACKET_UNUSEABLE;
203 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
206 void test_HandleServerAuthenticationFailure(void) {
213 rpktl = SERVER_AUTH_FAIL;
214 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
217 void test_HandleKodDemobilize(void) {
218 const char * HOSTNAME = "192.0.2.1";
219 const char * REASON = "DENY";
223 struct kod_entry * entry;
225 rpktl = KOD_DEMOBILIZE;
227 memcpy(&rpkt.refid, REASON, 4);
229 host.sa4.sin_family = AF_INET;
230 host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
232 // Test that the KOD-entry is added to the database.
233 kod_init_kod_db("/dev/null", TRUE);
235 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
237 TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
238 TEST_ASSERT_TRUE(memcmp(REASON, entry->type, 4) == 0);
241 void test_HandleKodRate(void) {
249 TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
252 void test_HandleCorrectPacket(void) {
258 // We don't want our testing code to actually change the system clock.
259 TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
260 TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
263 HTONL_FP(&now, &rpkt.reftime);
264 HTONL_FP(&now, &rpkt.org);
265 HTONL_FP(&now, &rpkt.rec);
266 HTONL_FP(&now, &rpkt.xmt);
267 rpktl = LEN_PKT_NOMAC;
271 TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
274 /* packetHandling.c */