clocktime.c revision 293896
1#include "config.h"
2
3#include "ntp_calendar.h"
4#include "ntp_stdlib.h"
5
6#include "unity.h"
7#include "test-libntp.h"
8
9void setUp(void);
10void tearDown(void);
11void test_CurrentYear(void);
12void test_CurrentYearFuzz(void);
13void test_TimeZoneOffset(void);
14void test_WrongYearStart(void);
15void test_PreviousYear(void);
16void test_NextYear(void);
17void test_NoReasonableConversion(void);
18int isLE(u_int32 diff,u_int32 actual);
19void test_AlwaysInLimit(void);
20
21
22/* ---------------------------------------------------------------------
23 * test fixture
24 *
25 * The clocktimeTest uses the NTP calendar feature to use a mockup
26 * function for getting the current system time, so the tests are not
27 * dependent on the actual system time.
28 */
29
30void
31setUp()
32{
33	ntpcal_set_timefunc(timefunc);
34	settime(2000, 1, 1, 0, 0, 0);
35
36	return;
37}
38
39void
40tearDown()
41{
42	ntpcal_set_timefunc(NULL);
43
44	return;
45}
46
47/* ---------------------------------------------------------------------
48 * test cases
49 */
50
51void
52test_CurrentYear(void)
53{
54	/* Timestamp: 2010-06-24 12:50:00Z */
55	const u_int32 timestamp = 3486372600UL;
56	const u_int32 expected	= timestamp; /* exactly the same. */
57
58	const int yday=175, hour=12, minute=50, second=0, tzoff=0;
59
60	u_long yearstart = 0;
61	u_int32 actual;
62
63	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
64				   timestamp, &yearstart, &actual));
65	TEST_ASSERT_EQUAL(expected, actual);
66
67	return;
68}
69
70void
71test_CurrentYearFuzz(void)
72{
73	/*
74	 * Timestamp (rec_ui) is: 2010-06-24 12:50:00
75	 * Time sent into function is 12:00:00.
76	 *
77	 * Since the fuzz is rather small, we should get a NTP
78	 * timestamp for the 12:00:00 time.
79	 */
80
81	const u_int32 timestamp = 3486372600UL; /* 2010-06-24 12:50:00Z */
82	const u_int32 expected	= 3486369600UL; /* 2010-06-24 12:00:00Z */
83
84	const int yday=175, hour=12, minute=0, second=0, tzoff=0;
85
86	u_long yearstart=0;
87	u_int32 actual;
88
89	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
90				   timestamp, &yearstart, &actual));
91	TEST_ASSERT_EQUAL(expected, actual);
92
93	return;
94}
95
96void
97test_TimeZoneOffset(void)
98{
99	/*
100	 * Timestamp (rec_ui) is: 2010-06-24 12:00:00 +0800
101	 * (which is 2010-06-24 04:00:00Z)
102	 *
103	 * Time sent into function is 04:00:00 +0800
104	 */
105	const u_int32 timestamp = 3486369600UL;
106	const u_int32 expected	= timestamp;
107
108	const int yday=175, hour=4, minute=0, second=0, tzoff=8;
109
110	u_long yearstart=0;
111	u_int32 actual;
112
113	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
114						  &yearstart, &actual));
115	TEST_ASSERT_EQUAL(expected, actual);
116}
117
118void
119test_WrongYearStart(void)
120{
121	/*
122	 * Timestamp (rec_ui) is: 2010-01-02 11:00:00Z
123	 * Time sent into function is 11:00:00.
124	 * Yearstart sent into function is the yearstart of 2009!
125	 */
126	const u_int32 timestamp = 3471418800UL;
127	const u_int32 expected	= timestamp;
128
129	const int yday=2, hour=11, minute=0, second=0, tzoff=0;
130
131	u_long yearstart = 302024100UL; /* Yearstart of 2009. */
132	u_int32 actual;
133
134	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
135						  &yearstart, &actual));
136	TEST_ASSERT_EQUAL(expected, actual);
137}
138
139void
140test_PreviousYear(void)
141{
142	/*
143	 * Timestamp is: 2010-01-01 01:00:00Z
144	 * Time sent into function is 23:00:00
145	 * (which is meant to be 2009-12-31 23:00:00Z)
146	 */
147	const u_int32 timestamp = 3471296400UL;
148	const u_int32 expected	= 3471289200UL;
149
150	const int yday=365, hour=23, minute=0, second=0, tzoff=0;
151
152	u_long yearstart = 0;
153	u_int32 actual;
154
155	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
156						  &yearstart, &actual));
157	TEST_ASSERT_EQUAL(expected, actual);
158}
159
160void
161test_NextYear(void)
162{
163	/*
164	 * Timestamp is: 2009-12-31 23:00:00Z
165	 * Time sent into function is 01:00:00
166	 * (which is meant to be 2010-01-01 01:00:00Z)
167	 */
168	const u_int32 timestamp = 3471289200UL;
169	const u_int32 expected	= 3471296400UL;
170
171	const int yday=1, hour=1, minute=0, second=0, tzoff=0;
172	u_long yearstart = 0;
173	u_int32 actual;
174
175	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
176				   timestamp, &yearstart, &actual));
177	TEST_ASSERT_EQUAL(expected, actual);
178
179	return;
180}
181
182void
183test_NoReasonableConversion(void)
184{
185	/* Timestamp is: 2010-01-02 11:00:00Z */
186	const u_int32 timestamp = 3471418800UL;
187
188	const int yday=100, hour=12, minute=0, second=0, tzoff=0;
189	u_long yearstart = 0;
190	u_int32 actual;
191
192	TEST_ASSERT_FALSE(clocktime(yday, hour, minute, second, tzoff,
193				    timestamp, &yearstart, &actual));
194
195	return;
196}
197
198
199int/*BOOL*/
200isLE(u_int32 diff,u_int32 actual)
201{
202
203	if (diff <= actual) {
204		return TRUE;
205	}
206	else return FALSE;
207}
208
209
210void
211test_AlwaysInLimit(void)
212{
213	/* Timestamp is: 2010-01-02 11:00:00Z */
214	const u_int32 timestamp = 3471418800UL;
215	const u_short prime_incs[] = { 127, 151, 163, 179 };
216	int	cyc;
217	int	yday;
218	u_char	whichprime;
219	u_short	ydayinc;
220	int	hour;
221	int	minute;
222	u_long	yearstart;
223	u_int32	actual;
224	u_int32	diff;
225
226	yearstart = 0;
227	for (cyc = 0; cyc < 5; cyc++) {
228		settime(1900 + cyc * 65, 1, 1, 0, 0, 0);
229		for (yday = -26000; yday < 26000; yday += ydayinc) {
230			whichprime = abs(yday) % COUNTOF(prime_incs);
231			ydayinc = prime_incs[whichprime];
232			for (hour = -204; hour < 204; hour += 2) {
233				for (minute = -60; minute < 60; minute++) {
234					clocktime(yday, hour, minute, 30, 0,
235						  timestamp, &yearstart,
236						  &actual);
237					diff = actual - timestamp;
238					if (diff >= 0x80000000UL)
239						diff = ~diff + 1;
240					TEST_ASSERT_TRUE(isLE(diff, (183u * SECSPERDAY)));
241				}
242			}
243		}
244	}
245	return;
246}
247