154 lines
6.9 KiB
Python
154 lines
6.9 KiB
Python
|
#
|
||
|
# Copyright (C) 2013 Red Hat, Inc.
|
||
|
#
|
||
|
# This copyrighted material is made available to anyone wishing to use,
|
||
|
# modify, copy, or redistribute it subject to the terms and conditions of
|
||
|
# the GNU General Public License v.2, or (at your option) any later version.
|
||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||
|
# ANY WARRANTY expressed or implied, including the implied warranties of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||
|
# Public License for more details. You should have received a copy of the
|
||
|
# GNU General Public License along with this program; if not, write to the
|
||
|
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
||
|
# source code or documentation are not subject to the GNU General Public
|
||
|
# License and may only be used or replicated with the express permission of
|
||
|
# Red Hat, Inc.
|
||
|
#
|
||
|
import unittest
|
||
|
|
||
|
from collections import OrderedDict
|
||
|
from freezegun import freeze_time
|
||
|
from unittest.mock import patch
|
||
|
from pyanaconda import timezone
|
||
|
|
||
|
|
||
|
class TimezonesListings(unittest.TestCase):
|
||
|
|
||
|
def test_get_all_regions_and_timezones(self):
|
||
|
"""Test the get_all_regions_and_timezones function."""
|
||
|
regions_and_timezones = timezone.get_all_regions_and_timezones()
|
||
|
assert regions_and_timezones
|
||
|
|
||
|
for (region, zones) in regions_and_timezones.items():
|
||
|
assert region and isinstance(region, str)
|
||
|
assert zones and isinstance(zones, set)
|
||
|
|
||
|
for zone in zones:
|
||
|
assert zone and isinstance(zone, str)
|
||
|
assert timezone.is_valid_timezone(region + "/" + zone)
|
||
|
|
||
|
def test_get_all_regions_and_timezones_compare(self):
|
||
|
"""Compare the previous implementation with the current one."""
|
||
|
result = OrderedDict()
|
||
|
|
||
|
for tz in sorted(timezone.all_timezones()):
|
||
|
parts = tz.split("/", 1)
|
||
|
|
||
|
if len(parts) > 1:
|
||
|
if parts[0] not in result:
|
||
|
result[parts[0]] = set()
|
||
|
result[parts[0]].add(parts[1])
|
||
|
|
||
|
assert result == timezone.get_all_regions_and_timezones()
|
||
|
|
||
|
def test_parse_timezone(self):
|
||
|
"""Test the parse_timezone function."""
|
||
|
regions_and_timezones = timezone.get_all_regions_and_timezones()
|
||
|
|
||
|
# Cover some of the invalid and valid use cases.
|
||
|
assert timezone.parse_timezone("") == ("", "")
|
||
|
assert timezone.parse_timezone("/") == ("", "")
|
||
|
assert timezone.parse_timezone("Europe") == ("", "")
|
||
|
assert timezone.parse_timezone("Europe/") == ("", "")
|
||
|
assert timezone.parse_timezone("Europe/") == ("", "")
|
||
|
assert timezone.parse_timezone("/Prague") == ("", "")
|
||
|
assert timezone.parse_timezone("Europe/Prague") == ("Europe", "Prague")
|
||
|
|
||
|
# Parse all valid timezones.
|
||
|
for (region, zones) in regions_and_timezones.items():
|
||
|
for zone in zones:
|
||
|
assert timezone.parse_timezone(region + "/" + zone) == (region, zone)
|
||
|
|
||
|
class TerritoryTimezones(unittest.TestCase):
|
||
|
def test_string_valid_territory_zone(self):
|
||
|
"""Check if the returned value is string for a valid territory."""
|
||
|
|
||
|
zone = timezone.get_preferred_timezone("CZ")
|
||
|
assert isinstance(zone, str)
|
||
|
|
||
|
def test_invalid_territory_zones(self):
|
||
|
"""Check if None is return for an invalid territory."""
|
||
|
|
||
|
assert timezone.get_preferred_timezone("nonexistent") is None
|
||
|
|
||
|
|
||
|
class SystemTime(unittest.TestCase):
|
||
|
@freeze_time("2021-01-01")
|
||
|
@patch('pyanaconda.timezone.execWithRedirect')
|
||
|
def test_system_time_now(self, exec_mock):
|
||
|
"""Test we do timezone math properly when setting system time
|
||
|
to "now". 1609459200 is 00:00:00 on 2021-01-01; with time
|
||
|
frozen to that point, whatever timezone we call the function
|
||
|
with, it should end up with that number. We also test
|
||
|
2021-06-01 (with the appropriate expected result) for zones
|
||
|
which do DST, as that date is during daylight savings.
|
||
|
"""
|
||
|
# default tz (UTC)
|
||
|
timezone.set_system_date_time()
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609459200"])
|
||
|
timezone.set_system_date_time(tz="US/Eastern")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609459200"])
|
||
|
with freeze_time("2021-06-01"):
|
||
|
timezone.set_system_date_time(tz="US/Eastern")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1622505600"])
|
||
|
timezone.set_system_date_time(tz="Asia/Kolkata")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609459200"])
|
||
|
timezone.set_system_date_time(tz="Asia/Aden")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609459200"])
|
||
|
|
||
|
@freeze_time("2021-01-01 12:00:00")
|
||
|
@patch('pyanaconda.timezone.execWithRedirect')
|
||
|
def test_system_time_explicit(self, exec_mock):
|
||
|
"""Test we do timezone math properly when setting system time
|
||
|
to explicit values, in and out of daylight savings.
|
||
|
"""
|
||
|
timezone.set_system_date_time(2020, 1, 1, 0, 0)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1577836800"])
|
||
|
timezone.set_system_date_time(2020, 1, 1, 0, 0, "US/Eastern")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1577854800"])
|
||
|
timezone.set_system_date_time(2020, 6, 1, 0, 0, "US/Eastern")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1590984000"])
|
||
|
timezone.set_system_date_time(2020, 1, 1, 0, 0, "Asia/Kolkata")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1577817000"])
|
||
|
timezone.set_system_date_time(2020, 1, 1, 0, 0, "Asia/Aden")
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1577826000"])
|
||
|
|
||
|
@freeze_time("2021-01-01 12:00:00")
|
||
|
@patch('pyanaconda.timezone.execWithRedirect')
|
||
|
def test_system_time_hybrid(self, exec_mock):
|
||
|
"""Test we do timezone math properly when setting system time
|
||
|
to a mix of "now" and explicit values, in and out of daylight
|
||
|
savings. We use 12pm as 12pm UTC is on the same date in each
|
||
|
tested timezone.
|
||
|
"""
|
||
|
timezone.set_system_date_time(None, None, None, 19, 15)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609528500"])
|
||
|
timezone.set_system_date_time(
|
||
|
None, None, None, 19, 15, "US/Eastern"
|
||
|
)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609546500"])
|
||
|
with freeze_time("2021-06-01 12:00:00"):
|
||
|
timezone.set_system_date_time(
|
||
|
None, None, None, 19, 15, "US/Eastern"
|
||
|
)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1622589300"])
|
||
|
timezone.set_system_date_time(
|
||
|
None, None, None, 19, 15, "Asia/Kolkata"
|
||
|
)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609508700"])
|
||
|
timezone.set_system_date_time(
|
||
|
None, None, None, 19, 15, "Asia/Aden"
|
||
|
)
|
||
|
exec_mock.assert_called_with("/usr/bin/date", ["--set=@1609517700"])
|