Skip to content

Commit

Permalink
Created proposed resolution of Github issue #230:
Browse files Browse the repository at this point in the history
* Removed PICS from TC_TIMESYNC_2_1 and TC_TIMESYNC_2_2 in python_testing folder
* Added using the wait_for_user_input() to allow user to inform if certain features are present on DUT
  • Loading branch information
j-ororke committed Jun 14, 2024
1 parent a12a0c0 commit a73c4c2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 72 deletions.
104 changes: 41 additions & 63 deletions src/python_testing/TC_TIMESYNC_2_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,40 +34,40 @@ def pics_TC_TIMESYNC_2_1(self) -> list[str]:

@async_test_body
async def test_TC_TIMESYNC_2_1(self):
# Establishing features support
TSCfeat = self.wait_for_user_input(prompt_msg="Is TSC feature supported? (y or n)\n", input_msg="Is TSC feature supported? (y or n)\n", prompt_msg_placeholder="y or n")
NTPCfeat = self.wait_for_user_input(prompt_msg="Is NTPC feature supported? (y or n)\n", input_msg="Is NTPC feature supported? (y or n)\n", prompt_msg_placeholder="y or n", default_value='n')
NTPSfeat = self.wait_for_user_input(prompt_msg="Is NTPS feature supported? (y or n)\n", input_msg="Is NTPS feature supported? (y or n)\n", prompt_msg_placeholder="y or n", default_value='n')
TZfeat = self.wait_for_user_input(prompt_msg="Is TZ feature supported? (y or n)\n", input_msg="Is TZ feature supported? (y or n)\n", prompt_msg_placeholder="y or n")

endpoint = self.user_params.get("endpoint", 0)

self.print_step(1, "Commissioning, already done")
attributes = Clusters.TimeSynchronization.Attributes

self.print_step(2, "Read Granularity attribute")
if self.check_pics("TIMESYNC.S.A0001"):
granularity_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.Granularity)
asserts.assert_less(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kUnknownEnumValue,
"Granularity is not in valid range")
else:
asserts.assert_true(False, "Granularity is a mandatory attribute and must be present in the PICS file")
granularity_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.Granularity)
asserts.assert_less(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kUnknownEnumValue,
"Granularity is not in valid range")

self.print_step(3, "Read TimeSource")
if self.check_pics("TIMESYNC.S.A0002"):
time_source = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeSource)
asserts.assert_less(time_source, Clusters.TimeSynchronization.Enums.TimeSourceEnum.kUnknownEnumValue,
"TimeSource is not in valid range")
time_source = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeSource)
asserts.assert_less(time_source, Clusters.TimeSynchronization.Enums.TimeSourceEnum.kUnknownEnumValue,
"TimeSource is not in valid range")

self.print_step(4, "Read TrustedTimeSource")
if self.check_pics("TIMESYNC.S.A0003"):
if TSCfeat == 'y':
trusted_time_source = await self.read_ts_attribute_expect_success(endpoint=endpoint,
attribute=attributes.TrustedTimeSource)
attribute=attributes.TrustedTimeSource)
if trusted_time_source is not NullValue:
asserts.assert_less_equal(trusted_time_source.fabricIndex, 0xFE,
"FabricIndex for the TrustedTimeSource is out of range")
"FabricIndex for the TrustedTimeSource is out of range")
asserts.assert_greater_equal(trusted_time_source.fabricIndex, 1,
"FabricIndex for the TrustedTimeSource is out of range")
elif self.check_pics("TIMESYNC.S.F03"):
asserts.assert_true(False, "TrustedTimeSource is mandatory if the TSC feature (TIMESYNC.S.F03) is supported")
"FabricIndex for the TrustedTimeSource is out of range")


