test: test parse_timestamp() in various timezone

This commit is contained in:
Yu Watanabe 2023-03-03 12:09:59 +09:00
parent 8677fdc78b
commit d8f3ad627c

View file

@ -628,15 +628,17 @@ TEST(format_timestamp_range) {
}
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 */
@ -681,10 +683,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);
@ -705,9 +706,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);
tzset();
}
if (timezone_is_valid("America/New_York", LOG_DEBUG)) {
@ -731,10 +729,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);
@ -755,9 +752,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);
tzset();
}
/* -06 */
@ -842,6 +836,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;