#include "config.h"
#include "ntp_calendar.h"
#include "ntp_stdlib.h"
#include "unity.h"
#include "test-libntp.h"
void setUp(void);
void tearDown(void);
void test_CurrentYear(void);
void test_CurrentYearFuzz(void);
void test_TimeZoneOffset(void);
void test_WrongYearStart(void);
void test_PreviousYear(void);
void test_NextYear(void);
void test_NoReasonableConversion(void);
int isLE(u_int32 diff,u_int32 actual);
void test_AlwaysInLimit(void);
void
setUp()
{
ntpcal_set_timefunc(timefunc);
settime(2000, 1, 1, 0, 0, 0);
return;
}
void
tearDown()
{
ntpcal_set_timefunc(NULL);
return;
}
void
test_CurrentYear(void)
{
const u_int32 timestamp = 3486372600UL;
const u_int32 expected = timestamp;
const int yday=175, hour=12, minute=50, second=0, tzoff=0;
u_long yearstart = 0;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
timestamp, &yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
return;
}
void
test_CurrentYearFuzz(void)
{
const u_int32 timestamp = 3486372600UL;
const u_int32 expected = 3486369600UL;
const int yday=175, hour=12, minute=0, second=0, tzoff=0;
u_long yearstart=0;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
timestamp, &yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
return;
}
void
test_TimeZoneOffset(void)
{
const u_int32 timestamp = 3486369600UL;
const u_int32 expected = timestamp;
const int yday=175, hour=4, minute=0, second=0, tzoff=8;
u_long yearstart=0;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
&yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
}
void
test_WrongYearStart(void)
{
const u_int32 timestamp = 3471418800UL;
const u_int32 expected = timestamp;
const int yday=2, hour=11, minute=0, second=0, tzoff=0;
u_long yearstart = 302024100UL;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
&yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
}
void
test_PreviousYear(void)
{
const u_int32 timestamp = 3471296400UL;
const u_int32 expected = 3471289200UL;
const int yday=365, hour=23, minute=0, second=0, tzoff=0;
u_long yearstart = 0;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
&yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
}
void
test_NextYear(void)
{
const u_int32 timestamp = 3471289200UL;
const u_int32 expected = 3471296400UL;
const int yday=1, hour=1, minute=0, second=0, tzoff=0;
u_long yearstart = 0;
u_int32 actual;
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
timestamp, &yearstart, &actual));
TEST_ASSERT_EQUAL(expected, actual);
return;
}
void
test_NoReasonableConversion(void)
{
const u_int32 timestamp = 3471418800UL;
const int yday=100, hour=12, minute=0, second=0, tzoff=0;
u_long yearstart = 0;
u_int32 actual;
TEST_ASSERT_FALSE(clocktime(yday, hour, minute, second, tzoff,
timestamp, &yearstart, &actual));
return;
}
int
isLE(u_int32 diff,u_int32 actual)
{
if (diff <= actual) {
return TRUE;
}
else return FALSE;
}
void
test_AlwaysInLimit(void)
{
const u_int32 timestamp = 3471418800UL;
const u_short prime_incs[] = { 127, 151, 163, 179 };
int cyc;
int yday;
u_char whichprime;
u_short ydayinc;
int hour;
int minute;
u_long yearstart;
u_int32 actual;
u_int32 diff;
yearstart = 0;
for (cyc = 0; cyc < 5; cyc++) {
settime(1900 + cyc * 65, 1, 1, 0, 0, 0);
for (yday = -26000; yday < 26000; yday += ydayinc) {
whichprime = abs(yday) % COUNTOF(prime_incs);
ydayinc = prime_incs[whichprime];
for (hour = -204; hour < 204; hour += 2) {
for (minute = -60; minute < 60; minute++) {
clocktime(yday, hour, minute, 30, 0,
timestamp, &yearstart,
&actual);
diff = actual - timestamp;
if (diff >= 0x80000000UL)
diff = ~diff + 1;
TEST_ASSERT_TRUE(isLE(diff, (183u * SECSPERDAY)));
}
}
}
}
return;
}