From 9010f2b16067fbe974cd1922b596bcd526de07bc Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 3 Mar 2023 12:09:59 +0900 Subject: [PATCH] test: test parse_timestamp() in various timezone (cherry picked from commit d8f3ad627c9a857d46d442f8ab722c1efab30d5c) Related: RHEL-109488 --- src/test/test-time-util.c | 57 +++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/test/test-time-util.c b/src/test/test-time-util.c index f2acb6159a..ee861135c2 100644 --- a/src/test/test-time-util.c +++ b/src/test/test-time-util.c @@ -567,15 +567,17 @@ TEST(format_timestamp_utc) { } static void test_parse_timestamp_one(const char *str, usec_t max_diff, usec_t expected) { - usec_t usec; + usec_t usec = USEC_INFINITY; + int r; - log_debug("/* %s(%s) */", __func__, str); - assert_se(parse_timestamp(str, &usec) >= 0); + r = parse_timestamp(str, &usec); + log_debug("/* %s(%s): max_diff="USEC_FMT", expected="USEC_FMT", result="USEC_FMT"*/", __func__, str, max_diff, expected, usec); + assert_se(r >= 0); assert_se(usec >= expected); assert_se(usec_sub_unsigned(usec, expected) <= max_diff); } -TEST(parse_timestamp) { +static void test_parse_timestamp_impl(const char *tz) { usec_t today, now_usec; /* UTC */ @@ -620,10 +622,9 @@ TEST(parse_timestamp) { test_parse_timestamp_one("70-01-01 09:00:01 Asia/Tokyo", 0, USEC_PER_SEC); test_parse_timestamp_one("70-01-01 09:00:01.001 Asia/Tokyo", 0, USEC_PER_SEC + 1000); test_parse_timestamp_one("70-01-01 09:00:01.0010 Asia/Tokyo", 0, USEC_PER_SEC + 1000); + } - const char *saved_tz = getenv("TZ"); - assert_se(setenv("TZ", ":Asia/Tokyo", 1) >= 0); - + if (streq_ptr(tz, "Asia/Tokyo")) { /* JST (+0900) */ test_parse_timestamp_one("Thu 1970-01-01 09:01 JST", 0, USEC_PER_MINUTE); test_parse_timestamp_one("Thu 1970-01-01 09:00:01 JST", 0, USEC_PER_SEC); @@ -644,8 +645,6 @@ TEST(parse_timestamp) { test_parse_timestamp_one("70-01-01 09:00:01 JST", 0, USEC_PER_SEC); test_parse_timestamp_one("70-01-01 09:00:01.001 JST", 0, USEC_PER_SEC + 1000); test_parse_timestamp_one("70-01-01 09:00:01.0010 JST", 0, USEC_PER_SEC + 1000); - - assert_se(set_unset_env("TZ", saved_tz, true) == 0); } if (timezone_is_valid("America/New_York", LOG_DEBUG)) { @@ -669,10 +668,9 @@ TEST(parse_timestamp) { test_parse_timestamp_one("69-12-31 19:00:01 America/New_York", 0, USEC_PER_SEC); test_parse_timestamp_one("69-12-31 19:00:01.001 America/New_York", 0, USEC_PER_SEC + 1000); test_parse_timestamp_one("69-12-31 19:00:01.0010 America/New_York", 0, USEC_PER_SEC + 1000); + } - const char *saved_tz = getenv("TZ"); - assert_se(setenv("TZ", ":America/New_York", 1) >= 0); - + if (streq_ptr(tz, "America/New_York")) { /* EST (-0500) */ test_parse_timestamp_one("Wed 1969-12-31 19:01 EST", 0, USEC_PER_MINUTE); test_parse_timestamp_one("Wed 1969-12-31 19:00:01 EST", 0, USEC_PER_SEC); @@ -693,8 +691,6 @@ TEST(parse_timestamp) { test_parse_timestamp_one("69-12-31 19:00:01 EST", 0, USEC_PER_SEC); test_parse_timestamp_one("69-12-31 19:00:01.001 EST", 0, USEC_PER_SEC + 1000); test_parse_timestamp_one("69-12-31 19:00:01.0010 EST", 0, USEC_PER_SEC + 1000); - - assert_se(set_unset_env("TZ", saved_tz, true) == 0); } #if 0 @@ -781,6 +777,39 @@ TEST(parse_timestamp) { test_parse_timestamp_one("30minutes ago", USEC_PER_MINUTE, now_usec - 30 * USEC_PER_MINUTE); } +TEST(parse_timestamp) { + test_parse_timestamp_impl(NULL); +} + +static void test_parse_timestamp_with_tz_one(const char *tz) { + const char *saved_tz, *colon_tz; + + if (!timezone_is_valid(tz, LOG_DEBUG)) + return; + + log_info("/* %s(%s) */", __func__, tz); + + saved_tz = getenv("TZ"); + + assert_se(colon_tz = strjoina(":", tz)); + assert_se(setenv("TZ", colon_tz, 1) >= 0); + tzset(); + log_debug("%s: tzname[0]=%s, tzname[1]=%s", tz, strempty(tzname[0]), strempty(tzname[1])); + + test_parse_timestamp_impl(tz); + + assert_se(set_unset_env("TZ", saved_tz, true) == 0); + tzset(); +} + +TEST(parse_timestamp_with_tz) { + _cleanup_strv_free_ char **timezones = NULL; + + assert_se(get_timezones(&timezones) >= 0); + STRV_FOREACH(tz, timezones) + test_parse_timestamp_with_tz_one(*tz); +} + TEST(deserialize_dual_timestamp) { int r; dual_timestamp t;