commit 6f398a9c2a1945a198d8d87bba69926069392075
parent 56f71b43eec528d053af918f5ac199b5c38c7811
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Mon, 27 Apr 2026 16:53:01 +0200
tests/libc: Add 0072-mktime
Diffstat:
3 files changed, 247 insertions(+), 0 deletions(-)
diff --git a/tests/libc/execute/.gitignore b/tests/libc/execute/.gitignore
@@ -70,3 +70,4 @@ test.log
0069-mktime
0070-difftime
0071-clock
+0072-mktime
diff --git a/tests/libc/execute/0072-mktime.c b/tests/libc/execute/0072-mktime.c
@@ -0,0 +1,245 @@
+/*
+output:
+testing
+test 0
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 11:30:59 2020 UTC
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 12:30:59 2020
+Wed Dec 30 12:30:59 2020
+test 1
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 13:30:59 2020 UTC
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 12:30:59 2020
+Wed Dec 30 12:30:59 2020
+test 2
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 11:30:59 2020 UTC
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 12:30:59 2020
+Wed Dec 30 12:30:59 2020
+test 3
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 13:30:59 2020 UTC
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 12:30:59 2020
+Wed Dec 30 12:30:59 2020
+test 4
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=30, tm_mon=11, tm_year= 120, tm_wday=3, tm_yday=364, tm_isdst=0
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 14:00:59 2020 UTC
+Wed Dec 30 12:30:59 2020 CET
+Wed Dec 30 12:30:59 2020
+Wed Dec 30 12:30:59 2020
+test 5
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=0
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 13:30:59 2021 UTC
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 12:30:59 2021
+Thu Jan 28 12:30:59 2021
+test 6
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=0
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 13:30:59 2021 UTC
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 12:30:59 2021
+Thu Jan 28 12:30:59 2021
+test 7
+tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=1
+Wed Jan 6 13:30:59 2021 CEST
+Wed Jan 6 13:30:59 2021 UTC
+Wed Jan 6 13:30:59 2021 CEST
+Wed Jan 6 13:30:59 2021
+Wed Jan 6 13:30:59 2021
+test 8
+tm_sec=59, tm_min=30, tm_hour=10, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=1
+Wed Jan 6 10:30:59 2021 CEST
+Wed Jan 6 13:30:59 2021 UTC
+Wed Jan 6 10:30:59 2021 CEST
+Wed Jan 6 10:30:59 2021
+Wed Jan 6 10:30:59 2021
+test 9
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=28, tm_mon= 0, tm_year= 121, tm_wday=4, tm_yday= 27, tm_isdst=0
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 13:30:59 2021 UTC
+Thu Jan 28 12:30:59 2021 CET
+Thu Jan 28 12:30:59 2021
+Thu Jan 28 12:30:59 2021
+test 10
+tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 6, tm_mon= 0, tm_year= 121, tm_wday=3, tm_yday= 5, tm_isdst=1
+Wed Jan 6 13:30:59 2021 CEST
+Wed Jan 6 13:30:59 2021 UTC
+Wed Jan 6 13:30:59 2021 CEST
+Wed Jan 6 13:30:59 2021
+Wed Jan 6 13:30:59 2021
+test 11
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday= 8, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 7, tm_isdst=0
+Fri Jan 8 12:30:59 2021 CET
+Fri Jan 8 13:30:59 2021 UTC
+Fri Jan 8 12:30:59 2021 CET
+Fri Jan 8 12:30:59 2021
+Fri Jan 8 12:30:59 2021
+test 12
+tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 8, tm_mon= 0, tm_year= 121, tm_wday=5, tm_yday= 7, tm_isdst=1
+Fri Jan 8 13:30:59 2021 CEST
+Fri Jan 8 13:30:59 2021 UTC
+Fri Jan 8 13:30:59 2021 CEST
+Fri Jan 8 13:30:59 2021
+Fri Jan 8 13:30:59 2021
+test 13
+tm_sec=59, tm_min=30, tm_hour=12, tm_mday=29, tm_mon= 1, tm_year= 124, tm_wday=4, tm_yday= 59, tm_isdst=0
+Thu Feb 29 12:30:59 2024 CET
+Thu Feb 29 13:30:59 2024 UTC
+Thu Feb 29 12:30:59 2024 CET
+Thu Feb 29 12:30:59 2024
+Thu Feb 29 12:30:59 2024
+test 14
+tm_sec=59, tm_min=30, tm_hour=13, tm_mday= 1, tm_mon= 2, tm_year= 124, tm_wday=5, tm_yday= 60, tm_isdst=1
+Fri Mar 1 13:30:59 2024 CEST
+Fri Mar 1 13:30:59 2024 UTC
+Fri Mar 1 13:30:59 2024 CEST
+Fri Mar 1 13:30:59 2024
+Fri Mar 1 13:30:59 2024
+test 15
+tm_sec=59, tm_min=30, tm_hour= 2, tm_mday= 4, tm_mon= 0, tm_year= 121, tm_wday=1, tm_yday= 3, tm_isdst=0
+Mon Jan 4 02:30:59 2021 CET
+Mon Jan 4 03:30:59 2021 UTC
+Mon Jan 4 02:30:59 2021 CET
+Mon Jan 4 02:30:59 2021
+Mon Jan 4 02:30:59 2021
+done
+end:
+*/
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#define NELEM(x) (sizeof(x)/sizeof((x)[0]))
+
+struct test {
+ struct tm tm;
+ char *tz;
+} tests[] = {
+ //sec,min,hour,mday,mon,year,wday,yday,isdst,tz,
+ {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-1"},
+ {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01"},
+ {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET-01"},
+ {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:00"},
+ {{ 59, 30, 12, 30, -1, 121, 0, 0, 0},"CET01:30"},
+ {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST3"},
+ {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,4,8"},
+ {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,4,8"},
+ {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST3,4,8"},
+ {{ 59, 30, 12, 28, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},
+ {{ 59, 30, 12, 6, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},
+ {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,J8"},
+ {{ 59, 30, 12, 8, 0, 121, 0, 0, 0},"CET01CEST,J4,8"},
+ {{ 59, 30, 12, 29, 1, 124, 0, 0, 0},"CET01CEST,J60,J80"},
+ {{ 59, 30, 12, 1, 2, 124, 0, 0, 0},"CET01CEST,J60,J80"},
+ {{ 59, 30, 2, 4, 0, 121, 0, 0, 0},"CET01CEST,J4/03,8/4"},
+};
+
+char *faketz;
+
+#ifndef __unix__
+#define putenv(x) (x)
+/*
+ * Ok, this is by definition undefined behaviour because
+ * we are using the name of a library function. The reallity
+ * is that if you use a static linker then this would
+ * overload the libc getenv and it will work as expected,
+ * but if you use a dynamic linker then the internal
+ * references will be tied to the internal getenv function
+ * and this would not work. For our main use case that is
+ * testing scc libc this is good enough, and with the
+ * fallback to putenv and unsetenv this will work in
+ * the systems we are interested on
+ */
+char *
+getenv(const char *name)
+{
+ if (strcmp(name, "TZ") != 0)
+ return NULL;
+ return faketz;
+}
+#endif
+
+int
+test(void)
+{
+ time_t t;
+ char buf[70], var[70], *tz;
+ struct tm *tm;
+ struct test *tp;
+
+ for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) {
+ printf("test %d\n", (int) (tp - tests));
+ tz = tp->tz;
+ if (!tz)
+ tz = "UTC";
+ faketz = tz;
+ sprintf(var, "TZ=%s", tz);
+ putenv(var);
+
+ t = mktime(&tp->tm);
+ if (t == -1) {
+ puts("failed");
+ continue;
+ }
+ printf("tm_sec=%2d, "
+ "tm_min=%2d, "
+ "tm_hour=%2d, "
+ "tm_mday=%2d, "
+ "tm_mon=%2d, "
+ "tm_year=%4d, "
+ "tm_wday=%d, "
+ "tm_yday=%3d, "
+ "tm_isdst=%d\n",
+ tp->tm.tm_sec,
+ tp->tm.tm_min,
+ tp->tm.tm_hour,
+ tp->tm.tm_mday,
+ tp->tm.tm_mon,
+ tp->tm.tm_year,
+ tp->tm.tm_wday,
+ tp->tm.tm_yday,
+ tp->tm.tm_isdst);
+ strftime(buf, sizeof(buf), "%c %Z", &tp->tm);
+ puts(buf);
+
+ tm = gmtime(&t);
+ strftime(buf, sizeof(buf), "%c %Z", tm);
+ puts(buf);
+
+ tm = localtime(&t);
+ strftime(buf, sizeof(buf), "%c %Z", tm);
+ puts(buf);
+
+ fputs(asctime(tm), stdout);
+ fputs(ctime(&t), stdout);
+ }
+
+ return 0;
+}
+
+int
+main(void)
+{
+#if !defined(__unix__) && !defined(__SCC_TZ_TIME__)
+ puts("RESULT: SKIP");
+ return 0;
+#endif
+ puts("testing");
+ test();
+ puts("done");
+ return 0;
+}
diff --git a/tests/libc/execute/libc-tests.lst b/tests/libc/execute/libc-tests.lst
@@ -68,3 +68,4 @@
0069-mktime
0070-difftime
0071-clock
+0072-mktime