Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */ 2 : : 3 : : #include <string.h> 4 : : 5 : : #include "alloc-util.h" 6 : : #include "string-util.h" 7 : : #include "tests.h" 8 : : #include "time-util.h" 9 : : 10 : 148 : static void test_should_pass(const char *p) { 11 : : usec_t t, q; 12 : : char buf[FORMAT_TIMESTAMP_MAX], buf_relative[FORMAT_TIMESTAMP_RELATIVE_MAX]; 13 : : 14 [ + - ]: 148 : log_info("Test: %s", p); 15 [ - + ]: 148 : assert_se(parse_timestamp(p, &t) >= 0); 16 [ - + ]: 148 : assert_se(format_timestamp_us(buf, sizeof(buf), t)); 17 [ + - ]: 148 : log_info("\"%s\" → \"%s\"", p, buf); 18 : : 19 [ - + ]: 148 : assert_se(parse_timestamp(buf, &q) >= 0); 20 [ - + ]: 148 : if (q != t) { 21 : : char tmp[FORMAT_TIMESTAMP_MAX]; 22 : : 23 [ # # ]: 0 : log_error("round-trip failed: \"%s\" → \"%s\"", 24 : : buf, format_timestamp_us(tmp, sizeof(tmp), q)); 25 : : } 26 [ - + ]: 148 : assert_se(q == t); 27 : : 28 [ - + ]: 148 : assert_se(format_timestamp_relative(buf_relative, sizeof(buf_relative), t)); 29 [ + - ]: 148 : log_info("%s", strna(buf_relative)); 30 : 148 : } 31 : : 32 : 4 : static void test_should_parse(const char *p) { 33 : : usec_t t; 34 : : 35 [ + - ]: 4 : log_info("Test: %s", p); 36 [ - + ]: 4 : assert_se(parse_timestamp(p, &t) >= 0); 37 [ + - ]: 4 : log_info("\"%s\" → \"@%" PRI_USEC "\"", p, t); 38 : 4 : } 39 : : 40 : 68 : static void test_should_fail(const char *p) { 41 : : usec_t t; 42 : : int r; 43 : : 44 [ + - ]: 68 : log_info("Test: %s", p); 45 : 68 : r = parse_timestamp(p, &t); 46 [ - + ]: 68 : if (r >= 0) 47 [ # # ]: 0 : log_info("\"%s\" → \"@%" PRI_USEC "\" (unexpected)", p, t); 48 : : else 49 [ + - ]: 68 : log_info("parse_timestamp() returns %d (expected)", r); 50 [ - + ]: 68 : assert_se(r < 0); 51 : 68 : } 52 : : 53 : 52 : static void test_one(const char *p) { 54 : 52 : _cleanup_free_ char *with_utc; 55 : : 56 : 52 : with_utc = strjoin(p, " UTC"); 57 : 52 : test_should_pass(p); 58 : 52 : test_should_pass(with_utc); 59 : 52 : } 60 : : 61 : 36 : static void test_one_noutc(const char *p) { 62 : 36 : _cleanup_free_ char *with_utc; 63 : : 64 : 36 : with_utc = strjoin(p, " UTC"); 65 : 36 : test_should_pass(p); 66 : 36 : test_should_fail(with_utc); 67 : 36 : } 68 : : 69 : 4 : int main(int argc, char *argv[]) { 70 : 4 : test_setup_logging(LOG_DEBUG); 71 : : 72 : 4 : test_one("17:41"); 73 : 4 : test_one("18:42:44"); 74 : 4 : test_one("18:42:44.0"); 75 : 4 : test_one("18:42:44.999999999999"); 76 : 4 : test_one("12-10-02 12:13:14"); 77 : 4 : test_one("12-10-2 12:13:14"); 78 : 4 : test_one("12-10-03 12:13"); 79 : 4 : test_one("2012-12-30 18:42"); 80 : 4 : test_one("2012-10-02"); 81 : 4 : test_one("Tue 2012-10-02"); 82 : 4 : test_one("yesterday"); 83 : 4 : test_one("today"); 84 : 4 : test_one("tomorrow"); 85 : 4 : test_one_noutc("16:20 UTC"); 86 : 4 : test_one_noutc("16:20 Asia/Seoul"); 87 : 4 : test_one_noutc("tomorrow Asia/Seoul"); 88 : 4 : test_one_noutc("2012-12-30 18:42 Asia/Seoul"); 89 : 4 : test_one_noutc("now"); 90 : 4 : test_one_noutc("+2d"); 91 : 4 : test_one_noutc("+2y 4d"); 92 : 4 : test_one_noutc("5months ago"); 93 : 4 : test_one_noutc("@1395716396"); 94 : 4 : test_should_parse("1970-1-1 UTC"); 95 : 4 : test_should_pass("1970-1-1 00:00:01 UTC"); 96 : 4 : test_should_fail("1969-12-31 UTC"); 97 : 4 : test_should_fail("-100y"); 98 : 4 : test_should_fail("today UTC UTC"); 99 : 4 : test_should_fail("now Asia/Seoul"); 100 : 4 : test_should_fail("+2d Asia/Seoul"); 101 : 4 : test_should_fail("@1395716396 Asia/Seoul"); 102 : : #if SIZEOF_TIME_T == 8 103 : 4 : test_should_pass("9999-12-30 23:59:59 UTC"); 104 : 4 : test_should_fail("9999-12-31 00:00:00 UTC"); 105 : 4 : test_should_fail("10000-01-01 00:00:00 UTC"); 106 : : #elif SIZEOF_TIME_T == 4 107 : : test_should_pass("2038-01-19 03:14:07 UTC"); 108 : : test_should_fail("2038-01-19 03:14:08 UTC"); 109 : : #endif 110 : : 111 : 4 : return 0; 112 : : }