self.print_step(5, "Read DefaultNTP")
if self.check_pics("TIMESYNC.S.A0004"):
if NTPCfeat == 'y':
default_ntp = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.DefaultNTP)
if default_ntp is not NullValue:
asserts.assert_less_equal(len(default_ntp), 128, "DefaultNTP length must be less than 128")
Expand All @@ -80,11 +80,9 @@ async def test_TC_TIMESYNC_2_1(self):
is_ip_addr = False
pass
asserts.assert_true(is_web_addr or is_ip_addr, "Returned DefaultNTP value is not a IP address or web address")
elif self.check_pics("TIMESYNC.S.F01"):
asserts.assert_true(False, "DefaultNTP is mandatory if the NTPC (TIMESYNC.S.F01) feature is supported")

self.print_step(6, "Read TimeZone")
if self.check_pics("TIMESYNC.S.A0005"):
if TZfeat == 'y':
tz_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeZone)
asserts.assert_greater_equal(len(tz_dut), 1, "TimeZone must have at least one entry in the list")
asserts.assert_less_equal(len(tz_dut), 2, "TimeZone may have a maximum of two entries in the list")
Expand All @@ -97,45 +95,38 @@ async def test_TC_TIMESYNC_2_1(self):
asserts.assert_equal(tz_dut[0].validAt, 0, "TimeZone list first entry must have a 0 ValidAt time")
if len(tz_dut) > 1:
asserts.assert_not_equal(tz_dut[1].validAt, 0, "TimeZone list second entry must have a non-zero ValidAt time")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "TimeZone is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(7, "Read DSTOffset")
if self.check_pics("TIMESYNC.S.A0006"):
if TZfeat == 'y':
dst_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.DSTOffset)
last_valid_until = -1
last_valid_starting = -1
for dst in dst_dut:
asserts.assert_greater(dst.validStarting, last_valid_starting,
"DSTOffset list must be sorted by ValidStarting time")
"DSTOffset list must be sorted by ValidStarting time")
last_valid_starting = dst.validStarting
asserts.assert_greater_equal(dst.validStarting, last_valid_until,
"DSTOffset list must have every ValidStarting > ValidUntil of the previous entry")
"DSTOffset list must have every ValidStarting > ValidUntil of the previous entry")
last_valid_until = dst.validUntil
if dst.validUntil is NullValue or dst.validUntil is None:
asserts.assert_equal(dst, dst_dut[-1], "DSTOffset list must have Null ValidUntil at the end")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "DSTOffset is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(8, "Read UTCTime")
if self.check_pics("TIMESYNC.S.A0000"):
utc_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.UTCTime)
if utc_dut is NullValue:
asserts.assert_equal(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kNoTimeGranularity)
else:
asserts.assert_not_equal(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kNoTimeGranularity)
if granularity_dut is Clusters.TimeSynchronization.Enums.GranularityEnum.kMinutesGranularity:
toleranace = timedelta(minutes=10)
else:
toleranace = timedelta(minutes=1)
delta_us = abs(utc_dut - utc_time_in_matter_epoch())
delta = timedelta(microseconds=delta_us)
asserts.assert_less_equal(delta, toleranace, "UTC time is not within tolerance of TH")
utc_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.UTCTime)
if utc_dut is NullValue:
asserts.assert_equal(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kNoTimeGranularity)
else:
asserts.assert_true(False, "UTCTime is a mandatory attribute and must be present in the PICS file")
asserts.assert_not_equal(granularity_dut, Clusters.TimeSynchronization.Enums.GranularityEnum.kNoTimeGranularity)
if granularity_dut is Clusters.TimeSynchronization.Enums.GranularityEnum.kMinutesGranularity:
toleranace = timedelta(minutes=10)
else:
toleranace = timedelta(minutes=1)
delta_us = abs(utc_dut - utc_time_in_matter_epoch())
delta = timedelta(microseconds=delta_us)
asserts.assert_less_equal(delta, toleranace, "UTC time is not within tolerance of TH")

