1169718Skan#include "config.h" 2169718Skan#include "ntp_debug.h" 3169718Skan#include "ntp_stdlib.h" 4169718Skan#include "ntp_types.h" 5169718Skan 6169718Skan#include "sntptest.h" 7169718Skan 8169718Skan#include "kod_management.h" 9169718Skan#include "main.h" 10169718Skan#include "networking.h" 11169718Skan#include "ntp.h" 12169718Skan 13169718Skan#include "unity.h" 14169718Skan 15169718Skanvoid setUp(void); 16169718Skanint LfpEquality(const l_fp expected, const l_fp actual); 17169718Skanvoid test_GenerateUnauthenticatedPacket(void); 18169718Skanvoid test_GenerateAuthenticatedPacket(void); 19169718Skanvoid test_OffsetCalculationPositiveOffset(void); 20169718Skanvoid test_OffsetCalculationNegativeOffset(void); 21169718Skanvoid test_HandleUnusableServer(void); 22169718Skanvoid test_HandleUnusablePacket(void); 23169718Skanvoid test_HandleServerAuthenticationFailure(void); 24169718Skanvoid test_HandleKodDemobilize(void); 25169718Skanvoid test_HandleKodRate(void); 26169718Skanvoid test_HandleCorrectPacket(void); 27169718Skan 28169718Skan 29169718Skanvoid 30169718SkansetUp(void) 31169718Skan{ 32169718Skan init_lib(); 33169718Skan} 34169718Skan 35169718Skan 36169718Skanint 37169718SkanLfpEquality( 38169718Skan const l_fp expected, 39169718Skan const l_fp actual 40169718Skan ) 41169718Skan{ 42169718Skan return !!(L_ISEQU(&expected, &actual)); 43169718Skan} 44169718Skan 45169718Skan 46169718Skanvoid 47169718Skantest_GenerateUnauthenticatedPacket(void) 48169718Skan{ 49169718Skan struct pkt testpkt; 50169718Skan struct timeval xmt; 51169718Skan l_fp expected_xmt, actual_xmt; 52169718Skan 53169718Skan GETTIMEOFDAY(&xmt, NULL); 54169718Skan xmt.tv_sec += JAN_1970; 55169718Skan 56169718Skan TEST_ASSERT_EQUAL(LEN_PKT_NOMAC, 57169718Skan generate_pkt(&testpkt, &xmt, 0, NULL)); 58169718Skan 59169718Skan TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode)); 60169718Skan TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode)); 61169718Skan TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode)); 62169718Skan 63169718Skan TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum)); 64169718Skan TEST_ASSERT_EQUAL(8, testpkt.ppoll); 65169718Skan 66169718Skan TVTOTS(&xmt, &expected_xmt); 67169718Skan NTOHL_FP(&testpkt.xmt, &actual_xmt); 68169718Skan TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt)); 69169718Skan} 70169718Skan 71169718Skan 72169718Skanvoid 73169718Skantest_GenerateAuthenticatedPacket(void) 74169718Skan{ 75169718Skan static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN; 76169718Skan 77169718Skan struct key testkey; 78169718Skan struct pkt testpkt; 79169718Skan struct timeval xmt; 80169718Skan l_fp expected_xmt, actual_xmt; 81169718Skan char expected_mac[MAX_MD5_LEN]; 82169718Skan 83169718Skan testkey.next = NULL; 84169718Skan testkey.key_id = 30; 85169718Skan testkey.key_len = 9; 86169718Skan memcpy(testkey.key_seq, "123456789", testkey.key_len); 87169718Skan memcpy(testkey.type, "MD5", 3); 88169718Skan 89169718Skan GETTIMEOFDAY(&xmt, NULL); 90169718Skan xmt.tv_sec += JAN_1970; 91169718Skan 92169718Skan TEST_ASSERT_EQUAL(EXPECTED_PKTLEN, 93169718Skan generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey)); 94169718Skan 95169718Skan TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode)); 96169718Skan TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode)); 97169718Skan TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode)); 98169718Skan 99169718Skan TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum)); 100169718Skan TEST_ASSERT_EQUAL(8, testpkt.ppoll); 101169718Skan 102169718Skan TVTOTS(&xmt, &expected_xmt); 103169718Skan NTOHL_FP(&testpkt.xmt, &actual_xmt); 104169718Skan TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt)); 105169718Skan 106169718Skan TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0])); 107169718Skan 108169718Skan TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */ 109169718Skan make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac)); 110169718Skan TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4); 111169718Skan} 112169718Skan 113169718Skan 114169718Skanvoid 115169718Skantest_OffsetCalculationPositiveOffset(void) 116169718Skan{ 117169718Skan struct pkt rpkt; 118169718Skan l_fp reftime, tmp; 119169718Skan struct timeval dst; 120169718Skan double offset, precision, synch_distance; 121169718Skan 122169718Skan rpkt.precision = -16; /* 0,000015259 */ 123169718Skan rpkt.rootdelay = HTONS_FP(DTOUFP(0.125)); 124169718Skan rpkt.rootdisp = HTONS_FP(DTOUFP(0.25)); 125169718Skan 126169718Skan /* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */ 127169718Skan get_systime(&reftime); 128169718Skan HTONL_FP(&reftime, &rpkt.reftime); 129169718Skan 130169718Skan /* T1 - Originate timestamp */ 131169718Skan tmp.l_ui = 1000000000UL; 132169718Skan tmp.l_uf = 0UL; 133169718Skan HTONL_FP(&tmp, &rpkt.org); 134169718Skan 135169718Skan /* T2 - Receive timestamp */ 136169718Skan tmp.l_ui = 1000000001UL; 137169718Skan tmp.l_uf = 2147483648UL; 138169718Skan HTONL_FP(&tmp, &rpkt.rec); 139169718Skan 140169718Skan /* T3 - Transmit timestamp */ 141169718Skan tmp.l_ui = 1000000002UL; 142169718Skan tmp.l_uf = 0UL; 143169718Skan HTONL_FP(&tmp, &rpkt.xmt); 144169718Skan 145169718Skan /* T4 - Destination timestamp as standard timeval */ 146169718Skan tmp.l_ui = 1000000001UL; 147169718Skan tmp.l_uf = 0UL; 148169718Skan TSTOTV(&tmp, &dst); 149169718Skan dst.tv_sec -= JAN_1970; 150169718Skan 151169718Skan offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance); 152169718Skan 153169718Skan TEST_ASSERT_EQUAL_DOUBLE(1.25, offset); 154169718Skan TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision); 155169718Skan /* 1.1250150000000001 ? */ 156169718Skan TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance); 157169718Skan} 158169718Skan 159169718Skan 160169718Skanvoid 161169718Skantest_OffsetCalculationNegativeOffset(void) 162169718Skan{ 163169718Skan struct pkt rpkt; 164169718Skan l_fp reftime, tmp; 165169718Skan struct timeval dst; 166169718Skan double offset, precision, synch_distance; 167169718Skan 168169718Skan rpkt.precision = -1; 169169718Skan rpkt.rootdelay = HTONS_FP(DTOUFP(0.5)); 170169718Skan rpkt.rootdisp = HTONS_FP(DTOUFP(0.5)); 171169718Skan 172169718Skan /* Synch Distance is (0.5+0.5)/2.0, or 0.5 */ 173169718Skan get_systime(&reftime); 174169718Skan HTONL_FP(&reftime, &rpkt.reftime); 175169718Skan 176169718Skan /* T1 - Originate timestamp */ 177169718Skan tmp.l_ui = 1000000001UL; 178169718Skan tmp.l_uf = 0UL; 179169718Skan HTONL_FP(&tmp, &rpkt.org); 180169718Skan 181169718Skan /* T2 - Receive timestamp */ 182169718Skan tmp.l_ui = 1000000000UL; 183169718Skan tmp.l_uf = 2147483648UL; 184169718Skan HTONL_FP(&tmp, &rpkt.rec); 185169718Skan 186169718Skan /*/ T3 - Transmit timestamp */ 187169718Skan tmp.l_ui = 1000000001UL; 188169718Skan tmp.l_uf = 2147483648UL; 189169718Skan HTONL_FP(&tmp, &rpkt.xmt); 190169718Skan 191169718Skan /* T4 - Destination timestamp as standard timeval */ 192169718Skan tmp.l_ui = 1000000003UL; 193169718Skan tmp.l_uf = 0UL; 194169718Skan 195169718Skan TSTOTV(&tmp, &dst); 196169718Skan dst.tv_sec -= JAN_1970; 197169718Skan 198169718Skan offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance); 199169718Skan 200169718Skan TEST_ASSERT_EQUAL_DOUBLE(-1, offset); 201169718Skan TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision); 202169718Skan TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance); 203169718Skan} 204169718Skan 205169718Skan 206169718Skanvoid 207169718Skantest_HandleUnusableServer(void) 208169718Skan{ 209169718Skan struct pkt rpkt; 210169718Skan sockaddr_u host; 211169718Skan int rpktl; 212169718Skan 213169718Skan ZERO(rpkt); 214169718Skan ZERO(host); 215169718Skan rpktl = SERVER_UNUSEABLE; 216169718Skan TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, "")); 217169718Skan} 218169718Skan 219169718Skan 220169718Skanvoid 221169718Skantest_HandleUnusablePacket(void) 222169718Skan{ 223169718Skan struct pkt rpkt; 224169718Skan sockaddr_u host; 225169718Skan int rpktl; 226169718Skan 227169718Skan ZERO(rpkt); 228169718Skan ZERO(host); 229169718Skan rpktl = PACKET_UNUSEABLE; 230169718Skan TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 231169718Skan} 232169718Skan 233169718Skan 234169718Skanvoid 235169718Skantest_HandleServerAuthenticationFailure(void) 236169718Skan{ 237169718Skan struct pkt rpkt; 238185777Skib sockaddr_u host; 239169718Skan int rpktl; 240169718Skan 241169718Skan ZERO(rpkt); 242169718Skan ZERO(host); 243169718Skan rpktl = SERVER_AUTH_FAIL; 244169718Skan TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 245169718Skan} 246169718Skan 247169718Skan 248169718Skanvoid 249169718Skantest_HandleKodDemobilize(void) 250169718Skan{ 251169718Skan static const char * HOSTNAME = "192.0.2.1"; 252169718Skan static const char * REASON = "DENY"; 253169718Skan struct pkt rpkt; 254169718Skan sockaddr_u host; 255169718Skan int rpktl; 256169718Skan struct kod_entry * entry; 257169718Skan 258169718Skan rpktl = KOD_DEMOBILIZE; 259169718Skan ZERO(rpkt); 260169718Skan memcpy(&rpkt.refid, REASON, 4); 261169718Skan ZERO(host); 262169718Skan host.sa4.sin_family = AF_INET; 263169718Skan host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME); 264169718Skan 265169718Skan /* Test that the KOD-entry is added to the database. */ 266169718Skan kod_init_kod_db("/dev/null", TRUE); 267169718Skan 268169718Skan TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME)); 269169718Skan 270169718Skan TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry)); 271169718Skan TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4); 272169718Skan} 273169718Skan 274169718Skan 275169718Skanvoid 276169718Skantest_HandleKodRate(void) 277169718Skan{ 278169718Skan struct pkt rpkt; 279169718Skan sockaddr_u host; 280169718Skan int rpktl; 281169718Skan 282169718Skan ZERO(rpkt); 283169718Skan ZERO(host); 284169718Skan rpktl = KOD_RATE; 285169718Skan TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, "")); 286169718Skan} 287169718Skan 288169718Skan 289169718Skanvoid 290169718Skantest_HandleCorrectPacket(void) 291169718Skan{ 292169718Skan struct pkt rpkt; 293169718Skan sockaddr_u host; 294169718Skan int rpktl; 295169718Skan l_fp now; 296169718Skan 297169718Skan /* We don't want our testing code to actually change the system clock. */ 298169718Skan TEST_ASSERT_FALSE(ENABLED_OPT(STEP)); 299169718Skan TEST_ASSERT_FALSE(ENABLED_OPT(SLEW)); 300169718Skan 301169718Skan get_systime(&now); 302169718Skan HTONL_FP(&now, &rpkt.reftime); 303169718Skan HTONL_FP(&now, &rpkt.org); 304169718Skan HTONL_FP(&now, &rpkt.rec); 305169718Skan HTONL_FP(&now, &rpkt.xmt); 306169718Skan rpktl = LEN_PKT_NOMAC; 307169718Skan ZERO(host); 308169718Skan AF(&host) = AF_INET; 309169718Skan 310169718Skan TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, "")); 311169718Skan} 312169718Skan 313169718Skan/* packetHandling.c */ 314169718Skan