xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/clocktime.c (revision eabc0478de71e4e011a5b4e0392741e01d491794)
1*eabc0478Schristos /*	$NetBSD: clocktime.c,v 1.3 2024/08/18 20:47:26 christos Exp $	*/
2067f5680Schristos 
3f17b710fSchristos #include "config.h"
4f17b710fSchristos 
5f17b710fSchristos #include "ntp_calendar.h"
6f17b710fSchristos #include "ntp_stdlib.h"
7f17b710fSchristos 
8f17b710fSchristos #include "unity.h"
9f17b710fSchristos #include "test-libntp.h"
10f17b710fSchristos 
11a6f3f22fSchristos void setUp(void);
12a6f3f22fSchristos void tearDown(void);
13a6f3f22fSchristos void test_CurrentYear(void);
14a6f3f22fSchristos void test_CurrentYearFuzz(void);
15a6f3f22fSchristos void test_TimeZoneOffset(void);
16a6f3f22fSchristos void test_WrongYearStart(void);
17a6f3f22fSchristos void test_PreviousYear(void);
18a6f3f22fSchristos void test_NextYear(void);
19a6f3f22fSchristos void test_NoReasonableConversion(void);
20a6f3f22fSchristos int isLE(u_int32 diff,u_int32 actual);
21a6f3f22fSchristos void test_AlwaysInLimit(void);
22f17b710fSchristos 
23f17b710fSchristos 
24a6f3f22fSchristos /* ---------------------------------------------------------------------
25a6f3f22fSchristos  * test fixture
26a6f3f22fSchristos  *
27a6f3f22fSchristos  * The clocktimeTest uses the NTP calendar feature to use a mockup
28a6f3f22fSchristos  * function for getting the current system time, so the tests are not
29a6f3f22fSchristos  * dependent on the actual system time.
30a6f3f22fSchristos  */
31a6f3f22fSchristos 
32a6f3f22fSchristos void
33*eabc0478Schristos setUp(void)
34f17b710fSchristos {
35f17b710fSchristos 	ntpcal_set_timefunc(timefunc);
36f17b710fSchristos 	settime(2000, 1, 1, 0, 0, 0);
374c290c01Schristos 
384c290c01Schristos 	return;
39f17b710fSchristos }
40f17b710fSchristos 
41a6f3f22fSchristos void
42*eabc0478Schristos tearDown(void)
43f17b710fSchristos {
44f17b710fSchristos 	ntpcal_set_timefunc(NULL);
454c290c01Schristos 
464c290c01Schristos 	return;
47f17b710fSchristos }
48f17b710fSchristos 
49a6f3f22fSchristos /* ---------------------------------------------------------------------
50a6f3f22fSchristos  * test cases
51a6f3f22fSchristos  */
52f17b710fSchristos 
53a6f3f22fSchristos void
544c290c01Schristos test_CurrentYear(void)
554c290c01Schristos {
56a6f3f22fSchristos 	/* Timestamp: 2010-06-24 12:50:00Z */
57f17b710fSchristos 	const u_int32 timestamp = 3486372600UL;
58a6f3f22fSchristos 	const u_int32 expected	= timestamp; /* exactly the same. */
59f17b710fSchristos 
60f17b710fSchristos 	const int yday=175, hour=12, minute=50, second=0, tzoff=0;
61f17b710fSchristos 
62f17b710fSchristos 	u_long yearstart = 0;
63f17b710fSchristos 	u_int32 actual;
64f17b710fSchristos 
654c290c01Schristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
664c290c01Schristos 				   timestamp, &yearstart, &actual));
67f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
684c290c01Schristos 
694c290c01Schristos 	return;
70f17b710fSchristos }
71f17b710fSchristos 
72a6f3f22fSchristos void
734c290c01Schristos test_CurrentYearFuzz(void)
744c290c01Schristos {
75f17b710fSchristos 	/*
76f17b710fSchristos 	 * Timestamp (rec_ui) is: 2010-06-24 12:50:00
77f17b710fSchristos 	 * Time sent into function is 12:00:00.
78f17b710fSchristos 	 *
79f17b710fSchristos 	 * Since the fuzz is rather small, we should get a NTP
80f17b710fSchristos 	 * timestamp for the 12:00:00 time.
81f17b710fSchristos 	 */
82f17b710fSchristos 
83a6f3f22fSchristos 	const u_int32 timestamp = 3486372600UL; /* 2010-06-24 12:50:00Z */
84a6f3f22fSchristos 	const u_int32 expected	= 3486369600UL; /* 2010-06-24 12:00:00Z */
85f17b710fSchristos 
86f17b710fSchristos 	const int yday=175, hour=12, minute=0, second=0, tzoff=0;
87f17b710fSchristos 
88f17b710fSchristos 	u_long yearstart=0;
89f17b710fSchristos 	u_int32 actual;
90f17b710fSchristos 
914c290c01Schristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
924c290c01Schristos 				   timestamp, &yearstart, &actual));
93f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
944c290c01Schristos 
954c290c01Schristos 	return;
96f17b710fSchristos }
97f17b710fSchristos 
98a6f3f22fSchristos void
994c290c01Schristos test_TimeZoneOffset(void)
1004c290c01Schristos {
101f17b710fSchristos 	/*
102f17b710fSchristos 	 * Timestamp (rec_ui) is: 2010-06-24 12:00:00 +0800
103f17b710fSchristos 	 * (which is 2010-06-24 04:00:00Z)
104f17b710fSchristos 	 *
105f17b710fSchristos 	 * Time sent into function is 04:00:00 +0800
106f17b710fSchristos 	 */
107f17b710fSchristos 	const u_int32 timestamp = 3486369600UL;
108f17b710fSchristos 	const u_int32 expected	= timestamp;
109f17b710fSchristos 
110f17b710fSchristos 	const int yday=175, hour=4, minute=0, second=0, tzoff=8;
111f17b710fSchristos 
112f17b710fSchristos 	u_long yearstart=0;
113f17b710fSchristos 	u_int32 actual;
114f17b710fSchristos 
115f17b710fSchristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
116f17b710fSchristos 						  &yearstart, &actual));
117f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
118f17b710fSchristos }
119f17b710fSchristos 
120a6f3f22fSchristos void
1214c290c01Schristos test_WrongYearStart(void)
1224c290c01Schristos {
123f17b710fSchristos 	/*
124f17b710fSchristos 	 * Timestamp (rec_ui) is: 2010-01-02 11:00:00Z
125f17b710fSchristos 	 * Time sent into function is 11:00:00.
126f17b710fSchristos 	 * Yearstart sent into function is the yearstart of 2009!
127f17b710fSchristos 	 */
128f17b710fSchristos 	const u_int32 timestamp = 3471418800UL;
129f17b710fSchristos 	const u_int32 expected	= timestamp;
130f17b710fSchristos 
131f17b710fSchristos 	const int yday=2, hour=11, minute=0, second=0, tzoff=0;
132f17b710fSchristos 
133a6f3f22fSchristos 	u_long yearstart = 302024100UL; /* Yearstart of 2009. */
134f17b710fSchristos 	u_int32 actual;
135f17b710fSchristos 
136f17b710fSchristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
137f17b710fSchristos 						  &yearstart, &actual));
138f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
139f17b710fSchristos }
140f17b710fSchristos 
141a6f3f22fSchristos void
1424c290c01Schristos test_PreviousYear(void)
1434c290c01Schristos {
144f17b710fSchristos 	/*
145f17b710fSchristos 	 * Timestamp is: 2010-01-01 01:00:00Z
146f17b710fSchristos 	 * Time sent into function is 23:00:00
147f17b710fSchristos 	 * (which is meant to be 2009-12-31 23:00:00Z)
148f17b710fSchristos 	 */
149f17b710fSchristos 	const u_int32 timestamp = 3471296400UL;
150f17b710fSchristos 	const u_int32 expected	= 3471289200UL;
151f17b710fSchristos 
152f17b710fSchristos 	const int yday=365, hour=23, minute=0, second=0, tzoff=0;
153f17b710fSchristos 
154f17b710fSchristos 	u_long yearstart = 0;
155f17b710fSchristos 	u_int32 actual;
156f17b710fSchristos 
157f17b710fSchristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff, timestamp,
158f17b710fSchristos 						  &yearstart, &actual));
159f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
160f17b710fSchristos }
161f17b710fSchristos 
162a6f3f22fSchristos void
1634c290c01Schristos test_NextYear(void)
1644c290c01Schristos {
165f17b710fSchristos 	/*
166f17b710fSchristos 	 * Timestamp is: 2009-12-31 23:00:00Z
167f17b710fSchristos 	 * Time sent into function is 01:00:00
168f17b710fSchristos 	 * (which is meant to be 2010-01-01 01:00:00Z)
169f17b710fSchristos 	 */
170f17b710fSchristos 	const u_int32 timestamp = 3471289200UL;
171f17b710fSchristos 	const u_int32 expected	= 3471296400UL;
172f17b710fSchristos 
173f17b710fSchristos 	const int yday=1, hour=1, minute=0, second=0, tzoff=0;
174f17b710fSchristos 	u_long yearstart = 0;
175f17b710fSchristos 	u_int32 actual;
176f17b710fSchristos 
1774c290c01Schristos 	TEST_ASSERT_TRUE(clocktime(yday, hour, minute, second, tzoff,
1784c290c01Schristos 				   timestamp, &yearstart, &actual));
179f17b710fSchristos 	TEST_ASSERT_EQUAL(expected, actual);
1804c290c01Schristos 
1814c290c01Schristos 	return;
182f17b710fSchristos }
183f17b710fSchristos 
184a6f3f22fSchristos void
1854c290c01Schristos test_NoReasonableConversion(void)
1864c290c01Schristos {
187f17b710fSchristos 	/* Timestamp is: 2010-01-02 11:00:00Z */
188f17b710fSchristos 	const u_int32 timestamp = 3471418800UL;
189f17b710fSchristos 
190f17b710fSchristos 	const int yday=100, hour=12, minute=0, second=0, tzoff=0;
191f17b710fSchristos 	u_long yearstart = 0;
192f17b710fSchristos 	u_int32 actual;
193f17b710fSchristos 
1944c290c01Schristos 	TEST_ASSERT_FALSE(clocktime(yday, hour, minute, second, tzoff,
1954c290c01Schristos 				    timestamp, &yearstart, &actual));
1964c290c01Schristos 
1974c290c01Schristos 	return;
198f17b710fSchristos }
199f17b710fSchristos 
200a6f3f22fSchristos 
201a6f3f22fSchristos int/*BOOL*/
2024c290c01Schristos isLE(u_int32 diff,u_int32 actual)
2034c290c01Schristos {
2044c290c01Schristos 
205f17b710fSchristos 	if (diff <= actual) {
206f17b710fSchristos 		return TRUE;
207f17b710fSchristos 	}
208f17b710fSchristos 	else return FALSE;
209f17b710fSchristos }
210f17b710fSchristos 
211f17b710fSchristos 
212a6f3f22fSchristos void
2134c290c01Schristos test_AlwaysInLimit(void)
2144c290c01Schristos {
215f17b710fSchristos 	/* Timestamp is: 2010-01-02 11:00:00Z */
216f17b710fSchristos 	const u_int32 timestamp = 3471418800UL;
217f17b710fSchristos 	const u_short prime_incs[] = { 127, 151, 163, 179 };
218f17b710fSchristos 	int	cyc;
219f17b710fSchristos 	int	yday;
220f17b710fSchristos 	u_char	whichprime;
221f17b710fSchristos 	u_short	ydayinc;
222f17b710fSchristos 	int	hour;
223f17b710fSchristos 	int	minute;
224f17b710fSchristos 	u_long	yearstart;
225f17b710fSchristos 	u_int32	actual;
226f17b710fSchristos 	u_int32	diff;
227f17b710fSchristos 
228f17b710fSchristos 	yearstart = 0;
229f17b710fSchristos 	for (cyc = 0; cyc < 5; cyc++) {
230f17b710fSchristos 		settime(1900 + cyc * 65, 1, 1, 0, 0, 0);
231f17b710fSchristos 		for (yday = -26000; yday < 26000; yday += ydayinc) {
232f17b710fSchristos 			whichprime = abs(yday) % COUNTOF(prime_incs);
233f17b710fSchristos 			ydayinc = prime_incs[whichprime];
234f17b710fSchristos 			for (hour = -204; hour < 204; hour += 2) {
235f17b710fSchristos 				for (minute = -60; minute < 60; minute++) {
236f17b710fSchristos 					clocktime(yday, hour, minute, 30, 0,
2374c290c01Schristos 						  timestamp, &yearstart,
2384c290c01Schristos 						  &actual);
239f17b710fSchristos 					diff = actual - timestamp;
240f17b710fSchristos 					if (diff >= 0x80000000UL)
241f17b710fSchristos 						diff = ~diff + 1;
242a6f3f22fSchristos 					TEST_ASSERT_TRUE(isLE(diff, (183u * SECSPERDAY)));
243f17b710fSchristos 				}
244f17b710fSchristos 			}
245f17b710fSchristos 		}
246f17b710fSchristos 	}
2474c290c01Schristos 	return;
248f17b710fSchristos }
249