]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test-time-util: do not fail on DST change 26772/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 12 Mar 2023 18:47:45 +0000 (03:47 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 12 Mar 2023 19:43:51 +0000 (04:43 +0900)
src/test/test-time-util.c

index e5a4cb65154f401e7016139d1fc8a8475fd54bcc..e0386d4ec585b5ae8a12f209066d033a252da5b1 100644 (file)
@@ -636,12 +636,30 @@ static void test_parse_timestamp_one(const char *str, usec_t max_diff, usec_t ex
         int r;
 
         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);
+        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);
 }
 
+static bool time_is_zero(usec_t usec) {
+        const char *s;
+
+        s = FORMAT_TIMESTAMP(usec);
+        return strstr(s, " 00:00:00 ");
+}
+
+static bool timezone_equal(usec_t today, usec_t target) {
+        const char *s, *t, *sz, *tz;
+
+        s = FORMAT_TIMESTAMP(today);
+        t = FORMAT_TIMESTAMP(target);
+        assert_se(sz = strrchr(s, ' '));
+        assert_se(tz = strrchr(t, ' '));
+        log_debug("%s("USEC_FMT", "USEC_FMT") -> %s, %s", __func__, today, target, s, t);
+        return streq(sz, tz);
+}
+
 static void test_parse_timestamp_impl(const char *tz) {
         usec_t today, now_usec;
 
@@ -823,12 +841,17 @@ static void test_parse_timestamp_impl(const char *tz) {
 
         /* without date */
         assert_se(parse_timestamp("today", &today) == 0);
-        test_parse_timestamp_one("00:01", 0, today + USEC_PER_MINUTE);
-        test_parse_timestamp_one("00:00:01", 0, today + USEC_PER_SEC);
-        test_parse_timestamp_one("00:00:01.001", 0, today + USEC_PER_SEC + 1000);
-        test_parse_timestamp_one("00:00:01.0010", 0, today + USEC_PER_SEC + 1000);
-        test_parse_timestamp_one("tomorrow", 0, today + USEC_PER_DAY);
-        test_parse_timestamp_one("yesterday", 0, today - USEC_PER_DAY);
+        if (time_is_zero(today)) {
+                test_parse_timestamp_one("00:01", 0, today + USEC_PER_MINUTE);
+                test_parse_timestamp_one("00:00:01", 0, today + USEC_PER_SEC);
+                test_parse_timestamp_one("00:00:01.001", 0, today + USEC_PER_SEC + 1000);
+                test_parse_timestamp_one("00:00:01.0010", 0, today + USEC_PER_SEC + 1000);
+
+                if (timezone_equal(today, today + USEC_PER_DAY) && time_is_zero(today + USEC_PER_DAY))
+                        test_parse_timestamp_one("tomorrow", 0, today + USEC_PER_DAY);
+                if (timezone_equal(today, today - USEC_PER_DAY) && time_is_zero(today - USEC_PER_DAY))
+                        test_parse_timestamp_one("yesterday", 0, today - USEC_PER_DAY);
+        }
 
         /* relative */
         assert_se(parse_timestamp("now", &now_usec) == 0);