root/maint/gnulib/tests/test-posixtm.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /* Test that posixtime works as required.
   2    Copyright (C) 2009-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Jim Meyering.  */
  18 
  19 #include <config.h>
  20 
  21 #include "posixtm.h"
  22 
  23 #include <stdio.h>
  24 #include <stdlib.h>
  25 #include <string.h>
  26 #include <stdint.h>
  27 #include <time.h>
  28 
  29 #include "intprops.h"
  30 #include "macros.h"
  31 
  32 struct posixtm_test
  33 {
  34   char const *in;
  35   unsigned int syntax_bits;
  36   bool valid;
  37   int_least64_t t_expected;
  38 };
  39 
  40 /* Test mainly with syntax_bits == LY.  */
  41 enum { LY = PDS_CENTURY | PDS_SECONDS };
  42 
  43 static struct posixtm_test const T[] =
  44   {
  45     /* no year specified; cross-check via another posixtime call */
  46     { "12131415.16",     LY, 1,            0}, /* ??? Dec 13 14:15:16 ???? */
  47     { "12131415",        LY, 1,            0}, /* ??? Dec 13 14:15:00 ???? */
  48 
  49 #if !((defined __APPLE__ && defined __MACH__) || defined __sun)
  50     /* These two tests fail on 64-bit Mac OS X 10.5 and on 64-bit Solaris up
  51        through at least Solaris 11.3, which is off by one day for timestamps
  52        before 0001-01-01 00:00:00 UTC.  */
  53     { "000001010000.00", LY, 1,
  54                       - INT64_C (62167219200)},/* Sat Jan  1 00:00:00 0    */
  55     { "000012312359.59", LY, 1,
  56                       - INT64_C (62135596801)},/* Fri Dec 31 23:59:59 0    */
  57 #endif
  58 
  59     { "000101010000.00", LY, 1,
  60                       - INT64_C (62135596800)},/* Sat Jan  1 00:00:00 1    */
  61     { "190112132045.51", LY, 1,
  62                        - INT64_C (2147483649)},/* Fri Dec 13 20:45:51 1901 */
  63     { "190112132045.52", LY, 1,
  64                        - INT64_C (2147483648)},/* Fri Dec 13 20:45:52 1901 */
  65     { "190112132045.53", LY, 1,  -2147483647}, /* Fri Dec 13 20:45:53 1901 */
  66     { "190112132046.52", LY, 1,  -2147483588}, /* Fri Dec 13 20:46:52 1901 */
  67     { "190112132145.52", LY, 1,  -2147480048}, /* Fri Dec 13 21:45:52 1901 */
  68     { "190112142045.52", LY, 1,  -2147397248}, /* Sat Dec 14 20:45:52 1901 */
  69     { "190201132045.52", LY, 1,  -2144805248}, /* Mon Jan 13 20:45:52 1902 */
  70     { "196912312359.59", LY, 1,           -1}, /* Wed Dec 31 23:59:59 1969 */
  71     { "197001010000.00", LY, 1,            0}, /* Thu Jan  1 00:00:00 1970 */
  72     { "197001010000.01", LY, 1,            1}, /* Thu Jan  1 00:00:01 1970 */
  73     { "197001010001.00", LY, 1,           60}, /* Thu Jan  1 00:01:00 1970 */
  74     { "197001010000.60", LY, 1,           60}, /* Thu Jan  1 00:01:00 1970 */
  75     { "197001010100.00", LY, 1,         3600}, /* Thu Jan  1 01:00:00 1970 */
  76     { "197001020000.00", LY, 1,        86400}, /* Fri Jan  2 00:00:00 1970 */
  77     { "197002010000.00", LY, 1,      2678400}, /* Sun Feb  1 00:00:00 1970 */
  78     { "197101010000.00", LY, 1,     31536000}, /* Fri Jan  1 00:00:00 1971 */
  79     { "197001000000.00", LY, 0,            0}, /* -- */
  80     { "197000010000.00", LY, 0,            0}, /* -- */
  81     { "197001010060.00", LY, 0,            0}, /* -- */
  82     { "197001012400.00", LY, 0,            0}, /* -- */
  83     { "197001320000.00", LY, 0,            0}, /* -- */
  84     { "197013010000.00", LY, 0,            0}, /* -- */
  85     { "203801190314.06", LY, 1,   2147483646}, /* Tue Jan 19 03:14:06 2038 */
  86     { "203801190314.07", LY, 1,   2147483647}, /* Tue Jan 19 03:14:07 2038 */
  87     { "203801190314.08", LY, 1,
  88                        INT64_C (  2147483648)},/* Tue Jan 19 03:14:08 2038 */
  89     { "999912312359.59", LY, 1,
  90                        INT64_C (253402300799)},/* Fri Dec 31 23:59:59 9999 */
  91     { "1112131415",      LY, 1,   1323785700}, /* Tue Dec 13 14:15:00 2011 */
  92     { "1112131415.16",   LY, 1,   1323785716}, /* Tue Dec 13 14:15:16 2011 */
  93     { "201112131415.16", LY, 1,   1323785716}, /* Tue Dec 13 14:15:16 2011 */
  94     { "191112131415.16", LY, 1,  -1831974284}, /* Wed Dec 13 14:15:16 1911 */
  95     { "203712131415.16", LY, 1,   2144326516}, /* Sun Dec 13 14:15:16 2037 */
  96     { "3712131415.16",   LY, 1,   2144326516}, /* Sun Dec 13 14:15:16 2037 */
  97     { "6812131415.16",   LY, 1,
  98                        INT64_C (  3122633716)},/* Thu Dec 13 14:15:16 2068 */
  99     { "6912131415.16",   LY, 1,     -1590284}, /* Sat Dec 13 14:15:16 1969 */
 100     { "7012131415.16",   LY, 1,     29945716}, /* Sun Dec 13 14:15:16 1970 */
 101     { "1213141599",      PDS_TRAILING_YEAR,
 102                              1,    945094500}, /* Mon Dec 13 14:15:00 1999 */
 103     { "1213141500",      PDS_TRAILING_YEAR,
 104                              1,    976716900}, /* Wed Dec 13 14:15:00 2000 */
 105     { NULL,               0, 0,            0}
 106   };
 107 
 108 int
 109 main (void)
     /* [previous][next][first][last][top][bottom][index][help] */
 110 {
 111   unsigned int i;
 112   int fail = 0;
 113   char curr_year_str[30];
 114   struct tm *tm;
 115   time_t t_now;
 116   int err;
 117   size_t n_bytes;
 118 
 119   /* The above test data requires Universal Time, e.g., TZ="UTC0".  */
 120   err = setenv ("TZ", "UTC0", 1);
 121   ASSERT (err == 0);
 122 
 123   t_now = time (NULL);
 124   ASSERT (t_now != (time_t) -1);
 125   tm = localtime (&t_now);
 126   ASSERT (tm);
 127   n_bytes = strftime (curr_year_str, sizeof curr_year_str, "%Y", tm);
 128   ASSERT (0 < n_bytes);
 129 
 130   for (i = 0; T[i].in; i++)
 131     {
 132       time_t t_out;
 133       time_t t_exp;
 134       bool ok;
 135 
 136       /* Some tests assume that time_t is signed.
 137          If it is unsigned and the result is negative, skip the test. */
 138       if (T[i].t_expected < 0 && ! TYPE_SIGNED (time_t))
 139         {
 140           printf ("skipping %s: result is negative, "
 141                   "but your time_t is unsigned\n", T[i].in);
 142           continue;
 143         }
 144 
 145       if (! (TYPE_MINIMUM (time_t) <= T[i].t_expected
 146              && T[i].t_expected <= TYPE_MAXIMUM (time_t)))
 147         {
 148           printf ("skipping %s: result is out of range of your time_t\n",
 149                   T[i].in);
 150           continue;
 151         }
 152 
 153       t_exp = T[i].t_expected;
 154 
 155       /* If an input string does not specify the year number, determine
 156          the expected output by calling posixtime with an otherwise
 157          equivalent string that starts with the current year.  */
 158       if (8 <= strlen (T[i].in)
 159           && (T[i].in[8] == '.' || T[i].in[8] == '\0'))
 160         {
 161           char tmp_buf[20];
 162           stpcpy (stpcpy (tmp_buf, curr_year_str), T[i].in);
 163           ASSERT (posixtime (&t_exp, tmp_buf, T[i].syntax_bits));
 164         }
 165 
 166       ok = posixtime (&t_out, T[i].in, T[i].syntax_bits);
 167       if (ok != !!T[i].valid)
 168         {
 169           printf ("%s return value mismatch: got %d, expected %d\n",
 170                   T[i].in, !!ok, T[i].valid);
 171           fail = 1;
 172           continue;
 173         }
 174 
 175       if (!ok)
 176         continue;
 177 
 178       if (t_out != t_exp)
 179         {
 180           printf ("%s mismatch (-: actual; +:expected)\n-%12ld\n+%12ld\n",
 181                   T[i].in, (long) t_out, (long) t_exp);
 182           fail = 1;
 183         }
 184     }
 185 
 186   return fail;
 187 }
 188 
 189 /*
 190 Local Variables:
 191 indent-tabs-mode: nil
 192 End:
 193 */

/* [previous][next][first][last][top][bottom][index][help] */