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