Code coverage for the coreboot unit tests allows us to see what lines of code in the coreboot library are covered by unit tests, and allows a test author to see where they need to add test cases for additional coverage.
Enable code coverage in your unit test build by setting the environment variable COV
to 1; either export COV=1
in your shell, or add it to your make
command, e.g. COV=1 make unit-tests
.
The build output directory is either build/tests
or build/coverage
, depending on whether COV=1
is set in the environment.
All of the unit test targets are available with and without COV=1
clean-unit-tests
build-unit-tests
run-unit-tests
unit-tests
(which is just build-unit-tests
followed by run-unit-tests
)There are two new make
targets:
coverage-report
generates a code coverage report from all of the GCOV data (*.gcda
and *.gcno
files) in the build directory. To view the coverage report, open build/coverage/coverage_reports/index.html
in your web browser.clean-coverage-report
deletes just the coverage report.The coverage-report
and clean-coverage-report
targets automatically set COV=1
if it is not already set in the environment.
COV=1 make unit-tests coverage-report
builds all of the unit tests with code coverage, runs the unit tests, and generates the code coverage report.
COV=1 make build-unit-tests
builds all of the unit tests with code coverage.
COV=1 make run-unit-tests
runs the unit tests, building them with code coverage if they are out-of-date.
COV=1 make coverage-report
creates the code coverage report. This target does not explicitly depend on the tests being built and run; it gathers the code coverage data from the output directory, which it assumes already exists.
COV=1 make tests/lib/uuid-test coverage-report
builds the uuid test with code coverage, runs it, and generates a code coverage report just for that test.
As a demonstration that building with and without coverage uses different output directories:
make build-unit-tests
builds unit tests without code coverage into build/tests
.COV=1 make clean-unit-tests
cleans build/coverage
make build-unit-tests
doesn't need to build anything in build/tests
, because those files weren't affected by the previous clean-unit-tests
.