DATE_TIME_STEP = "anaconda-screen-date-time"
class DateTime():
def __init__(self, browser, machine):
self.browser = browser
self.machine = machine
self._step = DATE_TIME_STEP
def set_auto_date_time(self, value):
self.browser.set_checked(f"#{self._step}-auto-date-time", value)
checked = self.browser.get_checked(f"#{self._step}-auto-date-time")
assert checked == value, f"Expected checked={value}, got {checked}"
def check_auto_date_time(self, value):
checked = self.browser.get_checked(f"#{self._step}-auto-date-time")
assert checked == value, f"Expected checked={value}, got {checked}"
def set_date(self, value):
self.browser.set_input_text(f"#{self._step}-date input", value)
def check_date(self, value):
self.browser.wait_val(f"#{self._step}-date input", value)
def set_time(self, value):
self.browser.set_input_text(f"#{self._step}-time input", value)
def check_time(self, value):
self.browser.wait_val(f"#{self._step}-time input", value)
def check_ntp_server_enabled(self, hostname, index):
b = self.browser
b.click(f"#{self._step}-configure-ntp")
b.wait_visible(f"#{self._step}-ntp-modal")
b.wait_val(f"#{self._step}-ntp-table-row-{index}-hostname", hostname)
def check_ntp_modal_rows(self, expected_rows):
"""Assert the NTP modal lists time sources as expected.
expected_rows: sequence of dicts with keys hostname (str), pool (bool), nts (bool).
"""
b = self.browser
b.click(f"#{self._step}-configure-ntp")
b.wait_visible(f"#{self._step}-ntp-modal")
for i, row in enumerate(expected_rows):
b.wait_val(f"#{self._step}-ntp-table-row-{i}-hostname", row["hostname"])
pool_sel = f"#{self._step}-ntp-table-row-{i}-pool-checkbox"
nts_sel = f"#{self._step}-ntp-table-row-{i}-secure-checkbox"
if row["pool"]:
b.wait_visible(f"{pool_sel}:checked")
else:
b.wait_visible(f"{pool_sel}:not(:checked)")
if row["nts"]:
b.wait_visible(f"{nts_sel}:checked")
else:
b.wait_visible(f"{nts_sel}:not(:checked)")
b.click(f"#{self._step}-ntp-modal-cancel-button")
b.wait_not_present(f"#{self._step}-ntp-modal")
def add_ntp_server(self, server, index):
b = self.browser
b.set_checked(f"#{self._step}-auto-date-time", True)
b.click(f"#{self._step}-configure-ntp")
b.wait_visible(f"#{self._step}-ntp-modal")
b.click(f"#{self._step}-ntp-table-add-server-button")
b.set_input_text(f"#{self._step}-ntp-table-row-{index}-hostname", server)
b.click(f"#{self._step}-ntp-modal-save-button")
b.wait_not_present(f"#{self._step}-ntp-modal")
class Timezone():
def __init__(self, browser, machine):
self.browser = browser
self.machine = machine
self._step = DATE_TIME_STEP
def set_auto_timezone(self, value):
self.browser.set_checked(f"#{self._step}-auto-timezone", value)
checked = self.browser.get_checked(f"#{self._step}-auto-timezone")
assert checked == value, f"Expected checked={value}, got {checked}"
def check_auto_timezone(self, value):
checked = self.browser.get_checked(f"#{self._step}-auto-timezone")
assert checked == value, f"Expected checked={value}, got {checked}"
def select_region(self, region):
self.browser.click("#anaconda-screen-date-time-region-toggle")
self.browser.wait_visible("#anaconda-screen-date-time-region")
self.browser.click(f"#anaconda-screen-date-time-region .pf-v6-c-menu__item-text:contains('{region}')")
self.browser.wait_not_present("#anaconda-screen-date-time-region")
def check_region(self, region):
self.browser.wait_in_text(f".{self._step}__region-toggle", region)
def select_city(self, city):
self.browser.click("#anaconda-screen-date-time-city-toggle")
self.browser.wait_visible("#anaconda-screen-date-time-city")
self.browser.click(f"#anaconda-screen-date-time-city .pf-v6-c-menu__item-text:contains('{city}')")
self.browser.wait_not_present("#anaconda-screen-date-time-city")
def check_city(self, city):
self.browser.wait_in_text(f".{self._step}__city-toggle", city)
def check_timezone_label(self, value):
self.browser.wait_in_text(f".{self._step}__timezone-label", value)
class TimeFormat():
def __init__(self, browser, machine):
self.browser = browser
self.machine = machine
self._step = DATE_TIME_STEP
def set_time_format(self, fmt):
self.browser.set_checked(f"#{self._step}-show-ampm", fmt == "ampm")
def check_time_format(self, fmt):
checked = self.browser.get_checked(f"#{self._step}-show-ampm")
if fmt == "24":
assert not checked
else:
assert checked
class DateTimeDBus():
TIMEZONE_SERVICE = "org.fedoraproject.Anaconda.Modules.Timezone"
TIMEZONE_INTERFACE = "org.fedoraproject.Anaconda.Modules.Timezone"
TIMEZONE_OBJECT_PATH = "/org/fedoraproject/Anaconda/Modules/Timezone"
def __init__(self, machine):
self.machine = machine
self._bus_address = self.machine.execute("cat /run/anaconda/bus.address")
def dbus_get_system_datetime(self):
out = self.machine.execute(f'busctl --address="{self._bus_address}" \
call {self.TIMEZONE_SERVICE} {self.TIMEZONE_OBJECT_PATH} \
{self.TIMEZONE_INTERFACE} GetSystemDateTime')
return out.split('"')[1]
def dbus_get_ntp_enabled(self):
return "true" in self.machine.execute(f'busctl --address="{self._bus_address}" \
get-property {self.TIMEZONE_SERVICE} {self.TIMEZONE_OBJECT_PATH} \
{self.TIMEZONE_INTERFACE} NTPEnabled')
def dbus_set_ntp_enabled(self, value):
val_str = "true" if value else "false"
self.machine.execute(f'busctl --address="{self._bus_address}" \
set-property {self.TIMEZONE_SERVICE} {self.TIMEZONE_OBJECT_PATH} \
{self.TIMEZONE_INTERFACE} NTPEnabled b {val_str}')
def dbus_get_timezone(self):
out = self.machine.execute(f'busctl --address="{self._bus_address}" \
get-property {self.TIMEZONE_SERVICE} {self.TIMEZONE_OBJECT_PATH} \
{self.TIMEZONE_INTERFACE} Timezone')
return out.split('"')[1]
def dbus_clear_time_sources(self):
self.machine.execute(f'busctl --address="{self._bus_address}" \
set-property {self.TIMEZONE_SERVICE} {self.TIMEZONE_OBJECT_PATH} \
{self.TIMEZONE_INTERFACE} TimeSources "aa{{sv}}" {0}')
class DateAndTime(DateTime, Timezone, TimeFormat, DateTimeDBus):
def __init__(self, browser, machine):
DateTime.__init__(self, browser, machine)
Timezone.__init__(self, browser, machine)
TimeFormat.__init__(self, browser, machine)
DateTimeDBus.__init__(self, machine)