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