// ---------------------------------------------------------------------- // test table selection TEST(leapsec, tableSelect) { leap_table_t *pt1, *pt2, *pt3; pt1 = leapsec_get_table(0); pt2 = leapsec_get_table(0); TEST_ASSERT_EQUAL(pt1, pt2); pt1 = leapsec_get_table(1); pt2 = leapsec_get_table(1); TEST_ASSERT_EQUAL(pt1, pt2); pt1 = leapsec_get_table(1); pt2 = leapsec_get_table(0); TEST_ASSERT_NOT_EQUAL(pt1, pt2); pt1 = leapsec_get_table(0); pt2 = leapsec_get_table(1); TEST_ASSERT_NOT_EQUAL(pt1, pt2); leapsec_set_table(pt1); pt2 = leapsec_get_table(0); pt3 = leapsec_get_table(1); TEST_ASSERT_EQUAL(pt1, pt2); TEST_ASSERT_NOT_EQUAL(pt2, pt3); pt1 = pt3; leapsec_set_table(pt1); pt2 = leapsec_get_table(0); pt3 = leapsec_get_table(1); TEST_ASSERT_EQUAL(pt1, pt2); TEST_ASSERT_NOT_EQUAL(pt2, pt3); }
// ---------------------------------------------------------------------- // test table selection void test_tableSelect(void) { leap_table_t *pt1, *pt2, *pt3, *pt4; pt1 = leapsec_get_table(0); pt2 = leapsec_get_table(0); TEST_ASSERT_EQUAL_MESSAGE(pt1, pt2,"first"); pt1 = leapsec_get_table(1); pt2 = leapsec_get_table(1); TEST_ASSERT_EQUAL_MESSAGE(pt1, pt2,"second"); pt1 = leapsec_get_table(1); pt2 = leapsec_get_table(0); TEST_ASSERT_NOT_EQUAL(pt1, pt2); pt1 = leapsec_get_table(0); pt2 = leapsec_get_table(1); TEST_ASSERT_NOT_EQUAL(pt1, pt2); leapsec_set_table(pt1); pt2 = leapsec_get_table(0); pt3 = leapsec_get_table(1); TEST_ASSERT_EQUAL(pt1, pt2); TEST_ASSERT_NOT_EQUAL(pt2, pt3); pt1 = pt3; leapsec_set_table(pt1); pt2 = leapsec_get_table(0); pt3 = leapsec_get_table(1); TEST_ASSERT_EQUAL(pt1, pt2); TEST_ASSERT_NOT_EQUAL(pt2, pt3); }
// ---------------------------------------------------------------------- // load file & check time-to-live TEST(leapsec, loadFileTTL) { const char *cp = leap1; int rc; leap_table_t * pt = leapsec_get_table(0); time_t pivot = 0x70000000; const uint32_t limit = 3610569600u; rc = leapsec_load(pt, stringreader, &cp, false) && leapsec_set_table(pt); TEST_ASSERT_EQUAL(1, rc); // exactly 1 day to live rc = leapsec_daystolive(limit - 86400, &pivot); TEST_ASSERT_EQUAL( 1, rc); // less than 1 day to live rc = leapsec_daystolive(limit - 86399, &pivot); TEST_ASSERT_EQUAL( 0, rc); // hit expiration exactly rc = leapsec_daystolive(limit, &pivot); TEST_ASSERT_EQUAL( 0, rc); // expired since 1 sec rc = leapsec_daystolive(limit + 1, &pivot); TEST_ASSERT_EQUAL(-1, rc); }
/* ------------------------------------------------------------------ */ int/*BOOL*/ leapsec_add_fix( int total, uint32_t ttime, uint32_t etime, const time_t * pivot) { time_t tpiv; leap_table_t * pt; vint64 tt64, et64; if (pivot == NULL) { time(&tpiv); pivot = &tpiv; } et64 = ntpcal_ntp_to_ntp(etime, pivot); tt64 = ntpcal_ntp_to_ntp(ttime, pivot); pt = leapsec_get_table(TRUE); if ( ucmpv64(&et64, &pt->head.expire) <= 0 || !leapsec_raw(pt, &tt64, total, FALSE) ) return FALSE; pt->lsig.etime = etime; pt->lsig.ttime = ttime; pt->lsig.taiof = (int16_t)total; pt->head.expire = et64; return leapsec_set_table(pt); }
/* ------------------------------------------------------------------ */ bool leapsec_add_fix( int total, uint32_t ttime, uint32_t etime, const time_t * pivot) { time_t tpiv; leap_table_t * pt; time64_t tt64, et64; if (pivot == NULL) { time(&tpiv); pivot = &tpiv; } et64 = ntpcal_ntp_to_ntp(etime, pivot); tt64 = ntpcal_ntp_to_ntp(ttime, pivot); pt = leapsec_get_table(true); if ((et64 <= pt->head.expire) || !leapsec_raw(pt, tt64, total, false) ) return false; pt->lsig.etime = etime; pt->lsig.ttime = ttime; pt->lsig.taiof = (int16_t)total; pt->head.expire = et64; return leapsec_set_table(pt); }
static bool setup_clear_table(void) { bool rc; leap_table_t * pt = leapsec_get_table(0); if (pt) leapsec_clear(pt); rc = leapsec_set_table(pt); return rc; }
static int/*BOOL*/ setup_clear_table(void) { int rc; leap_table_t * pt = leapsec_get_table(0); if (pt) leapsec_clear(pt); rc = leapsec_set_table(pt); return rc; }
static bool setup_load_table( const char * cp, bool blim) { bool rc; leap_table_t * pt = leapsec_get_table(0); rc = (pt != NULL) && leapsec_load(pt, stringreader, &cp, blim); rc = rc && leapsec_set_table(pt); return rc; }
static int/*BOOL*/ setup_load_table( const char * cp, int blim) { int rc; leap_table_t * pt = leapsec_get_table(0); rc = (pt != NULL) && leapsec_load(pt, stringreader, &cp, blim); rc = rc && leapsec_set_table(pt); return rc; }
// ---------------------------------------------------------------------- // load file & check expiration TEST(leapsec, loadFileExpire) { const char *cp = leap1; int rc; leap_table_t * pt = leapsec_get_table(0); rc = leapsec_load(pt, stringreader, &cp, false) && leapsec_set_table(pt); TEST_ASSERT_EQUAL(1, rc); rc = leapsec_expired(3439756800u, NULL); TEST_ASSERT_EQUAL(0, rc); rc = leapsec_expired(3610569601u, NULL); TEST_ASSERT_EQUAL(1, rc); }
void test_loadFileExpire(void) { const char *cp = leap1; int rc; leap_table_t * pt = leapsec_get_table(0); rc = leapsec_load(pt, stringreader, &cp, FALSE) && leapsec_set_table(pt); TEST_ASSERT_EQUAL_MESSAGE(1, rc,"first"); rc = leapsec_expired(3439756800u, NULL); TEST_ASSERT_EQUAL(0, rc); rc = leapsec_expired(3610569601u, NULL); TEST_ASSERT_EQUAL(1, rc); }
/* ------------------------------------------------------------------ */ int/*BOOL*/ leapsec_add_dyn( int insert, uint32_t ntpnow, const time_t * pivot ) { leap_table_t * pt; vint64 now64; pt = leapsec_get_table(TRUE); now64 = ntpcal_ntp_to_ntp(ntpnow, pivot); return ( leapsec_add(pt, &now64, (insert != 0)) && leapsec_set_table(pt)); }
/* ------------------------------------------------------------------ */ bool leapsec_add_dyn( bool insert, uint32_t ntpnow, const time_t * pivot ) { leap_table_t * pt; time64_t now64; pt = leapsec_get_table(true); now64 = ntpcal_ntp_to_ntp(ntpnow, pivot); return ( leapsec_add(pt, now64, insert) && leapsec_set_table(pt)); }
/* load a file from a FILE pointer. Note: If hcheck is true, load * only after successful signature check. The stream must be seekable * or this will fail. */ int/*BOOL*/ leapsec_load_stream( FILE * ifp , const char * fname, int/*BOOL*/ logall) { leap_table_t *pt; int rcheck; if (NULL == fname) fname = "<unknown>"; rcheck = leapsec_validate((leapsec_reader)getc, ifp); if (logall) switch (rcheck) { case LSVALID_GOODHASH: msyslog(LOG_NOTICE, "%s ('%s'): good hash signature", logPrefix, fname); break; case LSVALID_NOHASH: msyslog(LOG_ERR, "%s ('%s'): no hash signature", logPrefix, fname); break; case LSVALID_BADHASH: msyslog(LOG_ERR, "%s ('%s'): signature mismatch", logPrefix, fname); break; case LSVALID_BADFORMAT: msyslog(LOG_ERR, "%s ('%s'): malformed hash signature", logPrefix, fname); break; default: msyslog(LOG_ERR, "%s ('%s'): unknown error code %d", logPrefix, fname, rcheck); break; } if (rcheck < 0) return FALSE; rewind(ifp); pt = leapsec_get_table(TRUE); if (!leapsec_load(pt, (leapsec_reader)getc, ifp, TRUE)) { switch (errno) { case EINVAL: msyslog(LOG_ERR, "%s ('%s'): bad transition time", logPrefix, fname); break; case ERANGE: msyslog(LOG_ERR, "%s ('%s'): times not ascending", logPrefix, fname); break; default: msyslog(LOG_ERR, "%s ('%s'): parsing error", logPrefix, fname); break; } return FALSE; } if (pt->head.size) msyslog(LOG_NOTICE, "%s ('%s'): loaded, expire=%s last=%s ofs=%d", logPrefix, fname, lstostr(&pt->head.expire), lstostr(&pt->info[0].ttime), pt->info[0].taiof); else msyslog(LOG_NOTICE, "%s ('%s'): loaded, expire=%s ofs=%d (no entries after build date)", logPrefix, fname, lstostr(&pt->head.expire), pt->head.base_tai); return leapsec_set_table(pt); }