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