1 /* Basic tests for timegm.
2    Copyright (C) 2021-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include <time.h>
20 #include <stdlib.h>
21 #include <support/check.h>
22 
23 static void
do_test_func(time_t (* func)(struct tm *))24 do_test_func (time_t (*func)(struct tm *))
25 {
26   {
27     struct tm tmg =
28       {
29 	.tm_sec = 0,
30 	.tm_min = 0,
31 	.tm_hour = 0,
32 	.tm_mday = 1,
33 	.tm_mon = 0,
34 	.tm_year = 70,
35 	.tm_wday = 4,
36 	.tm_yday = 0,
37 	.tm_isdst = 0
38      };
39      time_t t = func (&tmg);
40      TEST_COMPARE (t, 0);
41   }
42 
43   {
44     struct tm tmg =
45       {
46 	.tm_sec = 7,
47 	.tm_min = 14,
48 	.tm_hour = 3,
49 	.tm_mday = 19,
50 	.tm_mon = 0,
51 	.tm_year = 138,
52 	.tm_wday = 2,
53 	.tm_yday = 18,
54 	.tm_isdst = 0
55      };
56      time_t t = func (&tmg);
57      TEST_COMPARE (t, 0x7fffffff);
58   }
59 
60   if (sizeof (time_t) < 8)
61     return;
62 
63   {
64     struct tm tmg =
65       {
66 	.tm_sec = 8,
67 	.tm_min = 14,
68 	.tm_hour = 3,
69 	.tm_mday = 19,
70 	.tm_mon = 0,
71 	.tm_year = 138,
72 	.tm_wday = 2,
73 	.tm_yday = 18,
74 	.tm_isdst = 0
75      };
76      time_t t = func (&tmg);
77      TEST_COMPARE (t, (time_t) 0x80000000ull);
78   }
79 }
80 
81 static int
do_test(void)82 do_test (void)
83 {
84   do_test_func (timegm);
85 
86   /* timelocal is an alias to mktime and behaves like timegm with the
87      difference that it takes timezone into account.  */
88   TEST_VERIFY_EXIT (setenv ("TZ", ":", 1) == 0);
89   tzset ();
90   do_test_func (timelocal);
91 
92   return 0;
93 }
94 
95 #include <support/test-driver.c>
96