Skip to content

Commit

Permalink
Add water heater management test scripts (project-chip#34340)
Browse files Browse the repository at this point in the history
* Add water heater management test scripts

* Define runner commands for WHM tests

* Specify --featureSet option on runner command line

* Add the --featureSet option to the RUNNER command line

* Apply suggestions from code review - corrected test step numbers to align to test plan PR.

* Apply suggestions from code review - Changing TestSteps into 3 entries

* Renamed EWATERHTRBase.py to TC_EWATERHTRBase.py. Changed TestStep to 3 args entries (to split out verification step for readability).

* Restyle fix.

* Update src/python_testing/TC_EWATERHTR_2_1.py

Co-authored-by: jamesharrow <[email protected]>

* Start addressing review comments from JamesH

* Remove water heater management app

* Address review comments from JamesH

* Address review comments from JamesH

* Address review comments from JamesH

* Address review comments from JamesH

* Update src/python_testing/TC_EWATERHTR_2_3.py

Co-authored-by: jamesharrow <[email protected]>

* Update src/python_testing/TC_EWATERHTR_2_3.py

Co-authored-by: jamesharrow <[email protected]>

* Update src/python_testing/TC_EWATERHTR_2_3.py

Co-authored-by: jamesharrow <[email protected]>

* Update src/python_testing/TC_EWATERHTR_2_3.py

Co-authored-by: jamesharrow <[email protected]>

* Update src/python_testing/TC_EWATERHTR_2_3.py

Co-authored-by: jamesharrow <[email protected]>

* Address review comments from JamesH

* Restyled by autopep8

* Restyled by isort

* Update src/python_testing/TC_EWATERHTR_2_1.py

* Update src/python_testing/TC_EWATERHTR_2_1.py

Removed assert TankVolume >= 0

* Restored TC_EEVSE_2_4.py from master

* Fixed issue raised on TC_EWATERHTR_2_1.py about checking that BoostState is in valid range.

---------

Co-authored-by: jamesharrow <[email protected]>
Co-authored-by: James Harrow <[email protected]>
Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
4 people authored and rochaferraz committed Jul 31, 2024
1 parent c951d51 commit c29efb9
Show file tree
Hide file tree
Showing 4 changed files with 878 additions and 0 deletions.
94 changes: 94 additions & 0 deletions src/python_testing/TC_EWATERHTRBase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#
# Copyright (c) 2024 Project CHIP Authors
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


import logging
import typing

import chip.clusters as Clusters
from chip.interaction_model import InteractionModelError, Status
from mobly import asserts

logger = logging.getLogger(__name__)


class EWATERHTRBase:

async def read_whm_attribute_expect_success(self, endpoint: int = None, attribute: str = ""):
cluster = Clusters.Objects.WaterHeaterManagement
full_attr = getattr(cluster.Attributes, attribute)
return await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=full_attr)

async def check_whm_attribute(self, attribute, expected_value, endpoint: int = None):
value = await self.read_whm_attribute_expect_success(endpoint=endpoint, attribute=attribute)
asserts.assert_equal(value, expected_value,
f"Unexpected '{attribute}' value - expected {expected_value}, was {value}")

async def send_boost_command(self, duration: int, one_shot: typing.Optional[bool] = None, emergency_boost: typing.Optional[bool] = None,
temporary_setpoint: typing.Optional[int] = None, target_percentage: typing.Optional[int] = None, target_reheat: typing.Optional[int] = None,
endpoint: int = None, timedRequestTimeoutMs: int = 3000,
expected_status: Status = Status.Success):
try:
await self.send_single_cmd(cmd=Clusters.WaterHeaterManagement.Commands.Boost(
duration=duration,
oneShot=one_shot,
emergencyBoost=emergency_boost,
temporarySetpoint=temporary_setpoint,
targetPercentage=target_percentage,
targetReheat=target_reheat),
endpoint=endpoint,
timedRequestTimeoutMs=timedRequestTimeoutMs)

asserts.assert_equal(expected_status, Status.Success)

except InteractionModelError as e:
asserts.assert_equal(e.status, expected_status, "Unexpected error returned")

async def send_cancel_boost_command(self, endpoint: int = None, timedRequestTimeoutMs: int = 3000,
expected_status: Status = Status.Success):
try:
await self.send_single_cmd(cmd=Clusters.WaterHeaterManagement.Commands.CancelBoost(),
endpoint=endpoint,
timedRequestTimeoutMs=timedRequestTimeoutMs)

asserts.assert_equal(expected_status, Status.Success)

except InteractionModelError as e:
asserts.assert_equal(e.status, expected_status, "Unexpected error returned")

async def send_test_event_trigger_basic_installation_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000000)

async def send_test_event_trigger_basic_installation_test_event_clear(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000001)

async def send_test_event_trigger_water_temperature20C_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000002)

async def send_test_event_trigger_water_temperature61C_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000003)

async def send_test_event_trigger_water_temperature66C_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000004)

async def send_test_event_trigger_manual_mode_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000005)

async def send_test_event_trigger_off_mode_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000006)

