new test framework (one main per test)
[libc-test] / src / time / time.c
1 #define _XOPEN_SOURCE 700
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <time.h>
5 #include "test.h"
6
7 /* We use this instead of memcmp because some broken C libraries
8  * add additional nonstandard fields to struct tm... */
9
10 int tm_cmp(struct tm tm1, struct tm tm2)
11 {
12         return  tm1.tm_sec  != tm2.tm_sec  ||
13                 tm1.tm_min  != tm2.tm_min  ||
14                 tm1.tm_hour != tm2.tm_hour ||
15                 tm1.tm_mday != tm2.tm_mday ||
16                 tm1.tm_mon  != tm2.tm_mon  ||
17                 tm1.tm_year != tm2.tm_year ||
18                 tm1.tm_wday != tm2.tm_wday ||
19                 tm1.tm_yday != tm2.tm_yday ||
20                 tm1.tm_isdst!= tm2.tm_isdst;
21 }
22
23 char *tm_str(struct tm tm)
24 {
25         static int i;
26         static char b[4][64];
27         i = (i+1)%4;
28         snprintf(b[i], sizeof b[i],
29                 "s=%02d m=%02d h=%02d mday=%02d mon=%02d year=%04d wday=%d yday=%d isdst=%d",
30                 tm.tm_sec, tm.tm_min, tm.tm_hour,
31                 tm.tm_mday, tm.tm_mon, tm.tm_year,
32                 tm.tm_wday, tm.tm_yday, tm.tm_isdst);
33         return b[i];
34 }
35
36 #define TM(ss,mm,hh,md,mo,yr,wd,yd,dst) (struct tm){ \
37         .tm_sec = ss, .tm_min = mm, .tm_hour = hh,    \
38         .tm_mday = md, .tm_mon = mo, .tm_year = yr,    \
39         .tm_wday = wd, .tm_yday = yd, .tm_isdst = dst }
40
41 #define TM_EPOCH    TM(0,0,0,1,0,70,4,0,0)
42 #define TM_Y2038_1S TM(7,14,3,19,0,138,2,18,0)
43 #define TM_Y2038    TM(8,14,3,19,0,138,2,18,0)
44
45 #define TEST_TM(r,x,m) (!tm_cmp((r),(x)) || \
46         (error("%s failed:\n\tresult: %s\n\texpect: %s\n", \
47                m, tm_str(r), tm_str(x)), 0) )
48
49 #define TEST(r, f, x, m) ( \
50         ((r) = (f)) == (x) || \
51         (error("%s failed (" m ")\n", #f, r, x), 0) )
52
53 int main(void)
54 {
55         struct tm tm, *tm_p;
56         time_t t;
57
58         putenv("TZ=GMT");
59         tzset();
60
61         t=0; tm_p = gmtime(&t);
62         TEST_TM(*tm_p, TM_EPOCH, "gmtime(0)");
63
64         tm = TM_Y2038_1S;
65         t = mktime(&tm);
66         tm = *(gmtime(&t));
67         TEST_TM(*tm_p, TM_Y2038_1S, "mktime/gmtime(Y2038-1)");
68
69         tm = TM_Y2038;
70         t = mktime(&tm);
71         tm = *(gmtime(&t));
72         TEST_TM(*tm_p, TM_Y2038, "mktime/gmtime(Y2038)");
73
74         /* FIXME: set a TZ var and check DST boundary conditions */
75         return test_status;
76 }