1 /* Test that openat_safer leave standard fds alone.
2 Copyright (C) 2009 Free Software Foundation, Inc.
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.
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.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 /* Written by Jim Meyering. */
28 #define STREQ(a, b) (strcmp (a, b) == 0)
30 #define ASSERT(expr) \
35 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
45 unsigned int syntax_bits;
49 /* Test mainly with syntax_bits == 13
50 (aka: (PDS_LEADING_YEAR | PDS_CENTURY | PDS_SECONDS)) */
52 static struct posixtm_test T[] =
54 { "12131415.16", 13, " 1039788916 Fri Dec 13 14:15:16 2002" },
55 { "12131415.16", 13, " 1039788916 Fri Dec 13 14:15:16 2002" },
56 { "000001010000.00", 13, "-62167132800 Sun Jan 1 00:00:00 0000" },
57 { "190112132045.52", 13, " -2147483648 Fri Dec 13 20:45:52 1901" },
58 { "190112132045.53", 13, " -2147483647 Fri Dec 13 20:45:53 1901" },
59 { "190112132046.52", 13, " -2147483588 Fri Dec 13 20:46:52 1901" },
60 { "190112132145.52", 13, " -2147480048 Fri Dec 13 21:45:52 1901" },
61 { "190112142045.52", 13, " -2147397248 Sat Dec 14 20:45:52 1901" },
62 { "190201132045.52", 13, " -2144805248 Mon Jan 13 20:45:52 1902" },
63 { "196912312359.59", 13, " -1 Wed Dec 31 23:59:59 1969" },
64 { "197001010000.00", 13, " 0 Thu Jan 1 00:00:00 1970" },
65 { "197001010000.01", 13, " 1 Thu Jan 1 00:00:01 1970" },
66 { "197001010001.00", 13, " 60 Thu Jan 1 00:01:00 1970" },
67 { "197001010000.60", 13, " 60 Thu Jan 1 00:01:00 1970" },
68 { "197001010100.00", 13, " 3600 Thu Jan 1 01:00:00 1970" },
69 { "197001020000.00", 13, " 86400 Fri Jan 2 00:00:00 1970" },
70 { "197002010000.00", 13, " 2678400 Sun Feb 1 00:00:00 1970" },
71 { "197101010000.00", 13, " 31536000 Fri Jan 1 00:00:00 1971" },
72 { "197001000000.00", 13, " * *" },
73 { "197000010000.00", 13, " * *" },
74 { "197001010060.00", 13, " * *" },
75 { "197001012400.00", 13, " * *" },
76 { "197001320000.00", 13, " * *" },
77 { "197013010000.00", 13, " * *" },
78 { "203801190314.06", 13, " 2147483646 Tue Jan 19 03:14:06 2038" },
79 { "203801190314.07", 13, " 2147483647 Tue Jan 19 03:14:07 2038" },
80 { "203801190314.08", 13, " 2147483648 Tue Jan 19 03:14:08 2038" },
81 { "999912312359.59", 13, "253402300799 Fri Dec 31 23:59:59 9999" },
82 { "1112131415", 13, " 1323785700 Tue Dec 13 14:15:00 2011" },
83 { "1112131415.16", 13, " 1323785716 Tue Dec 13 14:15:16 2011" },
84 { "201112131415.16", 13, " 1323785716 Tue Dec 13 14:15:16 2011" },
85 { "191112131415.16", 13, " -1831974284 Wed Dec 13 14:15:16 1911" },
86 { "203712131415.16", 13, " 2144326516 Sun Dec 13 14:15:16 2037" },
87 { "3712131415.16", 13, " 2144326516 Sun Dec 13 14:15:16 2037" },
88 { "6812131415.16", 13, " 3122633716 Thu Dec 13 14:15:16 2068" },
89 { "6912131415.16", 13, " -1590284 Sat Dec 13 14:15:16 1969" },
90 { "7012131415.16", 13, " 29945716 Sun Dec 13 14:15:16 1970" },
91 { "1213141599", 2, " 945094500 Mon Dec 13 14:15:00 1999" },
92 { "1213141500", 2, " 976716900 Wed Dec 13 14:15:00 2000" },
101 char curr_year_str[30];
107 /* The above test data requires Universal Time, e.g., TZ="UTC0". */
108 err = setenv ("TZ", "UTC0", 1);
112 ASSERT (t_now != (time_t) -1);
113 tm = localtime (&t_now);
115 n_bytes = strftime (curr_year_str, sizeof curr_year_str, "%Y", tm);
116 ASSERT (0 < n_bytes);
118 /* This test data also assumes that time_t is signed and is at least
119 39 bits wide, so that it can represent all years from 0000 through
120 9999. A host with 32-bit signed time_t can represent only time
121 stamps in the range 1901-12-13 20:45:52 through 2038-01-18
122 03:14:07 UTC, assuming POSIX time_t with no leap seconds, so test
123 cases outside this range will not work on such a host. */
124 if ( ! TYPE_SIGNED (time_t))
126 fprintf (stderr, "%s: this test requires signed time_t\n");
130 if (sizeof (time_t) * CHAR_BIT < 39)
132 fprintf (stderr, "%s: this test requires time_t at least 39 bits wide\n");
137 for (i = 0; T[i].in; i++)
142 /* The first two tests assume that the current year is 2002.
143 If an input string does not specify the year number, and
144 the expected output year is not the same as the current year,
145 then skip the test. For example:
146 { "12131415.16", " 1039788916 Fri Dec 13 14:15:16 2002" }, */
147 if (8 <= strlen (T[i].in)
148 && (T[i].in[8] == '.' || T[i].in[8] == '\0')
149 && 4 < strlen (T[i].expected)
150 && ! STREQ (T[i].expected + (strlen (T[i].expected) - 4),
154 if (posixtime (&t, T[i].in, T[i].syntax_bits))
155 sprintf (out_buf, "%12ld %s", (long int) t, ctime (&t));
157 sprintf (out_buf, "%12s %s", "*", "*\n");
159 out_buf[strlen (out_buf) - 1] = '\0';
160 if (!STREQ (out_buf, T[i].expected))
162 printf ("mismatch (-: actual; +:expected)\n-%s\n+%s\n",
163 out_buf, T[i].expected);
173 indent-tabs-mode: nil