Home | History | Annotate | Line # | Download | only in libntp
      1  1.2  christos /*	$NetBSD: caljulian.c,v 1.3 2024/08/18 20:47:26 christos Exp $	*/
      2  1.2  christos 
      3  1.1  christos #include "config.h"
      4  1.1  christos 
      5  1.1  christos #include "ntp_calendar.h"
      6  1.1  christos #include "ntp_stdlib.h"
      7  1.2  christos 
      8  1.1  christos #include "unity.h"
      9  1.2  christos #include "test-libntp.h"
     10  1.1  christos 
     11  1.2  christos #include <string.h>
     12  1.1  christos 
     13  1.1  christos 
     14  1.2  christos void setUp(void);
     15  1.2  christos void tearDown(void);
     16  1.2  christos void test_RegularTime(void);
     17  1.2  christos void test_LeapYear(void);
     18  1.2  christos void test_uLongBoundary(void);
     19  1.2  christos void test_uLongWrapped(void);
     20  1.1  christos 
     21  1.1  christos 
     22  1.3  christos static const char *
     23  1.2  christos CalendarToString(const struct calendar cal)
     24  1.2  christos {
     25  1.3  christos 	char * str;
     26  1.2  christos 
     27  1.3  christos 	LIB_GETBUF(str);
     28  1.3  christos 	snprintf(str, LIB_BUFLENGTH,
     29  1.3  christos 		 "%04hu-%02hhu-%02hhu (%hu) %02hhu:%02hhu:%02hhu",
     30  1.3  christos 		 cal.year, cal.month, cal.monthday, cal.yearday,
     31  1.3  christos 		 cal.hour, cal.minute, cal.second);
     32  1.2  christos 	return str;
     33  1.2  christos }
     34  1.2  christos 
     35  1.3  christos static int // technically boolean
     36  1.2  christos IsEqual(const struct calendar expected, const struct calendar actual)
     37  1.2  christos {
     38  1.2  christos 	if (   expected.year == actual.year
     39  1.2  christos 	    && (   expected.yearday == actual.yearday
     40  1.2  christos 		|| (   expected.month == actual.month
     41  1.2  christos 		    && expected.monthday == actual.monthday))
     42  1.2  christos 	    && expected.hour == actual.hour
     43  1.2  christos 	    && expected.minute == actual.minute
     44  1.2  christos 	    && expected.second == actual.second) {
     45  1.1  christos 		return TRUE;
     46  1.1  christos 	} else {
     47  1.3  christos 		const char * p_exp = CalendarToString(expected);
     48  1.3  christos 		const char * p_act = CalendarToString(actual);
     49  1.2  christos 		printf("expected: %s but was %s", p_exp, p_act);
     50  1.1  christos 		return FALSE;
     51  1.1  christos 	}
     52  1.1  christos }
     53  1.1  christos 
     54  1.1  christos 
     55  1.3  christos void setUp(void)
     56  1.1  christos {
     57  1.1  christos     ntpcal_set_timefunc(timefunc);
     58  1.1  christos     settime(1970, 1, 1, 0, 0, 0);
     59  1.2  christos     init_lib();
     60  1.1  christos }
     61  1.1  christos 
     62  1.3  christos void tearDown(void)
     63  1.1  christos {
     64  1.1  christos     ntpcal_set_timefunc(NULL);
     65  1.1  christos }
     66  1.1  christos 
     67  1.1  christos 
     68  1.3  christos void test_RegularTime(void)
     69  1.2  christos {
     70  1.1  christos 	u_long testDate = 3485080800UL; // 2010-06-09 14:00:00
     71  1.1  christos 	struct calendar expected = {2010,160,6,9,14,0,0};
     72  1.1  christos 
     73  1.1  christos 	struct calendar actual;
     74  1.1  christos 
     75  1.1  christos 	caljulian(testDate, &actual);
     76  1.1  christos 
     77  1.1  christos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
     78  1.1  christos }
     79  1.1  christos 
     80  1.3  christos void test_LeapYear(void)
     81  1.2  christos {
     82  1.1  christos 	u_long input = 3549902400UL; // 2012-06-28 20:00:00Z
     83  1.1  christos 	struct calendar expected = {2012, 179, 6, 28, 20, 0, 0};
     84  1.1  christos 
     85  1.1  christos 	struct calendar actual;
     86  1.1  christos 
     87  1.1  christos 	caljulian(input, &actual);
     88  1.1  christos 
     89  1.1  christos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
     90  1.1  christos }
     91  1.1  christos 
     92  1.3  christos void test_uLongBoundary(void)
     93  1.2  christos {
     94  1.2  christos 	u_long enc_time = 4294967295UL; // 2036-02-07 6:28:15
     95  1.1  christos 	struct calendar expected = {2036,0,2,7,6,28,15};
     96  1.1  christos 
     97  1.1  christos 	struct calendar actual;
     98  1.1  christos 
     99  1.2  christos 	caljulian(enc_time, &actual);
    100  1.1  christos 
    101  1.1  christos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
    102  1.1  christos }
    103  1.1  christos 
    104  1.3  christos void test_uLongWrapped(void)
    105  1.2  christos {
    106  1.2  christos 	u_long enc_time = 0;
    107  1.1  christos 	struct calendar expected = {2036,0,2,7,6,28,16};
    108  1.1  christos 
    109  1.1  christos 	struct calendar actual;
    110  1.1  christos 
    111  1.2  christos 	caljulian(enc_time, &actual);
    112  1.1  christos 
    113  1.1  christos 	TEST_ASSERT_TRUE(IsEqual(expected, actual));
    114  1.1  christos }
    115