User guide | |
========== | |
This page describes how to get started with compiling and running unit tests on | |
the host machine. | |
Host machine requirements | |
------------------------- | |
The system has been successfully tested on the following platforms: | |
- Ubuntu 19.04 | |
- Ubuntu 18.04 | |
- Arch Linux | |
- MSYS2 MinGW64 | |
Tools | |
----- | |
The following applications are expected to be installed in the build machine: | |
- CMake >=3.11 | |
- Python >=3.4 | |
- c-picker | |
- pyyaml | |
- clang (pip package if not included in libclang) | |
- libclang | |
- git | |
- Toolchain | |
- Native build system | |
Ubuntu 19.04 | |
^^^^^^^^^^^^ | |
On Ubuntu 19.04 use the following commands to install the required tools: | |
:: | |
sudo apt-get install cmake git python3 python3-pip libclang-dev build-essential | |
sudo pip3 install git+https://gerrit.oss.arm.com/iot-sw/shared/c-picker | |
Ubuntu 18.04 | |
^^^^^^^^^^^^ | |
The official Ubuntu 18.04 package repository only contains CMake 3.10 which not | |
satisfies the requirements for building unit tests. Fortunately there's an | |
official CMake APT repository provided by Kitware: https://apt.kitware.com/ By | |
adding this server to the repository list an up-to-date version of CMake can be | |
installed on Ubuntu 18.04. | |
:: | |
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc \ | |
2>/dev/null | sudo apt-key add - | |
sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main' | |
sudo apt-get install cmake git python3 python3-pip libclang-dev build-essential | |
sudo pip3 install git+https://gerrit.oss.arm.com/iot-sw/shared/c-picker | |
Arch Linux | |
^^^^^^^^^^ | |
On Arch Linux use the following commands to install the required tools: | |
:: | |
sudo pacman -Sy cmake git python python-pip python-yaml make gcc clang | |
sudo pip install git+https://gerrit.oss.arm.com/iot-sw/shared/c-picker | |
MSYS2 MinGW64 | |
^^^^^^^^^^^^^ | |
:: | |
pacman -Sy mingw-w64-x86_64-cmake git mingw-w64-x86_64-python3 \ | |
mingw-w64-x86_64-python3-pip make mingw-w64-x86_64-gcc mingw-w64-x86_64-clang | |
pip install git+https://gerrit.oss.arm.com/iot-sw/shared/c-picker | |
Getting unit test source code | |
----------------------------- | |
Download the unit test source code using the following command: | |
:: | |
git clone https://gerrit.oss.arm.com/trusted-firmware/tf-a-unit-tests.git | |
Getting Trusted Firmware-A source code | |
-------------------------------------- | |
Download the TF-A source code using the following command: | |
:: | |
git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git | |
Building unit tests | |
------------------- | |
Building unit tests start with running CMake which will check all the | |
prerequisites and generate the native build system's input files. This example | |
uses Unix Makefiles. Unit tests exercise the code directly by compiling it into | |
the same binary as the test code. In this case the tests need to know where to | |
find the TF-A source files and this is why the :cmake:variable:`TF_A_PATH` is | |
specified. | |
:: | |
cd tf-a-unit-tests | |
mkdir build | |
cd build | |
cmake -DTF_A_PATH=../../trusted-firmware-a -G"Unix Makefiles" .. | |
After running the previous steps the makefiles are generated into the build | |
directory so make can build unit tests. During unit test development if only the | |
source files have changed it's not necessary to re-run cmake it's only needed to | |
run make as shown below. | |
:: | |
make -j | |
For building single unit tests suites the test's name can be used as a makefile | |
target. Let's assume there's a test suite called bl1_fwu. | |
:: | |
make bl1_fwu | |
Running unit tests | |
------------------ | |
CMake provides a built-in tool called ctest for running all the tests using a | |
single command. It is also able to filter tests or run them in parallel for | |
speeding up the tests process. Run all the tests using the following command: | |
:: | |
ctest | |
Each unit test suite has its own executable. The easiest way of running single | |
test suite is running it as a simple executable. | |
:: | |
./bl1_fwu | |
Debugging unit tests | |
-------------------- | |
As it was mentioned in the previous section test suites are basically separate | |
executables so they can be debugged as any other native applications on the host | |
machine. In a Linux environment gdb or IDE's built-in debugger can be utilized | |
for debugging. | |
:: | |
gdb ./bl1_fwu | |
Measuring code coverage | |
----------------------- | |
Inspecting code coverage is a useful method for detecting parts of the code | |
which is not exercised by tests. The build system includes an option for | |
generating code coverage report of the unit tests. The coverage is processed by | |
``lcov`` which needs to be installed for this feature. Also the coverage | |
measurement in only available when GCC is used as a compiler. | |
First of all the :cmake:variable:`COVERAGE` option has to be enabled by using | |
the following command line when invoking CMake. | |
:: | |
cmake -DTF_A_PATH=../../trusted-firmware-a -DCOVERAGE=ON -G"Unix Makefiles" .. | |
This makes CMake to build the binaries with coverage information included. The | |
rest of the build process works the same way as before. | |
Before collecting coverage info and generating reports the tests must be run as | |
the coverage is a runtime measurement. See section `Running unit tests`_ for | |
more information about running unit tests. | |
The :cmake:variable:`COVERAGE` option adds two new build targets called | |
``coverage`` and ``coverage_report``. They can be used simply by running the | |
following commands if ``make`` is used as a build system. | |
:: | |
make coverage | |
make coverage_report | |
The ``coverage`` target generates lcov info files for further processing. If | |
there are coverage files available from different sources (i.e. coverages of | |
other tests) they can be merged with the unit test coverage file and evaluated | |
together. Currently two coverage info files are generated during the build. One | |
of them contains the coverage of code under test (i.e. Trusted Firmware-A) and | |
the other one has the coverage of the unit tests themselves. | |
The ``coverage_report`` target generates a HTML report from the coverage info | |
files. The coverage reports can be found in the build directory's subdirectories | |
having ``-coverage`` suffix in their names. The report shows the directory | |
structure of the code and each file can be inspected individually. Line, | |
function and branch coverage is included. | |
-------------- | |
*Copyright (c) 2019-2020, Arm Limited. All rights reserved.* |