blob: fd3aa815c3bb6ae22e5aa83b5fd74351111b214b [file] [log] [blame]
#
# Copyright (c) 2023 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 os
import re
import chip.interaction_model
import pytest
from chip.clusters.Objects import AccessControl
from chip.clusters.Types import NullValue
from common.utils import (connect_device, disconnect_device, discover_device, get_setup_payload, read_zcl_attribute,
write_zcl_attribute)
log = logging.getLogger(__name__)
@pytest.fixture(scope="session")
def binaryPath(request, rootDir):
if request.config.getoption('binaryPath'):
return request.config.getoption('binaryPath')
else:
return os.path.join(rootDir, 'examples/all-clusters-app/openiotsdk/build/chip-openiotsdk-all-clusters-app-example.elf')
@pytest.fixture(scope="session")
def controllerConfig(request):
config = {
'vendorId': 0xFFF1,
'fabricId': 1,
'persistentStoragePath': '/tmp/openiotsdk-test-storage.json'
}
return config
@pytest.mark.smoketest
def test_smoke_test(device):
ret = device.wait_for_output("Open IoT SDK all-clusters-app example application start")
assert ret is not None and len(ret) > 0
ret = device.wait_for_output("Open IoT SDK all-clusters-app example application run")
assert ret is not None and len(ret) > 0
@pytest.mark.commissioningtest
def test_commissioning(device, controller):
assert controller is not None
devCtrl = controller
ret = device.wait_for_output("Open IoT SDK all-clusters-app example application start")
assert ret is not None and len(ret) > 0
setupPayload = get_setup_payload(device)
assert setupPayload is not None
commissionable_device = discover_device(devCtrl, setupPayload)
assert commissionable_device is not None
assert commissionable_device.vendorId == int(setupPayload.attributes['VendorID'])
assert commissionable_device.productId == int(setupPayload.attributes['ProductID'])
assert commissionable_device.addresses[0] is not None
nodeId = connect_device(devCtrl, setupPayload, commissionable_device)
assert nodeId is not None
log.info("Device {} connected".format(commissionable_device.addresses[0]))
ret = device.wait_for_output("Commissioning completed successfully")
assert ret is not None and len(ret) > 0
assert disconnect_device(devCtrl, nodeId)
ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID = 0
@pytest.mark.ctrltest
def test_clusters_ctrl(device, controller):
assert controller is not None
devCtrl = controller
ret = device.wait_for_output("Open IoT SDK all-clusters-app example application start")
assert ret is not None and len(ret) > 0
setupPayload = get_setup_payload(device)
assert setupPayload is not None
ret = device.wait_for_output("Current software version")
assert ret is not None and len(ret) > 1
version_app = ret[-1].split()[-2:]
commissionable_device = discover_device(devCtrl, setupPayload)
assert commissionable_device is not None
nodeId = connect_device(devCtrl, setupPayload, commissionable_device)
assert nodeId is not None
ret = device.wait_for_output("Commissioning completed successfully")
assert ret is not None and len(ret) > 0
acs = AccessControl.Structs()
ace = AccessControl.Enums()
# AccessControl cluster test - write entires
entry0 = acs.AccessControlEntryStruct(privilege=ace.AccessControlEntryPrivilegeEnum.kAdminister, authMode=ace.AccessControlEntryAuthModeEnum.kCase, subjects=NullValue, targets=[acs.AccessControlTargetStruct(
cluster=NullValue, endpoint=0, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=1, endpoint=NullValue, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=2, endpoint=3, deviceType=NullValue)], fabricIndex=1)
entry1 = acs.AccessControlEntryStruct(privilege=ace.AccessControlEntryPrivilegeEnum.kView, authMode=ace.AccessControlEntryAuthModeEnum.kCase, subjects=[4, 5, 6, 7], targets=[acs.AccessControlTargetStruct(
cluster=NullValue, endpoint=8, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=9, endpoint=NullValue, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=10, endpoint=11, deviceType=NullValue)], fabricIndex=1)
entry2 = acs.AccessControlEntryStruct(privilege=ace.AccessControlEntryPrivilegeEnum.kOperate, authMode=ace.AccessControlEntryAuthModeEnum.kGroup, subjects=[12, 13, 14, 15], targets=[acs.AccessControlTargetStruct(
cluster=NullValue, endpoint=16, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=17, endpoint=NullValue, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=18, endpoint=19, deviceType=NullValue)], fabricIndex=1)
entry3 = acs.AccessControlEntryStruct(privilege=ace.AccessControlEntryPrivilegeEnum.kOperate, authMode=ace.AccessControlEntryAuthModeEnum.kCase, subjects=[20, 21, 22, 23], targets=[acs.AccessControlTargetStruct(
cluster=NullValue, endpoint=24, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=25, endpoint=NullValue, deviceType=NullValue), acs.AccessControlTargetStruct(cluster=26, endpoint=27, deviceType=NullValue)], fabricIndex=1)
err, res = write_zcl_attribute(devCtrl, "AccessControl", "Acl", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID,
[entry0, entry1, entry2, entry3])
assert err == 0
assert res[0].Status == chip.interaction_model.Status.Success
err, res = read_zcl_attribute(devCtrl, "AccessControl", "Acl", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID)
assert err == 0
assert res.value[0] == entry0
assert res.value[1] == entry1
assert res.value[2] == entry2
assert res.value[3] == entry3
# BasicInformation cluster test - check vendor ID
err, res = read_zcl_attribute(devCtrl, "BasicInformation", "VendorID", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID)
assert err == 0
assert res.value == int(setupPayload.attributes['VendorID'])
# BasicInformation cluster test - check product ID
err, res = read_zcl_attribute(devCtrl, "BasicInformation", "ProductID", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID)
assert err == 0
assert res.value == int(setupPayload.attributes['ProductID'])
# BasicInformation cluster test - check software version
err, res = read_zcl_attribute(devCtrl, "BasicInformation", "SoftwareVersion", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID)
assert err == 0
assert res.value == int(re.sub(r"[\[\]]", "", version_app[0]))
# BasicInformation cluster test - check software version string
err, res = read_zcl_attribute(devCtrl, "BasicInformation", "SoftwareVersionString", nodeId, ALL_CLUSTERS_CTRL_TEST_ENDPOINT_ID)
assert err == 0
assert res.value == version_app[1]