async def send_test_event_trigger_draw_off_hot_water_test_event(self):
await self.send_test_event_triggers(eventTrigger=0x0094000000000007)
121 changes: 121 additions & 0 deletions src/python_testing/TC_EWATERHTR_2_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#
# Copyright (c) 2024 Project CHIP Authors
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments
# for details about the block below.
#
# === BEGIN CI TEST ARGUMENTS ===# test-runner-runs: run1
# test-runner-run/run1/app: ${ALL_CLUSTERS_APP}
# test-runner-run/run1/factoryreset: True
# test-runner-run/run1/quiet: True
# test-runner-run/run1/app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json --enable-key 000102030405060708090a0b0c0d0e0f --featureSet 0x03
# test-runner-run/run1/script-args: --storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --hex-arg enableKey:000102030405060708090a0b0c0d0e0f --endpoint 1 --trace-to json:${TRACE_TEST_JSON}.json --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto --int-arg PIXIT.EWATERHTR.EM:1 PIXIT.EWATERHTR.TP:2
# === END CI TEST ARGUMENTS ===

import logging

import chip.clusters as Clusters
from matter_testing_support import MatterBaseTest, TestStep, async_test_body, default_matter_test_main
from mobly import asserts
from TC_EWATERHTRBase import EWATERHTRBase

logger = logging.getLogger(__name__)


class TC_EWATERHTR_2_1(MatterBaseTest, EWATERHTRBase):

def desc_TC_EWATERHTR_2_1(self) -> str:
"""Returns a description of this test"""
return "[TC-EWATERHTR-2.1] Attributes with attributes with DUT as Server\n" \
"This test case verifies the non-global attributes of the Water Heater Management cluster server."

def pics_TC_EWATERHTR_2_1(self):
""" This function returns a list of PICS for this test case that must be True for the test to be run"""
return ["EWATERHTR.S"]

def steps_TC_EWATERHTR_2_1(self) -> list[TestStep]:
steps = [
TestStep("1", "Commissioning, already done",
is_commissioning=True),
TestStep("2", "TH reads HeaterTypes attribute.",
"DUT as Server replies with a WaterHeaterTypeBitmap (enum8) greater than 0x00 (at least one type supported), and less than 0x20 (no undefined types supported)."),
TestStep("3", "TH reads HeatDemand attribute.",
"DUT as Server replies with a WaterHeaterDemandBitmap (enum8)."),
TestStep("4", "TH reads TankVolume attribute.",
"DUT as Server replies with a uint16 value."),
TestStep("5", "TH reads EstimatedHeatRequired attribute.",
"DUT as Server replies with an energy-mWh value."),
TestStep("6", "TH reads TankPercentage attribute.",
"DUT as Server replies with a percent value."),
TestStep("7", "TH reads BoostState attribute.",
"DUT as Server replies with a BoostStateEnum (enum8) value."),
]

return steps

@async_test_body
async def test_TC_EWATERHTR_2_1(self):

em_supported = self.matter_test_config.global_test_params['PIXIT.EWATERHTR.EM']
tp_supported = self.matter_test_config.global_test_params['PIXIT.EWATERHTR.TP']

self.step("1")
# Commission DUT - already done

self.step("2")
heaterTypes = await self.read_whm_attribute_expect_success(attribute="HeaterTypes")
asserts.assert_greater(heaterTypes, 0,
f"Unexpected HeaterTypes value - expected {heaterTypes} > 0")
asserts.assert_less_equal(heaterTypes, Clusters.WaterHeaterManagement.Bitmaps.WaterHeaterTypeBitmap.kOther,
f"Unexpected HeaterTypes value - expected {heaterTypes} <= WaterHeaterTypeBitmap.kOther")

self.step("3")
heatDemand = await self.read_whm_attribute_expect_success(attribute="HeatDemand")
asserts.assert_greater(heatDemand, 0,
f"Unexpected HeatDemand value - expected {heatDemand} > 0")
asserts.assert_less_equal(heatDemand, Clusters.WaterHeaterManagement.Bitmaps.WaterHeaterDemandBitmap.kOther,
f"Unexpected HeatDemand value - expected {heatDemand} <= WaterHeaterDemandBitmap.kOther")

self.step("4")
if em_supported:
value = await self.read_whm_attribute_expect_success(attribute="TankVolume")
else:
logging.info("Skipping step 4 as PIXIT.EWATERHTR.EM not supported")

self.step("5")
if em_supported:
value = await self.read_whm_attribute_expect_success(attribute="EstimatedHeatRequired")
asserts.assert_greater_equal(value, 0, f"Unexpected EstimatedHeatRequired value - expected {value} >= 0")
else:
logging.info("Skipping step 5 as PIXIT.EWATERHTR.EM not supported")

self.step("6")
if tp_supported:
value = await self.read_whm_attribute_expect_success(attribute="TankPercentage")
asserts.assert_greater_equal(value, 0, f"Unexpected TankPercentage value - expected {value} >= 0")
asserts.assert_less_equal(value, 100, f"Unexpected TankPercentage value - expected {value} <= 100")
else:
logging.info("Skipping step 6 as PIXIT.EWATERHTR.TP not supported")

self.step("7")
boost_state = await self.read_whm_attribute_expect_success(attribute="BoostState")
asserts.assert_less_equal(boost_state, Clusters.WaterHeaterManagement.Enums.BoostStateEnum.kInactive,
f"Unexpected BoostState value - expected {boost_state} should be BoostStateEnum (enum8) value in range 0x00 to 0x01")


if __name__ == "__main__":
default_matter_test_main()
Loading

0 comments on commit c29efb9

Please sign in to comment.