self.print_step(9, "Read LocalTime")
if self.check_pics("TIMESYNC.S.A0007"):
if TZfeat == 'y':
utc_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.UTCTime)
local_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.LocalTime)
if utc_dut is NullValue:
Expand All @@ -148,46 +139,33 @@ async def test_TC_TIMESYNC_2_1(self):
delta = timedelta(microseconds=delta_us)
toleranace = timedelta(minutes=1)
asserts.assert_less_equal(delta, toleranace, "Local time caluclation is not within tolerance of calculated value")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "LocalTime is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(10, "Read TimeZoneDatabase")
if self.check_pics("TIMESYNC.S.A0008"):
if TZfeat == 'y':
tz_db_dut = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeZoneDatabase)
asserts.assert_less(tz_db_dut, Clusters.TimeSynchronization.Enums.TimeZoneDatabaseEnum.kUnknownEnumValue,
"TimeZoneDatabase is not in valid range")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "TimeZoneDatabase is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(11, "Read NTPServerAvailable")
if self.check_pics("TIMESYNC.S.A0009"):
if NTPSfeat == 'y':
# bool typechecking happens in the test read functions, so all we need to do here is do the read
await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.NTPServerAvailable)
elif self.check_pics("TIMESYNC.S.F02"):
asserts.assert_true(False, "NTPServerAvailable is mandatory if the NTPS (TIMESYNC.S.F02) feature is supported")


self.print_step(12, "Read TimeZoneListMaxSize")
if self.check_pics("TIMESYNC.S.A000a"):
if TZfeat == 'y':
size = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeZoneListMaxSize)
asserts.assert_greater_equal(size, 1, "TimeZoneListMaxSize must be at least 1")
asserts.assert_less_equal(size, 2, "TimeZoneListMaxSize must be max 2")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "TimeZoneListMaxSize is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(13, "Read DSTOffsetListMaxSize")
if self.check_pics("TIMESYNC.S.A000b"):
if TZfeat == 'y':
size = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.DSTOffsetListMaxSize)
asserts.assert_greater_equal(size, 1, "DSTOffsetListMaxSize must be at least 1")
elif self.check_pics("TIMESYNC.S.F00"):
asserts.assert_true(False, "DSTOffsetListMaxSize is mandatory if the TZ (TIMESYNC.S.F00) feature is supported")

self.print_step(14, "Read SupportsDNSResolve")
if self.check_pics("TIMESYNC.S.A0004"):
# bool typechecking happens in the test read functions, so all we need to do here is do the read
# bool typechecking happens in the test read functions, so all we need to do here is do the read
if NTPCfeat == 'y':
await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.SupportsDNSResolve)
elif self.check_pics("TIMESYNC.S.F01"):
asserts.assert_true(False, "SupportsDNSResolve is mandatory if the NTPC (TIMESYNC.S.F01) feature is supported")


if __name__ == "__main__":
default_matter_test_main()
12 changes: 3 additions & 9 deletions src/python_testing/TC_TIMESYNC_2_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,11 @@
from matter_testing_support import MatterBaseTest, async_test_body, compare_time, default_matter_test_main, utc_time_in_matter_epoch
from mobly import asserts


class TC_TIMESYNC_2_2(MatterBaseTest):
async def read_ts_attribute_expect_success(self, endpoint, attribute):
cluster = Clusters.Objects.TimeSynchronization
return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=attribute)

def pics_TC_TIMESYNC_2_2(self) -> list[str]:
return ["TIMESYNC.S"]

@async_test_body
async def test_TC_TIMESYNC_2_2(self):

Expand Down Expand Up @@ -78,11 +74,9 @@ async def test_TC_TIMESYNC_2_2(self):
compare_time(received=utc_dut, utc=th_utc, tolerance=tolerance)

self.print_step(5, "Read time source")
if self.check_pics("TIMESYNC.S.A0002"):
source = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeSource)
if utc_dut_initial is NullValue:
asserts.assert_equal(source, Clusters.Objects.TimeSynchronization.Enums.TimeSourceEnum.kAdmin)

source = await self.read_ts_attribute_expect_success(endpoint=endpoint, attribute=attributes.TimeSource)
if utc_dut_initial is NullValue:
asserts.assert_equal(source, Clusters.Objects.TimeSynchronization.Enums.TimeSourceEnum.kAdmin)

if __name__ == "__main__":
default_matter_test_main()

0 comments on commit a73c4c2

Please sign in to comment.