1276da39aSCy Schubert #include "config.h" 2276da39aSCy Schubert #include "ntp_debug.h" 3276da39aSCy Schubert #include "ntp_stdlib.h" 4276da39aSCy Schubert #include "ntp_types.h" 5276da39aSCy Schubert 6276da39aSCy Schubert #include "sntptest.h" 7276da39aSCy Schubert 8276da39aSCy Schubert #include "kod_management.h" 9276da39aSCy Schubert #include "main.h" 10276da39aSCy Schubert #include "networking.h" 11276da39aSCy Schubert #include "ntp.h" 12276da39aSCy Schubert 13276da39aSCy Schubert #include "unity.h" 14276da39aSCy Schubert 159034852cSGleb Smirnoff void setUp(void); 169034852cSGleb Smirnoff int LfpEquality(const l_fp expected, const l_fp actual); 179034852cSGleb Smirnoff void test_GenerateUnauthenticatedPacket(void); 189034852cSGleb Smirnoff void test_GenerateAuthenticatedPacket(void); 199034852cSGleb Smirnoff void test_OffsetCalculationPositiveOffset(void); 209034852cSGleb Smirnoff void test_OffsetCalculationNegativeOffset(void); 219034852cSGleb Smirnoff void test_HandleUnusableServer(void); 229034852cSGleb Smirnoff void test_HandleUnusablePacket(void); 239034852cSGleb Smirnoff void test_HandleServerAuthenticationFailure(void); 249034852cSGleb Smirnoff void test_HandleKodDemobilize(void); 259034852cSGleb Smirnoff void test_HandleKodRate(void); 269034852cSGleb Smirnoff void test_HandleCorrectPacket(void); 27276da39aSCy Schubert 28276da39aSCy Schubert 299034852cSGleb Smirnoff void 30*68ba7e87SXin LI setUp(void) 31*68ba7e87SXin LI { 32276da39aSCy Schubert init_lib(); 33276da39aSCy Schubert } 34276da39aSCy Schubert 35276da39aSCy Schubert 369034852cSGleb Smirnoff int 37*68ba7e87SXin LI LfpEquality( 38*68ba7e87SXin LI const l_fp expected, 39*68ba7e87SXin LI const l_fp actual 40*68ba7e87SXin LI ) 41*68ba7e87SXin LI { 42*68ba7e87SXin LI return !!(L_ISEQU(&expected, &actual)); 43276da39aSCy Schubert } 44276da39aSCy Schubert 459034852cSGleb Smirnoff 469034852cSGleb Smirnoff void 47*68ba7e87SXin LI test_GenerateUnauthenticatedPacket(void) 48*68ba7e87SXin LI { 49276da39aSCy Schubert struct pkt testpkt; 50276da39aSCy Schubert struct timeval xmt; 51*68ba7e87SXin LI l_fp expected_xmt, actual_xmt; 52*68ba7e87SXin LI 53276da39aSCy Schubert GETTIMEOFDAY(&xmt, NULL); 54276da39aSCy Schubert xmt.tv_sec += JAN_1970; 55276da39aSCy Schubert 56276da39aSCy Schubert TEST_ASSERT_EQUAL(LEN_PKT_NOMAC, 57276da39aSCy Schubert generate_pkt(&testpkt, &xmt, 0, NULL)); 58276da39aSCy Schubert 59276da39aSCy Schubert TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode)); 60276da39aSCy Schubert TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode)); 61276da39aSCy Schubert TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode)); 62276da39aSCy Schubert 63276da39aSCy Schubert TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum)); 64276da39aSCy Schubert TEST_ASSERT_EQUAL(8, testpkt.ppoll); 65276da39aSCy Schubert 66276da39aSCy Schubert TVTOTS(&xmt, &expected_xmt); 67276da39aSCy Schubert NTOHL_FP(&testpkt.xmt, &actual_xmt); 68276da39aSCy Schubert TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt)); 69276da39aSCy Schubert } 70276da39aSCy Schubert 719034852cSGleb Smirnoff 729034852cSGleb Smirnoff void 73*68ba7e87SXin LI test_GenerateAuthenticatedPacket(void) 74*68ba7e87SXin LI { 75*68ba7e87SXin LI static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN; 76*68ba7e87SXin LI 77276da39aSCy Schubert struct key testkey; 78*68ba7e87SXin LI struct pkt testpkt; 79*68ba7e87SXin LI struct timeval xmt; 80*68ba7e87SXin LI l_fp expected_xmt, actual_xmt; 81*68ba7e87SXin LI char expected_mac[MAX_MD5_LEN]; 82*68ba7e87SXin LI 83276da39aSCy Schubert testkey.next = NULL; 84276da39aSCy Schubert testkey.key_id = 30; 85276da39aSCy Schubert testkey.key_len = 9; 86276da39aSCy Schubert memcpy(testkey.key_seq, "123456789", testkey.key_len); 87276da39aSCy Schubert memcpy(testkey.type, "MD5", 3); 88276da39aSCy Schubert 89276da39aSCy Schubert GETTIMEOFDAY(&xmt, NULL); 90276da39aSCy Schubert xmt.tv_sec += JAN_1970; 91276da39aSCy Schubert 92276da39aSCy Schubert TEST_ASSERT_EQUAL(EXPECTED_PKTLEN, 93276da39aSCy Schubert generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey)); 94276da39aSCy Schubert 95276da39aSCy Schubert TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode)); 96276da39aSCy Schubert TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode)); 97276da39aSCy Schubert TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode)); 98276da39aSCy Schubert 99276da39aSCy Schubert TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum)); 100276da39aSCy Schubert TEST_ASSERT_EQUAL(8, testpkt.ppoll); 101276da39aSCy Schubert 102276da39aSCy Schubert TVTOTS(&xmt, &expected_xmt); 103276da39aSCy Schubert NTOHL_FP(&testpkt.xmt, &actual_xmt); 104276da39aSCy Schubert TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt)); 105276da39aSCy Schubert 106276da39aSCy Schubert TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0])); 107276da39aSCy Schubert 108*68ba7e87SXin LI TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */ 109*68ba7e87SXin LI make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac)); 1109034852cSGleb Smirnoff TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4); 111276da39aSCy Schubert } 112276da39aSCy Schubert 1139034852cSGleb Smirnoff 1149034852cSGleb Smirnoff void 115*68ba7e87SXin LI test_OffsetCalculationPositiveOffset(void) 116*68ba7e87SXin LI { 117276da39aSCy Schubert struct pkt rpkt; 118*68ba7e87SXin LI l_fp reftime, tmp; 119*68ba7e87SXin LI struct timeval dst; 120*68ba7e87SXin LI double offset, precision, synch_distance; 121276da39aSCy Schubert 122*68ba7e87SXin LI rpkt.precision = -16; /* 0,000015259 */ 123276da39aSCy Schubert rpkt.rootdelay = HTONS_FP(DTOUFP(0.125)); 124276da39aSCy Schubert rpkt.rootdisp = HTONS_FP(DTOUFP(0.25)); 125*68ba7e87SXin LI 126*68ba7e87SXin LI /* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */ 127276da39aSCy Schubert get_systime(&reftime); 128276da39aSCy Schubert HTONL_FP(&reftime, &rpkt.reftime); 129276da39aSCy Schubert 130*68ba7e87SXin LI /* T1 - Originate timestamp */ 131276da39aSCy Schubert tmp.l_ui = 1000000000UL; 132276da39aSCy Schubert tmp.l_uf = 0UL; 133276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.org); 134276da39aSCy Schubert 135*68ba7e87SXin LI /* T2 - Receive timestamp */ 136276da39aSCy Schubert tmp.l_ui = 1000000001UL; 137276da39aSCy Schubert tmp.l_uf = 2147483648UL; 138276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.rec); 139276da39aSCy Schubert 140*68ba7e87SXin LI /* T3 - Transmit timestamp */ 141276da39aSCy Schubert tmp.l_ui = 1000000002UL; 142276da39aSCy Schubert tmp.l_uf = 0UL; 143276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.xmt); 144276da39aSCy Schubert 145*68ba7e87SXin LI /* T4 - Destination timestamp as standard timeval */ 146276da39aSCy Schubert tmp.l_ui = 1000000001UL; 147276da39aSCy Schubert tmp.l_uf = 0UL; 148276da39aSCy Schubert TSTOTV(&tmp, &dst); 149276da39aSCy Schubert dst.tv_sec -= JAN_1970; 150276da39aSCy Schubert 151276da39aSCy Schubert offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance); 152276da39aSCy Schubert 1539034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(1.25, offset); 1549034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision); 155*68ba7e87SXin LI /* 1.1250150000000001 ? */ 1569034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance); 157276da39aSCy Schubert } 158276da39aSCy Schubert 1599034852cSGleb Smirnoff 1609034852cSGleb Smirnoff void 161*68ba7e87SXin LI test_OffsetCalculationNegativeOffset(void) 162*68ba7e87SXin LI { 163276da39aSCy Schubert struct pkt rpkt; 164*68ba7e87SXin LI l_fp reftime, tmp; 165*68ba7e87SXin LI struct timeval dst; 166*68ba7e87SXin LI double offset, precision, synch_distance; 167276da39aSCy Schubert 168276da39aSCy Schubert rpkt.precision = -1; 169276da39aSCy Schubert rpkt.rootdelay = HTONS_FP(DTOUFP(0.5)); 170276da39aSCy Schubert rpkt.rootdisp = HTONS_FP(DTOUFP(0.5)); 171*68ba7e87SXin LI 172*68ba7e87SXin LI /* Synch Distance is (0.5+0.5)/2.0, or 0.5 */ 173276da39aSCy Schubert get_systime(&reftime); 174276da39aSCy Schubert HTONL_FP(&reftime, &rpkt.reftime); 175276da39aSCy Schubert 176*68ba7e87SXin LI /* T1 - Originate timestamp */ 177276da39aSCy Schubert tmp.l_ui = 1000000001UL; 178276da39aSCy Schubert tmp.l_uf = 0UL; 179276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.org); 180276da39aSCy Schubert 181*68ba7e87SXin LI /* T2 - Receive timestamp */ 182276da39aSCy Schubert tmp.l_ui = 1000000000UL; 183276da39aSCy Schubert tmp.l_uf = 2147483648UL; 184276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.rec); 185276da39aSCy Schubert 186*68ba7e87SXin LI /*/ T3 - Transmit timestamp */ 187276da39aSCy Schubert tmp.l_ui = 1000000001UL; 188276da39aSCy Schubert tmp.l_uf = 2147483648UL; 189276da39aSCy Schubert HTONL_FP(&tmp, &rpkt.xmt); 190276da39aSCy Schubert 191*68ba7e87SXin LI /* T4 - Destination timestamp as standard timeval */ 192276da39aSCy Schubert tmp.l_ui = 1000000003UL; 193276da39aSCy Schubert tmp.l_uf = 0UL; 194*68ba7e87SXin LI 195276da39aSCy Schubert TSTOTV(&tmp, &dst); 196276da39aSCy Schubert dst.tv_sec -= JAN_1970; 197276da39aSCy Schubert 198276da39aSCy Schubert offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance); 199276da39aSCy Schubert 2009034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(-1, offset); 2019034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision); 2029034852cSGleb Smirnoff TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance); 203276da39aSCy Schubert } 204276da39aSCy Schubert 2059034852cSGleb Smirnoff 2069034852cSGleb Smirnoff void 207*68ba7e87SXin LI test_HandleUnusableServer(void) 208*68ba7e87SXin LI { 209276da39aSCy Schubert struct pkt rpkt; 210276da39aSCy Schubert sockaddr_u host; 211276da39aSCy Schubert int rpktl; 212276da39aSCy Schubert 213276da39aSCy Schubert ZERO(rpkt); 214276da39aSCy Schubert ZERO(host); 215276da39aSCy Schubert rpktl = SERVER_UNUSEABLE; 216276da39aSCy Schubert TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, "")); 217276da39aSCy Schubert } 218276da39aSCy Schubert 2199034852cSGleb Smirnoff 2209034852cSGleb Smirnoff void 221*68ba7e87SXin LI test_HandleUnusablePacket(void) 222*68ba7e87SXin LI { 223276da39aSCy Schubert struct pkt rpkt; 224276da39aSCy Schubert sockaddr_u host; 225276da39aSCy Schubert int rpktl; 226276da39aSCy Schubert 227276da39aSCy Schubert ZERO(rpkt); 228276da39aSCy Schubert ZERO(host); 229276da39aSCy Schubert rpktl = PACKET_UNUSEABLE; 230276da39aSCy Schubert TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 231276da39aSCy Schubert } 232276da39aSCy Schubert 2339034852cSGleb Smirnoff 2349034852cSGleb Smirnoff void 235*68ba7e87SXin LI test_HandleServerAuthenticationFailure(void) 236*68ba7e87SXin LI { 237276da39aSCy Schubert struct pkt rpkt; 238276da39aSCy Schubert sockaddr_u host; 239276da39aSCy Schubert int rpktl; 240276da39aSCy Schubert 241276da39aSCy Schubert ZERO(rpkt); 242276da39aSCy Schubert ZERO(host); 243276da39aSCy Schubert rpktl = SERVER_AUTH_FAIL; 244276da39aSCy Schubert TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 245276da39aSCy Schubert } 246276da39aSCy Schubert 2479034852cSGleb Smirnoff 2489034852cSGleb Smirnoff void 249*68ba7e87SXin LI test_HandleKodDemobilize(void) 250*68ba7e87SXin LI { 251*68ba7e87SXin LI static const char * HOSTNAME = "192.0.2.1"; 252*68ba7e87SXin LI static const char * REASON = "DENY"; 253276da39aSCy Schubert struct pkt rpkt; 254276da39aSCy Schubert sockaddr_u host; 255276da39aSCy Schubert int rpktl; 256276da39aSCy Schubert struct kod_entry * entry; 257276da39aSCy Schubert 258276da39aSCy Schubert rpktl = KOD_DEMOBILIZE; 259276da39aSCy Schubert ZERO(rpkt); 260276da39aSCy Schubert memcpy(&rpkt.refid, REASON, 4); 261276da39aSCy Schubert ZERO(host); 262276da39aSCy Schubert host.sa4.sin_family = AF_INET; 263276da39aSCy Schubert host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME); 264276da39aSCy Schubert 265*68ba7e87SXin LI /* Test that the KOD-entry is added to the database. */ 266276da39aSCy Schubert kod_init_kod_db("/dev/null", TRUE); 267276da39aSCy Schubert 268276da39aSCy Schubert TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME)); 269276da39aSCy Schubert 270276da39aSCy Schubert TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry)); 2719034852cSGleb Smirnoff TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4); 272276da39aSCy Schubert } 273276da39aSCy Schubert 2749034852cSGleb Smirnoff 2759034852cSGleb Smirnoff void 276*68ba7e87SXin LI test_HandleKodRate(void) 277*68ba7e87SXin LI { 278276da39aSCy Schubert struct pkt rpkt; 279276da39aSCy Schubert sockaddr_u host; 280276da39aSCy Schubert int rpktl; 281276da39aSCy Schubert 282276da39aSCy Schubert ZERO(rpkt); 283276da39aSCy Schubert ZERO(host); 284276da39aSCy Schubert rpktl = KOD_RATE; 285276da39aSCy Schubert TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 286276da39aSCy Schubert } 287276da39aSCy Schubert 2889034852cSGleb Smirnoff 2899034852cSGleb Smirnoff void 290*68ba7e87SXin LI test_HandleCorrectPacket(void) 291*68ba7e87SXin LI { 292276da39aSCy Schubert struct pkt rpkt; 293276da39aSCy Schubert sockaddr_u host; 294276da39aSCy Schubert int rpktl; 295276da39aSCy Schubert l_fp now; 296276da39aSCy Schubert 297*68ba7e87SXin LI /* We don't want our testing code to actually change the system clock. */ 298276da39aSCy Schubert TEST_ASSERT_FALSE(ENABLED_OPT(STEP)); 299276da39aSCy Schubert TEST_ASSERT_FALSE(ENABLED_OPT(SLEW)); 300276da39aSCy Schubert 301276da39aSCy Schubert get_systime(&now); 302276da39aSCy Schubert HTONL_FP(&now, &rpkt.reftime); 303276da39aSCy Schubert HTONL_FP(&now, &rpkt.org); 304276da39aSCy Schubert HTONL_FP(&now, &rpkt.rec); 305276da39aSCy Schubert HTONL_FP(&now, &rpkt.xmt); 306276da39aSCy Schubert rpktl = LEN_PKT_NOMAC; 307276da39aSCy Schubert ZERO(host); 308276da39aSCy Schubert AF(&host) = AF_INET; 309276da39aSCy Schubert 310276da39aSCy Schubert TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, "")); 311276da39aSCy Schubert } 312276da39aSCy Schubert 313276da39aSCy Schubert /* packetHandling.c */ 314