1 #include "g_sntptest.h"
4 #include "kod_management.h"
6 #include "networking.h"
10 class mainTest : public sntptest {
12 ::testing::AssertionResult LfpEquality(const l_fp &expected, const l_fp &actual) {
13 if (L_ISEQU(&expected, &actual)) {
14 return ::testing::AssertionSuccess();
16 return ::testing::AssertionFailure()
17 << " expected: " << lfptoa(&expected, FRACTION_PREC)
18 << " (" << expected.l_ui << "." << expected.l_uf << ")"
19 << " but was: " << lfptoa(&actual, FRACTION_PREC)
20 << " (" << actual.l_ui << "." << actual.l_uf << ")";
25 TEST_F(mainTest, GenerateUnauthenticatedPacket) {
29 GETTIMEOFDAY(&xmt, NULL);
30 xmt.tv_sec += JAN_1970;
32 EXPECT_EQ(LEN_PKT_NOMAC,
33 generate_pkt(&testpkt, &xmt, 0, NULL));
35 EXPECT_EQ(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
36 EXPECT_EQ(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
37 EXPECT_EQ(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
39 EXPECT_EQ(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
40 EXPECT_EQ(8, testpkt.ppoll);
42 l_fp expected_xmt, actual_xmt;
43 TVTOTS(&xmt, &expected_xmt);
44 NTOHL_FP(&testpkt.xmt, &actual_xmt);
45 EXPECT_TRUE(LfpEquality(expected_xmt, actual_xmt));
48 TEST_F(mainTest, GenerateAuthenticatedPacket) {
53 memcpy(testkey.key_seq, "123456789", testkey.key_len);
54 memcpy(testkey.type, "MD5", 3);
59 GETTIMEOFDAY(&xmt, NULL);
60 xmt.tv_sec += JAN_1970;
62 const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
64 EXPECT_EQ(EXPECTED_PKTLEN,
65 generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
67 EXPECT_EQ(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
68 EXPECT_EQ(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
69 EXPECT_EQ(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
71 EXPECT_EQ(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
72 EXPECT_EQ(8, testpkt.ppoll);
74 l_fp expected_xmt, actual_xmt;
75 TVTOTS(&xmt, &expected_xmt);
76 NTOHL_FP(&testpkt.xmt, &actual_xmt);
77 EXPECT_TRUE(LfpEquality(expected_xmt, actual_xmt));
79 EXPECT_EQ(testkey.key_id, ntohl(testpkt.exten[0]));
81 char expected_mac[MAX_MD5_LEN];
82 ASSERT_EQ(MAX_MD5_LEN - 4, // Remove the key_id, only keep the mac.
83 make_mac((char*)&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
84 EXPECT_TRUE(memcmp(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4) == 0);
87 TEST_F(mainTest, OffsetCalculationPositiveOffset) {
90 rpkt.precision = -16; // 0,000015259
91 rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
92 rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
93 // Synch Distance: (0.125+0.25)/2.0 == 0.1875
95 get_systime(&reftime);
96 HTONL_FP(&reftime, &rpkt.reftime);
100 // T1 - Originate timestamp
101 tmp.l_ui = 1000000000UL;
103 HTONL_FP(&tmp, &rpkt.org);
105 // T2 - Receive timestamp
106 tmp.l_ui = 1000000001UL;
107 tmp.l_uf = 2147483648UL;
108 HTONL_FP(&tmp, &rpkt.rec);
110 // T3 - Transmit timestamp
111 tmp.l_ui = 1000000002UL;
113 HTONL_FP(&tmp, &rpkt.xmt);
115 // T4 - Destination timestamp as standard timeval
116 tmp.l_ui = 1000000001UL;
120 dst.tv_sec -= JAN_1970;
122 double offset, precision, synch_distance;
123 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
125 EXPECT_DOUBLE_EQ(1.25, offset);
126 EXPECT_DOUBLE_EQ(1. / ULOGTOD(16), precision);
127 // 1.1250150000000001 ?
128 EXPECT_DOUBLE_EQ(1.125015, synch_distance);
131 TEST_F(mainTest, OffsetCalculationNegativeOffset) {
135 rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
136 rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
137 // Synch Distance is (0.5+0.5)/2.0, or 0.5
139 get_systime(&reftime);
140 HTONL_FP(&reftime, &rpkt.reftime);
144 // T1 - Originate timestamp
145 tmp.l_ui = 1000000001UL;
147 HTONL_FP(&tmp, &rpkt.org);
149 // T2 - Receive timestamp
150 tmp.l_ui = 1000000000UL;
151 tmp.l_uf = 2147483648UL;
152 HTONL_FP(&tmp, &rpkt.rec);
154 // T3 - Transmit timestamp
155 tmp.l_ui = 1000000001UL;
156 tmp.l_uf = 2147483648UL;
157 HTONL_FP(&tmp, &rpkt.xmt);
159 // T4 - Destination timestamp as standard timeval
160 tmp.l_ui = 1000000003UL;
164 dst.tv_sec -= JAN_1970;
166 double offset, precision, synch_distance;
167 offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
169 EXPECT_DOUBLE_EQ(-1, offset);
170 EXPECT_DOUBLE_EQ(1. / ULOGTOD(1), precision);
171 EXPECT_DOUBLE_EQ(1.3333483333333334, synch_distance);
174 TEST_F(mainTest, HandleUnusableServer) {
181 rpktl = SERVER_UNUSEABLE;
182 EXPECT_EQ(-1, handle_pkt(rpktl, &rpkt, &host, ""));
185 TEST_F(mainTest, HandleUnusablePacket) {
192 rpktl = PACKET_UNUSEABLE;
193 EXPECT_EQ(1, handle_pkt(rpktl, &rpkt, &host, ""));
196 TEST_F(mainTest, HandleServerAuthenticationFailure) {
203 rpktl = SERVER_AUTH_FAIL;
204 EXPECT_EQ(1, handle_pkt(rpktl, &rpkt, &host, ""));
207 TEST_F(mainTest, HandleKodDemobilize) {
208 const char * HOSTNAME = "192.0.2.1";
209 const char * REASON = "DENY";
215 rpktl = KOD_DEMOBILIZE;
217 memcpy(&rpkt.refid, REASON, 4);
219 host.sa4.sin_family = AF_INET;
220 host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
222 // Test that the KOD-entry is added to the database.
223 kod_init_kod_db("/dev/null", TRUE);
225 EXPECT_EQ(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
227 ASSERT_EQ(1, search_entry(HOSTNAME, &entry));
228 EXPECT_TRUE(memcmp(REASON, entry->type, 4) == 0);
231 TEST_F(mainTest, HandleKodRate) {
239 EXPECT_EQ(1, handle_pkt(rpktl, &rpkt, &host, ""));
242 TEST_F(mainTest, HandleCorrectPacket) {
248 // We don't want our testing code to actually change the system clock.
249 ASSERT_FALSE(ENABLED_OPT(STEP));
250 ASSERT_FALSE(ENABLED_OPT(SLEW));
253 HTONL_FP(&now, &rpkt.reftime);
254 HTONL_FP(&now, &rpkt.org);
255 HTONL_FP(&now, &rpkt.rec);
256 HTONL_FP(&now, &rpkt.xmt);
257 rpktl = LEN_PKT_NOMAC;
261 EXPECT_EQ(0, handle_pkt(rpktl, &rpkt, &host, ""));
264 /* packetHandling.cpp */