mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:22:43 +00:00 
			
		
		
		
	 010ec36d20
			
		
	
	
		010ec36d20
		
	
	
	
	
		
			
			This ensures these tests pass even if the user has changed the system time zone away from UTC.
		
			
				
	
	
		
			121 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Brian Gianforcaro <bgianf@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <AK/StringView.h>
 | |
| #include <LibTest/TestCase.h>
 | |
| #include <time.h>
 | |
| 
 | |
| const auto expected_epoch = "Thu Jan  1 00:00:00 1970\n"sv;
 | |
| 
 | |
| class TimeZoneGuard {
 | |
| public:
 | |
|     TimeZoneGuard()
 | |
|         : m_tz(getenv("TZ"))
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     explicit TimeZoneGuard(char const* tz)
 | |
|         : m_tz(getenv("TZ"))
 | |
|     {
 | |
|         setenv("TZ", tz, 1);
 | |
|     }
 | |
| 
 | |
|     ~TimeZoneGuard()
 | |
|     {
 | |
|         if (m_tz)
 | |
|             setenv("TZ", m_tz, 1);
 | |
|         else
 | |
|             unsetenv("TZ");
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     char const* m_tz { nullptr };
 | |
| };
 | |
| 
 | |
| TEST_CASE(asctime)
 | |
| {
 | |
|     TimeZoneGuard guard("UTC");
 | |
| 
 | |
|     time_t epoch = 0;
 | |
|     auto result = asctime(localtime(&epoch));
 | |
|     EXPECT_EQ(expected_epoch, StringView(result));
 | |
| }
 | |
| 
 | |
| TEST_CASE(asctime_r)
 | |
| {
 | |
|     TimeZoneGuard guard("UTC");
 | |
| 
 | |
|     char buffer[26] {};
 | |
|     time_t epoch = 0;
 | |
|     auto result = asctime_r(localtime(&epoch), buffer);
 | |
|     EXPECT_EQ(expected_epoch, StringView(result));
 | |
| }
 | |
| 
 | |
| TEST_CASE(ctime)
 | |
| {
 | |
|     TimeZoneGuard guard("UTC");
 | |
| 
 | |
|     time_t epoch = 0;
 | |
|     auto result = ctime(&epoch);
 | |
| 
 | |
|     EXPECT_EQ(expected_epoch, StringView(result));
 | |
| }
 | |
| 
 | |
| TEST_CASE(ctime_r)
 | |
| {
 | |
|     TimeZoneGuard guard("UTC");
 | |
| 
 | |
|     char buffer[26] {};
 | |
|     time_t epoch = 0;
 | |
|     auto result = ctime_r(&epoch, buffer);
 | |
| 
 | |
|     EXPECT_EQ(expected_epoch, StringView(result));
 | |
| }
 | |
| 
 | |
| TEST_CASE(tzset)
 | |
| {
 | |
|     TimeZoneGuard guard;
 | |
| 
 | |
|     auto set_tz = [](char const* tz) {
 | |
|         setenv("TZ", tz, 1);
 | |
|         tzset();
 | |
|     };
 | |
| 
 | |
|     set_tz("UTC");
 | |
|     EXPECT_EQ(timezone, 0);
 | |
|     EXPECT_EQ(altzone, 0);
 | |
|     EXPECT_EQ(daylight, 0);
 | |
|     EXPECT_EQ(tzname[0], "UTC"sv);
 | |
|     EXPECT_EQ(tzname[1], "UTC"sv);
 | |
| 
 | |
|     set_tz("America/New_York");
 | |
|     EXPECT_EQ(timezone, 5 * 60 * 60);
 | |
|     EXPECT_EQ(altzone, 4 * 60 * 60);
 | |
|     EXPECT_EQ(daylight, 1);
 | |
|     EXPECT_EQ(tzname[0], "EST"sv);
 | |
|     EXPECT_EQ(tzname[1], "EDT"sv);
 | |
| 
 | |
|     set_tz("America/Phoenix");
 | |
|     EXPECT_EQ(timezone, 7 * 60 * 60);
 | |
|     EXPECT_EQ(altzone, 7 * 60 * 60);
 | |
|     EXPECT_EQ(daylight, 0);
 | |
|     EXPECT_EQ(tzname[0], "MST"sv);
 | |
|     EXPECT_EQ(tzname[1], "MST"sv);
 | |
| 
 | |
|     set_tz("America/Asuncion");
 | |
|     EXPECT_EQ(timezone, 4 * 60 * 60);
 | |
|     EXPECT_EQ(altzone, 3 * 60 * 60);
 | |
|     EXPECT_EQ(daylight, 1);
 | |
|     EXPECT_EQ(tzname[0], "-04"sv);
 | |
|     EXPECT_EQ(tzname[1], "-03"sv);
 | |
| 
 | |
|     set_tz("CET");
 | |
|     EXPECT_EQ(timezone, -1 * 60 * 60);
 | |
|     EXPECT_EQ(altzone, -2 * 60 * 60);
 | |
|     EXPECT_EQ(daylight, 1);
 | |
|     EXPECT_EQ(tzname[0], "CET"sv);
 | |
|     EXPECT_EQ(tzname[1], "CEST"sv);
 | |
| }
 |