310 lines · cpp
1//===-- Unittests for gmtime ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "hdr/errno_macros.h"10#include "hdr/types/struct_tm.h"11#include "src/__support/CPP/limits.h" // INT_MAX, INT_MIN12#include "src/time/gmtime.h"13#include "src/time/time_constants.h"14#include "test/UnitTest/ErrnoCheckingTest.h"15#include "test/UnitTest/Test.h"16#include "test/src/time/TmMatcher.h"17 18using LlvmLibcGmTime = LIBC_NAMESPACE::testing::ErrnoCheckingTest;19 20TEST_F(LlvmLibcGmTime, OutOfRange) {21 if (sizeof(time_t) < sizeof(int64_t))22 return;23 time_t seconds =24 1 +25 INT_MAX *26 static_cast<int64_t>(27 LIBC_NAMESPACE::time_constants::NUMBER_OF_SECONDS_IN_LEAP_YEAR);28 struct tm *tm_data = LIBC_NAMESPACE::gmtime(&seconds);29 EXPECT_TRUE(tm_data == nullptr);30 ASSERT_ERRNO_EQ(EOVERFLOW);31 32 seconds =33 INT_MIN *34 static_cast<int64_t>(35 LIBC_NAMESPACE::time_constants::NUMBER_OF_SECONDS_IN_LEAP_YEAR) -36 1;37 tm_data = LIBC_NAMESPACE::gmtime(&seconds);38 EXPECT_TRUE(tm_data == nullptr);39 ASSERT_ERRNO_EQ(EOVERFLOW);40}41 42TEST_F(LlvmLibcGmTime, InvalidSeconds) {43 time_t seconds = 0;44 struct tm *tm_data = nullptr;45 // -1 second from 1970-01-01 00:00:00 returns 1969-12-31 23:59:59.46 seconds = -1;47 tm_data = LIBC_NAMESPACE::gmtime(&seconds);48 EXPECT_TM_EQ(49 (tm{59, // sec50 59, // min51 23, // hr52 31, // day53 12 - 1, // tm_mon starts with 0 for Jan54 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year55 3, // wday56 364, // yday57 0}),58 *tm_data);59 // 60 seconds from 1970-01-01 00:00:00 returns 1970-01-01 00:01:00.60 seconds = 60;61 tm_data = LIBC_NAMESPACE::gmtime(&seconds);62 EXPECT_TM_EQ(63 (tm{0, // sec64 1, // min65 0, // hr66 1, // day67 0, // tm_mon starts with 0 for Jan68 1970 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year69 4, // wday70 0, // yday71 0}),72 *tm_data);73}74 75TEST_F(LlvmLibcGmTime, InvalidMinutes) {76 time_t seconds = 0;77 struct tm *tm_data = nullptr;78 // -1 minute from 1970-01-01 00:00:00 returns 1969-12-31 23:59:00.79 seconds = -LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN;80 tm_data = LIBC_NAMESPACE::gmtime(&seconds);81 EXPECT_TM_EQ(82 (tm{0, // sec83 59, // min84 23, // hr85 31, // day86 11, // tm_mon starts with 0 for Jan87 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year88 3, // wday89 0, // yday90 0}),91 *tm_data);92 // 60 minutes from 1970-01-01 00:00:00 returns 1970-01-01 01:00:00.93 seconds = 60 * LIBC_NAMESPACE::time_constants::SECONDS_PER_MIN;94 tm_data = LIBC_NAMESPACE::gmtime(&seconds);95 EXPECT_TM_EQ(96 (tm{0, // sec97 0, // min98 1, // hr99 1, // day100 0, // tm_mon starts with 0 for Jan101 1970 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year102 4, // wday103 0, // yday104 0}),105 *tm_data);106}107 108TEST_F(LlvmLibcGmTime, InvalidHours) {109 time_t seconds = 0;110 struct tm *tm_data = nullptr;111 // -1 hour from 1970-01-01 00:00:00 returns 1969-12-31 23:00:00.112 seconds = -LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR;113 tm_data = LIBC_NAMESPACE::gmtime(&seconds);114 EXPECT_TM_EQ(115 (tm{0, // sec116 0, // min117 23, // hr118 31, // day119 11, // tm_mon starts with 0 for Jan120 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year121 3, // wday122 0, // yday123 0}),124 *tm_data);125 // 24 hours from 1970-01-01 00:00:00 returns 1970-01-02 00:00:00.126 seconds = 24 * LIBC_NAMESPACE::time_constants::SECONDS_PER_HOUR;127 tm_data = LIBC_NAMESPACE::gmtime(&seconds);128 EXPECT_TM_EQ(129 (tm{0, // sec130 0, // min131 0, // hr132 2, // day133 0, // tm_mon starts with 0 for Jan134 1970 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year135 5, // wday136 0, // yday137 0}),138 *tm_data);139}140 141TEST_F(LlvmLibcGmTime, InvalidYear) {142 // -1 year from 1970-01-01 00:00:00 returns 1969-01-01 00:00:00.143 time_t seconds = -LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR *144 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;145 struct tm *tm_data = LIBC_NAMESPACE::gmtime(&seconds);146 EXPECT_TM_EQ(147 (tm{0, // sec148 0, // min149 0, // hr150 1, // day151 0, // tm_mon starts with 0 for Jan152 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year153 3, // wday154 0, // yday155 0}),156 *tm_data);157}158 159TEST_F(LlvmLibcGmTime, InvalidMonths) {160 time_t seconds = 0;161 struct tm *tm_data = nullptr;162 // -1 month from 1970-01-01 00:00:00 returns 1969-12-01 00:00:00.163 seconds = -31 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;164 tm_data = LIBC_NAMESPACE::gmtime(&seconds);165 EXPECT_TM_EQ(166 (tm{0, // sec167 0, // min168 0, // hr169 1, // day170 12 - 1, // tm_mon starts with 0 for Jan171 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year172 1, // wday173 0, // yday174 0}),175 *tm_data);176 // 1970-13-01 00:00:00 returns 1971-01-01 00:00:00.177 seconds = LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR *178 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;179 tm_data = LIBC_NAMESPACE::gmtime(&seconds);180 EXPECT_TM_EQ(181 (tm{0, // sec182 0, // min183 0, // hr184 1, // day185 0, // tm_mon starts with 0 for Jan186 1971 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year187 5, // wday188 0, // yday189 0}),190 *tm_data);191}192 193TEST_F(LlvmLibcGmTime, InvalidDays) {194 time_t seconds = 0;195 struct tm *tm_data = nullptr;196 // -1 day from 1970-01-01 00:00:00 returns 1969-12-31 00:00:00.197 seconds = -1 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;198 tm_data = LIBC_NAMESPACE::gmtime(&seconds);199 EXPECT_TM_EQ(200 (tm{0, // sec201 0, // min202 0, // hr203 31, // day204 11, // tm_mon starts with 0 for Jan205 1969 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year206 3, // wday207 0, // yday208 0}),209 *tm_data);210 211 // 1970-01-32 00:00:00 returns 1970-02-01 00:00:00.212 seconds = 31 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;213 tm_data = LIBC_NAMESPACE::gmtime(&seconds);214 EXPECT_TM_EQ(215 (tm{0, // sec216 0, // min217 0, // hr218 1, // day219 0, // tm_mon starts with 0 for Jan220 1970 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year221 0, // wday222 0, // yday223 0}),224 *tm_data);225 226 // 1970-02-29 00:00:00 returns 1970-03-01 00:00:00.227 seconds = 59 * LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;228 tm_data = LIBC_NAMESPACE::gmtime(&seconds);229 EXPECT_TM_EQ(230 (tm{0, // sec231 0, // min232 0, // hr233 1, // day234 2, // tm_mon starts with 0 for Jan235 1970 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year236 0, // wday237 0, // yday238 0}),239 *tm_data);240 241 // 1972-02-30 00:00:00 returns 1972-03-01 00:00:00.242 seconds =243 ((2 * LIBC_NAMESPACE::time_constants::DAYS_PER_NON_LEAP_YEAR) + 60) *244 LIBC_NAMESPACE::time_constants::SECONDS_PER_DAY;245 tm_data = LIBC_NAMESPACE::gmtime(&seconds);246 EXPECT_TM_EQ(247 (tm{0, // sec248 0, // min249 0, // hr250 1, // day251 2, // tm_mon starts with 0 for Jan252 1972 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year253 3, // wday254 0, // yday255 0}),256 *tm_data);257}258 259TEST_F(LlvmLibcGmTime, EndOf32BitEpochYear) {260 // Test for maximum value of a signed 32-bit integer.261 // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.262 time_t seconds = 0x7FFFFFFF;263 struct tm *tm_data = LIBC_NAMESPACE::gmtime(&seconds);264 EXPECT_TM_EQ(265 (tm{7, // sec266 14, // min267 3, // hr268 19, // day269 0, // tm_mon starts with 0 for Jan270 2038 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year271 2, // wday272 7, // yday273 0}),274 *tm_data);275}276 277TEST_F(LlvmLibcGmTime, Max64BitYear) {278 if (sizeof(time_t) == 4)279 return;280 // Mon Jan 1 12:50:50 2170 (200 years from 1970),281 time_t seconds = 6311479850;282 struct tm *tm_data = LIBC_NAMESPACE::gmtime(&seconds);283 EXPECT_TM_EQ(284 (tm{50, // sec285 50, // min286 12, // hr287 1, // day288 0, // tm_mon starts with 0 for Jan289 2170 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year290 1, // wday291 50, // yday292 0}),293 *tm_data);294 295 // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.296 seconds = 67767976202043050;297 tm_data = LIBC_NAMESPACE::gmtime(&seconds);298 EXPECT_TM_EQ(299 (tm{50, // sec300 50, // min301 12, // hr302 1, // day303 0, // tm_mon starts with 0 for Jan304 2147483647 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year305 2, // wday306 50, // yday307 0}),308 *tm_data);309}310