More work on the dirmngr. It now builds for W32 and W32CE and quick
[gnupg.git] / common / t-timestuff.c
1 /* t-timestuff.c - Regression tests for time functions
2  * Copyright (C) 2007 Free Software Foundation, Inc.
3  *
4  * This file is part of JNLIB.
5  *
6  * JNLIB is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as
8  * published by the Free Software Foundation; either version 3 of
9  * the License, or (at your option) any later version.
10  *
11  * JNLIB is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <errno.h>
25 #include <time.h>
26
27 #include "mischelp.h"
28
29 #include "t-support.h"
30
31
32 static int
33 cmp_time_s (struct tm *a, struct tm *b)
34 {
35   if (a->tm_year != b->tm_year
36       || a->tm_mon  != b->tm_mon
37       || a->tm_mday != b->tm_mday
38       || a->tm_hour != b->tm_hour
39       || a->tm_min  != b->tm_min 
40       || a->tm_sec  != b->tm_sec 
41       || a->tm_wday != b->tm_wday
42       || a->tm_yday != b->tm_yday
43       || !a->tm_isdst != !b->tm_isdst)
44     return -1;
45   return 0;
46 }
47
48
49
50 static void
51 test_timegm (void)
52 {
53   static struct {
54     int year, mon, mday, hour, min, sec; 
55   } tvalues[] = {
56     { -1 },
57     { -2,  1 },
58     { -2,  2 },
59     { -2,  86399 },
60     { -2,  86400 },
61     { -2,  0x7ffffffe },
62     { -2,  0x7fffffff },
63     /* Note: Because we use mktime below we can only start with the
64        day after Epoch.  */
65     { 1970, 1, 2, 0, 0 , 1},
66     { 1970, 1, 2, 0, 0 , 2},
67     { 1970, 1, 2, 12, 0 , 0},
68     { 1970, 1, 2, 23, 59 , 59},
69     { 1999, 12, 31, 23, 59 , 59},
70     { 2000, 1, 1, 0, 0, 0},
71     { 2000, 1, 1, 0, 0, 1},
72     { 2010, 12, 31, 23, 59 , 59},
73     { 2010, 1, 1, 0, 0, 0},
74     { 2010, 1, 1, 0, 0, 1},
75     /* The date below is about the last time mktime works in CET on
76        Windows XP; this is a somewhat strange because 32 bit Unices
77        will happily work along for another month until they reach the
78        end of all ticks on 20380119T031408 (unless Uli takes
79        compassion on us and changes time_t to a u64).  */
80     { 2037, 12, 18, 23, 59, 59}
81
82   };
83   int tidx;
84   time_t now, atime, counter;
85   struct tm tbuf, tbuf2, *tp;
86
87   counter = 0;
88   for (tidx=0; tidx < DIM (tvalues); tidx++)
89     {
90       if (tvalues[tidx].year == -1)
91         {
92           now = time (NULL);
93         }
94       else if (tvalues[tidx].year == -2)
95         {
96           now = tvalues[tidx].mon;
97         }
98       else
99         {
100           memset (&tbuf, 0, sizeof tbuf);
101           tbuf.tm_year = tvalues[tidx].year - 1900;
102           tbuf.tm_mon  = tvalues[tidx].mon;
103           tbuf.tm_mday = tvalues[tidx].mday;
104           tbuf.tm_hour = tvalues[tidx].hour;
105           tbuf.tm_min  = tvalues[tidx].min;
106           tbuf.tm_sec  = tvalues[tidx].sec; 
107           now = mktime (&tbuf);
108         }
109       if (now == (time_t)(-1))
110         fail (tidx);
111       
112       tp = gmtime (&now);
113       if (!tp)
114         fail (tidx);
115       tbuf = *tp;
116       tbuf2 = tbuf;
117       atime = timegm (&tbuf);
118       if (atime == (time_t)(-1))
119         fail (tidx);
120       if (atime != now)
121         fail (tidx);
122       
123       tp = gmtime (&atime);
124       if (!tp)
125         fail (tidx);
126       if (cmp_time_s (tp, &tbuf))
127         fail (tidx);
128       if (cmp_time_s (tp, &tbuf2))
129         fail (tidx);
130     }
131 }
132
133
134
135 int
136 main (int argc, char **argv)
137 {
138   (void)argc;
139   (void)argv;
140
141   test_timegm ();
142
143   return 0;
144 }
145