X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-parse-datetime.c;h=7eba9ad7337749636b6cd6d3d673ccee0d55639a;hb=790fade563cb6461d9f2b78775e8bd53e66a2566;hp=b9d08a63f513f0a65efa11002a9533d53bdb273a;hpb=8bfd590069540f3fa8500bb496502ad675fdc148;p=gnulib.git diff --git a/tests/test-parse-datetime.c b/tests/test-parse-datetime.c index b9d08a63f..7eba9ad73 100644 --- a/tests/test-parse-datetime.c +++ b/tests/test-parse-datetime.c @@ -1,5 +1,5 @@ /* Test of parse_datetime() function. - Copyright (C) 2008-2011 Free Software Foundation, Inc. + Copyright (C) 2008-2013 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -12,8 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program; if not, see . */ /* Written by Simon Josefsson , 2008. */ @@ -30,7 +29,7 @@ #ifdef DEBUG #define LOG(str, now, res) \ - printf ("string `%s' diff %d %d\n", \ + printf ("string '%s' diff %d %d\n", \ str, res.tv_sec - now.tv_sec, res.tv_nsec - now.tv_nsec); #else #define LOG(str, now, res) (void) 0 @@ -94,20 +93,17 @@ tm_diff (struct tm const *a, struct tm const *b) #endif /* ! HAVE_TM_GMTOFF */ static long -gmt_offset () +gmt_offset (time_t s) { - time_t now; long gmtoff; - time (&now); - #if !HAVE_TM_GMTOFF - struct tm tm_local = *localtime (&now); - struct tm tm_gmt = *gmtime (&now); + struct tm tm_local = *localtime (&s); + struct tm tm_gmt = *gmtime (&s); gmtoff = tm_diff (&tm_local, &tm_gmt); #else - gmtoff = localtime (&now)->tm_gmtoff; + gmtoff = localtime (&s)->tm_gmtoff; #endif return gmtoff; @@ -123,16 +119,23 @@ main (int argc _GL_UNUSED, char **argv) const char *p; int i; long gmtoff; + time_t ref_time = 1304250918; set_program_name (argv[0]); - gmtoff = gmt_offset (); + /* Set the time zone to US Eastern time with the 2012 rules. This + should disable any leap second support. Otherwise, there will be + a problem with glibc on sites that default to leap seconds; see + . */ + setenv ("TZ", "EST5EDT,M3.2.0,M11.1.0", 1); + + gmtoff = gmt_offset (ref_time); /* ISO 8601 extended date and time of day representation, 'T' separator, local time zone */ p = "2011-05-01T11:55:18"; - expected.tv_sec = 1304250918 - gmtoff; + expected.tv_sec = ref_time - gmtoff; expected.tv_nsec = 0; ASSERT (parse_datetime (&result, p, 0)); LOG (p, expected, result); @@ -142,7 +145,7 @@ main (int argc _GL_UNUSED, char **argv) /* ISO 8601 extended date and time of day representation, ' ' separator, local time zone */ p = "2011-05-01 11:55:18"; - expected.tv_sec = 1304250918 - gmtoff; + expected.tv_sec = ref_time - gmtoff; expected.tv_nsec = 0; ASSERT (parse_datetime (&result, p, 0)); LOG (p, expected, result); @@ -153,7 +156,7 @@ main (int argc _GL_UNUSED, char **argv) /* ISO 8601, extended date and time of day representation, 'T' separator, UTC */ p = "2011-05-01T11:55:18Z"; - expected.tv_sec = 1304250918; + expected.tv_sec = ref_time; expected.tv_nsec = 0; ASSERT (parse_datetime (&result, p, 0)); LOG (p, expected, result); @@ -163,7 +166,7 @@ main (int argc _GL_UNUSED, char **argv) /* ISO 8601, extended date and time of day representation, ' ' separator, UTC */ p = "2011-05-01 11:55:18Z"; - expected.tv_sec = 1304250918; + expected.tv_sec = ref_time; expected.tv_nsec = 0; ASSERT (parse_datetime (&result, p, 0)); LOG (p, expected, result); @@ -412,5 +415,9 @@ main (int argc _GL_UNUSED, char **argv) ASSERT (result.tv_sec == 24 * 3600 && result.tv_nsec == now.tv_nsec); + /* Exercise a sign-extension bug. Before July 2012, an input + starting with a high-bit-set byte would be treated like "0". */ + ASSERT ( ! parse_datetime (&result, "\xb0", &now)); + return 0; }