xref: /illumos-gate/usr/src/test/tz-tests/tests/strftime_18091.c (revision 83cfce2593d5879e6831dd040afbd71e613d50f5)
1*83cfce25SRobert Mustacchi /*
2*83cfce25SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*83cfce25SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*83cfce25SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*83cfce25SRobert Mustacchi  * 1.0 of the CDDL.
6*83cfce25SRobert Mustacchi  *
7*83cfce25SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*83cfce25SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*83cfce25SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*83cfce25SRobert Mustacchi  */
11*83cfce25SRobert Mustacchi 
12*83cfce25SRobert Mustacchi /*
13*83cfce25SRobert Mustacchi  * Copyright 2026 Oxide Computer Company
14*83cfce25SRobert Mustacchi  */
15*83cfce25SRobert Mustacchi 
16*83cfce25SRobert Mustacchi /*
17*83cfce25SRobert Mustacchi  * Regression test for illumos#18091 where the current time has different time
18*83cfce25SRobert Mustacchi  * zone names than a past or future time. Prior to this test strftime would
19*83cfce25SRobert Mustacchi  * report time zone names based on the current time.
20*83cfce25SRobert Mustacchi  */
21*83cfce25SRobert Mustacchi 
22*83cfce25SRobert Mustacchi #include <err.h>
23*83cfce25SRobert Mustacchi #include <stdlib.h>
24*83cfce25SRobert Mustacchi #include <time.h>
25*83cfce25SRobert Mustacchi #include <stdbool.h>
26*83cfce25SRobert Mustacchi #include <string.h>
27*83cfce25SRobert Mustacchi #include <sys/sysmacros.h>
28*83cfce25SRobert Mustacchi 
29*83cfce25SRobert Mustacchi typedef struct st_test {
30*83cfce25SRobert Mustacchi 	const char *st_tz;
31*83cfce25SRobert Mustacchi 	long st_time;
32*83cfce25SRobert Mustacchi 	const char *st_exp;
33*83cfce25SRobert Mustacchi } st_test_t;
34*83cfce25SRobert Mustacchi 
35*83cfce25SRobert Mustacchi const st_test_t st_tests[] = { {
36*83cfce25SRobert Mustacchi 	/*
37*83cfce25SRobert Mustacchi 	 * America/Vancouver moved to MST in tzdata2026b. However, at the time,
38*83cfce25SRobert Mustacchi 	 * the current information would have had it in PST/PDT.
39*83cfce25SRobert Mustacchi 	 */
40*83cfce25SRobert Mustacchi 	.st_tz = "America/Vancouver",
41*83cfce25SRobert Mustacchi 	.st_time = 1798790400,
42*83cfce25SRobert Mustacchi 	.st_exp = "MST"
43*83cfce25SRobert Mustacchi }, {
44*83cfce25SRobert Mustacchi 	.st_tz = "America/Vancouver",
45*83cfce25SRobert Mustacchi 	.st_time = 1777569072,
46*83cfce25SRobert Mustacchi 	.st_exp = "PDT"
47*83cfce25SRobert Mustacchi }, {
48*83cfce25SRobert Mustacchi 	/*
49*83cfce25SRobert Mustacchi 	 * The other way this was originally reported.
50*83cfce25SRobert Mustacchi 	 */
51*83cfce25SRobert Mustacchi 	.st_tz = "Europe/Kyiv",
52*83cfce25SRobert Mustacchi 	.st_time = 500000000,
53*83cfce25SRobert Mustacchi 	.st_exp = "MSK"
54*83cfce25SRobert Mustacchi }, {
55*83cfce25SRobert Mustacchi 	.st_tz = "Europe/Kyiv",
56*83cfce25SRobert Mustacchi 	.st_time = 700000000,
57*83cfce25SRobert Mustacchi 	.st_exp = "EET"
58*83cfce25SRobert Mustacchi } };
59*83cfce25SRobert Mustacchi 
60*83cfce25SRobert Mustacchi static bool
st_test_one(const st_test_t * test)61*83cfce25SRobert Mustacchi st_test_one(const st_test_t *test)
62*83cfce25SRobert Mustacchi {
63*83cfce25SRobert Mustacchi 	struct tm *tm;
64*83cfce25SRobert Mustacchi 	char buf[32];
65*83cfce25SRobert Mustacchi 
66*83cfce25SRobert Mustacchi 	(void) setenv("TZ", test->st_tz, 1);
67*83cfce25SRobert Mustacchi 	tm = localtime(&test->st_time);
68*83cfce25SRobert Mustacchi 	if (tm == NULL) {
69*83cfce25SRobert Mustacchi 		warn("TEST FAILED: %s (%ld): failed to convert to struct tm",
70*83cfce25SRobert Mustacchi 		    test->st_tz, test->st_time);
71*83cfce25SRobert Mustacchi 		return (false);
72*83cfce25SRobert Mustacchi 	}
73*83cfce25SRobert Mustacchi 
74*83cfce25SRobert Mustacchi 	if (strftime(buf, sizeof (buf), "%Z", tm) == 0) {
75*83cfce25SRobert Mustacchi 		warnx("TEST FAILED: %s (%ld): strftime wrote no data",
76*83cfce25SRobert Mustacchi 		    test->st_tz, test->st_time);
77*83cfce25SRobert Mustacchi 		return (false);
78*83cfce25SRobert Mustacchi 	}
79*83cfce25SRobert Mustacchi 
80*83cfce25SRobert Mustacchi 	if (strcmp(buf, test->st_exp) != 0) {
81*83cfce25SRobert Mustacchi 		warnx("TEST FAILED: %s (%ld): tz mismatch: found %s, expected "
82*83cfce25SRobert Mustacchi 		    "%s", test->st_tz, test->st_time, buf, test->st_exp);
83*83cfce25SRobert Mustacchi 		return (false);
84*83cfce25SRobert Mustacchi 	}
85*83cfce25SRobert Mustacchi 
86*83cfce25SRobert Mustacchi 	return (true);
87*83cfce25SRobert Mustacchi }
88*83cfce25SRobert Mustacchi 
89*83cfce25SRobert Mustacchi int
main(void)90*83cfce25SRobert Mustacchi main(void)
91*83cfce25SRobert Mustacchi {
92*83cfce25SRobert Mustacchi 	int ret = EXIT_SUCCESS;
93*83cfce25SRobert Mustacchi 
94*83cfce25SRobert Mustacchi 	for (size_t i = 0; i < ARRAY_SIZE(st_tests); i++) {
95*83cfce25SRobert Mustacchi 		if (!st_test_one(&st_tests[i]))
96*83cfce25SRobert Mustacchi 			ret = EXIT_FAILURE;
97*83cfce25SRobert Mustacchi 	}
98*83cfce25SRobert Mustacchi 
99*83cfce25SRobert Mustacchi 	if (ret == EXIT_SUCCESS) {
100*83cfce25SRobert Mustacchi 		(void) printf("All tests passed successfully!\n");
101*83cfce25SRobert Mustacchi 	}
102*83cfce25SRobert Mustacchi 	return (ret);
103*83cfce25SRobert Mustacchi }
104