lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. |
| 3 | * |
| 4 | * Licensed under the OpenSSL license (the "License"). You may not use |
| 5 | * this file except in compliance with the License. You can obtain a copy |
| 6 | * in the file LICENSE in the source distribution or at |
| 7 | * https://www.openssl.org/source/license.html |
| 8 | */ |
| 9 | |
| 10 | #include <openssl/crypto.h> |
| 11 | |
| 12 | #include "testutil.h" |
| 13 | |
| 14 | #define SECS_PER_DAY (24 * 60 * 60) |
| 15 | |
| 16 | /* |
| 17 | * Time checking test code. Check times are identical for a wide range of |
| 18 | * offsets. This should be run on a machine with 64 bit time_t or it will |
| 19 | * trigger the very errors the routines fix. |
| 20 | */ |
| 21 | |
| 22 | static int check_time(long offset) |
| 23 | { |
| 24 | struct tm tm1, tm2, o1; |
| 25 | int off_day, off_sec; |
| 26 | long toffset; |
| 27 | time_t t1, t2; |
| 28 | |
| 29 | time(&t1); |
| 30 | |
| 31 | t2 = t1 + offset; |
| 32 | OPENSSL_gmtime(&t2, &tm2); |
| 33 | OPENSSL_gmtime(&t1, &tm1); |
| 34 | o1 = tm1; |
| 35 | OPENSSL_gmtime_adj(&tm1, 0, offset); |
| 36 | if (!TEST_int_eq(tm1.tm_year, tm2.tm_year) |
| 37 | || !TEST_int_eq(tm1.tm_mon, tm2.tm_mon) |
| 38 | || !TEST_int_eq(tm1.tm_mday, tm2.tm_mday) |
| 39 | || !TEST_int_eq(tm1.tm_hour, tm2.tm_hour) |
| 40 | || !TEST_int_eq(tm1.tm_min, tm2.tm_min) |
| 41 | || !TEST_int_eq(tm1.tm_sec, tm2.tm_sec) |
| 42 | || !TEST_true(OPENSSL_gmtime_diff(&off_day, &off_sec, &o1, &tm1))) |
| 43 | return 0; |
| 44 | toffset = (long)off_day * SECS_PER_DAY + off_sec; |
| 45 | if (!TEST_long_eq(offset, toffset)) |
| 46 | return 0; |
| 47 | return 1; |
| 48 | } |
| 49 | |
| 50 | static int test_gmtime(int offset) |
| 51 | { |
| 52 | return check_time(offset) && |
| 53 | check_time(-offset) && |
| 54 | check_time(offset * 1000L) && |
| 55 | check_time(-offset * 1000L); |
| 56 | } |
| 57 | |
| 58 | int setup_tests(void) |
| 59 | { |
| 60 | if (sizeof(time_t) < 8) |
| 61 | TEST_info("Skipping; time_t is less than 64-bits"); |
| 62 | else |
| 63 | ADD_ALL_TESTS_NOSUBTEST(test_gmtime, 1000000); |
| 64 | return 1; |
| 65 | } |