chiark / gitweb /
Commit 2.4.5-5 as unpacked
[innduct.git] / tests / lib / date-t.c
1 /* $Id: date-t.c 7495 2006-03-19 23:21:38Z eagle $ */
2 /* makedate test suite */
3
4 #include "config.h"
5 #include "clibrary.h"
6 #include <time.h>
7
8 #include "libinn.h"
9 #include "libtest.h"
10
11 static const time_t test_times[] = {
12     28800UL,                    /* Thu,  1 Jan 1970 00:00:00 -0800 (PST) */
13     362762400UL,                /* Tue, 30 Jun 1981 15:20:00 +0000 (UTC) */
14     396977449UL,                /* Sat, 31 Jul 1982 15:30:49 +0000 (UTC) */
15     825597049UL,                /* Thu, 29 Feb 1996 12:30:49 +0000 (UTC) */
16     850435199UL,                /* Thu, 12 Dec 1996 23:59:59 +0000 (UTC) */
17     852101999UL,                /* Wed,  1 Jan 1997 06:59:59 +0000 (UTC) */
18     934288249UL,                /* Tue, 10 Aug 1999 12:30:49 +0000 (UTC) */
19     946684800UL,                /* Sat,  1 Jan 2000 00:00:00 +0000 (UTC) */
20     946713599UL,                /* Fri, 31 Dec 1999 23:59:59 -0800 (PST) */
21     946713600UL,                /* Sat,  1 Jan 2000 00:00:00 -0800 (PST) */
22     951827449UL,                /* Tue, 29 Feb 2000 12:30:49 +0000 (UTC) */
23     954669599UL,                /* Sun,  2 Apr 2000 01:59:59 -0800 (PST) */
24     954669600UL,                /* Sun,  2 Apr 2000 03:00:00 -0700 (PDT) */
25     967707668UL,                /* Thu, 31 Aug 2000 07:41:08 +0000 (UTC) */
26     972813600UL                 /* Sun, 29 Oct 2000 02:00:00 -0800 (PST) */
27 };
28
29 static void
30 ok_time(int n, time_t right, const char *date, const char *hour, bool local)
31 {
32     time_t seen;
33
34     seen = parsedate_nntp(date, hour, local);
35     if (right == seen)
36         printf("ok %d\n", n);
37     else
38         printf("not ok %d\n  wanted %lu seen %lu\n  %s %s %d\n", n,
39                (unsigned long) right, (unsigned long) seen, date, hour,
40                local);
41 }
42
43 static void
44 check_nntp(int *n, time_t timestamp)
45 {
46     char date[9], hour[7];
47     struct tm *tmp_tm, tm;
48
49     tmp_tm = localtime(&timestamp);
50     tm = *tmp_tm;
51     sprintf(date, "%02d%02d%02d", tm.tm_year % 100, tm.tm_mon + 1,
52             tm.tm_mday);
53     sprintf(hour, "%02d%02d%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
54     ok_time((*n)++, timestamp, date, hour, true);
55     sprintf(date, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1,
56             tm.tm_mday);
57     ok_time((*n)++, timestamp, date, hour, true);
58     tmp_tm = gmtime(&timestamp);
59     tm = *tmp_tm;
60     sprintf(date, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1,
61             tm.tm_mday);
62     sprintf(hour, "%02d%02d%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
63     ok_time((*n)++, timestamp, date, hour, false);
64 }
65
66 int
67 main(void)
68 {
69     char buff[64] = "";
70     bool status;
71     time_t now, result;
72     double diff = 0;
73     int n;
74     unsigned int i;
75
76     char PST8PDT[] = "TZ=PST8PDT";
77     char Newfoundland[] = "TZ=Canada/Newfoundland";
78
79     printf("%d\n", 44 + ARRAY_SIZE(test_times) * 3 + 3);
80
81     now = time(NULL);
82     status = makedate(-1, false, buff, sizeof(buff));
83     if (status) {
84         result = parsedate(buff, NULL);
85         diff = difftime(result, now);
86     }
87     ok(1, status && diff >= 0 && diff < 10);
88     now = time(NULL);
89     status = makedate(-1, true, buff, sizeof(buff));
90     if (status) {
91         result = parsedate(buff, NULL);
92         diff = difftime(result, now);
93     }
94     ok(2, status && diff >= 0 && diff < 10);
95
96     putenv(PST8PDT);
97     tzset();
98
99     status = makedate(100000000UL, false, buff, sizeof(buff));
100     ok(3, status);
101     ok_string(4, "Sat, 3 Mar 1973 09:46:40 +0000 (UTC)", buff);
102     status = makedate(100000000UL, true, buff, sizeof(buff));
103     ok(5, status);
104     ok_string(6, "Sat, 3 Mar 1973 01:46:40 -0800 (PST)", buff);
105     status = makedate(300000000UL, false, buff, sizeof(buff));
106     ok(7, status);
107     ok_string(8, "Thu, 5 Jul 1979 05:20:00 +0000 (UTC)", buff);
108     status = makedate(300000000UL, true, buff, sizeof(buff));
109     ok(9, status);
110     ok_string(10, "Wed, 4 Jul 1979 22:20:00 -0700 (PDT)", buff);
111
112     status = makedate(300000000UL, false, buff, 31);
113     ok(11, !status);
114     status = makedate(300000000UL, false, buff, 32);
115     ok(12, status);
116     ok_string(13, "Thu, 5 Jul 1979 05:20:00 +0000", buff);
117     status = makedate(300000000UL, true, buff, 32);
118     ok(14, status);
119     ok_string(15, "Wed, 4 Jul 1979 22:20:00 -0700", buff);
120
121     putenv(Newfoundland);
122     tzset();
123
124     status = makedate(900000045UL, true, buff, sizeof(buff));
125     ok(16, status);
126     if (memcmp(buff, "Thu, 9 Jul 1998 16:00:45 +0000", 30) == 0)
127         printf("ok 17 # skip - Newfoundland time zone not installed\n");
128     else
129         ok_string(17, "Thu, 9 Jul 1998 13:30:45 -0230 (NDT)", buff);
130
131     putenv(PST8PDT);
132     tzset();
133
134     ok_time(18, (time_t) -1, "20000132", "000000", false);
135     ok_time(19, (time_t) -1, "20000132", "000000", true);
136     ok_time(20, (time_t) -1, "20000230", "000000", false);
137     ok_time(21, (time_t) -1, "20000230", "000000", true);
138     ok_time(22, (time_t) -1, "19990229", "000000", false);
139     ok_time(23, (time_t) -1, "19990229", "000000", true);
140     ok_time(24, (time_t) -1, "19990020", "000000", false);
141     ok_time(25, (time_t) -1, "19990120", "240000", false);
142     ok_time(26, (time_t) -1, "19990120", "146000", false);
143     ok_time(27, (time_t) -1, "19990120", "145961", false);
144     ok_time(28, (time_t) -1,   "691231", "235959", false);
145     ok_time(29, (time_t) -1, "19691231", "235959", false);
146     ok_time(30, (time_t) -1, "19700100", "000000", false);
147     ok_time(31,           0, "19700101", "000000", false);
148     ok_time(32,           0,   "700101", "000000", false);
149     ok_time(33, (time_t) -1, "2000010101", "000000", false);
150     ok_time(34, (time_t) -1,    "00101", "000000", false);
151     ok_time(35, (time_t) -1, "20000101",  "11111", false);
152     ok_time(36, (time_t) -1, "20000101", "1111111", false);
153     ok_time(37, (time_t) -1, "200001a1", "000000", false);
154     ok_time(38, (time_t) -1, "20000101", "00a000", false);
155
156     /* Times around the fall daylight savings change are ambiguous; accept
157        either of the possible interpretations, but make sure we get one or
158        the other. */
159     result = parsedate_nntp("20001029", "010000", true);
160     ok(39, result == 972806400UL || result == 972810000UL);
161     result = parsedate_nntp("001029", "013000", true);
162     ok(40, result == 972808200UL || result == 972811800UL);
163     result = parsedate_nntp("20001029", "013000", true);
164     ok(41, result == 972808200UL || result == 972811800UL);
165     result = parsedate_nntp("001029", "013000", true);
166     ok(42, result == 972808200UL || result == 972811800UL);
167     result = parsedate_nntp("20001029", "015959", true);
168     ok(43, result == 972809999UL || result == 972813599UL);
169     result = parsedate_nntp("001029", "015959", true);
170     ok(44, result == 972809999UL || result == 972813599UL);
171
172     n = 45;
173     for (i = 0; i < ARRAY_SIZE(test_times); i++)
174         check_nntp(&n, test_times[i]);
175     check_nntp(&n, time(NULL));
176
177     return 0;
178 }