31ece5769d
ntp 4.2.8p5 Reviewed by: cy, roberto Relnotes: yes Differential Revision: https://reviews.freebsd.org/D4828
247 lines
5.3 KiB
C
247 lines
5.3 KiB
C
#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);
|
|
|
|
|
|
/* ---------------------------------------------------------------------
|
|
* test fixture
|
|
*
|
|
* The clocktimeTest uses the NTP calendar feature to use a mockup
|
|
* function for getting the current system time, so the tests are not
|
|
* dependent on the actual system time.
|
|
*/
|
|
|
|
void
|
|
setUp()
|
|
{
|
|
ntpcal_set_timefunc(timefunc);
|
|
settime(2000, 1, 1, 0, 0, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
void
|
|
tearDown()
|
|
{
|
|
ntpcal_set_timefunc(NULL);
|
|
|
|
return;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------
|
|
* test cases
|
|
*/
|
|
|
|
void
|
|
test_CurrentYear(void)
|
|
{
|
|
/* Timestamp: 2010-06-24 12:50:00Z */
|
|
const u_int32 timestamp = 3486372600UL;
|
|
const u_int32 expected = timestamp; /* exactly the same. */
|
|
|
|
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)
|
|
{
|
|
/*
|
|
* Timestamp (rec_ui) is: 2010-06-24 12:50:00
|
|
* Time sent into function is 12:00:00.
|
|
*
|
|
* Since the fuzz is rather small, we should get a NTP
|
|
* timestamp for the 12:00:00 time.
|
|
*/
|
|
|
|
const u_int32 timestamp = 3486372600UL; /* 2010-06-24 12:50:00Z */
|
|
const u_int32 expected = 3486369600UL; /* 2010-06-24 12:00:00Z */
|
|
|
|
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)
|
|
{
|
|
/*
|
|
* Timestamp (rec_ui) is: 2010-06-24 12:00:00 +0800
|
|
* (which is 2010-06-24 04:00:00Z)
|
|
*
|
|
* Time sent into function is 04:00:00 +0800
|
|
*/
|
|
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)
|
|
{
|
|
/*
|
|
* Timestamp (rec_ui) is: 2010-01-02 11:00:00Z
|
|
* Time sent into function is 11:00:00.
|
|
* Yearstart sent into function is the yearstart of 2009!
|
|
*/
|
|
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; /* Yearstart of 2009. */
|
|
u_int32 actual;
|
|
|
|
TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
|
|
&yearstart, &actual));
|
|
TEST_ASSERT_EQUAL(expected, actual);
|
|
}
|
|
|
|
void
|
|
test_PreviousYear(void)
|
|
{
|
|
/*
|
|
* Timestamp is: 2010-01-01 01:00:00Z
|
|
* Time sent into function is 23:00:00
|
|
* (which is meant to be 2009-12-31 23:00:00Z)
|
|
*/
|
|
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)
|
|
{
|
|
/*
|
|
* Timestamp is: 2009-12-31 23:00:00Z
|
|
* Time sent into function is 01:00:00
|
|
* (which is meant to be 2010-01-01 01:00:00Z)
|
|
*/
|
|
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)
|
|
{
|
|
/* Timestamp is: 2010-01-02 11:00:00Z */
|
|
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/*BOOL*/
|
|
isLE(u_int32 diff,u_int32 actual)
|
|
{
|
|
|
|
if (diff <= actual) {
|
|
return TRUE;
|
|
}
|
|
else return FALSE;
|
|
}
|
|
|
|
|
|
void
|
|
test_AlwaysInLimit(void)
|
|
{
|
|
/* Timestamp is: 2010-01-02 11:00:00Z */
|
|
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;
|
|
}
|