xref: /netbsd-src/external/bsd/ntp/dist/tests/libntp/caljulian.c (revision eabc0478de71e4e011a5b4e0392741e01d491794)
1*eabc0478Schristos /*	$NetBSD: caljulian.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 
8a6f3f22fSchristos #include "unity.h"
9f17b710fSchristos #include "test-libntp.h"
10f17b710fSchristos 
11f17b710fSchristos #include <string.h>
12f17b710fSchristos 
13f17b710fSchristos 
14a6f3f22fSchristos void setUp(void);
15a6f3f22fSchristos void tearDown(void);
16a6f3f22fSchristos void test_RegularTime(void);
17a6f3f22fSchristos void test_LeapYear(void);
18a6f3f22fSchristos void test_uLongBoundary(void);
19a6f3f22fSchristos void test_uLongWrapped(void);
20a6f3f22fSchristos 
21a6f3f22fSchristos 
22*eabc0478Schristos static const char *
234c290c01Schristos CalendarToString(const struct calendar cal)
244c290c01Schristos {
25*eabc0478Schristos 	char * str;
264c290c01Schristos 
27*eabc0478Schristos 	LIB_GETBUF(str);
28*eabc0478Schristos 	snprintf(str, LIB_BUFLENGTH,
29*eabc0478Schristos 		 "%04hu-%02hhu-%02hhu (%hu) %02hhu:%02hhu:%02hhu",
30*eabc0478Schristos 		 cal.year, cal.month, cal.monthday, cal.yearday,
31*eabc0478Schristos 		 cal.hour, cal.minute, cal.second);
32a6f3f22fSchristos 	return str;
33f17b710fSchristos }
34f17b710fSchristos 
35*eabc0478Schristos static int // technically boolean
364c290c01Schristos IsEqual(const struct calendar expected, const struct calendar actual)
374c290c01Schristos {
384c290c01Schristos 	if (   expected.year == actual.year
394c290c01Schristos 	    && (   expected.yearday == actual.yearday
404c290c01Schristos 		|| (   expected.month == actual.month
414c290c01Schristos 		    && expected.monthday == actual.monthday))
424c290c01Schristos 	    && expected.hour == actual.hour
434c290c01Schristos 	    && expected.minute == actual.minute
444c290c01Schristos 	    && expected.second == actual.second) {
45f17b710fSchristos 		return TRUE;
46f17b710fSchristos 	} else {
47*eabc0478Schristos 		const char * p_exp = CalendarToString(expected);
48*eabc0478Schristos 		const char * p_act = CalendarToString(actual);
494c290c01Schristos 		printf("expected: %s but was %s", p_exp, p_act);
504c290c01Schristos 		return FALSE;
51f17b710fSchristos 	}
52f17b710fSchristos }
53f17b710fSchristos 
54f17b710fSchristos 
55*eabc0478Schristos void setUp(void)
56f17b710fSchristos {
57f17b710fSchristos     ntpcal_set_timefunc(timefunc);
58f17b710fSchristos     settime(1970, 1, 1, 0, 0, 0);
594c290c01Schristos     init_lib();
60f17b710fSchristos }
61f17b710fSchristos 
62*eabc0478Schristos void tearDown(void)
63f17b710fSchristos {
64f17b710fSchristos     ntpcal_set_timefunc(NULL);
65f17b710fSchristos }
66f17b710fSchristos 
67f17b710fSchristos 
68*eabc0478Schristos void test_RegularTime(void)
694c290c01Schristos {
70f17b710fSchristos 	u_long testDate = 3485080800UL; // 2010-06-09 14:00:00
71f17b710fSchristos 	struct calendar expected = {2010,160,6,9,14,0,0};
72f17b710fSchristos 
73f17b710fSchristos 	struct calendar actual;
74f17b710fSchristos 
75f17b710fSchristos 	caljulian(testDate, &actual);
76f17b710fSchristos 
77f17b710fSchristos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
78f17b710fSchristos }
79f17b710fSchristos 
80*eabc0478Schristos void test_LeapYear(void)
814c290c01Schristos {
82f17b710fSchristos 	u_long input = 3549902400UL; // 2012-06-28 20:00:00Z
83f17b710fSchristos 	struct calendar expected = {2012, 179, 6, 28, 20, 0, 0};
84f17b710fSchristos 
85f17b710fSchristos 	struct calendar actual;
86f17b710fSchristos 
87f17b710fSchristos 	caljulian(input, &actual);
88f17b710fSchristos 
89f17b710fSchristos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
90f17b710fSchristos }
91f17b710fSchristos 
92*eabc0478Schristos void test_uLongBoundary(void)
934c290c01Schristos {
944c290c01Schristos 	u_long enc_time = 4294967295UL; // 2036-02-07 6:28:15
95f17b710fSchristos 	struct calendar expected = {2036,0,2,7,6,28,15};
96f17b710fSchristos 
97f17b710fSchristos 	struct calendar actual;
98f17b710fSchristos 
994c290c01Schristos 	caljulian(enc_time, &actual);
100f17b710fSchristos 
101f17b710fSchristos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
102f17b710fSchristos }
103f17b710fSchristos 
104*eabc0478Schristos void test_uLongWrapped(void)
1054c290c01Schristos {
1064c290c01Schristos 	u_long enc_time = 0;
107f17b710fSchristos 	struct calendar expected = {2036,0,2,7,6,28,16};
108f17b710fSchristos 
109f17b710fSchristos 	struct calendar actual;
110f17b710fSchristos 
1114c290c01Schristos 	caljulian(enc_time, &actual);
112f17b710fSchristos 
113f17b710fSchristos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
114f17b710fSchristos }
115