// ---------------------------------------------------------------------- // 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); }
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); }
/* 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); }