Fixup gmtime/localtime/mktime tests with all cases

This commit is contained in:
Colin Leroy-Mira
2024-01-10 22:43:49 +01:00
parent 10282a9b74
commit 01ee903cdf
2 changed files with 90 additions and 67 deletions

View File

@@ -4,90 +4,107 @@
int fails = 0; int fails = 0;
time_t timestamps[] = { typedef struct _test_data {
0, time_t t;
0x41eb00, char *gmt;
0x1e7cb00, char *local;
0x21c8700, } test_data;
0x2FFFFFFF,
0x6FFFFFFF,
0xF48656FF,
0xF4865700,
0xFC5A3EFF,
0x6D6739FF,
0x6D673A00,
0xFFFFFFFF,
};
/* Values checked against glibc 2.37's implementation of ctime() */ /* Test data generated using glibc 2.37 */
const char *dates_gmt[] = { test_data data[] = {
"Thu Jan 1 00:00:00 1970\n", /* First year */
"Fri Feb 20 00:00:00 1970\n", {0x00000000, "Thu Jan 1 00:00:00 1970\n", "Thu Jan 1 01:00:00 1970\n"},
"Wed Jan 6 00:00:00 1971\n", {0x004e7970, "Sun Mar 1 12:34:56 1970\n", "Sun Mar 1 13:34:56 1970\n"},
"Mon Feb 15 00:00:00 1971\n", {0x01e1337f, "Thu Dec 31 23:59:59 1970\n", "Fri Jan 1 00:59:59 1971\n"},
"Sun Jul 9 16:12:47 1995\n",
"Wed Jul 18 05:49:51 2029\n",
"Thu Dec 31 23:59:59 2099\n",
"Fri Jan 1 00:00:00 2100\n",
"Fri Feb 29 23:59:59 2104\n",
"Tue Feb 29 23:59:59 2028\n",
"Wed Mar 1 00:00:00 2028\n",
"Sun Feb 7 06:28:15 2106\n",
NULL
};
const char *dates_gmt_plus_one[] = { /* First leap year */
"Thu Jan 1 01:00:00 1970\n", {0x03c26700, "Sat Jan 1 00:00:00 1972\n", "Sat Jan 1 01:00:00 1972\n"},
"Fri Feb 20 01:00:00 1970\n", {0x03c8fe7f, "Wed Jan 5 23:59:59 1972\n", "Thu Jan 6 00:59:59 1972\n"},
"Wed Jan 6 01:00:00 1971\n", {0x041180ff, "Tue Feb 29 23:59:59 1972\n", "Wed Mar 1 00:59:59 1972\n"},
"Mon Feb 15 01:00:00 1971\n", {0x04118100, "Wed Mar 1 00:00:00 1972\n", "Wed Mar 1 01:00:00 1972\n"},
"Sun Jul 9 17:12:47 1995\n", {0x05a4ebff, "Sun Dec 31 23:59:59 1972\n", "Mon Jan 1 00:59:59 1973\n"},
"Wed Jul 18 06:49:51 2029\n",
"Fri Jan 1 00:59:59 2100\n", /* A non-leap year */
"Fri Jan 1 01:00:00 2100\n", {0x63b0cd00, "Sun Jan 1 00:00:00 2023\n", "Sun Jan 1 01:00:00 2023\n"},
"Sat Mar 1 00:59:59 2104\n", {0x63fe957f, "Tue Feb 28 23:59:59 2023\n", "Wed Mar 1 00:59:59 2023\n"},
"Wed Mar 1 00:59:59 2028\n", {0x63fe9580, "Wed Mar 1 00:00:00 2023\n", "Wed Mar 1 01:00:00 2023\n"},
"Wed Mar 1 01:00:00 2028\n", {0x656d4ec0, "Mon Dec 4 04:00:00 2023\n", "Mon Dec 4 05:00:00 2023\n"},
"Thu Jan 1 00:59:59 1970\n", {0x6592007f, "Sun Dec 31 23:59:59 2023\n", "Mon Jan 1 00:59:59 2024\n"},
NULL
/* Another leap year */
{0x65920080, "Mon Jan 1 00:00:00 2024\n", "Mon Jan 1 01:00:00 2024\n"},
{0x65e11a7f, "Thu Feb 29 23:59:59 2024\n", "Fri Mar 1 00:59:59 2024\n"},
{0x65e11a80, "Fri Mar 1 00:00:00 2024\n", "Fri Mar 1 01:00:00 2024\n"},
{0x6774857f, "Tue Dec 31 23:59:59 2024\n", "Wed Jan 1 00:59:59 2025\n"},
/* End of century */
{0xf48656ff, "Thu Dec 31 23:59:59 2099\n", "Fri Jan 1 00:59:59 2100\n"},
/* A non-leap year for exceptional reasons */
{0xf4865700, "Fri Jan 1 00:00:00 2100\n", "Fri Jan 1 01:00:00 2100\n"},
{0xf4d41f7f, "Sun Feb 28 23:59:59 2100\n", "Mon Mar 1 00:59:59 2100\n"},
{0xf4d41f80, "Mon Mar 1 00:00:00 2100\n", "Mon Mar 1 01:00:00 2100\n"},
{0xf4fceff0, "Wed Mar 31 23:00:00 2100\n", "Thu Apr 1 00:00:00 2100\n"},
{0xf6678a7f, "Fri Dec 31 23:59:59 2100\n", "Sat Jan 1 00:59:59 2101\n"},
/* First post-2100 leap year */
{0xfc0b2500, "Tue Jan 1 00:00:00 2104\n", "Tue Jan 1 01:00:00 2104\n"},
{0xfc5a3eff, "Fri Feb 29 23:59:59 2104\n", "Sat Mar 1 00:59:59 2104\n"},
{0xfc5a3f00, "Sat Mar 1 00:00:00 2104\n", "Sat Mar 1 01:00:00 2104\n"},
{0xfcaa9c70, "Wed Apr 30 23:00:00 2104\n", "Thu May 1 00:00:00 2104\n"},
/* End of epoch */
{0xfdedaa00, "Thu Jan 1 00:00:00 2105\n", "Thu Jan 1 01:00:00 2105\n"},
{0xffffffff, "Sun Feb 7 06:28:15 2106\n", "Thu Jan 1 00:59:59 1970\n"}
}; };
int main (void) int main (void)
{ {
int i; int i;
struct tm *tm;
char *str;
for (i = 0; dates_gmt[i] != NULL; i++) { tm = gmtime(NULL);
struct tm *tm; if (tm != NULL) {
char *str; printf("gmtime should return NULL with a NULL parameter\n");
fails++;
}
/* Check gmtime */ tm = localtime(NULL);
tm = gmtime(&timestamps[i]); if (tm != NULL) {
printf("localtime should return NULL with a NULL parameter\n");
fails++;
}
/* Verify conversion both ways */
for (i = 0; ; i++) {
time_t t = data[i].t;
tm = gmtime(&t);
str = asctime(tm); str = asctime(tm);
if (strcmp(str, dates_gmt[i])) { if (strcmp(data[i].gmt, str)) {
printf("0x%lx: gmtime: unexpected result: expected %s, got %s\n", t, data[i].gmt, str);
fails++; fails++;
printf("gmtime: Unexpected result for t %lx: Expected \"%s\", got \"%s\"\n",
timestamps[i], dates_gmt[i], str);
} }
/* Check localtime with UTC timezone */
_tz.timezone = 0; _tz.timezone = 0;
tm = localtime(&timestamps[i]); tm = localtime(&t);
str = asctime(tm); str = asctime(tm);
if (strcmp(str, dates_gmt[i])) { if (strcmp(data[i].gmt, str)) {
printf("0x%lx: localtime (UTC+0): unexpected result: expected %s, got %s\n", t, data[i].gmt, str);
fails++; fails++;
printf("localtime: Unexpected result for t %lx: Expected \"%s\", got \"%s\"\n",
timestamps[i], dates_gmt[i], str);
} }
// /* Check localtime at UTC+1 */ _tz.timezone = 3600;
// _tz.timezone = 3600; tm = localtime(&t);
// tm = localtime(&timestamps[i]); str = asctime(tm);
// str = asctime(tm); if (strcmp(data[i].local, str)) {
// if (strcmp(str, dates_gmt_plus_one[i])) { printf("0x%lx: localtime (UTC+1): unexpected result: expected %s, got %s\n", t, data[i].local, str);
// fails++; fails++;
// printf("localtime: Unexpected result for t %lx: Expected \"%s\", got \"%s\"\n", }
// timestamps[i], dates_gmt_plus_one[i], str);
// } if (t == 0xFFFFFFFF)
break;
} }
return fails; return fails;
} }

View File

@@ -75,6 +75,11 @@ int main (void)
{ {
int i; int i;
if (mktime(NULL) != (time_t)-1) {
printf("mktime should return -1 with a NULL parameter\n");
fails++;
}
/* Verify conversion both ways */ /* Verify conversion both ways */
for (i = 0; ; i++) { for (i = 0; ; i++) {
time_t t = data[i].t; time_t t = data[i].t;
@@ -91,6 +96,7 @@ int main (void)
} }
if (strcmp(data[i].str, ctime(&t))) { if (strcmp(data[i].str, ctime(&t))) {
printf("0x%lx: unexpected ctime result: expected %s, got %s", t, data[i].str, ctime(&t)); printf("0x%lx: unexpected ctime result: expected %s, got %s", t, data[i].str, ctime(&t));
fails++;
} }
if (t == 0xFFFFFFFF) if (t == 0xFFFFFFFF)