add some tests for parse_absolute_time(), including cases where it
authordjm <djm@openbsd.org>
Thu, 11 Aug 2022 01:57:50 +0000 (01:57 +0000)
committerdjm <djm@openbsd.org>
Thu, 11 Aug 2022 01:57:50 +0000 (01:57 +0000)
is forced to the UTC timezone. bz3468 ok dtucker

regress/usr.bin/ssh/unittests/misc/test_convtime.c

index 8ec9b74..de5ce75 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: test_convtime.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */
+/*     $OpenBSD: test_convtime.c,v 1.3 2022/08/11 01:57:50 djm Exp $ */
 /*
  * Regress test for misc time conversion functions.
  *
@@ -16,6 +16,7 @@
 
 #include "log.h"
 #include "misc.h"
+#include "ssherr.h"
 
 void test_convtime(void);
 
@@ -23,6 +24,7 @@ void
 test_convtime(void)
 {
        char buf[1024];
+       uint64_t t;
 
        TEST_START("misc_convtime");
        ASSERT_INT_EQ(convtime("0"), 0);
@@ -52,4 +54,64 @@ test_convtime(void)
        ASSERT_INT_EQ(convtime("3550w5d3h14m8s"), -1);
 #endif
        TEST_DONE();
+
+       /* XXX timezones/DST make verification of this tricky */
+       /* XXX maybe setenv TZ and tzset() to make it unambiguous? */
+       TEST_START("misc_parse_absolute_time");
+       ASSERT_INT_EQ(parse_absolute_time("20000101", &t), 0);
+       ASSERT_INT_EQ(parse_absolute_time("200001011223", &t), 0);
+       ASSERT_INT_EQ(parse_absolute_time("20000101122345", &t), 0);
+
+       /* forced UTC TZ */
+       ASSERT_INT_EQ(parse_absolute_time("20000101Z", &t), 0);
+       ASSERT_U64_EQ(t, 946684800);
+       ASSERT_INT_EQ(parse_absolute_time("200001011223Z", &t), 0);
+       ASSERT_U64_EQ(t, 946729380);
+       ASSERT_INT_EQ(parse_absolute_time("20000101122345Z", &t), 0);
+       ASSERT_U64_EQ(t, 946729425);
+       ASSERT_INT_EQ(parse_absolute_time("20000101UTC", &t), 0);
+       ASSERT_U64_EQ(t, 946684800);
+       ASSERT_INT_EQ(parse_absolute_time("200001011223UTC", &t), 0);
+       ASSERT_U64_EQ(t, 946729380);
+       ASSERT_INT_EQ(parse_absolute_time("20000101122345UTC", &t), 0);
+       ASSERT_U64_EQ(t, 946729425);
+
+       /* Bad month */
+       ASSERT_INT_EQ(parse_absolute_time("20001301", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000001", &t),
+           SSH_ERR_INVALID_FORMAT);
+       /* Incomplete */
+       ASSERT_INT_EQ(parse_absolute_time("2", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("2000", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("200001", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("2000010", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("200001010", &t),
+           SSH_ERR_INVALID_FORMAT);
+       /* Bad day, hour, minute, second */
+       ASSERT_INT_EQ(parse_absolute_time("20000199", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("200001019900", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("200001010099", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000101000099", &t),
+           SSH_ERR_INVALID_FORMAT);
+       /* Invalid TZ specifier */
+       ASSERT_INT_EQ(parse_absolute_time("20000101ZZ", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000101PDT", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000101U", &t),
+           SSH_ERR_INVALID_FORMAT);
+       ASSERT_INT_EQ(parse_absolute_time("20000101UTCUTC", &t),
+           SSH_ERR_INVALID_FORMAT);
+
+       TEST_DONE();
 }