leap_table_t *p1, *p2;
p1 = _lptr;
- p1 = &_ltab[p1 == &_ltab[1]];
- p2 = &_ltab[p1 == &_ltab[0]];
+ if (p1 == &_ltab[0]) {
+ p2 = &_ltab[1];
+ } else if (p1 == &_ltab[1]) {
+ p2 = &_ltab[0];
+ } else {
+ p1 = &_ltab[0];
+ p2 = &_ltab[1];
+ reset_times(p1);
+ reset_times(p2);
+ _lptr = p1;
+ }
if (alternate) {
memcpy(p2, p1, sizeof(leap_table_t));
p1 = p2;
pt = leapsec_get_table(FALSE);
memset(qr, 0, sizeof(leap_result_t));
+#if 0
+ printf("ebase=%s dtime=%s\n", lstostr(&pt->head.ebase), lstostr(&pt->head.dtime));
+ if (ucmpv64(&pt->head.dtime, &pt->head.ebase) <= 0) {
+ /* Initial state and empty table. Fix it. */
+ reload_limits(pt, &ts64);
+ printf("\n\n PRESET INITAL CONDITION\n\n\n");
+ } else
+#endif
if (ucmpv64(&ts64, &pt->head.ebase) < 0) {
/* Most likely after leap frame reset. Could also be a
* backstep of the system clock. Anyway, get the new
* leap era frame.
*/
reload_limits(pt, &ts64);
- } else if (ucmpv64(&ts64, &pt->head.dtime) >= 0) {
+ } else if (ucmpv64(&ts64, &pt->head.dtime) >= 0) {
/* Boundary crossed in forward direction. This might
* indicate a leap transition, so we prepare for that
* case.
return buf;
}
+/* reset the global state for unit tests */
+void
+leapsec_ut_pristine(void)
+{
+ memset(_ltab, 0, sizeof(_ltab));
+ _lptr = NULL;
+ _electric = 0;
+}
+
/* -*- that's all folks! -*- */
{
ntpcal_set_timefunc(timefunc);
settime(1970, 1, 1, 0, 0, 0);
- leapsec_electric(1);
+ leapsec_ut_pristine();
}
void leapsecTest::TearDown()
EXPECT_EQ(-1, rc);
}
+// ----------------------------------------------------------------------
+// test query in pristine state (bug#2745 misbehaviour)
+TEST_F(leapsecTest, lsQueryPristineState) {
+ int rc;
+ leap_result_t qr;
+
+ rc = leapsec_query(&qr, lsec2012, NULL);
+ EXPECT_EQ(FALSE, rc);
+ EXPECT_EQ(0, qr.warped );
+ EXPECT_EQ(LSPROX_NOWARN, qr.proximity);
+}
+
// ----------------------------------------------------------------------
// ad-hoc jump: leap second at 2009.01.01 -60days
TEST_F(leapsecTest, ls2009faraway) {
rc = setup_load_table(leap1);
EXPECT_EQ(1, rc);
leapsec_electric(1);
+ EXPECT_EQ(1, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2009 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
rc = setup_load_table(leap1);
EXPECT_EQ(1, rc);
- leapsec_electric(0);
+ EXPECT_EQ(0, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2009 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
rc = setup_load_table(leap3);
EXPECT_EQ(1, rc);
leapsec_electric(1);
+ EXPECT_EQ(1, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2009 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
rc = setup_load_table(leap3);
EXPECT_EQ(1, rc);
- leapsec_electric(0);
+ EXPECT_EQ(0, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2009 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
rc = setup_load_table(leap1);
EXPECT_EQ(1, rc);
+ leapsec_electric(1);
+ EXPECT_EQ(1, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2012 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
int rc;
leap_result_t qr;
- leapsec_electric(0);
- EXPECT_EQ(0, leapsec_electric(-1));
- EXPECT_EQ(0, leapsec_electric(-1));
-
rc = setup_load_table(leap1);
EXPECT_EQ(1, rc);
+ EXPECT_EQ(0, leapsec_electric(-1));
rc = leapsec_query(&qr, lsec2012 - 60*SECSPERDAY, NULL);
EXPECT_EQ(FALSE, rc);
const uint32_t t0 (lsec2012 - 10);
const uint32_t tE (lsec2012 + 10);
- leapsec_electric(0);
EXPECT_EQ(0, leapsec_electric(-1));
- leapsec_clear(leapsec_get_table(FALSE));
for (uint32_t t = t0; t != tE; ++t) {
rc = leapsec_query(&qr, t, &pivot);
EXPECT_EQ(FALSE, rc);
const uint32_t t0 (lsec2012 - 10);
const uint32_t tE (lsec2012 + 10);
- leapsec_clear(leapsec_get_table(FALSE));
for (time_t t = t0; t != tE; ++t) {
rc = leapsec_query(&qr, t, &pivot);
EXPECT_EQ(FALSE, rc);