![ARM Mbed-OS logo](https://raw.githubusercontent.com/ARMmbed/mbed-os/master/logo.png)
Matter Arm Mbed OS Integration Tests
This page describes the Matter project's functional testing approach for Mbed
applications. It allows you to better understand the use of tools and frameworks
for target validation.
- [Overview](#overview)
- [Setup](#setup)
- [Environment setup](#environment-setup)
- [Tools installation](#tools-installation)
- [Setup WiFi access point](#setup-wifi-access-point)
- [Mount the device](#mount-the-device)
- [Prepare device under test](#prepare-device-under-test)
- [Tests configuration](#tests-configuration)
- [Test run](#test-run)
- [Tests results](#tests-results)
# Overview
According to the Matter project design idea:
_"The ability to run tests on actual and emulated hardware is paramount in
embedded projects. CHIP is no exception. We want on-device testing to be a first
class goal of CHIP architecture. On-device testing requirements apply both to
Continuous Integration testing for main CHIP software stack development and to
eventual CHIP product certification."_
However, functional testing requires a host machine to run and control the
testing program. Connection and data exchange between the host machine and the
device under test is necessary. Various communication interfaces and protocols
are used for this purpose (i.e serial port, network communication via Ethernet,
or WiFi).
The common functional test scenario involves the following steps:
- Get binaries image of testing application (build directly or download CI
artifacts)
- Flash binary image to the device under test
- Configuration functional tests
- Run testing
- Collecting and processing the results
Matter Arm Mbed OS Integration Tests happens at system level on real hardware.
The host machine running the tests should be connected to the board under test
via serial port. The tests send a succession of commands to the connected boards
or trigger external tools action that changes the device state and asserts the
results reported by the hardware.
For example, here is a test validating that WiFi connection works:
**Preparation:** The device is connected to the host via serial port and
executes the shell example application.
**The test:**
1. Checking if the device is connected
1. Sending the command connecting with network credentials
1. Check device response
1. Check the device IP address
The Mbed integration tests are coded in Python and use the pyTest framework.
This also allows for easy integration with external CHIP tools such as
device-controller.
Python CHIP Controller and RPC console are required for the correct run
integration tests.
# Setup
## Environment setup
The first step check out the Matter repository and sync submodules using the
following command:
$ git submodule update --init
Building the example application requires the use of **ARM Mbed-OS** sources and
the **arm-none-gnu-eabi** toolchain.
The Cypress OpenOCD package is required for flashing purpose. Install the
Cypress OpenOCD and set env var `OPENOCD_PATH` before calling the flashing
script.
```
cd ~
wget https://github.com/Infineon/openocd/releases/download/release-v4.3.0/openocd-4.3.0.1746-linux.tar.gz
tar xzvf openocd-4.3.0.1746-linux.tar.gz
export OPENOCD_PATH=$HOME/openocd
```
Some additional packages may be needed, depending on selected build target and
its requirements.
> **The VSCode devcontainer has these components pre-installed. Using the VSCode
> devcontainer is the recommended way to interact with Arm Mbed-OS port of the
> Matter Project.**
>
> **Please read this [README.md](../../../../docs/VSCODE_DEVELOPMENT.md) for
> more information about using VSCode in container.**
To initialize the development environment, download all registered sub-modules
and activate the environment:
```
$ source ./scripts/bootstrap.sh
$ source ./scripts/activate.sh
```
If packages are already installed then you just need to activate the development
environment:
```
$ source ./scripts/activate.sh
```
## Tools installation
Python CHIP Controller and RPC console are required for the correct run
integration tests. Build and install them inside the development environment.
For building and installing Python CHIP Controller please visit
[Python CHIP Controller](../../../../docs/guides/python_chip_controller_building.md)
For building and installing RPC console please visit
[CHIP RPC CONSOLE](../../../../examples/common/pigweed/rpc_console/README.md)
## Setup WiFi access point
The way of running the WiFi access point depends on the platform on which the
tests are run. Choose the best one. Just remember the network credentials ssid
and password.
## Mount the device
There is a special script for the easy Mbed board mounting. It adds a static
entry in fstab with a new connected device.
Then you can just need to call `sudo mount -a` to mount the device.
To add the new Mbed device you should:
1. Run script `bash src/scripts/tests/mbed/mount_new_mbed_device.sh`
2. Plug the device
3. Run `sudo mount -a`
That's all. The new device is ready for testing.
# Prepare device under test
Preparation of the device for testing should consist of two steps:
- prepare binary image - building an right application from sources
- flash binary image to device
For more information how to build and flash example application please visit
their documentation.
# Tests configuration
Mbed integration tests can be configured by PyTest command line arguments. Every
test call may contain a specific test configuration. The list of supported
parameters:
**[Common]**
- _platforms_ - list of platforms that can be used to run the tests. Platforms
are separated by a comma
- _binaries_ - platform and associated binary in the form platform:binary.
Multiple values are separated by a comma
- _serial_inter_byte_delay_ - time in second between two bytes sent on the
serial line (accepts floats), default=None
- _serial_baudrate_ - baudrate of the serial port used, default=115200
**[Test specific]**
- _network_ - WiFi network credentials to which we want to connect device.
Format network_ssid:network_password
# Test run
To run Mbed integration tests execute the pytest command with the arguments
mentioned above. For example:
`pytest --platforms=CY8CPROTO_062_4343W --network=$AP_SSID:$AP_PASSWORD ... src/test_driver/mbed/integration_tests/{APP_NAME}/test_app.py`
The Mbed integration testes cases are divided into separate directory depends on
the testing Matter application:
- shell - testing shell commands and check base device functionalities
- lock-app - testing WiFi provisioning and execute ZCL command to control
lock, use RPC client to run base device functionalities, control lock and
trigger some button actions
- lighting-app - testing WiFi provisioning and execute ZCL command to control
light, use RPC client to run base device functionalities, control light and
trigger some button actions
- pigweed-app - use RPC client to send echo message and receive the response
- unit-tests - check unit-tests result
For more details on how to run tests using PyTest see:
[PyTest doc](https://docs.pytest.org/en/6.2.x/usage.html)
Pytest markers have been added to run a specific set of tests:
- smoketest - check base communication and correct launch of the application
# Tests results
Adding `-rAv` arguments to Pytest cause that short tests summary is on the
output.
For example:
```
pytest -rAv simple_test.py
```
Output:
```
=================================================================================================================== short test summary info ====================================================================================================================
PASSED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_smoke_test
PASSED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_help_check
PASSED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_log_check
PASSED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_rand_check
PASSED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_base64_encode_decode
FAILED CHIP/src/test_driver/mbed/integration_tests/shell/test_app.py::test_wifi_mode - AssertionError: assert 'true' == 'false'
===================================================================================================== 1 failed, 4 passed, 7 warnings in 20.71s (0:03:29) =====================================================================================================
```
There is also an option to save test results to HTML file. Adding
`--html=` arguments to Pytest cause that all test results are
saved to HTML file and can be open in your browser.
For example:
```
pytest --html=result.html simple_test.py
```