1 /* $OpenBSD: test_convtime.c,v 1.3 2022/08/11 01:57:50 djm Exp $ */ 2 /* 3 * Regress test for misc time conversion functions. 4 * 5 * Placed in the public domain. 6 */ 7 8 #include <sys/types.h> 9 #include <stdio.h> 10 #include <stdint.h> 11 #include <stdlib.h> 12 #include <limits.h> 13 #include <string.h> 14 15 #include "test_helper.h" 16 17 #include "log.h" 18 #include "misc.h" 19 #include "ssherr.h" 20 21 void test_convtime(void); 22 23 void 24 test_convtime(void) 25 { 26 char buf[1024]; 27 uint64_t t; 28 29 TEST_START("misc_convtime"); 30 ASSERT_INT_EQ(convtime("0"), 0); 31 ASSERT_INT_EQ(convtime("1"), 1); 32 ASSERT_INT_EQ(convtime("2s"), 2); 33 ASSERT_INT_EQ(convtime("3m"), 180); 34 ASSERT_INT_EQ(convtime("1m30"), 90); 35 ASSERT_INT_EQ(convtime("1m30s"), 90); 36 ASSERT_INT_EQ(convtime("1h1s"), 3601); 37 ASSERT_INT_EQ(convtime("1h30m"), 90 * 60); 38 ASSERT_INT_EQ(convtime("1d"), 24 * 60 * 60); 39 ASSERT_INT_EQ(convtime("1w"), 7 * 24 * 60 * 60); 40 ASSERT_INT_EQ(convtime("1w2d3h4m5"), 788645); 41 ASSERT_INT_EQ(convtime("1w2d3h4m5s"), 788645); 42 /* any negative number or error returns -1 */ 43 ASSERT_INT_EQ(convtime("-1"), -1); 44 ASSERT_INT_EQ(convtime(""), -1); 45 ASSERT_INT_EQ(convtime("trout"), -1); 46 ASSERT_INT_EQ(convtime("-77"), -1); 47 /* boundary conditions */ 48 snprintf(buf, sizeof buf, "%llu", (long long unsigned)INT_MAX); 49 ASSERT_INT_EQ(convtime(buf), INT_MAX); 50 snprintf(buf, sizeof buf, "%llu", (long long unsigned)INT_MAX + 1); 51 ASSERT_INT_EQ(convtime(buf), -1); 52 ASSERT_INT_EQ(convtime("3550w5d3h14m7s"), 2147483647); 53 #if INT_MAX == 2147483647 54 ASSERT_INT_EQ(convtime("3550w5d3h14m8s"), -1); 55 #endif 56 TEST_DONE(); 57 58 /* XXX timezones/DST make verification of this tricky */ 59 /* XXX maybe setenv TZ and tzset() to make it unambiguous? */ 60 TEST_START("misc_parse_absolute_time"); 61 ASSERT_INT_EQ(parse_absolute_time("20000101", &t), 0); 62 ASSERT_INT_EQ(parse_absolute_time("200001011223", &t), 0); 63 ASSERT_INT_EQ(parse_absolute_time("20000101122345", &t), 0); 64 65 /* forced UTC TZ */ 66 ASSERT_INT_EQ(parse_absolute_time("20000101Z", &t), 0); 67 ASSERT_U64_EQ(t, 946684800); 68 ASSERT_INT_EQ(parse_absolute_time("200001011223Z", &t), 0); 69 ASSERT_U64_EQ(t, 946729380); 70 ASSERT_INT_EQ(parse_absolute_time("20000101122345Z", &t), 0); 71 ASSERT_U64_EQ(t, 946729425); 72 ASSERT_INT_EQ(parse_absolute_time("20000101UTC", &t), 0); 73 ASSERT_U64_EQ(t, 946684800); 74 ASSERT_INT_EQ(parse_absolute_time("200001011223UTC", &t), 0); 75 ASSERT_U64_EQ(t, 946729380); 76 ASSERT_INT_EQ(parse_absolute_time("20000101122345UTC", &t), 0); 77 ASSERT_U64_EQ(t, 946729425); 78 79 /* Bad month */ 80 ASSERT_INT_EQ(parse_absolute_time("20001301", &t), 81 SSH_ERR_INVALID_FORMAT); 82 ASSERT_INT_EQ(parse_absolute_time("20000001", &t), 83 SSH_ERR_INVALID_FORMAT); 84 /* Incomplete */ 85 ASSERT_INT_EQ(parse_absolute_time("2", &t), 86 SSH_ERR_INVALID_FORMAT); 87 ASSERT_INT_EQ(parse_absolute_time("2000", &t), 88 SSH_ERR_INVALID_FORMAT); 89 ASSERT_INT_EQ(parse_absolute_time("20000", &t), 90 SSH_ERR_INVALID_FORMAT); 91 ASSERT_INT_EQ(parse_absolute_time("200001", &t), 92 SSH_ERR_INVALID_FORMAT); 93 ASSERT_INT_EQ(parse_absolute_time("2000010", &t), 94 SSH_ERR_INVALID_FORMAT); 95 ASSERT_INT_EQ(parse_absolute_time("200001010", &t), 96 SSH_ERR_INVALID_FORMAT); 97 /* Bad day, hour, minute, second */ 98 ASSERT_INT_EQ(parse_absolute_time("20000199", &t), 99 SSH_ERR_INVALID_FORMAT); 100 ASSERT_INT_EQ(parse_absolute_time("200001019900", &t), 101 SSH_ERR_INVALID_FORMAT); 102 ASSERT_INT_EQ(parse_absolute_time("200001010099", &t), 103 SSH_ERR_INVALID_FORMAT); 104 ASSERT_INT_EQ(parse_absolute_time("20000101000099", &t), 105 SSH_ERR_INVALID_FORMAT); 106 /* Invalid TZ specifier */ 107 ASSERT_INT_EQ(parse_absolute_time("20000101ZZ", &t), 108 SSH_ERR_INVALID_FORMAT); 109 ASSERT_INT_EQ(parse_absolute_time("20000101PDT", &t), 110 SSH_ERR_INVALID_FORMAT); 111 ASSERT_INT_EQ(parse_absolute_time("20000101U", &t), 112 SSH_ERR_INVALID_FORMAT); 113 ASSERT_INT_EQ(parse_absolute_time("20000101UTCUTC", &t), 114 SSH_ERR_INVALID_FORMAT); 115 116 TEST_DONE(); 117 } 118