/* * Copyright 2015-2017 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the OpenSSL license (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy * in the file LICENSE in the source distribution or at * https://www.openssl.org/source/license.html */ #include #include "testutil.h" #define SECS_PER_DAY (24 * 60 * 60) /* * Time checking test code. Check times are identical for a wide range of * offsets. This should be run on a machine with 64 bit time_t or it will * trigger the very errors the routines fix. */ static int check_time(long offset) { struct tm tm1, tm2, o1; int off_day, off_sec; long toffset; time_t t1, t2; time(&t1); t2 = t1 + offset; OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t1, &tm1); o1 = tm1; OPENSSL_gmtime_adj(&tm1, 0, offset); if (!TEST_int_eq(tm1.tm_year, tm2.tm_year) || !TEST_int_eq(tm1.tm_mon, tm2.tm_mon) || !TEST_int_eq(tm1.tm_mday, tm2.tm_mday) || !TEST_int_eq(tm1.tm_hour, tm2.tm_hour) || !TEST_int_eq(tm1.tm_min, tm2.tm_min) || !TEST_int_eq(tm1.tm_sec, tm2.tm_sec) || !TEST_true(OPENSSL_gmtime_diff(&off_day, &off_sec, &o1, &tm1))) return 0; toffset = (long)off_day * SECS_PER_DAY + off_sec; if (!TEST_long_eq(offset, toffset)) return 0; return 1; } static int test_gmtime(int offset) { return check_time(offset) && check_time(-offset) && check_time(offset * 1000L) && check_time(-offset * 1000L); } int setup_tests(void) { if (sizeof(time_t) < 8) TEST_info("Skipping; time_t is less than 64-bits"); else ADD_ALL_TESTS_NOSUBTEST(test_gmtime, 1000000); return 1; }