1290001Sglebius#include "config.h"
2290001Sglebius
3290001Sglebius#include "ntp_calendar.h"
4290001Sglebius#include "ntp_stdlib.h"
5290001Sglebius
6290001Sglebius#include "unity.h"
7290001Sglebius#include "test-libntp.h"
8290001Sglebius
9290001Sglebius#include <string.h>
10290001Sglebius
11290001Sglebius
12290001Sglebiuschar * CalendarToString(const struct calendar cal);
13290001Sglebiusint IsEqual(const struct calendar expected, const struct calendar actual);
14290001Sglebiusvoid setUp(void);
15290001Sglebiusvoid tearDown(void);
16290001Sglebiusvoid test_RegularTime(void);
17290001Sglebiusvoid test_LeapYear(void);
18290001Sglebiusvoid test_uLongBoundary(void);
19290001Sglebiusvoid test_uLongWrapped(void);
20290001Sglebius
21290001Sglebius
22290001Sglebiuschar *
23293896SglebiusCalendarToString(const struct calendar cal)
24293896Sglebius{
25290001Sglebius	char * str = emalloc (sizeof (char) * 100);
26290001Sglebius	char buffer[100] ="";
27293896Sglebius
28293896Sglebius	*str = '\0';
29290001Sglebius	snprintf(buffer, 100, "%u", cal.year);
30290001Sglebius	strcat(str, buffer);
31290001Sglebius	strcat(str, "-");
32290001Sglebius	snprintf(buffer, 100, "%u", (u_int)cal.month);
33290001Sglebius	strcat(str, buffer);
34290001Sglebius	strcat(str, "-");
35290001Sglebius	snprintf(buffer, 100, "%u", (u_int)cal.monthday);
36290001Sglebius	strcat(str, buffer);
37290001Sglebius	strcat(str, " (");
38290001Sglebius	snprintf(buffer, 100, "%u", (u_int) cal.yearday);
39290001Sglebius	strcat(str, buffer);
40290001Sglebius	strcat(str, ") ");
41290001Sglebius	snprintf(buffer, 100, "%u", (u_int)cal.hour);
42290001Sglebius	strcat(str, buffer);
43290001Sglebius	strcat(str, ":");
44290001Sglebius	snprintf(buffer, 100, "%u", (u_int)cal.minute);
45290001Sglebius	strcat(str, buffer);
46290001Sglebius	strcat(str, ":");
47290001Sglebius	snprintf(buffer, 100, "%u", (u_int)cal.second);
48290001Sglebius	strcat(str, buffer);
49290001Sglebius	return str;
50290001Sglebius}
51290001Sglebius
52290001Sglebiusint // technically boolean
53293896SglebiusIsEqual(const struct calendar expected, const struct calendar actual)
54293896Sglebius{
55293896Sglebius	if (   expected.year == actual.year
56293896Sglebius	    && (   expected.yearday == actual.yearday
57293896Sglebius		|| (   expected.month == actual.month
58293896Sglebius		    && expected.monthday == actual.monthday))
59293896Sglebius	    && expected.hour == actual.hour
60293896Sglebius	    && expected.minute == actual.minute
61293896Sglebius	    && expected.second == actual.second) {
62290001Sglebius		return TRUE;
63290001Sglebius	} else {
64293896Sglebius		char *p_exp, *p_act;
65293896Sglebius
66293896Sglebius		p_exp = CalendarToString(expected);
67293896Sglebius		p_act = CalendarToString(actual);
68293896Sglebius		printf("expected: %s but was %s", p_exp, p_act);
69293896Sglebius		free(p_exp);
70293896Sglebius		free(p_act);
71290001Sglebius		return FALSE;
72290001Sglebius	}
73290001Sglebius}
74290001Sglebius
75290001Sglebius
76290001Sglebiusvoid
77290001SglebiussetUp()
78290001Sglebius{
79290001Sglebius    ntpcal_set_timefunc(timefunc);
80290001Sglebius    settime(1970, 1, 1, 0, 0, 0);
81293896Sglebius    init_lib();
82293896Sglebius
83293896Sglebius    return;
84290001Sglebius}
85290001Sglebius
86290001Sglebiusvoid
87290001SglebiustearDown()
88290001Sglebius{
89290001Sglebius    ntpcal_set_timefunc(NULL);
90293896Sglebius
91293896Sglebius    return;
92290001Sglebius}
93290001Sglebius
94290001Sglebius
95290001Sglebiusvoid
96293896Sglebiustest_RegularTime(void)
97293896Sglebius{
98290001Sglebius	u_long testDate = 3485080800UL; // 2010-06-09 14:00:00
99290001Sglebius	struct calendar expected = {2010,160,6,9,14,0,0};
100290001Sglebius
101290001Sglebius	struct calendar actual;
102290001Sglebius
103290001Sglebius	caljulian(testDate, &actual);
104290001Sglebius
105290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
106293896Sglebius
107293896Sglebius	return;
108290001Sglebius}
109290001Sglebius
110290001Sglebiusvoid
111293896Sglebiustest_LeapYear(void)
112293896Sglebius{
113290001Sglebius	u_long input = 3549902400UL; // 2012-06-28 20:00:00Z
114290001Sglebius	struct calendar expected = {2012, 179, 6, 28, 20, 0, 0};
115290001Sglebius
116290001Sglebius	struct calendar actual;
117290001Sglebius
118290001Sglebius	caljulian(input, &actual);
119290001Sglebius
120290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
121293896Sglebius
122293896Sglebius	return;
123290001Sglebius}
124290001Sglebius
125290001Sglebiusvoid
126293896Sglebiustest_uLongBoundary(void)
127293896Sglebius{
128293896Sglebius	u_long enc_time = 4294967295UL; // 2036-02-07 6:28:15
129290001Sglebius	struct calendar expected = {2036,0,2,7,6,28,15};
130290001Sglebius
131290001Sglebius	struct calendar actual;
132290001Sglebius
133293896Sglebius	caljulian(enc_time, &actual);
134290001Sglebius
135290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
136293896Sglebius
137293896Sglebius	return;
138290001Sglebius}
139290001Sglebius
140290001Sglebiusvoid
141293896Sglebiustest_uLongWrapped(void)
142293896Sglebius{
143293896Sglebius	u_long enc_time = 0;
144290001Sglebius	struct calendar expected = {2036,0,2,7,6,28,16};
145290001Sglebius
146290001Sglebius	struct calendar actual;
147290001Sglebius
148293896Sglebius	caljulian(enc_time, &actual);
149290001Sglebius
150290001Sglebius	TEST_ASSERT_TRUE(IsEqual(expected, actual));
151293896Sglebius
152293896Sglebius	return;
153290001Sglebius}
154