1  /* Basic tests for timegm.
       2     Copyright (C) 2021-2023 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
      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
      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>