brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.0 KiB · a1308b1 Raw
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