| # Matter RPC Verification Tool |
| |
| ## Overview |
| |
| The Matter RPC verification tool can help verify if the Matter SDK (or Matter solution) has the required RPCs defined in the [Matter RPC guidelines document](https://docs.google.com/document/d/1uOFa_xLk7H03BnrTGNE5gV3TtiGoEfIE6Yh2fctSeMc), and offer a free stress test suite to help verify the SDK software quality and robustness. |
| |
| With RPC implemented in the SDK (or the Matter solution), on-device automation testing becomes feasible, such as regression tests (ex: automatic execution every x hour) and stress tests (ex: 100 times device boot up test) can be easily enabled to catch bugs in an early stage. |
| |
| |
| ## Features |
| |
| 1. Provides simple tests to verify if the SDK or the Matter solution contains all the required RPCs. |
| 2. Provides stress test suites to test the quality and robustness of the SDK or the Matter solution. |
| 3. Generates test result in compressed file for the above tests. |
| |
| |
| ## Prerequisites |
| |
| Make sure the host meets the following prerequisites before setting up the RPC tool. |
| |
| |
| ### Host Minimum Requirements |
| |
| 1. Ubuntu LTS or any other Linux-based environments. |
| 2. `Python3` installed with version `>=3.7` |
| 3. Internet access. |
| 4. Device debug interface (Typically UART over USB) |
| |
| |
| ## Setup tool |
| |
| 1. Clone the repository at ```$HOME``` (or any desired place): |
| ``` |
| $ cd $HOME |
| $ git clone https://testsuite-smarthome-matter.googlesource.com/matter_rpc_verification |
| ``` |
| |
| 2. Change directory to the tool folder: |
| ``` |
| $ cd $HOME/matter_rpc_verification/rpc_tool |
| ``` |
| |
| 3. Run the script to install packages: |
| ``` |
| $ sh verify_rpc.sh build |
| ``` |
| |
| Or use the below command if you're running on Ubuntu: |
| ``` |
| $ ./verify_rpc.sh build |
| ``` |
| |
| ## Usage |
| |
| ### Run verification test |
| |
| To check if the SDK contains the required RPCs: `firmware_version` RPC, `reboot` RPC, `factory_reset` RPC, `descriptor cluster` RPC and `attribute_service` RPC. |
| |
| 1. Connect the device (flashed with the SDK you want to test) to the machine (the host where you installed this tool). |
| |
| 2. Inside the ```rpc_tool``` directory, run the script: |
| ``` |
| $ sh verify_rpc.sh run |
| ``` |
| |
| Or use the below command if you're running on Ubuntu: |
| ``` |
| $ ./verify_rpc.sh run |
| ``` |
| |
| 3. The tool will ask you to select the device to test, use arrow keys on the keyboard to select. (The tool only supports running 1 device at a time). |
| |
| 4. The tool will start testing the RPC functionality of the device, a successful test result looks like: |
| |
| ``` |
| $ sh verify_rpc.sh run |
| [RpcTest] 06-09 11:42:34.896 INFO ==========> MatterRpcTest <========== |
| [RpcTest] 06-09 11:42:35.578 INFO [Test] test_rpc_attribute_service |
| [RpcTest] 06-09 11:42:36.624 INFO [Test] test_rpc_attribute_service PASS |
| [RpcTest] 06-09 11:42:36.629 INFO [Test] test_rpc_descriptor_cluster |
| [RpcTest] 06-09 11:42:37.657 INFO [Test] test_rpc_descriptor_cluster PASS |
| [RpcTest] 06-09 11:42:37.661 INFO [Test] test_rpc_factory_reset |
| [RpcTest] 06-09 11:42:38.686 INFO [Test] test_rpc_factory_reset PASS |
| [RpcTest] 06-09 11:42:38.691 INFO [Test] test_rpc_firmware_version |
| [RpcTest] 06-09 11:42:39.848 WARNING Failed to decode frame: frame check sequence failure; discarded 3962 bytes |
| [RpcTest] 06-09 11:42:40.880 INFO [Test] test_rpc_firmware_version PASS |
| [RpcTest] 06-09 11:42:40.884 INFO [Test] test_rpc_reboot |
| [RpcTest] 06-09 11:42:41.898 INFO [Test] test_rpc_reboot PASS |
| [RpcTest] 06-09 11:42:42.722 INFO Summary for test class MatterRpcTest: Error 0, Executed 5, Failed 0, Passed 5, Requested 5, Skipped 0 |
| [RpcTest] 06-09 11:42:42.723 INFO Summary for test run RpcTest@06-09-2022_11-42-34-895: |
| Total time elapsed 7.827033718116581s |
| Artifacts are saved in "/tmp/logs/mobly/RpcTest/06-09-2022_11-42-34-895" |
| Test results: Error 0, Executed 5, Failed 0, Passed 5, Requested 5, Skipped 0 |
| ``` |
| |
| A failing test result looks like (device is not responsive to some RPCs): |
| |
| ``` |
| $ sh verify_rpc.sh run |
| [RpcTest] 06-09 11:48:32.649 INFO ==========> MatterRpcTest <========== |
| [RpcTest] 06-09 11:48:33.251 INFO [Test] test_rpc_attribute_service |
| [RpcTest] 06-09 11:48:34.318 INFO [Test] test_rpc_attribute_service PASS |
| [RpcTest] 06-09 11:48:34.323 INFO [Test] test_rpc_descriptor_cluster |
| [RpcTest] 06-09 11:48:35.354 INFO [Test] test_rpc_descriptor_cluster PASS |
| [RpcTest] 06-09 11:48:35.359 INFO [Test] test_rpc_factory_reset |
| [RpcTest] 06-09 11:48:36.373 INFO [Test] test_rpc_factory_reset PASS |
| [RpcTest] 06-09 11:48:36.374 INFO [Test] test_rpc_firmware_version |
| [RpcTest] 06-09 11:48:36.624 WARNING Failed to decode frame: frame check sequence failure; discarded 10 bytes |
| [RpcTest] 06-09 11:48:36.739 WARNING Failed to decode frame: frame check sequence failure; discarded 54 bytes |
| [RpcTest] 06-09 11:48:39.375 ERROR Exception occurred in test_rpc_firmware_version. |
| Traceback (most recent call last): |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/pw_rpc/callback_client/call.py", line 179, in _get_responses |
| response = self._response_queue.get(True, timeout_s) |
| _queue.Empty |
| |
| During handling of the above exception, another exception occurred: |
| |
| Traceback (most recent call last): |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/mobly/base_test.py", line 756, in exec_one_test |
| test_method() |
| File "/home/user/rainier_agent/rpc_tool/push_code/rainier-engprod/rpc_tool/./verify_rpc/rpc_tool.py", line 131, in test_rpc_firmware_version |
| ack, device_info = self.dut.device_service.GetDeviceInfo() |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/pw_rpc/callback_client/impl.py", line 383, in call |
| return self.invoke( |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/pw_rpc/callback_client/call.py", line 261, in wait |
| return self._unary_wait(timeout_s) |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/pw_rpc/callback_client/call.py", line 142, in _unary_wait |
| for _ in self._get_responses(timeout_s=timeout_s): |
| File "/home/user/rpc_tool_venv/lib/python3.9/site-packages/pw_rpc/callback_client/call.py", line 189, in _get_responses |
| raise RpcTimeout(self._rpc, timeout_s) |
| pw_rpc.callback_client.errors.RpcTimeout: No response received for chip.rpc.Device.GetDeviceInfo after 3 s |
| [RpcTest] 06-09 11:48:40.380 INFO [Test] test_rpc_firmware_version ERROR |
| [RpcTest] 06-09 11:48:40.382 INFO [Test] test_rpc_reboot |
| [RpcTest] 06-09 11:48:40.395 WARNING Failed to decode frame: frame check sequence failure; discarded 41 bytes |
| [RpcTest] 06-09 11:48:41.457 INFO [Test] test_rpc_reboot PASS |
| [RpcTest] 06-09 11:48:42.390 INFO Summary for test class MatterRpcTest: Error 1, Executed 5, Failed 0, Passed 4, Requested 5, Skipped 0 |
| [RpcTest] 06-09 11:48:42.401 INFO Summary for test run RpcTest@06-09-2022_11-48-32-648: |
| Total time elapsed 9.75229246309027s |
| Artifacts are saved in "/tmp/logs/mobly/RpcTest/06-09-2022_11-48-32-648" |
| Test results: Error 1, Executed 5, Failed 0, Passed 4, Requested 5, Skipped 0 |
| ``` |
| |
| 5. The test result will be compressed in a zip file ```(rpc_test_result-xxxx.zip)``` under the same directory, which contains the device's logs and test framework logs during execution. |
| |
| ``` |
| $ ls |
| 'rpc_test_result-2022-06-08 14:50:26.499469.zip' verify_rpc verify_rpc.sh |
| ``` |
| |
| |
| ### Run stress test |
| |
| To run stress test suite on the SDK (or Matter solution), verifying the software quality and robustness. |
| The tool will run 50 iterations of each RPC tests. |
| |
| 1. Connect the device to the machine. |
| |
| 2. Inside the ```rpc_tool``` directory, run the script: |
| ``` |
| $ sh verify_rpc.sh stress |
| ``` |
| |
| Or use the below command if you're running on Ubuntu: |
| ``` |
| $ ./verify_rpc.sh stress |
| ``` |
| |
| 3. Select the device you want to test, then the tool will start stress testing. A successful test result looks like: |
| |
| ``` |
| $ sh verify_rpc.sh stress |
| [RpcTest] 06-08 11:58:13.719 INFO ==========> MatterRpcStressTest <========== |
| [RpcTest] 06-08 11:58:15.136 INFO [Test] test_rpc_attribute_service |
| [RpcTest] 06-08 11:58:16.205 INFO [Test] test_rpc_attribute_service PASS |
| [RpcTest] 06-08 11:58:16.209 INFO [Test] test_rpc_descriptor_cluster |
| [RpcTest] 06-08 11:58:17.234 INFO [Test] test_rpc_descriptor_cluster PASS |
| [RpcTest] 06-08 11:58:17.238 INFO [Test] test_rpc_factory_reset |
| [RpcTest] 06-08 11:58:18.255 INFO [Test] test_rpc_factory_reset PASS |
| [RpcTest] 06-08 11:58:18.260 INFO [Test] test_rpc_firmware_version |
| [RpcTest] 06-08 11:58:19.428 WARNING Failed to decode frame: frame check sequence failure; discarded 3962 bytes |
| [RpcTest] 06-08 11:58:20.435 INFO [Test] test_rpc_firmware_version PASS |
| [RpcTest] 06-08 11:58:20.441 INFO [Test] test_rpc_reboot |
| [RpcTest] 06-08 11:58:21.458 INFO [Test] test_rpc_reboot PASS |
| [RpcTest] 06-08 11:58:21.464 INFO [Test] test_reboot_0 |
| [RpcTest] 06-08 11:58:22.479 INFO [Test] test_reboot_0 PASS |
| [RpcTest] 06-08 11:58:22.483 INFO [Test] test_reboot_1 |
| [RpcTest] 06-08 11:58:23.494 INFO [Test] test_reboot_1 PASS |
| [RpcTest] 06-08 11:58:23.498 INFO [Test] test_reboot_2 |
| [RpcTest] 06-08 11:58:24.516 INFO [Test] test_reboot_2 PASS |
| [RpcTest] 06-08 11:58:24.520 INFO [Test] test_reboot_3 |
| [RpcTest] 06-08 11:58:25.535 INFO [Test] test_reboot_3 PASS |
| |
| .... |
| |
| [RpcTest] 06-08 12:02:43.830 INFO [Test] test_attribute_service_48 |
| [RpcTest] 06-08 12:02:44.877 INFO [Test] test_attribute_service_48 PASS |
| [RpcTest] 06-08 12:02:44.881 INFO [Test] test_attribute_service_49 |
| [RpcTest] 06-08 12:02:45.945 INFO [Test] test_attribute_service_49 PASS |
| [RpcTest] 06-08 12:02:47.648 INFO Summary for test class MatterRpcStressTest: Error 0, Executed 205, Failed 0, Passed 205, Requested 205, Skipped 0 |
| [RpcTest] 06-08 12:02:47.648 INFO Summary for test run RpcTest@06-08-2022_11-58-13-700: |
| Total time elapsed 273.94792108098045s |
| Artifacts are saved in "/tmp/logs/mobly/RpcTest/06-08-2022_11-58-13-700" |
| Test results: Error 0, Executed 205, Failed 0, Passed 205, Requested 205, Skipped 0 |
| ``` |
| |
| 4. The stress test result will also be compressed as a zip file under the same directory. |