summaryrefslogtreecommitdiff
path: root/Tests
diff options
context:
space:
mode:
authorTimothy Flynn <trflynn89@pm.me>2022-01-24 14:42:51 -0500
committerLinus Groh <mail@linusgroh.de>2022-01-25 18:39:36 +0000
commitb1ea585149ecd9663aae9607c1b1c508cc98aec2 (patch)
tree05a8bfb05d4f71fc1270a0d5e0cc1cd162e5c31c /Tests
parent6095500263f20b073c5b603b37337a7589fb89eb (diff)
downloadserenity-b1ea585149ecd9663aae9607c1b1c508cc98aec2.zip
LibC: Implement tzset with time zone awareness in accordance with POSIX
Diffstat (limited to 'Tests')
-rw-r--r--Tests/LibC/TestLibCTime.cpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/Tests/LibC/TestLibCTime.cpp b/Tests/LibC/TestLibCTime.cpp
index fcf2327639..4fa829e2a2 100644
--- a/Tests/LibC/TestLibCTime.cpp
+++ b/Tests/LibC/TestLibCTime.cpp
@@ -10,6 +10,25 @@
const auto expected_epoch = "Thu Jan 1 00:00:00 1970\n"sv;
+class TimeZoneGuard {
+public:
+ TimeZoneGuard()
+ : m_tz(getenv("TZ"))
+ {
+ }
+
+ ~TimeZoneGuard()
+ {
+ if (m_tz)
+ setenv("TZ", m_tz, 1);
+ else
+ unsetenv("TZ");
+ }
+
+private:
+ char const* m_tz { nullptr };
+};
+
TEST_CASE(asctime)
{
time_t epoch = 0;
@@ -41,3 +60,48 @@ TEST_CASE(ctime_r)
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);
+}