/* $Id: date-t.c 7495 2006-03-19 23:21:38Z eagle $ */ /* makedate test suite */ #include "config.h" #include "clibrary.h" #include #include "libinn.h" #include "libtest.h" static const time_t test_times[] = { 28800UL, /* Thu, 1 Jan 1970 00:00:00 -0800 (PST) */ 362762400UL, /* Tue, 30 Jun 1981 15:20:00 +0000 (UTC) */ 396977449UL, /* Sat, 31 Jul 1982 15:30:49 +0000 (UTC) */ 825597049UL, /* Thu, 29 Feb 1996 12:30:49 +0000 (UTC) */ 850435199UL, /* Thu, 12 Dec 1996 23:59:59 +0000 (UTC) */ 852101999UL, /* Wed, 1 Jan 1997 06:59:59 +0000 (UTC) */ 934288249UL, /* Tue, 10 Aug 1999 12:30:49 +0000 (UTC) */ 946684800UL, /* Sat, 1 Jan 2000 00:00:00 +0000 (UTC) */ 946713599UL, /* Fri, 31 Dec 1999 23:59:59 -0800 (PST) */ 946713600UL, /* Sat, 1 Jan 2000 00:00:00 -0800 (PST) */ 951827449UL, /* Tue, 29 Feb 2000 12:30:49 +0000 (UTC) */ 954669599UL, /* Sun, 2 Apr 2000 01:59:59 -0800 (PST) */ 954669600UL, /* Sun, 2 Apr 2000 03:00:00 -0700 (PDT) */ 967707668UL, /* Thu, 31 Aug 2000 07:41:08 +0000 (UTC) */ 972813600UL /* Sun, 29 Oct 2000 02:00:00 -0800 (PST) */ }; static void ok_time(int n, time_t right, const char *date, const char *hour, bool local) { time_t seen; seen = parsedate_nntp(date, hour, local); if (right == seen) printf("ok %d\n", n); else printf("not ok %d\n wanted %lu seen %lu\n %s %s %d\n", n, (unsigned long) right, (unsigned long) seen, date, hour, local); } static void check_nntp(int *n, time_t timestamp) { char date[9], hour[7]; struct tm *tmp_tm, tm; tmp_tm = localtime(×tamp); tm = *tmp_tm; sprintf(date, "%02d%02d%02d", tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday); sprintf(hour, "%02d%02d%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); ok_time((*n)++, timestamp, date, hour, true); sprintf(date, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); ok_time((*n)++, timestamp, date, hour, true); tmp_tm = gmtime(×tamp); tm = *tmp_tm; sprintf(date, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); sprintf(hour, "%02d%02d%02d", tm.tm_hour, tm.tm_min, tm.tm_sec); ok_time((*n)++, timestamp, date, hour, false); } int main(void) { char buff[64] = ""; bool status; time_t now, result; double diff = 0; int n; unsigned int i; char PST8PDT[] = "TZ=PST8PDT"; char Newfoundland[] = "TZ=Canada/Newfoundland"; printf("%d\n", 44 + ARRAY_SIZE(test_times) * 3 + 3); now = time(NULL); status = makedate(-1, false, buff, sizeof(buff)); if (status) { result = parsedate(buff, NULL); diff = difftime(result, now); } ok(1, status && diff >= 0 && diff < 10); now = time(NULL); status = makedate(-1, true, buff, sizeof(buff)); if (status) { result = parsedate(buff, NULL); diff = difftime(result, now); } ok(2, status && diff >= 0 && diff < 10); putenv(PST8PDT); tzset(); status = makedate(100000000UL, false, buff, sizeof(buff)); ok(3, status); ok_string(4, "Sat, 3 Mar 1973 09:46:40 +0000 (UTC)", buff); status = makedate(100000000UL, true, buff, sizeof(buff)); ok(5, status); ok_string(6, "Sat, 3 Mar 1973 01:46:40 -0800 (PST)", buff); status = makedate(300000000UL, false, buff, sizeof(buff)); ok(7, status); ok_string(8, "Thu, 5 Jul 1979 05:20:00 +0000 (UTC)", buff); status = makedate(300000000UL, true, buff, sizeof(buff)); ok(9, status); ok_string(10, "Wed, 4 Jul 1979 22:20:00 -0700 (PDT)", buff); status = makedate(300000000UL, false, buff, 31); ok(11, !status); status = makedate(300000000UL, false, buff, 32); ok(12, status); ok_string(13, "Thu, 5 Jul 1979 05:20:00 +0000", buff); status = makedate(300000000UL, true, buff, 32); ok(14, status); ok_string(15, "Wed, 4 Jul 1979 22:20:00 -0700", buff); putenv(Newfoundland); tzset(); status = makedate(900000045UL, true, buff, sizeof(buff)); ok(16, status); if (memcmp(buff, "Thu, 9 Jul 1998 16:00:45 +0000", 30) == 0) printf("ok 17 # skip - Newfoundland time zone not installed\n"); else ok_string(17, "Thu, 9 Jul 1998 13:30:45 -0230 (NDT)", buff); putenv(PST8PDT); tzset(); ok_time(18, (time_t) -1, "20000132", "000000", false); ok_time(19, (time_t) -1, "20000132", "000000", true); ok_time(20, (time_t) -1, "20000230", "000000", false); ok_time(21, (time_t) -1, "20000230", "000000", true); ok_time(22, (time_t) -1, "19990229", "000000", false); ok_time(23, (time_t) -1, "19990229", "000000", true); ok_time(24, (time_t) -1, "19990020", "000000", false); ok_time(25, (time_t) -1, "19990120", "240000", false); ok_time(26, (time_t) -1, "19990120", "146000", false); ok_time(27, (time_t) -1, "19990120", "145961", false); ok_time(28, (time_t) -1, "691231", "235959", false); ok_time(29, (time_t) -1, "19691231", "235959", false); ok_time(30, (time_t) -1, "19700100", "000000", false); ok_time(31, 0, "19700101", "000000", false); ok_time(32, 0, "700101", "000000", false); ok_time(33, (time_t) -1, "2000010101", "000000", false); ok_time(34, (time_t) -1, "00101", "000000", false); ok_time(35, (time_t) -1, "20000101", "11111", false); ok_time(36, (time_t) -1, "20000101", "1111111", false); ok_time(37, (time_t) -1, "200001a1", "000000", false); ok_time(38, (time_t) -1, "20000101", "00a000", false); /* Times around the fall daylight savings change are ambiguous; accept either of the possible interpretations, but make sure we get one or the other. */ result = parsedate_nntp("20001029", "010000", true); ok(39, result == 972806400UL || result == 972810000UL); result = parsedate_nntp("001029", "013000", true); ok(40, result == 972808200UL || result == 972811800UL); result = parsedate_nntp("20001029", "013000", true); ok(41, result == 972808200UL || result == 972811800UL); result = parsedate_nntp("001029", "013000", true); ok(42, result == 972808200UL || result == 972811800UL); result = parsedate_nntp("20001029", "015959", true); ok(43, result == 972809999UL || result == 972813599UL); result = parsedate_nntp("001029", "015959", true); ok(44, result == 972809999UL || result == 972813599UL); n = 45; for (i = 0; i < ARRAY_SIZE(test_times); i++) check_nntp(&n, test_times[i]); check_nntp(&n, time(NULL)); return 0; }