From f3c5a411c26e7e7b0192c0f63081fd3ff22d5c30 Mon Sep 17 00:00:00 2001 From: Abhinavpv28 <162570454+Abhinavpv28@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:01:19 +0530 Subject: [PATCH 1/5] RDKEMW-21374: Fix L2 Upload Results to Automatics Error (#508) * Refactor Docker exec command in L2-tests.yml * Update L2-tests.yml --------- Co-authored-by: nhanasi --- .github/workflows/L2-tests.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/L2-tests.yml b/.github/workflows/L2-tests.yml index 0bf905aeb..ec9248ddd 100644 --- a/.github/workflows/L2-tests.yml +++ b/.github/workflows/L2-tests.yml @@ -63,13 +63,11 @@ jobs: with: install: true - - name: Run RDK CI Container - run: | - docker run -d --name ci-container -e AUTOMATICS_UNAME=${{ secrets.AUTOMATICS_UNAME }} -e AUTOMATICS_PASSCODE=${{ secrets.AUTOMATICS_PASSCODE }} -v /tmp/L2_TEST_RESULTS:/tmp/L2_TEST_RESULTS ghcr.io/rdkcentral/docker-rdk-ci:latest tail -f /dev/null + - name: Run CI container + run: docker run -e AUTOMATICS_UNAME=${{ secrets.AUTOMATICS_UNAME }} -e AUTOMATICS_PASSCODE=${{ secrets.AUTOMATICS_PASSCODE }} -v ${{ github.workspace }}:/mnt/L2_CONTAINER_SHARED_VOLUME --name ci-container -d ghcr.io/rdkcentral/docker-rdk-ci:latest tail -f /dev/null - name: Upload Results to Automatics if: github.repository_owner == 'rdkcentral' run: | docker cp /tmp/L2_TEST_RESULTS ci-container:/tmp/L2_TEST_RESULTS - docker exec -i ci-container bash -c "echo 'Contents in workspace directory' && ls -l && echo '===============================' && echo 'Contents in /tmp/L2_TEST_RESULTS' && ls -l /tmp/L2_TEST_RESULTS && echo '===============================' && git config --global --add safe.directory /mnt/L2_CONTAINER_SHARED_VOLUME && gtest-json-result-push.py /tmp/L2_TEST_RESULTS https://rdkeorchestrationservice.apps.cloud.comcast.net/rdke_orchestration_api/push_unit_test_results /mnt/L2_CONTAINER_SHARED_VOLUME" - + docker exec -i ci-container bash -c "cd /mnt/L2_CONTAINER_SHARED_VOLUME && echo 'Contents in workspace directory' && ls -l . && echo '===============================' && echo 'Contents in /tmp/L2_TEST_RESULTS' && ls -l /tmp/L2_TEST_RESULTS && echo '===============================' && git config --global --add safe.directory /mnt/L2_CONTAINER_SHARED_VOLUME && gtest-json-result-push.py /tmp/L2_TEST_RESULTS https://rdkeorchestrationservice.apps.cloud.comcast.net/rdke_orchestration_api/push_unit_test_results /mnt/L2_CONTAINER_SHARED_VOLUME" From d7f0f9ec5aa13eff7faa1ece42659fc8f0daaf7c Mon Sep 17 00:00:00 2001 From: madhubabutt <114217841+madhubabutt@users.noreply.github.com> Date: Thu, 16 Jul 2026 23:05:55 +0530 Subject: [PATCH 2/5] RDKEMW-20790 : Improve L2 Coverage for tr69hostif (#507) Co-authored-by: mtirum011 --- run_l2.sh | 7 + .../features/tr69hostif_bluetooth.feature | 107 +++++++ .../features/tr69hostif_custom.feature | 51 +++- .../features/tr69hostif_device_info.feature | 153 ++++++++++ .../features/tr69hostif_devicetime.feature | 17 ++ .../tr69hostif_ethernet_handlers.feature | 26 +- .../tr69hostif_interfacestack.feature | 39 +++ .../features/tr69hostif_ip.feature | 97 +++++- .../features/tr69hostif_moca.feature | 24 ++ .../tr69hostif_opsdevicemgmt_logging.feature | 59 ++++ .../tr69hostif_opsdevicemgmt_rpc.feature | 71 +++++ ...tr69hostif_processor_processstatus.feature | 7 + .../tr69hostif_storageservice.feature | 86 ++++++ .../tr69hostif_webpa_rdkdlmgr.feature | 8 + .../functional-tests/tests/basic_constants.py | 3 + .../tests/tr69hostif_bluetooth.py | 279 ++++++++++++++++++ .../tests/tr69hostif_custom.py | 62 ++++ .../tests/tr69hostif_device_info.py | 276 +++++++++++++++++ .../tests/tr69hostif_devicetime.py | 30 ++ .../tests/tr69hostif_ethernet_handlers.py | 92 ++++-- .../tests/tr69hostif_interfacestack.py | 47 +++ test/functional-tests/tests/tr69hostif_ip.py | 266 ++++++++++++++--- .../tests/tr69hostif_ipremotesupport.py | 10 +- .../functional-tests/tests/tr69hostif_moca.py | 70 +++++ .../tests/tr69hostif_opsdevicemgmt_logging.py | 90 ++++++ .../tests/tr69hostif_opsdevicemgmt_rpc.py | 118 ++++++++ .../tr69hostif_processor_processstatus.py | 24 +- .../tests/tr69hostif_rfc_store_params.py | 22 +- .../tests/tr69hostif_storageservice.py | 132 +++++++++ .../tests/tr69hostif_webpa_rdkdlmgr.py | 14 + 30 files changed, 2187 insertions(+), 100 deletions(-) create mode 100755 test/functional-tests/features/tr69hostif_bluetooth.feature create mode 100755 test/functional-tests/features/tr69hostif_device_info.feature create mode 100755 test/functional-tests/features/tr69hostif_interfacestack.feature create mode 100755 test/functional-tests/features/tr69hostif_opsdevicemgmt_logging.feature create mode 100755 test/functional-tests/features/tr69hostif_opsdevicemgmt_rpc.feature create mode 100755 test/functional-tests/features/tr69hostif_storageservice.feature create mode 100755 test/functional-tests/tests/tr69hostif_bluetooth.py create mode 100755 test/functional-tests/tests/tr69hostif_device_info.py mode change 100644 => 100755 test/functional-tests/tests/tr69hostif_ethernet_handlers.py create mode 100755 test/functional-tests/tests/tr69hostif_interfacestack.py mode change 100644 => 100755 test/functional-tests/tests/tr69hostif_ip.py mode change 100644 => 100755 test/functional-tests/tests/tr69hostif_ipremotesupport.py mode change 100644 => 100755 test/functional-tests/tests/tr69hostif_moca.py create mode 100755 test/functional-tests/tests/tr69hostif_opsdevicemgmt_logging.py create mode 100755 test/functional-tests/tests/tr69hostif_opsdevicemgmt_rpc.py create mode 100755 test/functional-tests/tests/tr69hostif_storageservice.py diff --git a/run_l2.sh b/run_l2.sh index f2598d9b4..ca0ba69e8 100644 --- a/run_l2.sh +++ b/run_l2.sh @@ -44,6 +44,7 @@ echo "Status|Download In Progress" >> /opt/fwdnldstatus.txt echo "DnldFile|TESTIMAGE_DEV.bin" >> /opt/fwdnldstatus.txt echo "DnldURL|https://mockserver.tv/Images" >> /opt/fwdnldstatus.txt echo "FwUpdateState|Download complete" >> /opt/fwdnldstatus.txt +echo "uploaded" > /opt/loguploadstatus.txt cp ./src/integrationtest/conf/mgrlist.conf /etc/ @@ -95,6 +96,12 @@ pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/custom pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/dhcpv4.json test/functional-tests/tests/tr69hostif_dhcpv4.py pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/moca.json test/functional-tests/tests/tr69hostif_moca.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/device_info.json test/functional-tests/tests/tr69hostif_device_info.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/interfacestack.json test/functional-tests/tests/tr69hostif_interfacestack.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/opsdevicemgmt_logging.json test/functional-tests/tests/tr69hostif_opsdevicemgmt_logging.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/opsdevicemgmt_rpc.json test/functional-tests/tests/tr69hostif_opsdevicemgmt_rpc.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/storageservice.json test/functional-tests/tests/tr69hostif_storageservice.py +pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/bluetooth.json test/functional-tests/tests/tr69hostif_bluetooth.py pkill -f thunder-mock-server.js pytest --json-report --json-report-summary --json-report-file $RESULT_DIR/thunder_negative_edge.json test/functional-tests/tests/tr69hostif_thunder_negative_edge_cases.py diff --git a/test/functional-tests/features/tr69hostif_bluetooth.feature b/test/functional-tests/features/tr69hostif_bluetooth.feature new file mode 100755 index 000000000..77f115c64 --- /dev/null +++ b/test/functional-tests/features/tr69hostif_bluetooth.feature @@ -0,0 +1,107 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses.txt file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: ../tests/tr69hostif_bluetooth.py +# Source implementation: src/hostif/profiles/DeviceInfo/XrdkBlueTooth.cpp +# Feature: tr69hostif_bluetooth.feature + +Feature: Bluetooth xBlueTooth Parameter Handler Validation + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario Outline: GET xBlueTooth top-level parameters returns error + When I GET "" via rbus + Then the rbus response should contain an error + + Examples: + | parameter | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.enable | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveryEnabled | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDeviceCnt| + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.PairedDeviceCnt | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.ConnectedDeviceCnt | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.GetDeviceInfo | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.LimitBeaconDetection | + + Scenario Outline: GET xBlueTooth DeviceInfo parameters returns error + When I GET "" via rbus + Then the rbus response should contain an error + + Examples: + | parameter | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.DeviceID | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.Manufacturer | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.Profile | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.MAC | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.SignalStrength | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DeviceInfo.RSSI | + + Scenario Outline: GET xBlueTooth discovered and paired list parameters returns error + When I GET "" via rbus + Then the rbus response should contain an error + + Examples: + | parameter | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDevice.1.Name | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDevice.1.DeviceID | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDevice.1.DeviceType | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDevice.1.Paired | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.DiscoveredDevice.1.Connected | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.PairedDevice.1.Name | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.PairedDevice.1.DeviceID | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.PairedDevice.1.Connected | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.PairedDevice.1.DeviceType | + + Scenario Outline: GET xBlueTooth connected device list parameters returns error + When I GET "" via rbus + Then the rbus response should contain an error + + Examples: + | parameter | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.ConnectedDevice.1.Name | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.ConnectedDevice.1.DeviceID | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.ConnectedDevice.1.DeviceType | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.ConnectedDevice.1.Active | + + Scenario Outline: SET xBlueTooth writable parameters returns set failure + When I SET "" to "" as via rbus + Then the rbus set response should contain "setvalues failed" + + Examples: + | parameter | type | value | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.GetDeviceInfo | int | 1 | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.LimitBeaconDetection | boolean | true | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.Id | string | TILE-TEST-001 | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.SessionId | string | SESSION-TEST-001 | + | Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Cmd.Request | string | test-cmd | + + Scenario: GET xBlueTooth BLE Tile Ring parameters returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.Id" via rbus + Then the rbus response should contain an error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.SessionId" via rbus + Then the rbus response should contain an error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.Trigger" via rbus + Then the rbus response should contain an error + + Scenario: SET xBlueTooth BLE Tile Ring Trigger returns set failure + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.Id" to "TILE-TEST-001" as string via rbus + And I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.BLE.Tile.Ring.Trigger" to "false" as boolean via rbus + Then the rbus set response should contain "setvalues failed" diff --git a/test/functional-tests/features/tr69hostif_custom.feature b/test/functional-tests/features/tr69hostif_custom.feature index 7e377c1d0..a61e53b22 100755 --- a/test/functional-tests/features/tr69hostif_custom.feature +++ b/test/functional-tests/features/tr69hostif_custom.feature @@ -41,8 +41,6 @@ Feature: Comcast/RDK Custom Parameter GET and SET via rbus | Device.DeviceInfo.X_RDKCENTRAL-COM.CPUTemp | | Device.DeviceInfo.X_RDKCENTRAL-COM_Experience | | Device.DeviceInfo.X_RDK_FirmwareName | - | Device.DeviceInfo.X_RDKCENTRAL-COM_MigrationPreparer.MigrationReady | - | Device.DeviceInfo.X_RDKCENTRAL-COM_Migration.MigrationStatus | Scenario Outline: SET then GET writable custom parameter When I SET "" to "" as via rbus @@ -52,15 +50,60 @@ Feature: Comcast/RDK Custom Parameter GET and SET via rbus Examples: | parameter | type | value | | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareToDownload | string | fw_image.bin | - | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus| string | IDLE | | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadProtocol | string | https | | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadURL | string | https://example.com/fw.bin | - | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadUseCodebig | boolean | true | | Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadDeferReboot | boolean | true | | Device.DeviceInfo.X_RDKCENTRAL-COM_PreferredGatewayType | string | DOCSIS | | Device.DeviceInfo.X_RDKCENTRAL-COM.IUI.Version | string | 1.0.0 | | Device.DeviceInfo.X_RDKCENTRAL-COM.IUI.AppsVersion | string | 1.0.0 | + Scenario: GET Device.DeviceInfo.X_COMCAST-COM_STB_MAC returns error + When I GET "Device.DeviceInfo.X_COMCAST-COM_STB_MAC" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus returns error + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus" to "IDLE" as string via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus" via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadUseCodebig + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadUseCodebig" to "true" as boolean via rbus + Then the rbus response should indicate success + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadUseCodebig returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadUseCodebig" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadPercent returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadPercent" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_LastRebootReason returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_LastRebootReason" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_MigrationPreparer.MigrationReady returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_MigrationPreparer.MigrationReady" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_Migration.MigrationStatus returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_Migration.MigrationStatus" via rbus + Then the rbus response should contain an error + + Scenario: SET and GET FirmwareDownloadProtocol COMCAST alias value + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadProtocol" to "http" as string via rbus + And I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadProtocol" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "http" + + Scenario: SET and GET FirmwareDownloadURL COMCAST alias value + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadURL" to "https://example.com/fw-comcast.bin" as string via rbus + And I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadURL" via rbus + Then the rbus response should not contain an error + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_Reset When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_Reset" to "Factory" as string via rbus Then the rbus response should indicate success diff --git a/test/functional-tests/features/tr69hostif_device_info.feature b/test/functional-tests/features/tr69hostif_device_info.feature new file mode 100755 index 000000000..8bf06c267 --- /dev/null +++ b/test/functional-tests/features/tr69hostif_device_info.feature @@ -0,0 +1,153 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses.txt file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: ../tests/tr69hostif_device_info.py +# Feature: tr69hostif_device_info.feature + +Feature: DeviceInfo Extended Parameter GET/SET Handler Validation + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario: GET Device.DeviceInfo.AdditionalHardwareVersion returns error + When I GET "Device.DeviceInfo.AdditionalHardwareVersion" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.AdditionalSoftwareVersion returns error + When I GET "Device.DeviceInfo.AdditionalSoftwareVersion" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.FirstUseDate returns error + When I GET "Device.DeviceInfo.FirstUseDate" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.HardwareVersion returns error + When I GET "Device.DeviceInfo.HardwareVersion" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.Manufacturer returns error + When I GET "Device.DeviceInfo.Manufacturer" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.ManufacturerOUI returns error + When I GET "Device.DeviceInfo.ManufacturerOUI" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.Migration.MigrationStatus + When I GET "Device.DeviceInfo.Migration.MigrationStatus" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.MigrationPreparer.MigrationReady returns error + When I GET "Device.DeviceInfo.MigrationPreparer.MigrationReady" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.SerialNumber returns error + When I GET "Device.DeviceInfo.SerialNumber" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.SupportedDataModelNumberOfEntries + When I GET "Device.DeviceInfo.SupportedDataModelNumberOfEntries" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.VendorConfigFileNumberOfEntries returns error + When I GET "Device.DeviceInfo.VendorConfigFileNumberOfEntries" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.VendorLogFileNumberOfEntries returns error + When I GET "Device.DeviceInfo.VendorLogFileNumberOfEntries" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus + When I GET "Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_COMCAST-COM_FirmwareToDownload + When I GET "Device.DeviceInfo.X_COMCAST-COM_FirmwareToDownload" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_COMCAST-COM_Reset returns error + When I GET "Device.DeviceInfo.X_COMCAST-COM_Reset" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_RDKVersion + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_RDKVersion" via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist" to "sample-profile:enforce" as string via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist" via rbus + Then the rbus response should contain an error + + Scenario: SET and GET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.Blocklist + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.Blocklist" to "sample-block-entry" as string via rbus + And I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.Blocklist" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "sample-block-entry" + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action returns error + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action" to "XRPoll" as string via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action returns error + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus returns error + When I SET "Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus" to "IDLE" as string via rbus + Then the rbus response should contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareToDownload + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareToDownload" to "fw_image.bin" as string via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_COMCAST-COM_Reset + When I SET "Device.DeviceInfo.X_COMCAST-COM_Reset" to "Factory" as string via rbus + Then the rbus response should not contain an error + + Scenario: SET and GET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Detection + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Detection" to "true" as boolean via rbus + And I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Detection" via rbus + Then the rbus response should not contain an error + + Scenario: SET and GET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Duration + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Duration" to "10" as int via rbus + And I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Duration" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "10" + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger to start + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger" to "start" as string via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger to stop + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger" to "stop" as string via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable to true + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable" to "true" as boolean via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable to false + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable" to "false" as boolean via rbus + Then the rbus response should not contain an error + diff --git a/test/functional-tests/features/tr69hostif_devicetime.feature b/test/functional-tests/features/tr69hostif_devicetime.feature index 3315b4472..3433991b3 100755 --- a/test/functional-tests/features/tr69hostif_devicetime.feature +++ b/test/functional-tests/features/tr69hostif_devicetime.feature @@ -74,6 +74,23 @@ Feature: Device.Time Parameter GET/SET via rbus Then the rbus response should not contain an error And the rbus response should contain "UTC" + Scenario: SET Device.Time.LocalTimeZone returns error + When I SET "Device.Time.LocalTimeZone" to "UTC" as string via rbus + Then the rbus response should contain an error + Scenario: GET Device.Time.X_RDK_CurrentUTCTime When I GET "Device.Time.X_RDK_CurrentUTCTime" via rbus Then the rbus response should not contain an error + + Scenario: SET Device.Time.Enable to true returns error + When I SET "Device.Time.Enable" to "true" as boolean via rbus + Then the rbus response should contain an error + + Scenario: GET Device.Time.Enable remains false + When I GET "Device.Time.Enable" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "false" + + Scenario: SET Device.Time.Enable to false returns error + When I SET "Device.Time.Enable" to "false" as boolean via rbus + Then the rbus response should contain an error diff --git a/test/functional-tests/features/tr69hostif_ethernet_handlers.feature b/test/functional-tests/features/tr69hostif_ethernet_handlers.feature index 3078ab2bd..2bb6a0b7b 100755 --- a/test/functional-tests/features/tr69hostif_ethernet_handlers.feature +++ b/test/functional-tests/features/tr69hostif_ethernet_handlers.feature @@ -20,7 +20,7 @@ # Source: ../tests/tr69hostif_ethernet_handlers.py # Feature: tr69hostif_ethernet_handlers.feature -Feature: Ethernet Interface and Stats GET Handler Validation +Feature: Ethernet Interface and Stats GET/SET Handler Validation Background: Given the tr69hostif daemon is running and initialized @@ -36,11 +36,23 @@ Feature: Ethernet Interface and Stats GET Handler Validation Then the rbus response should not contain an error And the rbus response should contain "eth0" + Scenario: SET Device.Ethernet.Interface.1.Enable + When I SET "Device.Ethernet.Interface.1.Enable" to "true" as boolean via rbus + Then the rbus response should not contain an error + Scenario: GET Device.Ethernet.Interface.1.Enable When I GET "Device.Ethernet.Interface.1.Enable" via rbus Then the rbus response should not contain an error And the rbus response should contain "true" + Scenario: SET Device.Ethernet.Interface.1.Alias returns error + When I SET "Device.Ethernet.Interface.1.Alias" to "eth0_alias" as string via rbus + Then the rbus response should contain an error + + Scenario: GET Device.Ethernet.Interface.1.Alias returns error + When I GET "Device.Ethernet.Interface.1.Alias" via rbus + Then the rbus response should contain an error + Scenario: GET Device.Ethernet.Interface.1.Status When I GET "Device.Ethernet.Interface.1.Status" via rbus Then the rbus response should not contain an error @@ -50,6 +62,10 @@ Feature: Ethernet Interface and Stats GET Handler Validation When I GET "Device.Ethernet.Interface.1.LastChange" via rbus Then the rbus response should contain an error + Scenario: SET Device.Ethernet.Interface.1.LowerLayers returns error + When I SET "Device.Ethernet.Interface.1.LowerLayers" to "eth0" as string via rbus + Then the rbus response should contain an error + Scenario: GET Device.Ethernet.Interface.1.LowerLayers returns error When I GET "Device.Ethernet.Interface.1.LowerLayers" via rbus Then the rbus response should contain an error @@ -63,10 +79,18 @@ Feature: Ethernet Interface and Stats GET Handler Validation When I GET "Device.Ethernet.Interface.1.MACAddress" via rbus Then the rbus response should not contain an error + Scenario: SET Device.Ethernet.Interface.1.MaxBitRate + When I SET "Device.Ethernet.Interface.1.MaxBitRate" to "1000" as int via rbus + Then the rbus response should not contain an error + Scenario: GET Device.Ethernet.Interface.1.MaxBitRate When I GET "Device.Ethernet.Interface.1.MaxBitRate" via rbus Then the rbus response should not contain an error + Scenario: SET Device.Ethernet.Interface.1.DuplexMode returns error + When I SET "Device.Ethernet.Interface.1.DuplexMode" to "full" as string via rbus + Then the rbus response should contain an error + Scenario: GET Device.Ethernet.Interface.1.DuplexMode When I GET "Device.Ethernet.Interface.1.DuplexMode" via rbus Then the rbus response should not contain an error diff --git a/test/functional-tests/features/tr69hostif_interfacestack.feature b/test/functional-tests/features/tr69hostif_interfacestack.feature new file mode 100755 index 000000000..f251a1db0 --- /dev/null +++ b/test/functional-tests/features/tr69hostif_interfacestack.feature @@ -0,0 +1,39 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses.txt file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: ../tests/tr69hostif_interfacestack.py +# Feature: tr69hostif_interfacestack.feature + +Feature: InterfaceStack Parameter Handler Validation + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario: GET Device.InterfaceStackNumberOfEntries + When I GET "Device.InterfaceStackNumberOfEntries" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.InterfaceStack.1.HigherLayer + When I GET "Device.InterfaceStack.1.HigherLayer" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.InterfaceStack.1.LowerLayer + When I GET "Device.InterfaceStack.1.LowerLayer" via rbus + Then the rbus response should contain an error diff --git a/test/functional-tests/features/tr69hostif_ip.feature b/test/functional-tests/features/tr69hostif_ip.feature index 933c4cfe7..6cb0042d2 100755 --- a/test/functional-tests/features/tr69hostif_ip.feature +++ b/test/functional-tests/features/tr69hostif_ip.feature @@ -18,7 +18,7 @@ #################################################################################### -Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers +Feature: Device.IP Interface, Address, Stats and ActivePort GET/SET Handlers Background: Given the tr69hostif daemon is running and initialized @@ -33,6 +33,26 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers | Device.IP.InterfaceNumberOfEntries | | Device.IP.ActivePortNumberOfEntries | + Scenario: SET and GET Device.IP.Interface.1.Enable + When I SET "Device.IP.Interface.1.Enable" to "true" as boolean via rbus + And I GET "Device.IP.Interface.1.Enable" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "true" + + Scenario: SET and GET Device.IP.Interface.1.IPv4Enable + When I SET "Device.IP.Interface.1.IPv4Enable" to "true" as boolean via rbus + And I GET "Device.IP.Interface.1.IPv4Enable" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "true" + + Scenario: SET Device.IP.Interface.1.IPv6Enable returns error + When I SET "Device.IP.Interface.1.IPv6Enable" to "true" as boolean via rbus + Then the rbus response should contain an error + + Scenario: SET Device.IP.Interface.1.ULAEnable returns error + When I SET "Device.IP.Interface.1.ULAEnable" to "true" as boolean via rbus + Then the rbus response should contain an error + Scenario Outline: GET Device.IP.Interface.1 core parameters with expected values When I GET "" via rbus Then the rbus response should not contain an error @@ -48,10 +68,42 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers | Device.IP.Interface.1.Type | Loopback | | Device.IP.Interface.1.Loopback | true | + Scenario: GET Device.IP.Interface.1.ULAEnable returns error + When I GET "Device.IP.Interface.1.ULAEnable" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.IP.Interface.1.Alias returns error + When I SET "Device.IP.Interface.1.Alias" to "ip_interface_alias" as string via rbus + Then the rbus response should contain an error + + Scenario: GET Device.IP.Interface.1.Alias returns error + When I GET "Device.IP.Interface.1.Alias" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.IP.Interface.1.LastChange returns error + When I GET "Device.IP.Interface.1.LastChange" via rbus + Then the rbus response should contain an error + Scenario: GET Device.IP.Interface.1.LowerLayers When I GET "Device.IP.Interface.1.LowerLayers" via rbus Then the rbus response should not contain an error + Scenario: SET Device.IP.Interface.1.LowerLayers returns error + When I SET "Device.IP.Interface.1.LowerLayers" to "eth0" as string via rbus + Then the rbus response should contain an error + + Scenario: SET Device.IP.Interface.1.Router returns error + When I SET "Device.IP.Interface.1.Router" to "true" as boolean via rbus + Then the rbus response should contain an error + + Scenario: GET Device.IP.Interface.1.Router returns error + When I GET "Device.IP.Interface.1.Router" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.IP.Interface.1.Loopback returns error + When I SET "Device.IP.Interface.1.Loopback" to "true" as boolean via rbus + Then the rbus response should contain an error + Scenario Outline: GET Device.IP.Interface.1.IPv4Address.1 parameters with expected values When I GET "" via rbus Then the rbus response should not contain an error @@ -70,6 +122,36 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers When I GET "Device.IP.Interface.1.IPv4AddressNumberOfEntries" via rbus Then the rbus response should not contain an error + Scenario: GET Device.IP.Interface.1.IPv6AddressNumberOfEntries + When I GET "Device.IP.Interface.1.IPv6AddressNumberOfEntries" via rbus + Then the rbus response should not contain an error + + Scenario: SET and GET Device.IP.Interface.1.IPv4Address.1.Enable + When I SET "Device.IP.Interface.1.IPv4Address.1.Enable" to "true" as boolean via rbus + And I GET "Device.IP.Interface.1.IPv4Address.1.Enable" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "true" + + Scenario: SET Device.IP.Interface.1.IPv4Address.1.Alias returns error + When I SET "Device.IP.Interface.1.IPv4Address.1.Alias" to "ipv4_alias" as string via rbus + Then the rbus response should contain an error + + Scenario: GET Device.IP.Interface.1.IPv4Address.1.Alias returns error + When I GET "Device.IP.Interface.1.IPv4Address.1.Alias" via rbus + Then the rbus response should contain an error + + Scenario: SET and GET Device.IP.Interface.1.IPv4Address.1.IPAddress + When I SET "Device.IP.Interface.1.IPv4Address.1.IPAddress" to "127.0.0.1" as string via rbus + And I GET "Device.IP.Interface.1.IPv4Address.1.IPAddress" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "127.0.0.1" + + Scenario: SET and GET Device.IP.Interface.1.IPv4Address.1.SubnetMask + When I SET "Device.IP.Interface.1.IPv4Address.1.SubnetMask" to "255.0.0.0" as string via rbus + And I GET "Device.IP.Interface.1.IPv4Address.1.SubnetMask" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "255.0.0.0" + Scenario Outline: GET Device.IP.Interface.1.IPv6Address.1 key parameters When I GET "" via rbus Then the rbus response should not contain an error @@ -83,6 +165,14 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers | Device.IP.Interface.1.IPv6Address.1.Origin | WellKnown | | Device.IP.Interface.1.IPv6Address.1.Anycast | false | + Scenario: SET Device.IP.Interface.1.IPv6Address.1.Enable returns error + When I SET "Device.IP.Interface.1.IPv6Address.1.Enable" to "true" as boolean via rbus + Then the rbus response should contain an error + + Scenario: SET Device.IP.Interface.1.IPv6Address.1.IPAddress returns error + When I SET "Device.IP.Interface.1.IPv6Address.1.IPAddress" to "::1" as string via rbus + Then the rbus response should contain an error + Scenario Outline: GET Device.IP.Interface.1.IPv6Address.1 additional parameters When I GET "" via rbus Then the rbus response should not contain an error @@ -117,6 +207,7 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers | Device.IP.Interface.1.Stats.BytesSent | | Device.IP.Interface.1.Stats.BytesReceived | | Device.IP.Interface.1.Stats.PacketsSent | + | Device.IP.Interface.1.Stats.PacketsReceived | | Device.IP.Interface.1.Stats.ErrorsSent | | Device.IP.Interface.1.Stats.ErrorsReceived | | Device.IP.Interface.1.Stats.UnicastPacketsSent | @@ -143,3 +234,7 @@ Feature: Device.IP Interface, Address, Stats and ActivePort GET Handlers Scenario: GET Device.IP.ActivePort.1.LocalPort When I GET "Device.IP.ActivePort.1.LocalPort" via rbus Then the rbus response should not contain an error + + Scenario: GET Device.IP.ActivePort.1.Status + When I GET "Device.IP.ActivePort.1.Status" via rbus + Then the rbus response should not contain an error diff --git a/test/functional-tests/features/tr69hostif_moca.feature b/test/functional-tests/features/tr69hostif_moca.feature index 5e56a6f22..20b555196 100644 --- a/test/functional-tests/features/tr69hostif_moca.feature +++ b/test/functional-tests/features/tr69hostif_moca.feature @@ -238,3 +238,27 @@ Feature: MoCA Interface Parameter Handler Validation When I SET "Device.MoCA.Interface.1.LowerLayers" to "" as string via rbus Then the rbus set response should contain "setvalues failed" + Scenario: GET Device.MoCA.Interface.1.KeyPassphrase + When I GET "Device.MoCA.Interface.1.KeyPassphrase" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.MoCA.Interface.1.TxPowerLimit + When I GET "Device.MoCA.Interface.1.TxPowerLimit" via rbus + Then the rbus response should contain an error + + Scenario: GET Device.MoCA.Interface.1.BeaconPowerLimit + When I GET "Device.MoCA.Interface.1.BeaconPowerLimit" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.MoCA.Interface.1.KeyPassphrase + When I SET "Device.MoCA.Interface.1.KeyPassphrase" to "123456" as string via rbus + Then the rbus set response should contain "setvalues failed" + + Scenario: SET Device.MoCA.Interface.1.TxPowerLimit + When I SET "Device.MoCA.Interface.1.TxPowerLimit" to "0" as int via rbus + Then the rbus set response should contain "setvalues failed" + + Scenario: SET Device.MoCA.Interface.1.BeaconPowerLimit + When I SET "Device.MoCA.Interface.1.BeaconPowerLimit" to "0" as int via rbus + Then the rbus set response should contain "setvalues failed" + diff --git a/test/functional-tests/features/tr69hostif_opsdevicemgmt_logging.feature b/test/functional-tests/features/tr69hostif_opsdevicemgmt_logging.feature new file mode 100755 index 000000000..b60caf48b --- /dev/null +++ b/test/functional-tests/features/tr69hostif_opsdevicemgmt_logging.feature @@ -0,0 +1,59 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses.txt file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: ../tests/tr69hostif_opsdevicemgmt_logging.py +# Feature: tr69hostif_opsdevicemgmt_logging.feature + +Feature: xOpsDeviceMgmt Logging Parameter Handler Validation + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow" to "true" as boolean via rbus + Then the rbus response should not contain an error + And the log should contain "Start executing script to upload logs... " + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "false" + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMLogsUploadStatus + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMLogsUploadStatus" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "uploaded" + And the log should contain "Successfully read from /opt/loguploadstatus.txt." + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled" to "true" as boolean via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled" via rbus + Then the rbus response should contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod" to "300" as int via rbus + Then the rbus response should contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod" via rbus + Then the rbus response should contain an error diff --git a/test/functional-tests/features/tr69hostif_opsdevicemgmt_rpc.feature b/test/functional-tests/features/tr69hostif_opsdevicemgmt_rpc.feature new file mode 100755 index 000000000..864e0601f --- /dev/null +++ b/test/functional-tests/features/tr69hostif_opsdevicemgmt_rpc.feature @@ -0,0 +1,71 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses.txt file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: ../tests/tr69hostif_opsdevicemgmt_rpc.py +# Feature: tr69hostif_opsdevicemgmt_rpc.feature + +Feature: xOpsDeviceMgmt RPC Parameter Handler Validation + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow to true + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow" to "true" as boolean via rbus + Then the rbus response should not contain an error + And the log should contain "Successfully executed reboot script" + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow to false + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow" to "false" as boolean via rbus + Then the rbus response should not contain an error + And the log should contain "Not rebooting. Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow = false" + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification" to "manageable" as string via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification" via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification" to "started" as string via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification" via rbus + Then the rbus response should not contain an error + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification" to "false" as boolean via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "false" + + Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification + When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification" to "0" as uint32 via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification + When I GET "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification" via rbus + Then the rbus response should not contain an error + And the rbus response should contain "0" diff --git a/test/functional-tests/features/tr69hostif_processor_processstatus.feature b/test/functional-tests/features/tr69hostif_processor_processstatus.feature index 43c3cbdc1..974eb1f45 100755 --- a/test/functional-tests/features/tr69hostif_processor_processstatus.feature +++ b/test/functional-tests/features/tr69hostif_processor_processstatus.feature @@ -58,3 +58,10 @@ Feature: Processor and ProcessStatus Parameter GET via rbus Scenario: GET Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries When I GET "Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries" via rbus Then the rbus response should not contain an error + + Scenario: GET Device.DeviceInfo.ProcessStatus.CPUUsage + # TR-181: System CPU usage as a percentage (0-100%) + When I GET "Device.DeviceInfo.ProcessStatus.CPUUsage" via rbus + Then the rbus response should not contain an error + And the rbus response should contain a numeric value + And the CPU usage value should be between 0 and 100 diff --git a/test/functional-tests/features/tr69hostif_storageservice.feature b/test/functional-tests/features/tr69hostif_storageservice.feature new file mode 100755 index 000000000..4bd943fca --- /dev/null +++ b/test/functional-tests/features/tr69hostif_storageservice.feature @@ -0,0 +1,86 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### + +# Source: src/hostif/profiles/StorageService/ + +Feature: Device.StorageService Parameter Handlers + + Background: + Given the tr69hostif daemon is running and initialized + And rbuscli is available on the system + + Scenario: GET StorageServiceNumberOfEntries + When I GET "Device.Services.StorageServiceNumberOfEntries" via rbus + Then the rbus response should not contain an error + + Scenario: GET PhysicalMedium.1.Alias (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Alias" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.Name (implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Name" via rbus + Then the rbus response should not contain an error + + Scenario: GET PhysicalMedium.1.Vendor (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Vendor" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.Model (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Model" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.SerialNumber (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.SerialNumber" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.FirmwareVersion (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.FirmwareVersion" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.ConnectionType (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.ConnectionType" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.Removable (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Removable" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.Status (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Status" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.Uptime (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Uptime" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMedium.1.SmartCapable (read-only/implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.SmartCapable" via rbus + Then the rbus response should not contain an error + + Scenario: GET PhysicalMedium.1.Health (read-only/implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.Health" via rbus + Then the rbus response should not contain an error + + Scenario: GET PhysicalMedium.1.HotSwappable (read-only/not implemented) + When I GET "Device.Services.StorageService.1.PhysicalMedium.1.HotSwappable" via rbus + Then the rbus response should contain an error + + Scenario: GET PhysicalMediumNumberOfEntries + When I GET "Device.Services.StorageService.1.PhysicalMediumNumberOfEntries" via rbus + Then the rbus response should not contain an error diff --git a/test/functional-tests/features/tr69hostif_webpa_rdkdlmgr.feature b/test/functional-tests/features/tr69hostif_webpa_rdkdlmgr.feature index 0192f3b0f..ed4d59aab 100755 --- a/test/functional-tests/features/tr69hostif_webpa_rdkdlmgr.feature +++ b/test/functional-tests/features/tr69hostif_webpa_rdkdlmgr.feature @@ -54,3 +54,11 @@ Feature: WebPA DNSText and RDK Download Manager/Remote Debugger Parameters SET/G Scenario: SET Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RDKRemoteDebugger.WebCfgData When I SET "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RDKRemoteDebugger.WebCfgData" to "testcfgdata" as string via rbus Then the rbus response should indicate success + + Scenario: GET Device.X_RDK_WebPA_Server.URL + When I GET "Device.X_RDK_WebPA_Server.URL" via rbus + Then the rbus response should not contain an error + + Scenario: GET Device.X_RDK_WebPA_TokenServer.URL + When I GET "Device.X_RDK_WebPA_TokenServer.URL" via rbus + Then the rbus response should not contain an error diff --git a/test/functional-tests/tests/basic_constants.py b/test/functional-tests/tests/basic_constants.py index 4ad938cda..fa007a867 100644 --- a/test/functional-tests/tests/basic_constants.py +++ b/test/functional-tests/tests/basic_constants.py @@ -44,6 +44,9 @@ RBUS_SUCCESS_STRING = "setvalues succeeded.." RBUS_SET_EXCEPTION_STRING = "setvalues failed" +BT_ROOT = "Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth." +BT_ENABLE = BT_ROOT + "enable" + LOG_FILE = "/opt/logs/tr69hostif.log.0" PARODUS_LOG_FILE = "/opt/logs/parodus.log" diff --git a/test/functional-tests/tests/tr69hostif_bluetooth.py b/test/functional-tests/tests/tr69hostif_bluetooth.py new file mode 100755 index 000000000..6c73e5f47 --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_bluetooth.py @@ -0,0 +1,279 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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. +#################################################################################### +# +# Source: src/hostif/profiles/DeviceInfo/XrdkBlueTooth.cpp +# Guard: USE_XRDK_BT_PROFILE (outer), BLE_TILE_PROFILE (Tile sub-section) +# Root: Device.DeviceInfo.X_RDKCENTRAL-COM_xBlueTooth.* +# +#################################################################################### + +import pytest + +from helper_functions import * + + +@pytest.mark.run(order=437) +def test_xBlueTooth_Enable_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "enable" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=438) +def test_xBlueTooth_DiscoveryEnabled_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveryEnabled" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=439) +def test_xBlueTooth_DiscoveredDeviceCnt_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDeviceCnt" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=440) +def test_xBlueTooth_PairedDeviceCnt_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "PairedDeviceCnt" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=441) +def test_xBlueTooth_ConnectedDeviceCnt_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "ConnectedDeviceCnt" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + + +@pytest.mark.run(order=442) +def test_xBlueTooth_GetDeviceInfo_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "GetDeviceInfo" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=443) +def test_xBlueTooth_DeviceInfo_DeviceID_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.DeviceID" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=444) +def test_xBlueTooth_DeviceInfo_Manufacturer_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.Manufacturer" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=445) +def test_xBlueTooth_DeviceInfo_Profile_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.Profile" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=446) +def test_xBlueTooth_DeviceInfo_MAC_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.MAC" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=447) +def test_xBlueTooth_DeviceInfo_SignalStrength_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.SignalStrength" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=448) +def test_xBlueTooth_DeviceInfo_RSSI_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DeviceInfo.RSSI" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=449) +def test_xBlueTooth_SetDeviceInfo_Set_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "GetDeviceInfo" + VALUE = "1" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + + + +@pytest.mark.run(order=450) +def test_xBlueTooth_DiscoveredDevice_Name_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDevice.1.Name" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=451) +def test_xBlueTooth_DiscoveredDevice_DeviceID_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDevice.1.DeviceID" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=452) +def test_xBlueTooth_DiscoveredDevice_DeviceType_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDevice.1.DeviceType" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=453) +def test_xBlueTooth_DiscoveredDevice_Paired_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDevice.1.Paired" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=454) +def test_xBlueTooth_DiscoveredDevice_Connected_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "DiscoveredDevice.1.Connected" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + + +@pytest.mark.run(order=455) +def test_xBlueTooth_PairedDevice_Name_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "PairedDevice.1.Name" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=456) +def test_xBlueTooth_PairedDevice_DeviceID_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "PairedDevice.1.DeviceID" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=457) +def test_xBlueTooth_PairedDevice_Connected_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "PairedDevice.1.Connected" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=458) +def test_xBlueTooth_PairedDevice_DeviceType_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "PairedDevice.1.DeviceType" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + + +@pytest.mark.run(order=459) +def test_xBlueTooth_ConnectedDevice_Name_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "ConnectedDevice.1.Name" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=460) +def test_xBlueTooth_ConnectedDevice_DeviceID_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "ConnectedDevice.1.DeviceID" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=461) +def test_xBlueTooth_ConnectedDevice_DeviceType_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "ConnectedDevice.1.DeviceType" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=462) +def test_xBlueTooth_ConnectedDevice_Active_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "ConnectedDevice.1.Active" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=463) +def test_xBlueTooth_LimitBeaconDetection_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "LimitBeaconDetection" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=464) +def test_xBlueTooth_LimitBeaconDetection_Set_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "LimitBeaconDetection" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "true") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=465) +def test_xBlueTooth_BLE_Tile_Ring_Id_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.Id" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=466) +def test_xBlueTooth_BLE_Tile_Ring_Id_Set_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.Id" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "TILE-TEST-001") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=467) +def test_xBlueTooth_BLE_Tile_Ring_SessionId_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.SessionId" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=468) +def test_xBlueTooth_BLE_Tile_Ring_SessionId_Set_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.SessionId" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "SESSION-TEST-001") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=469) +def test_xBlueTooth_BLE_Tile_Ring_Trigger_Get_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.Trigger" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=470) +def test_xBlueTooth_BLE_Tile_Ring_Trigger_Set_Handler(): + rbus_set_data(BT_ROOT + "BLE.Tile.Ring.Id", "string", "TILE-TEST-001") + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Ring.Trigger" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "false") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=471) +def test_xBlueTooth_BLE_Tile_Cmd_Request_Set_Handler(): + DATA_ELEMENT_NAME = BT_ROOT + "BLE.Tile.Cmd.Request" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "test-cmd") + assert RBUS_SET_EXCEPTION_STRING in rstdout diff --git a/test/functional-tests/tests/tr69hostif_custom.py b/test/functional-tests/tests/tr69hostif_custom.py index 2dfa8a782..79ff86c7d 100755 --- a/test/functional-tests/tests/tr69hostif_custom.py +++ b/test/functional-tests/tests/tr69hostif_custom.py @@ -70,6 +70,14 @@ def test_DeviceInfo_FirmwareToDownload_Set_Handler(): assert RBUS_SUCCESS_STRING in rstdout +@pytest.mark.run(order=224) +def test_DeviceInfo_FirmwareDownloadStatus_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus" + VALUE = "IDLE" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + + @pytest.mark.run(order=225) def test_DeviceInfo_FirmwareDownloadStatus_Get_Handler(): DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadStatus" @@ -293,3 +301,57 @@ def test_DeviceInfo_IUI_AppsVersion_Set_Handler(): VALUE = "1.0.0" rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=431) +def test_DeviceInfo_FirmwareDownloadProtocol_Get_Handler_COMCAST_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadProtocol" + VALUE = "http" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout + + +@pytest.mark.run(order=430) +def test_DeviceInfo_FirmwareDownloadProtocol_Set_Handler_COMCAST_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadProtocol" + VALUE = "http" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=432) +def test_DeviceInfo_FirmwareDownloadURL_Get_Handler_COMCAST_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadURL" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=433) +def test_DeviceInfo_FirmwareDownloadURL_Set_Handler_COMCAST_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadURL" + VALUE = "https://example.com/fw-comcast.bin" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=434) +def test_DeviceInfo_FirmwareDownloadPercent_Get_Handler_COMCAST_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareDownloadPercent" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=435) +def test_DeviceInfo_BootStatus_Get_Handler_Underscore_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM.BootStatus" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=436) +def test_DeviceInfo_CPUTemp_Get_Handler_Underscore_Alias(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM.CPUTemp" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + diff --git a/test/functional-tests/tests/tr69hostif_device_info.py b/test/functional-tests/tests/tr69hostif_device_info.py new file mode 100755 index 000000000..941348db0 --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_device_info.py @@ -0,0 +1,276 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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 pytest + +from helper_functions import * + + +@pytest.mark.run(order=360) +def test_DeviceInfo_AdditionalHardwareVersion_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.AdditionalHardwareVersion" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=361) +def test_DeviceInfo_AdditionalSoftwareVersion_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.AdditionalSoftwareVersion" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=362) +def test_DeviceInfo_FirstUseDate_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.FirstUseDate" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=363) +def test_DeviceInfo_HardwareVersion_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.HardwareVersion" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=364) +def test_DeviceInfo_Manufacturer_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.Manufacturer" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=365) +def test_DeviceInfo_ManufacturerOUI_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.ManufacturerOUI" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=366) +def test_DeviceInfo_Migration_MigrationStatus_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.Migration.MigrationStatus" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=367) +def test_DeviceInfo_MigrationPreparer_MigrationReady_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.MigrationPreparer.MigrationReady" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=368) +def test_DeviceInfo_SerialNumber_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.SerialNumber" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=369) +def test_DeviceInfo_SupportedDataModelNumberOfEntries_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.SupportedDataModelNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=370) +def test_DeviceInfo_VendorConfigFileNumberOfEntries_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.VendorConfigFileNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=371) +def test_DeviceInfo_VendorLogFileNumberOfEntries_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.VendorLogFileNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=372) +def test_DeviceInfo_COMCAST_FirmwareDownloadStatus_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=373) +def test_DeviceInfo_COMCAST_FirmwareToDownload_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_COMCAST-COM_FirmwareToDownload" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=374) +def test_DeviceInfo_COMCAST_Reset_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_COMCAST-COM_Reset" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=375) +def test_DeviceInfo_RDKVersion_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RDKVersion" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=376) +def test_DeviceInfo_ApparmorBlocklist_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist" + profile = run_shell_command("awk -F: 'NF>0{print $1; exit}' /opt/secure/Apparmor_blocklist 2>/dev/null") + if not profile: + profile = run_shell_command("ls /etc/apparmor/service_profiles/*.service.sp 2>/dev/null | head -n 1 | xargs -r basename | sed 's/\\.service\\.sp$//'") + if not profile: + pytest.skip("No valid AppArmor profile found for ApparmorBlocklist set validation") + VALUE = f"{profile}:enforce" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=377) +def test_DeviceInfo_ApparmorBlocklist_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.ApparmorBlocklist" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=378) +def test_DeviceInfo_Blocklist_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.Blocklist" + VALUE = "sample-block-entry" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=379) +def test_DeviceInfo_Blocklist_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.NonRootSupport.Blocklist" + VALUE = "sample-block-entry" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout + + +@pytest.mark.run(order=380) +def test_DeviceInfo_XRPollingAction_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action" + VALUE = "XRPoll" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=381) +def test_DeviceInfo_XRPollingAction_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_XRPolling.Action" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=382) +def test_DeviceInfo_COMCAST_FirmwareDownloadStatus_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_COMCAST-COM_FirmwareDownloadStatus" + VALUE = "IDLE" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=383) +def test_DeviceInfo_FirmwareToDownload_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_FirmwareToDownload" + VALUE = "fw_image.bin" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=384) +def test_DeviceInfo_COMCAST_Reset_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_COMCAST-COM_Reset" + VALUE = "Factory" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=385) +def test_DeviceInfo_RebootStop_Detection_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Detection" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=386) +def test_DeviceInfo_RebootStop_Detection_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Detection" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=387) +def test_DeviceInfo_RebootStop_Duration_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Duration" + VALUE = "10" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=388) +def test_DeviceInfo_RebootStop_Duration_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Duration" + VALUE = "10" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout + + +@pytest.mark.run(order=389) +def test_DeviceInfo_MemInsight_Trigger_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger" + VALUE = "start" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=390) +def test_DeviceInfo_MemInsight_Trigger_Stop_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Trigger" + VALUE = "stop" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=391) +def test_DeviceInfo_MemInsight_Enable_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=392) +def test_DeviceInfo_MemInsight_Enable_False_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.meminsight.Enable" + VALUE = "false" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + diff --git a/test/functional-tests/tests/tr69hostif_devicetime.py b/test/functional-tests/tests/tr69hostif_devicetime.py index 466b3139e..9de3dacab 100644 --- a/test/functional-tests/tests/tr69hostif_devicetime.py +++ b/test/functional-tests/tests/tr69hostif_devicetime.py @@ -160,6 +160,14 @@ def test_DeviceTime_TimeZone_Get_Handler(): assert TIMEZONE in rstdout @pytest.mark.run(order=141) +def test_DeviceTime_TimeZone_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Time.LocalTimeZone" + VALUE = "UTC" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=142) def test_DeviceTime_UTCTIME_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Time.X_RDK_CurrentUTCTime" @@ -167,3 +175,25 @@ def test_DeviceTime_UTCTIME_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout +@pytest.mark.run(order=143) +def test_DeviceTime_Enable_SetTrue_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Time.Enable" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "true") + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=144) +def test_DeviceTime_Enable_GetFalse_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Time.Enable" + STATUS_MSG = "false" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert STATUS_MSG in rstdout + +@pytest.mark.run(order=145) +def test_DeviceTime_Enable_SetFalse_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Time.Enable" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "false") + assert RBUS_SET_EXCEPTION_STRING in rstdout diff --git a/test/functional-tests/tests/tr69hostif_ethernet_handlers.py b/test/functional-tests/tests/tr69hostif_ethernet_handlers.py old mode 100644 new mode 100755 index 5a04668f2..bbbc05af1 --- a/test/functional-tests/tests/tr69hostif_ethernet_handlers.py +++ b/test/functional-tests/tests/tr69hostif_ethernet_handlers.py @@ -46,6 +46,14 @@ def test_Ethernet_InterfaceName_Get_Handler(): assert IF_NAME in rstdout @pytest.mark.run(order=105) +def test_Ethernet_Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=106) def test_Ethernet_Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Enable" @@ -55,7 +63,23 @@ def test_Ethernet_Enable_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert ENABLE_MSG in rstdout -@pytest.mark.run(order=106) +@pytest.mark.run(order=107) +def test_Ethernet_Alias_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Alias" + VALUE = "eth0_alias" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=108) +def test_Ethernet_Alias_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Alias" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=109) def test_Ethernet_Status_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Status" @@ -65,14 +89,22 @@ def test_Ethernet_Status_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert STATUS_MSG in rstdout -@pytest.mark.run(order=107) +@pytest.mark.run(order=110) def test_Ethernet_LastChange_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.LastChange" rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING in rstdout -@pytest.mark.run(order=108) +@pytest.mark.run(order=111) +def test_Ethernet_LowerLayers_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.LowerLayers" + VALUE = "eth0" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=112) def test_Ethernet_LowerLayers_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.LowerLayers" @@ -80,7 +112,7 @@ def test_Ethernet_LowerLayers_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING in rstdout -@pytest.mark.run(order=109) +@pytest.mark.run(order=113) def test_Ethernet_Upstream_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Upstream" @@ -90,7 +122,7 @@ def test_Ethernet_Upstream_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert STATE_MSG in rstdout -@pytest.mark.run(order=110) +@pytest.mark.run(order=114) def test_Ethernet_MACAddr_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.MACAddress" @@ -98,7 +130,15 @@ def test_Ethernet_MACAddr_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=111) +@pytest.mark.run(order=115) +def test_Ethernet_MAXBitRate_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.MaxBitRate" + VALUE = "1000" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=116) def test_Ethernet_MAXBitRate_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.MaxBitRate" @@ -106,7 +146,15 @@ def test_Ethernet_MAXBitRate_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=112) +@pytest.mark.run(order=117) +def test_Ethernet_DuplexMode_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.DuplexMode" + VALUE = "full" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=118) def test_Ethernet_DuplexMode_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.DuplexMode" @@ -116,7 +164,7 @@ def test_Ethernet_DuplexMode_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert DUPLEX_MODE_MSG in rstdout -@pytest.mark.run(order=113) +@pytest.mark.run(order=119) def test_Ethernet_BytesSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.Stats.BytesSent" @@ -124,7 +172,7 @@ def test_Ethernet_BytesSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=114) +@pytest.mark.run(order=120) def test_Ethernet_BytesReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.Stats.BytesReceived" @@ -132,7 +180,7 @@ def test_Ethernet_BytesReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=115) +@pytest.mark.run(order=121) def test_Ethernet_PacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME ="Device.Ethernet.Interface.1.Stats.PacketsSent" @@ -140,7 +188,7 @@ def test_Ethernet_PacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=116) +@pytest.mark.run(order=122) def test_Ethernet_PacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.PacketsReceived" @@ -148,7 +196,7 @@ def test_Ethernet_PacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=117) +@pytest.mark.run(order=123) def test_Ethernet_ErrorsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.ErrorsSent" @@ -156,7 +204,7 @@ def test_Ethernet_ErrorsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=118) +@pytest.mark.run(order=124) def test_Ethernet_ErrorsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.ErrorsReceived" @@ -164,7 +212,7 @@ def test_Ethernet_ErrorsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=119) +@pytest.mark.run(order=125) def test_Ethernet_UnicastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.UnicastPacketsSent" @@ -172,7 +220,7 @@ def test_Ethernet_UnicastPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=120) +@pytest.mark.run(order=126) def test_Ethernet_UnicastPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.UnicastPacketsReceived" @@ -180,7 +228,7 @@ def test_Ethernet_UnicastPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=121) +@pytest.mark.run(order=481) def test_Ethernet_DiscardPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.DiscardPacketsSent" @@ -188,7 +236,7 @@ def test_Ethernet_DiscardPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=122) +@pytest.mark.run(order=482) def test_Ethernet_DiscardPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.DiscardPacketsReceived" @@ -196,15 +244,15 @@ def test_Ethernet_DiscardPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=123) -def test_Etherne_MulticastPacketsSent_Get_Handler(): +@pytest.mark.run(order=483) +def test_Ethernet_MulticastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.MulticastPacketsSent" # Force reload config fetch from xconf rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=124) +@pytest.mark.run(order=484) def test_Ethernet_MulticastPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.MulticastPacketsReceived" @@ -212,7 +260,7 @@ def test_Ethernet_MulticastPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=125) +@pytest.mark.run(order=485) def test_Ethernet_BroadcastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.BroadcastPacketsSent" @@ -220,7 +268,7 @@ def test_Ethernet_BroadcastPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=126) +@pytest.mark.run(order=486) def test_Ethernet_BroadcastPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.Ethernet.Interface.1.Stats.BroadcastPacketsReceived" diff --git a/test/functional-tests/tests/tr69hostif_interfacestack.py b/test/functional-tests/tests/tr69hostif_interfacestack.py new file mode 100755 index 000000000..decee370b --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_interfacestack.py @@ -0,0 +1,47 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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 pytest + +from helper_functions import * + + +@pytest.mark.run(order=523) +def test_InterfaceStack_NumberOfEntries_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.InterfaceStackNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=524) +def test_InterfaceStack_HigherLayer_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.InterfaceStack.1.HigherLayer" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=525) +def test_InterfaceStack_LowerLayer_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.InterfaceStack.1.LowerLayer" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout diff --git a/test/functional-tests/tests/tr69hostif_ip.py b/test/functional-tests/tests/tr69hostif_ip.py old mode 100644 new mode 100755 index 01b534b04..6ed0b8c1f --- a/test/functional-tests/tests/tr69hostif_ip.py +++ b/test/functional-tests/tests/tr69hostif_ip.py @@ -25,7 +25,7 @@ from helper_functions import * -@pytest.mark.run(order=142) +@pytest.mark.run(order=487) def test_IP_InterfaceNumberOfEntries_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.InterfaceNumberOfEntries" @@ -33,7 +33,7 @@ def test_IP_InterfaceNumberOfEntries_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=143) +@pytest.mark.run(order=488) def test_IP_ActivePortNumberOfEntries_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.ActivePortNumberOfEntries" @@ -41,7 +41,15 @@ def test_IP_ActivePortNumberOfEntries_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=144) +@pytest.mark.run(order=489) +def test_IP_Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=490) def test_IP_Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Enable" @@ -51,7 +59,15 @@ def test_IP_Enable_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=145) +@pytest.mark.run(order=146) +def test_IP_IPv4Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=147) def test_IP_IPv4Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Enable" @@ -62,7 +78,15 @@ def test_IP_IPv4Enable_Get_Handler(): assert VALUE in rstdout -@pytest.mark.run(order=146) +@pytest.mark.run(order=148) +def test_IP_IPv6Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=149) def test_IP_IPv6Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Enable" @@ -72,16 +96,40 @@ def test_IP_IPv6Enable_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=147) +@pytest.mark.run(order=150) +def test_IP_ULAEnable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.ULAEnable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=151) def test_IP_ULAEnable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.ULAEnable" VALUE = "true" # Force reload config fetch from xconf rstdout = rbus_get_data(DATA_ELEMENT_NAME) - assert RBUS_EXCEPTION_STRING in rstdout + assert RBUS_EXCEPTION_STRING in rstdout -@pytest.mark.run(order=148) +@pytest.mark.run(order=152) +def test_IP_Alias_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Alias" + VALUE = "ip_interface_alias" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=153) +def test_IP_Alias_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Alias" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=154) def test_IP_Status_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Status" @@ -91,7 +139,7 @@ def test_IP_Status_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=149) +@pytest.mark.run(order=155) def test_IP_Name_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Name" @@ -101,7 +149,23 @@ def test_IP_Name_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=150) +@pytest.mark.run(order=156) +def test_IP_LastChange_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.LastChange" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=157) +def test_IP_LowerLayers_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.LowerLayers" + VALUE = "eth0" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=158) def test_IP_LowerLayers_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.LowerLayers" @@ -109,7 +173,7 @@ def test_IP_LowerLayers_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=151) +@pytest.mark.run(order=159) def test_IP_Type_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Type" @@ -120,7 +184,33 @@ def test_IP_Type_Get_Handler(): assert VALUE in rstdout -@pytest.mark.run(order=152) +@pytest.mark.run(order=160) +def test_IP_Router_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Router" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=161) +def test_IP_Router_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Router" + VALUE = "true" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=162) +def test_IP_Loopback_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Loopback" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=163) def test_IP_Loopback_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Loopback" @@ -130,7 +220,7 @@ def test_IP_Loopback_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=153) +@pytest.mark.run(order=164) def test_IP_IPv4AddressNumberOfEntries_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4AddressNumberOfEntries" @@ -138,7 +228,23 @@ def test_IP_IPv4AddressNumberOfEntries_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=154) +@pytest.mark.run(order=165) +def test_IP_IPv6AddressNumberOfEntries_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6AddressNumberOfEntries" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + +@pytest.mark.run(order=166) +def test_IP_IPv4Address_Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=167) def test_IP_IPv4Address_Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.Enable" @@ -148,7 +254,7 @@ def test_IP_IPv4Address_Enable_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=155) +@pytest.mark.run(order=168) def test_IP_IPv4Address_Status_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.Status" @@ -158,7 +264,31 @@ def test_IP_IPv4Address_Status_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=156) +@pytest.mark.run(order=169) +def test_IP_IPv4Address_Alias_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.Alias" + VALUE = "ipv4_alias" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=170) +def test_IP_IPv4Address_Alias_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.Alias" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=171) +def test_IP_IPv4Address_IPAddress_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.IPAddress" + VALUE = "127.0.0.1" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=172) def test_IP_IPv4Address_IPAddress_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.IPAddress" @@ -169,7 +299,15 @@ def test_IP_IPv4Address_IPAddress_Get_Handler(): assert VALUE in rstdout -@pytest.mark.run(order=157) +@pytest.mark.run(order=173) +def test_IP_IPv4Address_SubnetMask_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.SubnetMask" + VALUE = "255.0.0.0" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=174) def test_IP_IPAddress_SubnetMask_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.SubnetMask" @@ -180,7 +318,7 @@ def test_IP_IPAddress_SubnetMask_Get_Handler(): assert VALUE in rstdout -@pytest.mark.run(order=158) +@pytest.mark.run(order=175) def test_IP_IPAddress_AddressingType_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv4Address.1.AddressingType" @@ -190,7 +328,15 @@ def test_IP_IPAddress_AddressingType_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=159) +@pytest.mark.run(order=176) +def test_IP_IPv6Address_Enable_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Enable" + VALUE = "true" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=177) def test_IP_IPv6Address_Enable_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Enable" @@ -200,7 +346,7 @@ def test_IP_IPv6Address_Enable_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=160) +@pytest.mark.run(order=178) def test_IP_IPv6Address_Status_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Status" @@ -210,7 +356,15 @@ def test_IP_IPv6Address_Status_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=161) +@pytest.mark.run(order=179) +def test_IP_IPv6Address_IPv6Address_Set_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.IPAddress" + VALUE = "::1" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=180) def test_IP_IPv6Address_IPv6Address_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.IPAddress" @@ -220,7 +374,7 @@ def test_IP_IPv6Address_IPv6Address_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=162) +@pytest.mark.run(order=181) def test_IP_IPv6Address_Prefix_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Prefix" @@ -228,7 +382,7 @@ def test_IP_IPv6Address_Prefix_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=163) +@pytest.mark.run(order=182) def test_IP_IPv6Address_Origin_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Origin" @@ -238,7 +392,7 @@ def test_IP_IPv6Address_Origin_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=164) +@pytest.mark.run(order=183) def test_IP_IPv6Address_Anycast_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.Anycast" @@ -249,7 +403,7 @@ def test_IP_IPv6Address_Anycast_Get_Handler(): assert VALUE in rstdout -@pytest.mark.run(order=165) +@pytest.mark.run(order=184) def test_IP_IPv6Address_PreferredLifetime_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.PreferredLifetime" @@ -257,7 +411,7 @@ def test_IP_IPv6Address_PreferredLifetime_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=166) +@pytest.mark.run(order=185) def test_IP_IPv6Address_ValidLifetime_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Address.1.ValidLifetime" @@ -266,7 +420,7 @@ def test_IP_IPv6Address_ValidLifetime_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=167) +@pytest.mark.run(order=186) def test_IP_IPv6Prefix_Autonomous_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Prefix.1.Autonomous" @@ -276,7 +430,7 @@ def test_IP_IPv6Prefix_Autonomous_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=168) +@pytest.mark.run(order=187) def test_IP_IPv6Prefix_StaticType_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Prefix.1.StaticType" @@ -286,7 +440,7 @@ def test_IP_IPv6Prefix_StaticType_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=169) +@pytest.mark.run(order=188) def test_IP_IPv6Prefix_PrefixStatus_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Prefix.1.PrefixStatus" @@ -296,7 +450,7 @@ def test_IP_IPv6Prefix_PrefixStatus_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=170) +@pytest.mark.run(order=189) def test_IP_IPv6Prefix_ValidLifetime_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.IPv6Prefix.1.ValidLifetime" @@ -304,7 +458,7 @@ def test_IP_IPv6Prefix_ValidLifetime_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=171) +@pytest.mark.run(order=190) def test_IP_Stats_BytesSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.BytesSent" @@ -313,7 +467,7 @@ def test_IP_Stats_BytesSent_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=172) +@pytest.mark.run(order=191) def test_IP_Stats_BytesReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.BytesReceived" @@ -321,7 +475,7 @@ def test_IP_Stats_BytesReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=173) +@pytest.mark.run(order=192) def test_IP_Stats_PacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.PacketsSent" @@ -329,7 +483,15 @@ def test_IP_Stats_PacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=174) +@pytest.mark.run(order=193) +def test_IP_Stats_PacketsReceived_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.PacketsReceived" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + +@pytest.mark.run(order=194) def test_IP_Stats_ErrorsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.ErrorsSent" @@ -337,7 +499,7 @@ def test_IP_Stats_ErrorsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=175) +@pytest.mark.run(order=195) def test_IP_Stats_ErrorsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.ErrorsReceived" @@ -345,7 +507,7 @@ def test_IP_Stats_ErrorsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=176) +@pytest.mark.run(order=196) def test_IP_Stats_UnicastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.UnicastPacketsSent" @@ -353,7 +515,7 @@ def test_IP_Stats_UnicastPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=177) +@pytest.mark.run(order=197) def test_IP_Stats_UnicastPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.UnicastPacketsReceived" @@ -361,7 +523,7 @@ def test_IP_Stats_UnicastPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=178) +@pytest.mark.run(order=198) def test_IP_Stats_DiscardPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.DiscardPacketsSent" @@ -370,7 +532,7 @@ def test_IP_Stats_DiscardPacketsSent_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=179) +@pytest.mark.run(order=199) def test_IP_Stats_DiscardPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.DiscardPacketsReceived" @@ -378,7 +540,7 @@ def test_IP_Stats_DiscardPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=180) +@pytest.mark.run(order=200) def test_IP_Stats_MulticastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.MulticastPacketsSent" @@ -386,7 +548,7 @@ def test_IP_Stats_MulticastPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=181) +@pytest.mark.run(order=201) def test_IP_Stats_MulticastPacketsReceived_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.MulticastPacketsReceived" @@ -394,7 +556,7 @@ def test_IP_Stats_MulticastPacketsReceived_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=182) +@pytest.mark.run(order=202) def test_IP_Stats_BroadcastPacketsSent_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.BroadcastPacketsSent" @@ -402,7 +564,7 @@ def test_IP_Stats_BroadcastPacketsSent_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=183) +@pytest.mark.run(order=203) def test_IP_Stats_BroadcastPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.BroadcastPacketsReceived" @@ -410,7 +572,7 @@ def test_IP_Stats_BroadcastPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=184) +@pytest.mark.run(order=204) def test_IP_Stats_UnknownProtoPacketsReceived_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.Interface.1.Stats.UnknownProtoPacketsReceived" @@ -418,7 +580,7 @@ def test_IP_Stats_UnknownProtoPacketsReceived_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=185) +@pytest.mark.run(order=205) def test_IP_ActivePort_LocalIPAddress_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.ActivePort.1.LocalIPAddress" @@ -428,7 +590,7 @@ def test_IP_ActivePort_LocalIPAddress_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=186) +@pytest.mark.run(order=206) def test_IP_ActivePort_LocalPort_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.ActivePort.1.LocalPort" @@ -437,7 +599,7 @@ def test_IP_ActivePort_LocalPort_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=187) +@pytest.mark.run(order=207) def test_IP_ActivePort_RemoteIPAddress_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.ActivePort.1.RemoteIPAddress" @@ -447,7 +609,7 @@ def test_IP_ActivePort_RemoteIPAddress_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=188) +@pytest.mark.run(order=208) def test_IP_ActivePort_RemotePort_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.IP.ActivePort.1.RemotePort" @@ -456,6 +618,14 @@ def test_IP_ActivePort_RemotePort_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout + +@pytest.mark.run(order=209) +def test_IP_ActivePort_Status_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.IP.ActivePort.1.Status" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout diff --git a/test/functional-tests/tests/tr69hostif_ipremotesupport.py b/test/functional-tests/tests/tr69hostif_ipremotesupport.py old mode 100644 new mode 100755 index dab783d2f..2e905807b --- a/test/functional-tests/tests/tr69hostif_ipremotesupport.py +++ b/test/functional-tests/tests/tr69hostif_ipremotesupport.py @@ -25,7 +25,7 @@ from helper_functions import * -@pytest.mark.run(order=189) +@pytest.mark.run(order=491) def test_IPRemoteSupport_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.Enable" @@ -34,7 +34,7 @@ def test_IPRemoteSupport_Set_Handler(): rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) assert RBUS_SUCCESS_STRING in rstdout -@pytest.mark.run(order=190) +@pytest.mark.run(order=492) def test_IPRemoteSupport_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.Enable" @@ -44,7 +44,7 @@ def test_IPRemoteSupport_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=191) +@pytest.mark.run(order=493) def test_IPRemoteSupport_IPAddr_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.IPAddr" @@ -54,7 +54,7 @@ def test_IPRemoteSupport_IPAddr_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=192) +@pytest.mark.run(order=494) def test_IPRemoteSupport_MACAddr_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.MACAddr" @@ -64,7 +64,7 @@ def test_IPRemoteSupport_MACAddr_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=193) +@pytest.mark.run(order=495) def test_PartnerId_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_Syndication.PartnerId" diff --git a/test/functional-tests/tests/tr69hostif_moca.py b/test/functional-tests/tests/tr69hostif_moca.py old mode 100644 new mode 100755 index 77b55e0af..4487e9350 --- a/test/functional-tests/tests/tr69hostif_moca.py +++ b/test/functional-tests/tests/tr69hostif_moca.py @@ -396,3 +396,73 @@ def test_MoCA_Interface_LowerLayers_Set_Handler(): rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "lower") assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=513) +def test_MoCA_Interface_PreferredNC_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.PreferredNC" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "true") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=514) +def test_MoCA_Interface_PrivacyEnabledSetting_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.PrivacyEnabledSetting" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", "true") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=515) +def test_MoCA_Interface_FreqCurrentMaskSetting_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.FreqCurrentMaskSetting" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "0") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=516) +def test_MoCA_Interface_PowerCntlPhyTarget_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.PowerCntlPhyTarget" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int32", "0") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=517) +def test_MoCA_Interface_KeyPassphrase_Get_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.KeyPassphrase" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=518) +def test_MoCA_Interface_TxPowerLimit_Get_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.TxPowerLimit" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=519) +def test_MoCA_Interface_BeaconPowerLimit_Get_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.BeaconPowerLimit" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=520) +def test_MoCA_Interface_KeyPassphrase_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.KeyPassphrase" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", "123456") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=521) +def test_MoCA_Interface_TxPowerLimit_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.TxPowerLimit" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int32", "0") + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=522) +def test_MoCA_Interface_BeaconPowerLimit_Set_Handler(): + DATA_ELEMENT_NAME = "Device.MoCA.Interface.1.BeaconPowerLimit" + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int32", "0") + assert RBUS_SET_EXCEPTION_STRING in rstdout + diff --git a/test/functional-tests/tests/tr69hostif_opsdevicemgmt_logging.py b/test/functional-tests/tests/tr69hostif_opsdevicemgmt_logging.py new file mode 100755 index 000000000..75e8de88e --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_opsdevicemgmt_logging.py @@ -0,0 +1,90 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2024 RDK Management +# +# 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 pytest + +from helper_functions import * + + +@pytest.mark.run(order=327) +def test_xOpsDeviceMgmt_Logging_xOpsDMUploadLogsNow_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow" + VALUE = "true" + UPLOAD_MSG = "Start executing script to upload logs... " + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + assert UPLOAD_MSG in grep_tr69hostiflogs(UPLOAD_MSG) + + +@pytest.mark.run(order=328) +def test_xOpsDeviceMgmt_Logging_xOpsDMUploadLogsNow_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMUploadLogsNow" + VALUE = "false" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout + + +@pytest.mark.run(order=329) +def test_xOpsDeviceMgmt_Logging_xOpsDMLogsUploadStatus_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMLogsUploadStatus" + UPLOAD_STATUS_MSG = "uploaded" + STATUS_MSG = "Successfully read from /opt/loguploadstatus.txt." + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert UPLOAD_STATUS_MSG in rstdout + assert STATUS_MSG in grep_tr69hostiflogs(STATUS_MSG) + + +@pytest.mark.run(order=330) +def test_xOpsDeviceMgmt_Logging_xOpsDMMoCALogEnabled_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled" + VALUE = "true" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + +@pytest.mark.run(order=331) +def test_xOpsDeviceMgmt_Logging_xOpsDMMoCALogEnabled_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogEnabled" + VALUE = "true" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=332) +def test_xOpsDeviceMgmt_Logging_xOpsDMMoCALogPeriod_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod" + VALUE = "300" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "int", VALUE) + assert RBUS_SET_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=333) +def test_xOpsDeviceMgmt_Logging_xOpsDMMoCALogPeriod_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.Logging.xOpsDMMoCALogPeriod" + VALUE = "300" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout diff --git a/test/functional-tests/tests/tr69hostif_opsdevicemgmt_rpc.py b/test/functional-tests/tests/tr69hostif_opsdevicemgmt_rpc.py new file mode 100755 index 000000000..02f742e4d --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_opsdevicemgmt_rpc.py @@ -0,0 +1,118 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2024 RDK Management +# +# 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 pytest + +from helper_functions import * + + +@pytest.mark.run(order=334) +def test_xOpsDeviceMgmt_RPC_RebootNow_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow" + VALUE = "true" + SUCCESS_MSG = "Successfully executed reboot script" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + assert SUCCESS_MSG in grep_tr69hostiflogs(SUCCESS_MSG) + +@pytest.mark.run(order=335) +def test_xOpsDeviceMgmt_RPC_RebootNow_Set_False_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow" + VALUE = "false" + SUCCESS_MSG = "Not rebooting. Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootNow = false" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + assert SUCCESS_MSG in grep_tr69hostiflogs(SUCCESS_MSG) + + +@pytest.mark.run(order=336) +def test_xOpsDeviceMgmt_RPC_DeviceManageableNotification_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification" + VALUE = "manageable" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=337) +def test_xOpsDeviceMgmt_RPC_DeviceManageableNotification_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.DeviceManageableNotification" + VALUE = "manageable" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=338) +def test_xOpsDeviceMgmt_RPC_FirmwareDownloadStartedNotification_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification" + VALUE = "started" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=339) +def test_xOpsDeviceMgmt_RPC_FirmwareDownloadStartedNotification_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadStartedNotification" + VALUE = "started" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + + +@pytest.mark.run(order=340) +def test_xOpsDeviceMgmt_RPC_FirmwareDownloadCompletedNotification_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification" + VALUE = "false" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "boolean", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=341) +def test_xOpsDeviceMgmt_RPC_FirmwareDownloadCompletedNotification_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.FirmwareDownloadCompletedNotification" + VALUE = "false" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout + + +@pytest.mark.run(order=342) +def test_xOpsDeviceMgmt_RPC_RebootPendingNotification_Set_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification" + VALUE = "0" + + rstdout = rbus_set_data(DATA_ELEMENT_NAME, "uint32", VALUE) + assert RBUS_SUCCESS_STRING in rstdout + + +@pytest.mark.run(order=343) +def test_xOpsDeviceMgmt_RPC_RebootPendingNotification_Get_Handler(): + DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.RebootPendingNotification" + VALUE = "0" + + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + assert VALUE in rstdout diff --git a/test/functional-tests/tests/tr69hostif_processor_processstatus.py b/test/functional-tests/tests/tr69hostif_processor_processstatus.py index cc23b90c0..3ff0d0c52 100644 --- a/test/functional-tests/tests/tr69hostif_processor_processstatus.py +++ b/test/functional-tests/tests/tr69hostif_processor_processstatus.py @@ -25,7 +25,7 @@ from helper_functions import * -@pytest.mark.run(order=194) +@pytest.mark.run(order=526) def test_Processor_Architecture_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.Processor.1.Architecture" @@ -35,7 +35,7 @@ def test_Processor_Architecture_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout assert VALUE in rstdout -@pytest.mark.run(order=195) +@pytest.mark.run(order=527) def test_ProcessStatus_PID_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.PID" @@ -43,7 +43,7 @@ def test_ProcessStatus_PID_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=196) +@pytest.mark.run(order=528) def test_ProcessStatus_Command_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.Command" @@ -51,7 +51,7 @@ def test_ProcessStatus_Command_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=197) +@pytest.mark.run(order=529) def test_ProcessStatus_Size_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.Size" @@ -59,7 +59,7 @@ def test_ProcessStatus_Size_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=198) +@pytest.mark.run(order=530) def test_ProcessStatus_Priority_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.Priority" @@ -67,7 +67,7 @@ def test_ProcessStatus_Priority_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=199) +@pytest.mark.run(order=531) def test_ProcessStatus_CPUTime_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.CPUTime" @@ -76,7 +76,7 @@ def test_ProcessStatus_CPUTime_Get_Handler(): assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=200) +@pytest.mark.run(order=532) def test_ProcessStatus_State_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.Process.1.State" @@ -84,7 +84,7 @@ def test_ProcessStatus_State_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout -@pytest.mark.run(order=201) +@pytest.mark.run(order=533) def test_ProcessStatus_NumberOfEntries_Get_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.ProcessNumberOfEntries" @@ -92,3 +92,11 @@ def test_ProcessStatus_NumberOfEntries_Get_Handler(): rstdout = rbus_get_data(DATA_ELEMENT_NAME) assert RBUS_EXCEPTION_STRING not in rstdout +@pytest.mark.run(order=534) +def test_ProcessStatus_CPUUsage_Get_Handler(): + #clear_tr69hostiflogs() + DATA_ELEMENT_NAME = "Device.DeviceInfo.ProcessStatus.CPUUsage" + # Force reload config fetch from xconf + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING not in rstdout + diff --git a/test/functional-tests/tests/tr69hostif_rfc_store_params.py b/test/functional-tests/tests/tr69hostif_rfc_store_params.py index 29227893c..6d2e65775 100644 --- a/test/functional-tests/tests/tr69hostif_rfc_store_params.py +++ b/test/functional-tests/tests/tr69hostif_rfc_store_params.py @@ -26,7 +26,7 @@ from helper_functions import * @pytest.mark.run(order=81) -def test_RFC_ClearDB_Get_Handler(): +def test_RFC_ClearDB_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Control.ClearDB" VALUE = "true" @@ -35,7 +35,7 @@ def test_RFC_ClearDB_Get_Handler(): assert RBUS_SUCCESS_STRING in rstdout @pytest.mark.run(order=82) -def test_RFC_ClearDBEnd_Get_Handler(): +def test_RFC_ClearDBEnd_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Control.ClearDBEnd" VALUE = "true" @@ -55,7 +55,7 @@ def test_RFC_RetrieveNow_Set_Handler(): @pytest.mark.run(order=84) -def test_RFC_RoamTrigger_Get_Handler(): +def test_RFC_RoamTrigger_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RoamTrigger" VALUE = "triggered" @@ -65,7 +65,7 @@ def test_RFC_RoamTrigger_Get_Handler(): @pytest.mark.run(order=85) -def test_RFC_DAPv2_Get_Handler(): +def test_RFC_DAPv2_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.MS12.DAPv2_Enable" VALUE = "true" @@ -75,7 +75,7 @@ def test_RFC_DAPv2_Get_Handler(): @pytest.mark.run(order=86) -def test_RFC_MS12_DE_Get_Handler(): +def test_RFC_MS12_DE_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.MS12.DE_Enable" VALUE = "true" @@ -84,7 +84,7 @@ def test_RFC_MS12_DE_Get_Handler(): assert RBUS_SUCCESS_STRING in rstdout @pytest.mark.run(order=87) -def test_RFC_LoudnessEquivalence_Get_Handler(): +def test_RFC_LoudnessEquivalence_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.LoudnessEquivalence.Enable" VALUE = "true" @@ -93,7 +93,7 @@ def test_RFC_LoudnessEquivalence_Get_Handler(): assert RBUS_SUCCESS_STRING in rstdout @pytest.mark.run(order=88) -def test_RFC_DAB_Get_Handler(): +def test_RFC_DAB_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.DAB.Enable" VALUE = "true" @@ -102,7 +102,7 @@ def test_RFC_DAB_Get_Handler(): assert RBUS_SUCCESS_STRING in rstdout @pytest.mark.run(order=89) -def test_RFC_AutoReboot_Get_Handler(): +def test_RFC_AutoReboot_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.AutoReboot.Enable" VALUE = "true" @@ -112,7 +112,7 @@ def test_RFC_AutoReboot_Get_Handler(): @pytest.mark.run(order=90) -def test_RFC_RebootStop_Get_Handler(): +def test_RFC_RebootStop_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Enable" VALUE = "true" @@ -121,7 +121,7 @@ def test_RFC_RebootStop_Get_Handler(): assert RBUS_SUCCESS_STRING in rstdout @pytest.mark.run(order=91) -def test_RFC_wakeUpStart_Get_Handler(): +def test_RFC_wakeUpStart_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.Canary.wakeUpStart" VALUE = "100" @@ -131,7 +131,7 @@ def test_RFC_wakeUpStart_Get_Handler(): @pytest.mark.run(order=92) -def test_RFC_wakeUpEnd_Get_Handler(): +def test_RFC_wakeUpEnd_Set_Handler(): #clear_tr69hostiflogs() DATA_ELEMENT_NAME = "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.Canary.wakeUpEnd" VALUE = "100" diff --git a/test/functional-tests/tests/tr69hostif_storageservice.py b/test/functional-tests/tests/tr69hostif_storageservice.py new file mode 100755 index 000000000..32016d637 --- /dev/null +++ b/test/functional-tests/tests/tr69hostif_storageservice.py @@ -0,0 +1,132 @@ +#################################################################################### +# If not stated otherwise in this file or this component's Licenses file the +# following copyright and licenses apply: +# +# Copyright 2026 RDK Management +# +# 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 subprocess +import os +import pytest +from time import sleep + +from helper_functions import * + + +@pytest.mark.run(order=344) +def test_StorageService_ClientNumberOfEntries_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageServiceNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=345) +def test_StorageService_PhysicalMedium_Alias_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Alias" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=346) +def test_StorageService_PhysicalMedium_Name_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Name" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=347) +def test_StorageService_PhysicalMedium_Vendor_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Vendor" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=348) +def test_StorageService_PhysicalMedium_Model_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Model" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=349) +def test_StorageService_PhysicalMedium_SerialNumber_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.SerialNumber" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=350) +def test_StorageService_PhysicalMedium_FirmwareVersion_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.FirmwareVersion" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=351) +def test_StorageService_PhysicalMedium_ConnectionType_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.ConnectionType" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=352) +def test_StorageService_PhysicalMedium_Removable_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Removable" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=353) +def test_StorageService_PhysicalMedium_Status_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Status" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=354) +def test_StorageService_PhysicalMedium_Uptime_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Uptime" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=355) +def test_StorageService_PhysicalMedium_SMARTCapable_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.SmartCapable" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=356) +def test_StorageService_PhysicalMedium_Health_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.Health" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=357) +def test_StorageService_PhysicalMedium_HotSwappable_Get_Handler(): + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMedium.1.HotSwappable" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=358) +def test_StorageService_PhysicalMedium_NumberOfEntries_Get_Handler(): + # TR-181 mapping: Device.StorageService.{i}.PhysicalMedium.NumberOfEntries + DATA_ELEMENT_NAME = "Device.Services.StorageService.1.PhysicalMediumNumberOfEntries" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout diff --git a/test/functional-tests/tests/tr69hostif_webpa_rdkdlmgr.py b/test/functional-tests/tests/tr69hostif_webpa_rdkdlmgr.py index 12e818707..4b2ff0dcf 100644 --- a/test/functional-tests/tests/tr69hostif_webpa_rdkdlmgr.py +++ b/test/functional-tests/tests/tr69hostif_webpa_rdkdlmgr.py @@ -91,3 +91,17 @@ def test_RDKRemoteDebugger_WebCfgData_Set_Handler(): rstdout = rbus_set_data(DATA_ELEMENT_NAME, "string", VALUE) assert RBUS_SUCCESS_STRING in rstdout + +@pytest.mark.run(order=472) +def test_X_RDK_WebPA_Server_URL_Get_Handler(): + DATA_ELEMENT_NAME = "Device.X_RDK_WebPA_Server.URL" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + + +@pytest.mark.run(order=473) +def test_X_RDK_WebPA_TokenServer_URL_Get_Handler(): + DATA_ELEMENT_NAME = "Device.X_RDK_WebPA_TokenServer.URL" + rstdout = rbus_get_data(DATA_ELEMENT_NAME) + assert RBUS_EXCEPTION_STRING in rstdout + From 9e881fc2e316ed5ed47f42a793f2bda7491efc1f Mon Sep 17 00:00:00 2001 From: nhanasi Date: Tue, 21 Jul 2026 10:36:40 -0400 Subject: [PATCH 3/5] RDKEMW-20790 : L2 Coverage for tr69hostif update (#513) * RDKEMW-20790 : Improve L2 Coverage for tr69hostif * RDKEMW-20790 : L2 Coverage for tr69hostif update --------- Co-authored-by: mtirum011 Co-authored-by: madhubabutt <114217841+madhubabutt@users.noreply.github.com> Co-authored-by: Hanasi --- test/docs/L2_Test_Coverage.md | 217 +++++++++++++++++++--------------- 1 file changed, 122 insertions(+), 95 deletions(-) diff --git a/test/docs/L2_Test_Coverage.md b/test/docs/L2_Test_Coverage.md index 3b7142f51..6155e615e 100644 --- a/test/docs/L2_Test_Coverage.md +++ b/test/docs/L2_Test_Coverage.md @@ -6,7 +6,7 @@ This document provides the detailed L2 coverage view for the functional test sui It restores the richer format with summary, layout, infrastructure notes, current coverage detail, heat map, pending gaps to reach 100%, and parameter count analysis. -Last analyzed: June 29, 2026. +Last analyzed: July 20, 2026. --- @@ -15,21 +15,21 @@ Last analyzed: June 29, 2026. | Metric | Value | |---|---:| | Total source functions (approx baseline) | ~761 | -| Functions with direct L2 coverage | ~313 | -| Functions with no current L2 coverage (estimated) | ~448 | -| Active L2 test functions | 313 | +| Functions with direct L2 coverage | ~416 | +| Functions with no current L2 coverage (estimated) | ~345 | +| Active L2 test functions | 416 | | Disabled test functions via skip/xfail decorators | 0 | | Runtime skip paths detected | 1 | -| Active feature scenarios | 355 | -| Test files active | 25 | -| Feature files active | 29 | -| Estimated current L2 coverage | ~41.1% | +| Active feature scenarios | 427 | +| Test files active | 31 | +| Feature files active | 35 | +| Estimated current L2 coverage | ~54.7% | | Target L2 coverage | 100% | Coverage calculation: -- `313 / 761 = 41.1%` -- Remaining estimated gap: `761 - 313 = 448` +- `416 / 761 = 54.7%` +- Remaining estimated gap: `761 - 416 = 345` --- @@ -39,27 +39,39 @@ Coverage calculation: test/functional-tests/ ├── features/ # BDD feature specs │ ├── tr69hostif_bootup_sequence.feature +│ ├── tr69hostif_bluetooth.feature # NEW +│ ├── tr69hostif_device_info.feature # NEW │ ├── tr69hostif_handlers_communications.feature │ ├── tr69hostif_deviceip.feature +│ ├── tr69hostif_interfacestack.feature # NEW │ ├── tr69hostif_webpa.feature │ ├── tr69hostif_http_server.feature │ ├── tr69hostif_ethernet_handlers.feature │ ├── tr69hostif_moca.feature +│ ├── tr69hostif_opsdevicemgmt_logging.feature # NEW +│ ├── tr69hostif_opsdevicemgmt_rpc.feature # NEW │ ├── tr69hostif_rfc_store.feature +│ ├── tr69hostif_storageservice.feature # NEW │ ├── tr69hostif_thunder_negative_edge_cases.feature -│ └── ... (total 29 feature files) +│ └── ... (total 35 feature files) └── tests/ # Runnable pytest tests ├── test_bootup_sequence.py ├── test_handlers_communications.py + ├── tr69hostif_bluetooth.py # NEW + ├── tr69hostif_device_info.py # NEW ├── tr69hostif_deviceip.py + ├── tr69hostif_interfacestack.py # NEW ├── tr69hostif_ip.py ├── tr69hostif_webpa.py ├── tr69hostif_http_server.py ├── tr69hostif_ethernet_handlers.py ├── tr69hostif_moca.py + ├── tr69hostif_opsdevicemgmt_logging.py # NEW + ├── tr69hostif_opsdevicemgmt_rpc.py # NEW ├── tr69hostif_rfc_store.py + ├── tr69hostif_storageservice.py # NEW ├── tr69hostif_thunder_negative_edge_cases.py - └── ... (total 25 runnable test files) + └── ... (total 31 runnable test files) ``` Test runner: pytest with `@pytest.mark.run(order=N)` sequencing. @@ -80,7 +92,7 @@ Interfaces exercised: |---|---|---| | Test fixture orchestration | Partial | No global rollback fixture baseline documented in this file | | BDD execution wiring | Mixed | Features are present; tests run as pytest modules | -| Order tagging | Needs cleanup | 313 tags, 306 unique values, 7 duplicates | +| Order tagging | Needs cleanup | 416 tags, 409 unique values, 7 duplicates | | Static skip/xfail decorators | None found | No `@pytest.mark.skip` or `@pytest.mark.xfail` decorators | | Runtime skip behavior | Present | 1 runtime skip path in Thunder negative tests when port bind fails | | Test/feature map consistency | Partial | 25 mapped test files, 4 documentation-only feature files | @@ -111,28 +123,34 @@ Runtime skip signal: | test_handlers_communications.py | 10 | | tr69hostif_account_thunder_plugin.py | 2 | | tr69hostif_authservice_thunder_plugin.py | 3 | +| tr69hostif_bluetooth.py | 35 | | tr69hostif_custom.py | 34 | +| tr69hostif_device_info.py | 33 | | tr69hostif_deviceip.py | 4 | | tr69hostif_devicetime.py | 15 | | tr69hostif_dhcpv4.py | 4 | | tr69hostif_ethernet_handlers.py | 24 | | tr69hostif_http_server.py | 8 | +| tr69hostif_interfacestack.py | 3 | | tr69hostif_ip.py | 47 | | tr69hostif_ipremotesupport.py | 5 | | tr69hostif_moca.py | 53 | | tr69hostif_negative_edge_cases.py | 4 | | tr69hostif_networkmanager_endpoint_thunder_plugin.py | 7 | | tr69hostif_networkmanager_ssid_thunder_plugin.py | 7 | +| tr69hostif_opsdevicemgmt_logging.py | 7 | +| tr69hostif_opsdevicemgmt_rpc.py | 10 | | tr69hostif_processor_processstatus.py | 8 | | tr69hostif_rfc_store_params.py | 12 | | tr69hostif_rfc_store.py | 4 | | tr69hostif_std_params.py | 9 | +| tr69hostif_storageservice.py | 15 | | tr69hostif_system_thunder_plugin.py | 2 | | tr69hostif_thunder_negative_edge_cases.py | 3 | | tr69hostif_webpa_negative_edge_cases.py | 6 | | tr69hostif_webpa_rdkdlmgr.py | 7 | | tr69hostif_webpa.py | 17 | -| Total | 313 | +| Total | 416 | ### Per-Feature-File Detail @@ -140,8 +158,10 @@ Runtime skip signal: |---|---:| | tr69hostif_account_thunder_plugin.feature | 2 | | tr69hostif_authservice_thunder_plugin.feature | 3 | +| tr69hostif_bluetooth.feature | 7 | | tr69hostif_bootup_sequence.feature | 18 | | tr69hostif_custom.feature | 5 | +| tr69hostif_device_info.feature | 30 | | tr69hostif_deviceip.feature | 9 | | tr69hostif_devicetime.feature | 10 | | tr69hostif_dhcpv4.feature | 4 | @@ -149,6 +169,7 @@ Runtime skip signal: | tr69hostif_ethernet.feature | 13 | | tr69hostif_handlers_communications.feature | 20 | | tr69hostif_http_server.feature | 14 | +| tr69hostif_interfacestack.feature | 3 | | tr69hostif_ip.feature | 12 | | tr69hostif_ipremotesupport.feature | 5 | | tr69hostif_moca.feature | 53 | @@ -156,10 +177,13 @@ Runtime skip signal: | tr69hostif_negative_tests.feature | 28 | | tr69hostif_networkmanager_endpoint_thunder_plugin.feature | 7 | | tr69hostif_networkmanager_ssid_thunder_plugin.feature | 8 | +| tr69hostif_opsdevicemgmt_logging.feature | 7 | +| tr69hostif_opsdevicemgmt_rpc.feature | 10 | | tr69hostif_processor_processstatus.feature | 8 | | tr69hostif_rfc_store_params.feature | 12 | | tr69hostif_rfc_store.feature | 4 | | tr69hostif_std_params.feature | 9 | +| tr69hostif_storageservice.feature | 15 | | tr69hostif_system_thunder_plugin.feature | 1 | | tr69hostif_thunder_negative_edge_cases.feature | 3 | | tr69hostif_thunder_plugins.feature | 21 | @@ -167,7 +191,7 @@ Runtime skip signal: | tr69hostif_webpa_negative_edge_cases.feature | 6 | | tr69hostif_webpa_rdkdlmgr.feature | 7 | | tr69hostif_webpa.feature | 16 | -| Total | 355 | +| Total | 427 | ### Bootup Sequence (orders 1–18) @@ -253,18 +277,24 @@ Via mock parodus binary with JSON payloads. Validation reads `/opt/logs/parodus. |---|---:| | Device/IP Core | 56 | | MoCA | 53 | +| Bluetooth | 35 | | Custom/DeviceInfo | 43 | +| DeviceInfo Extended | 33 | | WebPA/Parodus | 30 | | Ethernet | 24 | | Thunder Plugins | 24 | +| StorageService | 15 | | Bootup/Lifecycle | 18 | | RFC/Bootstrap Store | 16 | | Time/Chrony | 15 | +| OpsDeviceMgmt RPC | 10 | | Handler Communications | 10 | | HTTP Server | 8 | | Processor/ProcessStatus | 8 | +| OpsDeviceMgmt Logging | 7 | | DHCPv4 | 4 | | Negative/Edge Cases | 4 | +| InterfaceStack | 3 | --- @@ -282,6 +312,11 @@ graph TD A --> I[MoCA] A --> J[DHCPv4] A --> K[Negative Cases] + A --> L[Bluetooth] + A --> M[DeviceInfo Extended] + A --> N[StorageService] + A --> O[InterfaceStack] + A --> P[OpsDeviceMgmt] style B fill:#2d7a2d,color:#fff style C fill:#2d7a2d,color:#fff @@ -293,6 +328,11 @@ graph TD style I fill:#d4a017,color:#000 style J fill:#c0392b,color:#fff style K fill:#c0392b,color:#fff + style L fill:#2d7a2d,color:#fff + style M fill:#2d7a2d,color:#fff + style N fill:#2d7a2d,color:#fff + style O fill:#2d7a2d,color:#fff + style P fill:#2d7a2d,color:#fff ``` Legend: @@ -316,39 +356,25 @@ Estimated remaining gap: **~448 items** against the ~761 baseline. Source: `src/hostif/profiles/DeviceInfo/Device_DeviceInfo.h` -Handlers with no test (confirmed absent from test files): +Handlers with no test (confirmed absent from test files). +Items covered by `tr69hostif_device_info.py` (July 2026) have been removed from this table. | TR-181 Parameter | Handler Function | Dir | |---|---|---| -| `Device.DeviceInfo.Manufacturer` | `get_Device_DeviceInfo_Manufacturer` | GET | -| `Device.DeviceInfo.ManufacturerOUI` | `get_Device_DeviceInfo_ManufacturerOUI` | GET | | `Device.DeviceInfo.Description` | `get_Device_DeviceInfo_Description` | GET | | `Device.DeviceInfo.ProductClass` | `get_Device_DeviceInfo_ProductClass` | GET | -| `Device.DeviceInfo.SerialNumber` | `get_Device_DeviceInfo_SerialNumber` | GET | -| `Device.DeviceInfo.HardwareVersion` | `get_Device_DeviceInfo_HardwareVersion` | GET | -| `Device.DeviceInfo.AdditionalHardwareVersion` | `get_Device_DeviceInfo_AdditionalHardwareVersion` | GET | -| `Device.DeviceInfo.AdditionalSoftwareVersion` | `get_Device_DeviceInfo_AdditionalSoftwareVersion` | GET | -| `Device.DeviceInfo.ProvisioningCode` | `get_Device_DeviceInfo_ProvisioningCode` | GET | | `Device.DeviceInfo.UpTime` | `get_Device_DeviceInfo_UpTime` | GET | -| `Device.DeviceInfo.FirstUseDate` | `get_Device_DeviceInfo_FirstUseDate` | GET | | `Device.DeviceInfo.MemoryStatus.Total` | `get_Device_DeviceInfo_MemoryStatus_Total` | GET | | `Device.DeviceInfo.MemoryStatus.Free` | `get_Device_DeviceInfo_MemoryStatus_Free` | GET | -| `Device.DeviceInfo.VendorConfigFileNumberOfEntries` | `get_Device_DeviceInfo_VendorConfigFileNumberOfEntries` | GET | -| `Device.DeviceInfo.SupportedDataModelNumberOfEntries` | `get_Device_DeviceInfo_SupportedDataModelNumberOfEntries` | GET | | `Device.DeviceInfo.ProcessorNumberOfEntries` | `get_Device_DeviceInfo_ProcessorNumberOfEntries` | GET | -| `Device.DeviceInfo.VendorLogFileNumberOfEntries` | `get_Device_DeviceInfo_VendorLogFileNumberOfEntries` | GET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_Reset` | `get_Device_DeviceInfo_X_RDKCENTRAL_COM_Reset` | GET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_Reset` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_Reset` | SET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.IpAddress` | `get_Device_DeviceInfo_X_RDKCENTRAL_COM_IPRemoteSupportIpaddress` | GET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_IPRemoteSupport.MACAddress` | `get_Device_DeviceInfo_X_RDKCENTRAL_COM_IPRemoteSupportMACaddress` | GET | -| `Device.DeviceInfo.X_RDKCENTRAL-COM_xOpsDeviceMgmt.RPC.XRPollingAction` | `get_Device_DeviceInfo_X_RDKCENTRAL_COM_XRPollingAction` | GET+SET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_RDKRemoteDebugger.IssueType` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_RDKRemoteDebuggerIssueType` | SET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_RDKRemoteDebugger.WebCfgData` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_RDKRemoteDebuggerWebCfgData` | SET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_Canary.WakeUpStart` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_Canary_wakeUpStart` | SET | | `Device.DeviceInfo.X_RDKCENTRAL-COM_Canary.WakeUpEnd` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_Canary_wakeUpEnd` | SET | -| `Device.DeviceInfo.X_RDKCENTRAL-COM_MemInsight.Trigger` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_MemInsight_Trigger` | SET | -| `Device.DeviceInfo.X_RDKCENTRAL-COM_MemInsight.Enable` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_MemInsight_Enable` | SET | -| `Device.DeviceInfo.X_RDKCENTRAL-COM_RebootStopEnable` | `set_Device_DeviceInfo_X_RDKCENTRAL_COM_RebootStopEnable` | SET | --- @@ -377,41 +403,45 @@ Handlers still missing: --- -### Gap 4 — Device.InterfaceStack (zero coverage) +### Gap 4 — Device.InterfaceStack ✔ RESOLVED (July 2026) Source: `src/hostif/profiles/InterfaceStack/Device_InterfaceStack.h` -| TR-181 Parameter | Handler Function | Dir | -|---|---|---| -| `Device.InterfaceStackNumberOfEntries` | `get_Device_InterfaceStackNumberOfEntries` | GET | -| `Device.InterfaceStack.{i}.HigherLayer` | `get_Device_InterfaceStack_HigherLayer` | GET | -| `Device.InterfaceStack.{i}.LowerLayer` | `get_Device_InterfaceStack_LowerLayer` | GET | +All three handlers are now covered by `tr69hostif_interfacestack.py` (orders 523–525). + +| TR-181 Parameter | Handler Function | Dir | Status | +|---|---|---|---| +| `Device.InterfaceStackNumberOfEntries` | `get_Device_InterfaceStackNumberOfEntries` | GET | ✔ Covered | +| `Device.InterfaceStack.{i}.HigherLayer` | `get_Device_InterfaceStack_HigherLayer` | GET | ✔ Covered | +| `Device.InterfaceStack.{i}.LowerLayer` | `get_Device_InterfaceStack_LowerLayer` | GET | ✔ Covered | --- -### Gap 5 — Device.StorageService (zero coverage) +### Gap 5 — Device.StorageService ✔ RESOLVED (July 2026) Source: `src/hostif/profiles/StorageService/Service_Storage.h`, `Service_Storage_PhyMedium.h` Build flag: `WITH_STORAGESERVICE_PROFILE` -| TR-181 Parameter | Handler Function | Dir | -|---|---|---| -| `Device.StorageService.{i}.ClientNumberOfEntries` | `get_Device_StorageSrvc_ClientNumberOfEntries` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Alias` | `get_Device_Service_StorageMedium_Alias` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Name` | `get_Device_Service_StorageMedium_Name` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Vendor` | `get_Device_Service_StorageMedium_Vendor` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Model` | `get_Device_Service_StorageMedium_Model` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.SerialNumber` | `get_Device_Service_StorageMedium_SerialNumber` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.FirmwareVersion` | `get_Device_Service_StorageMedium_FirmwareVersion` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.ConnectionType` | `get_Device_Service_StorageMedium_ConnectionType` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Removable` | `get_Device_Service_StorageMedium_Removable` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Status` | `get_Device_Service_StorageMedium_Status` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Uptime` | `get_Device_Service_StorageMedium_Uptime` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.SMARTCapable` | `get_Device_Service_StorageMedium_SMARTCapable` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.Health` | `get_Device_Service_StorageMedium_Health` | GET | -| `Device.StorageService.{i}.PhysicalMedium.{i}.HotSwappable` | `get_Device_Service_StorageMedium_HotSwappable` | GET | -| `Device.StorageService.{i}.PhysicalMedium.NumberOfEntries` | `get_Device_Service_StorageMedium_ClientNumberOfEntries` | GET | +All 15 handlers are now covered by `tr69hostif_storageservice.py` (orders 344–358). + +| TR-181 Parameter | Handler Function | Dir | Status | +|---|---|---|---| +| `Device.StorageService.{i}.ClientNumberOfEntries` | `get_Device_StorageSrvc_ClientNumberOfEntries` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Alias` | `get_Device_Service_StorageMedium_Alias` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Name` | `get_Device_Service_StorageMedium_Name` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Vendor` | `get_Device_Service_StorageMedium_Vendor` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Model` | `get_Device_Service_StorageMedium_Model` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.SerialNumber` | `get_Device_Service_StorageMedium_SerialNumber` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.FirmwareVersion` | `get_Device_Service_StorageMedium_FirmwareVersion` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.ConnectionType` | `get_Device_Service_StorageMedium_ConnectionType` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Removable` | `get_Device_Service_StorageMedium_Removable` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Status` | `get_Device_Service_StorageMedium_Status` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Uptime` | `get_Device_Service_StorageMedium_Uptime` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.SMARTCapable` | `get_Device_Service_StorageMedium_SMARTCapable` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.Health` | `get_Device_Service_StorageMedium_Health` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.{i}.HotSwappable` | `get_Device_Service_StorageMedium_HotSwappable` | GET | ✔ Covered | +| `Device.StorageService.{i}.PhysicalMedium.NumberOfEntries` | `get_Device_Service_StorageMedium_ClientNumberOfEntries` | GET | ✔ Covered | --- @@ -611,11 +641,11 @@ These feature files have no matching runnable test file: | Gap | Area | Handler/Parameter Count | Priority | |---|---|---:|---| -| 1 | DeviceInfo uncovered handlers | ~29 | High | +| 1 | DeviceInfo uncovered handlers | ~14 | High | | 2 | ProcessStatus.CPUUsage | 1 | Medium | | 3 | Time SET-side | 2 | Low | -| 4 | InterfaceStack | 3 | Low | -| 5 | StorageService | 15 | Medium | +| 4 | InterfaceStack | 0 (**resolved**) | — | +| 5 | StorageService | 0 (**resolved**) | — | | 6 | WiFi (entire subtree) | ~153 | High | | 7 | Time SET gap | 2 | Low | | 8 | Negative/edge cases | ~12 | High | @@ -638,9 +668,9 @@ These feature files have no matching runnable test file: | Category | Count | |---|---:| | Baseline module surface (approx) | 761 | -| Implemented runnable tests | 313 | -| Remaining estimated items | 448 | -| Coverage percentage | 41.1% | +| Implemented runnable tests | 416 | +| Remaining estimated items | 345 | +| Coverage percentage | 54.7% | --- @@ -651,18 +681,18 @@ runnable test functions to known handler surfaces. | # | Profile Area | TR-181 Namespace | GET | SET | Tests Needed | Covered (est.) | Gap | Coverage | |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:| -| 1 | **DeviceInfo** | `Device.DeviceInfo.*` | 111 | 61 | **172** | ~67 | ~105 | ~39% | +| 1 | **DeviceInfo** | `Device.DeviceInfo.*` | 111 | 61 | **172** | ~151 | ~21 | ~88% | | 2 | **Ethernet** | `Device.Ethernet.*` | 25 | 5 | **30** | 24 | 6 | ~80% | | 3 | **IP** | `Device.IP.*` | 73 | 33 | **106** | ~51 | ~55 | ~48% | | 4 | **DHCPv4** | `Device.DHCPv4.*` | 4 | 0 | **4** | 4 | 0 | 100% | -| 5 | **InterfaceStack** | `Device.InterfaceStack.*` | 2 | 0 | **2** | 0 | 2 | 0% | +| 5 | **InterfaceStack** | `Device.InterfaceStack.*` | 3 | 0 | **3** | 3 | 0 | 100% | | 6 | **MoCA** | `Device.MoCA.*` | 89 | 10 | **99** | 53 | 46 | ~54% | | 7 | **STBService** | `Device.Services.STBService.*` | 71 | 14 | **85** | ~1 | ~84 | ~1% | -| 8 | **StorageService** | `Device.StorageService.*` | 15 | 0 | **15** | 0 | 15 | 0% | +| 8 | **StorageService** | `Device.StorageService.*` | 15 | 0 | **15** | 15 | 0 | 100% | | 9 | **Time** | `Device.Time.*` | 20 | 17 | **37** | ~20 | ~17 | ~54% | | 10 | **WiFi** | `Device.WiFi.*` | 132 | 21 | **153** | ~14 | ~139 | ~9% | | 11 | **Device** | `Device.*` (misc) | 3 | 1 | **4** | 0 | 4 | 0% | -| | **Parameter subtotal** | | **545** | **163** | **707** | **~234** | **~473** | **~33%** | +| | **Parameter subtotal** | | **545** | **163** | **707** | **~336** | **~371** | **~48%** | --- @@ -670,15 +700,15 @@ runnable test functions to known handler surfaces. DeviceInfo is the largest single profile area. -| Source File | GET | SET | Tests Needed | June 2026 Covered | Notes | +| Source File | GET | SET | Tests Needed | July 2026 Covered | Notes | |---|:---:|:---:|:---:|:---:|---| -| `Device_DeviceInfo.cpp` | 70 | 59 | 129 | ~50 | tr69hostif_custom.py + std_params + thunder plugins cover majority | +| `Device_DeviceInfo.cpp` | 70 | 59 | 129 | ~83 | tr69hostif_custom.py + std_params + thunder plugins + device_info.py + opsdevicemgmt_*.py cover majority | | `Device_DeviceInfo_Processor.cpp` | 1 | 0 | 1 | 1 | `Processor.Architecture` covered in processor_processstatus | | `Device_DeviceInfo_ProcessStatus.cpp` | 1 | 0 | 1 | 0 | `CPUUsage` not yet tested | | `Device_DeviceInfo_ProcessStatus_Process.cpp` | 6 | 0 | 6 | 7 | PID, Command, Size, Priority, CPUTime, State, ProcessNumberOfEntries | -| `XrdkBlueTooth.cpp` | 32 | 2 | 34 | 0 | `BLE_TILE_PROFILE` compile guard — no tests | +| `XrdkBlueTooth.cpp` | 32 | 2 | 34 | ~34 | Covered via `tr69hostif_bluetooth.py` (orders 437–471) | | `XrdkCentralComRFC.cpp` | 1 | 0 | 1 | 1 | `XRFCStorage::getValue` via rfc_store tests | -| **DeviceInfo TOTAL** | **111** | **61** | **172** | **~59** | | +| **DeviceInfo TOTAL** | **111** | **61** | **172** | **~126** | | --- @@ -698,12 +728,12 @@ DeviceInfo is the largest single profile area. ### Progress Delta (from earlier state) -| Metric | Earlier | Current | Delta | -|---|---:|---:|---:| -| Runnable tests | 47 | 313 | +266 | -| Feature scenarios | 73 | 355 | +282 | -| Runnable test files | 4 | 25 | +21 | -| Feature files | 4 | 29 | +25 | +| Metric | Earlier | June 2026 | July 2026 | Delta (Jun→Jul) | +|---|---:|---:|---:|---:| +| Runnable tests | 47 | 313 | 416 | +103 | +| Feature scenarios | 73 | 355 | 427 | +72 | +| Runnable test files | 4 | 25 | 31 | +6 | +| Feature files | 4 | 29 | 35 | +6 | --- @@ -717,14 +747,14 @@ planning baseline. Values remain approximate and are used for gap planning again | Profile Area | GET | SET | Tests Needed (Baseline) | Current Status | |---|---:|---:|---:|---| -| DeviceInfo | 111 | 61 | 172 | Partial coverage | +| DeviceInfo | 111 | 61 | 172 | Strongly improved (~88%) | | Ethernet | 25 | 5 | 30 | Improved but not complete | | IP | 73 | 33 | 106 | Strongly improved | | DHCPv4 | 4 | 0 | 4 | Limited | -| InterfaceStack | 2 | 0 | 2 | Limited | +| InterfaceStack | 3 | 0 | 3 | **Fully covered** | | MoCA | 89 | 10 | 99 | Strongly improved but not closed | | STBService | 71 | 14 | 85 | Partial | -| StorageService | 15 | 0 | 15 | Limited | +| StorageService | 15 | 0 | 15 | **Fully covered** | | Time | 20 | 17 | 37 | Improved | | WiFi | 132 | 21 | 153 | Improved, still large surface | | Device (misc) | 3 | 1 | 4 | Partial | @@ -734,10 +764,10 @@ planning baseline. Values remain approximate and are used for gap planning again | Category | Tests Needed | Covered (Estimated) | Remaining | |---|---:|---:|---:| -| Parameter handlers (all profiles) | 707 | 313-equivalent partial mix | Pending | +| Parameter handlers (all profiles) | 707 | 416-equivalent partial mix | Pending | | Behavioral scenarios | 38 | Partial | | Negative and edge cases | ~16 | Partial | -| Total baseline | ~761 | 313 | ~448 | +| Total baseline | ~761 | 416 | ~345 | --- @@ -749,13 +779,13 @@ Quick-reference table showing how much of each profile is still untested. |---|:---:|:---:|:---:|---| | `Device.WiFi.*` | 153 | ~14 | **~139** | Radio (27 params), SSID (9), SSID.Stats (15), EndPoint (13), ClientRoaming (13), AccessPoint (~20) | | `Device.MoCA.*` | 99 | 53 | **46** | AssociatedDevice (17), QoS (10), MeshTable (4), remaining interface params | -| `Device.DeviceInfo.*` | 172 | ~59 | **~113** | BT/Tile (34), RDKRemoteDebugger, Canary, MemInsight, standard read-only params | +| `Device.DeviceInfo.*` | 172 | ~151 | **~21** | RDKRemoteDebugger, Canary, MemoryStatus, UpTime, Description, ProductClass, ProcessorNumberOfEntries | | `Device.IP.*` | 106 | ~51 | **~55** | IPv4 SETs (6), IPv6Address/Prefix non-tested params, Interface.Stats SETs | | `Device.Services.STBService.*` | 85 | ~1 | **~84** | AudioOutput SET/GET (25), eMMC (14), SPDIF (11), SDCard (10), Security (9) | | `Device.Ethernet.*` | 30 | 24 | **6** | LowerLayers, LastChange, Enable SET, DuplexMode SET | | `Device.Time.*` | 37 | ~20 | **~17** | `set_Device_Time_Enable`, `set_Device_Time_LocalTimeZone`, remaining SET handlers | -| `Device.StorageService.*` | 15 | 0 | **15** | All PhysicalMedium GET handlers | -| `Device.InterfaceStack.*` | 2 | 0 | **2** | `HigherLayer`, `LowerLayer` | +| `Device.StorageService.*` | 15 | 15 | **0** | **Fully covered** | +| `Device.InterfaceStack.*` | 3 | 3 | **0** | **Fully covered** | | `Device.DHCPv4.*` | 4 | 4 | **0** | Fully covered | | Negative / edge cases | ~16 | ~12 | **~4** | Type-mismatch SET, out-of-range value, additional WebPA errors | @@ -766,23 +796,20 @@ Quick-reference table showing how much of each profile is still untested. ```mermaid flowchart TD P1[P1: WiFi Profile Tests\n~139 remaining handlers] --> P2 - P2[P2: DeviceInfo Uncovered\nBT, Canary, MemInsight, standard read-only] --> P3 - P3[P3: STBService Profile Tests\n~84 remaining handlers] --> P4 - P4[P4: MoCA Remaining Tests\n~46 remaining handlers] --> P5 - P5[P5: StorageService Tests\n15 GET-only handlers] --> P6 - P6[P6: Negative Edge Cases\n~4 remaining scenarios] + P2[P2: STBService Profile Tests\n~84 remaining handlers] --> P3 + P3[P3: MoCA Remaining Tests\n~46 remaining handlers] --> P4 + P4[P4: DeviceInfo Remaining\nRDKRemoteDebugger, Canary, MemoryStatus (~21)] --> P5 + P5[P5: Negative Edge Cases\n~4 remaining scenarios] ``` | Priority | Area | Remaining Tests | Blocking? | |---|---|:---:|---| | P1 | WiFi full profile | ~139 | Yes — 9% coverage on large surface | -| P2 | DeviceInfo uncovered handlers | ~113 | Yes — standard info params unverified | -| P3 | STBService profile | ~84 | Yes — 1% coverage | -| P4 | MoCA remaining | ~46 | No — 54% base exists | -| P5 | StorageService profile | 15 | No — conditional build | -| P6 | Negative/edge cases | ~4 | No — partial coverage exists | -| P7 | InterfaceStack | 2 | No — conditional build | -| P8 | Time SET-side | 2 | No — GET side complete | +| P2 | STBService profile | ~84 | Yes — 1% coverage | +| P3 | MoCA remaining | ~46 | No — 54% base exists | +| P4 | DeviceInfo remaining handlers | ~21 | No — 88% base now exists | +| P5 | Negative/edge cases | ~4 | No — partial coverage exists | +| P6 | Time SET-side | 2 | No — GET side complete | --- From 1ebceaa47f54e1c1a67c85503fa9e31d25038557 Mon Sep 17 00:00:00 2001 From: Aravindan NC <35158113+AravindanNC@users.noreply.github.com> Date: Tue, 21 Jul 2026 13:52:00 -0400 Subject: [PATCH 4/5] RDK-61871: Add OTEL source code and recipe changes to RDKE (#511) * Update data-model-generic.xml * Update data-model-generic.xml * Update Device_DeviceInfo.cpp * Update Device_DeviceInfo.h * Potential fix for pull request finding 'CodeQL / File created without restricting permissions' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * Update data-model-generic.xml --------- Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> --- .../waldb/data-model/data-model-generic.xml | 8 ++ .../profiles/DeviceInfo/Device_DeviceInfo.cpp | 77 +++++++++++++++++++ .../profiles/DeviceInfo/Device_DeviceInfo.h | 5 ++ 3 files changed, 90 insertions(+) diff --git a/src/hostif/parodusClient/waldb/data-model/data-model-generic.xml b/src/hostif/parodusClient/waldb/data-model/data-model-generic.xml index 8c3a98052..76c4e9202 100644 --- a/src/hostif/parodusClient/waldb/data-model/data-model-generic.xml +++ b/src/hostif/parodusClient/waldb/data-model/data-model-generic.xml @@ -2827,6 +2827,14 @@ + + + + + + + + diff --git a/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.cpp b/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.cpp index 5ebfc3eb1..aa5f3710d 100644 --- a/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.cpp +++ b/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -3797,6 +3798,10 @@ int hostIf_DeviceInfo::set_xRDKCentralComRFC(HOSTIF_MsgData_t * stMsgData) { ret = set_xRDKCentralComNewNtpEnable(stMsgData); } + else if (!strcasecmp(stMsgData->paramName, DISTRIBUTED_TRACING_RFC_ENABLE)) + { + ret = set_xRDKCentralComRFCDistributedTracingEnable(stMsgData); + } return ret; } @@ -3845,6 +3850,78 @@ int hostIf_DeviceInfo::set_xRDKCentralComNewNtpEnable(HOSTIF_MsgData_t *stMsgDat return ret; } +int hostIf_DeviceInfo::set_xRDKCentralComRFCDistributedTracingEnable(HOSTIF_MsgData_t *stMsgData) +{ + int ret = NOK; + bool enable = false; + LOG_ENTRY_EXIT; + + if (stMsgData->paramtype != hostIf_BooleanType) + { + RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF, + "[%s:%d] Wrong type for %s, expected boolean.\n", + __FUNCTION__, __LINE__, stMsgData->paramName); + return NOK; + } + + enable = get_boolean(stMsgData->paramValue); + RDK_LOG(RDK_LOG_INFO, LOG_TR69HOSTIF, + "[%s] DistributedTracing RFC: %s\n", __FUNCTION__, enable ? "ENABLE" : "DISABLE"); + + if (enable) + { + /* Create flag file watched by librdk_otlp.so via inotify in all processes */ + int fd = open(RDK_TRACING_FLAG_FILE, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd >= 0) + { + FILE *fp = fdopen(fd, "w"); + if (fp) + { + fclose(fp); + RDK_LOG(RDK_LOG_INFO, LOG_TR69HOSTIF, + "[%s] Created tracing flag file %s\n", __FUNCTION__, RDK_TRACING_FLAG_FILE); + } + else + { + close(fd); + RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF, + "[%s] Failed to create tracing flag file %s: %s\n", + __FUNCTION__, RDK_TRACING_FLAG_FILE, strerror(errno)); + } + } + else + { + RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF, + "[%s] Failed to create tracing flag file %s: %s\n", + __FUNCTION__, RDK_TRACING_FLAG_FILE, strerror(errno)); + } + v_secure_system("systemctl start rdk-otel-collector.service"); + RDK_LOG(RDK_LOG_INFO, LOG_TR69HOSTIF, + "[%s] Started rdk-otel-collector.service\n", __FUNCTION__); + } + else + { + v_secure_system("systemctl stop rdk-otel-collector.service"); + RDK_LOG(RDK_LOG_INFO, LOG_TR69HOSTIF, + "[%s] Stopped rdk-otel-collector.service\n", __FUNCTION__); + /* Remove flag file - inotify IN_DELETE fires in all processes */ + if (remove(RDK_TRACING_FLAG_FILE) != 0 && errno != ENOENT) + { + RDK_LOG(RDK_LOG_ERROR, LOG_TR69HOSTIF, + "[%s] Failed to remove tracing flag file %s: %s\n", + __FUNCTION__, RDK_TRACING_FLAG_FILE, strerror(errno)); + } + else + { + RDK_LOG(RDK_LOG_INFO, LOG_TR69HOSTIF, + "[%s] Removed tracing flag file %s\n", __FUNCTION__, RDK_TRACING_FLAG_FILE); + } + } + + ret = OK; + return ret; +} + int hostIf_DeviceInfo::get_xRDKCentralComBootstrap(HOSTIF_MsgData_t *stMsgData) { return m_bsStore->getValue(stMsgData); diff --git a/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.h b/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.h index 0a73c1d81..9e4e40671 100644 --- a/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.h +++ b/src/hostif/profiles/DeviceInfo/Device_DeviceInfo.h @@ -193,6 +193,10 @@ #define RDK_REMOTE_DEBUGGER_WEBCFGDATA "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RDKRemoteDebugger.WebCfgData" #endif +/* Profile: X_RDKCENTRAL-COM_RFC.Feature.DistributedTracing */ +#define DISTRIBUTED_TRACING_RFC_ENABLE "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.DistributedTracing.Enable" +#define RDK_TRACING_FLAG_FILE "/tmp/rdk_distributed_tracing_enabled" + /* Profile: X_RDKCENTRAL-COM_RFC.Feature.RebootStop */ #define RDK_REBOOTSTOP_ENABLE "Device.DeviceInfo.X_RDKCENTRAL-COM_RFC.Feature.RebootStop.Enable" @@ -306,6 +310,7 @@ class hostIf_DeviceInfo { int ScheduleAutoReboot(bool); int set_xRDKCentralComNewNtpEnable(HOSTIF_MsgData_t *); + int set_xRDKCentralComRFCDistributedTracingEnable(HOSTIF_MsgData_t *); int get_xRDKCentralComRFCAccountId (HOSTIF_MsgData_t *); int get_xOpsDeviceMgmtRPCRebootNow (HOSTIF_MsgData_t *); From ea476f92ec83bc7141d174e79196a12e2f60ada8 Mon Sep 17 00:00:00 2001 From: nhanas001c Date: Tue, 21 Jul 2026 18:16:41 +0000 Subject: [PATCH 5/5] tr69hostif 1.4.9 release changelog updates --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92af360db..6328f828d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,23 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [1.4.9](https://github.com/rdkcentral/tr69hostif/compare/1.4.8...1.4.9) + +- RDK-61871: Add OTEL source code and recipe changes to RDKE [`#511`](https://github.com/rdkcentral/tr69hostif/pull/511) +- RDKEMW-20790 : L2 Coverage for tr69hostif update [`#513`](https://github.com/rdkcentral/tr69hostif/pull/513) +- RDKEMW-20790 : Improve L2 Coverage for tr69hostif [`#507`](https://github.com/rdkcentral/tr69hostif/pull/507) +- RDKEMW-21374: Fix L2 Upload Results to Automatics Error [`#508`](https://github.com/rdkcentral/tr69hostif/pull/508) +- Merge tag '1.4.8' into develop [`78e90eb`](https://github.com/rdkcentral/tr69hostif/commit/78e90eb7cfb0bfe74597e3be7d80f9a0af761c73) + #### [1.4.8](https://github.com/rdkcentral/tr69hostif/compare/1.4.7...1.4.8) +> 10 July 2026 + - RDKEMW-19296 : Deprecated DataModel Removal for HWSelftest and SNMP code from RDKE [`#505`](https://github.com/rdkcentral/tr69hostif/pull/505) - updated the L2_Test_Coverage.md [`#504`](https://github.com/rdkcentral/tr69hostif/pull/504) - RDKEMW-19857 : Control Manager Deprecate RFC Code Removal from RDKE [`#497`](https://github.com/rdkcentral/tr69hostif/pull/497) - RDK-44337 : Test Gap Analysis on tr69hostif for L2 Framework with Regression Coverage [`#487`](https://github.com/rdkcentral/tr69hostif/pull/487) +- tr69hostif 1.4.8 release changelog updates [`69f54df`](https://github.com/rdkcentral/tr69hostif/commit/69f54df2c68eb246836d054e538e246a06072e8e) - Merge tag '1.4.7' into develop [`642ccbb`](https://github.com/rdkcentral/tr69hostif/commit/642ccbb6f6625b680b0b20ca39acb1d6f235fb33) #### [1.4.7](https://github.com/rdkcentral/tr69hostif/compare/1.4.6...1.4.7)