blob: 79c5c9fd28fd84bb13554d0891a5274f4578e56e [file] [log] [blame]
Gilles Peskine3d4ea542022-11-30 17:35:44 +01001#!/bin/sh
2
Gilles Peskineeff88032022-11-30 17:51:44 +01003help () {
4 cat <<EOF
Gilles Peskine749a0d72022-11-30 18:08:14 +01005Usage: $0 [-r]
Gilles Peskineeff88032022-11-30 17:51:44 +01006Collect coverage statistics of library code into an HTML report.
7
8General instructions:
Gilles Peskine202b1a02022-12-01 17:41:36 +010091. Build the library with CFLAGS="--coverage -O0 -g3" and link the test
10 programs with LDFLAGS="--coverage".
Gilles Peskineeff88032022-11-30 17:51:44 +010011 This can be an out-of-tree build.
Gilles Peskine202b1a02022-12-01 17:41:36 +010012 For example (in-tree):
13 make CFLAGS="--coverage -O0 -g3" LDFLAGS="--coverage"
14 Or (out-of-tree):
15 mkdir build-coverage && cd build-coverage &&
16 cmake -D CMAKE_BUILD_TYPE=Coverage .. && make
Gilles Peskineeff88032022-11-30 17:51:44 +0100172. Run whatever tests you want.
183. Run this script from the parent of the directory containing the library
19 object files and coverage statistics files.
204. Browse the coverage report in Coverage/index.html.
Gilles Peskine749a0d72022-11-30 18:08:14 +0100215. After rework, run "$0 -r", then re-test and run "$0" to get a fresh report.
22
23Options
24 -r Reset traces. Run this before re-testing to get fresh measurements.
Gilles Peskineeff88032022-11-30 17:51:44 +010025EOF
26}
27
28# Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +000029# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Gilles Peskineeff88032022-11-30 17:51:44 +010030
31set -eu
32
Thomas Daubneybbb41f72023-12-05 11:42:51 +000033# Project detection
34PROJECT_NAME_FILE='./scripts/project_name.txt'
Thomas Daubneybda3e462024-07-30 15:52:58 +010035if read -r PROJECT_NAME < "$PROJECT_NAME_FILE"; then :; else
36 echo "$PROJECT_NAME_FILE does not exist... Exiting..." >&2
37 exit 1
38fi
Thomas Daubneybbb41f72023-12-05 11:42:51 +000039
40in_mbedtls_repo () {
Thomas Daubneybda3e462024-07-30 15:52:58 +010041 test "$PROJECT_NAME" = "Mbed TLS"
Thomas Daubney6a864dc2024-07-26 17:31:46 +010042}
Thomas Daubney11120f92023-10-19 15:27:59 +010043
Gilles Peskine749a0d72022-11-30 18:08:14 +010044# Collect stats and build a HTML report.
45lcov_library_report () {
Gilles Peskineeff88032022-11-30 17:51:44 +010046 rm -rf Coverage
Gilles Peskinee628f292022-11-30 17:56:58 +010047 mkdir Coverage Coverage/tmp
Gilles Peskine539d7d52024-03-13 17:19:17 +010048 # Pass absolute paths as lcov output files. This works around a bug
49 # whereby lcov tries to create the output file in the root directory
50 # if it has emitted a warning. A fix was released in lcov 1.13 in 2016.
51 # Ubuntu 16.04 is affected, 18.04 and above are not.
52 # https://github.com/linux-test-project/lcov/commit/632c25a0d1f5e4d2f4fd5b28ce7c8b86d388c91f
53 COVTMP=$PWD/Coverage/tmp
Ronald Cron4802aaa2024-10-18 09:32:19 +020054 lcov --capture --initial ${lcov_dirs} -o "$COVTMP/files.info"
55 lcov --rc lcov_branch_coverage=1 --capture ${lcov_dirs} -o "$COVTMP/tests.info"
Gilles Peskine539d7d52024-03-13 17:19:17 +010056 lcov --rc lcov_branch_coverage=1 --add-tracefile "$COVTMP/files.info" --add-tracefile "$COVTMP/tests.info" -o "$COVTMP/all.info"
57 lcov --rc lcov_branch_coverage=1 --remove "$COVTMP/all.info" -o "$COVTMP/final.info" '*.h'
58 gendesc tests/Descriptions.txt -o "$COVTMP/descriptions"
59 genhtml --title "$title" --description-file "$COVTMP/descriptions" --keep-descriptions --legend --branch-coverage -o Coverage "$COVTMP/final.info"
60 rm -f "$COVTMP/"*.info "$COVTMP/descriptions"
Gilles Peskineeff88032022-11-30 17:51:44 +010061 echo "Coverage report in: Coverage/index.html"
62}
63
Gilles Peskine749a0d72022-11-30 18:08:14 +010064# Reset the traces to 0.
65lcov_reset_traces () {
66 # Location with plain make
Ronald Cron4802aaa2024-10-18 09:32:19 +020067 for dir in ${library_dirs}; do
68 rm -f ${dir}/*.gcda
69 done
Gilles Peskine749a0d72022-11-30 18:08:14 +010070 # Location with CMake
Ronald Cron4802aaa2024-10-18 09:32:19 +020071 for dir in ${library_dirs}; do
72 rm -f ${dir}/CMakeFiles/*.dir/*.gcda
73 done
Gilles Peskine749a0d72022-11-30 18:08:14 +010074}
75
Gilles Peskineeff88032022-11-30 17:51:44 +010076if [ $# -gt 0 ] && [ "$1" = "--help" ]; then
77 help
78 exit
79fi
80
Thomas Daubneybbb41f72023-12-05 11:42:51 +000081if in_mbedtls_repo; then
Ronald Cron4802aaa2024-10-18 09:32:19 +020082 library_dirs='library tf-psa-crypto/core tf-psa-crypto/drivers/builtin'
Thomas Daubney11120f92023-10-19 15:27:59 +010083 title='Mbed TLS'
84else
Ronald Cron4802aaa2024-10-18 09:32:19 +020085 library_dirs='core drivers/builtin'
Thomas Daubney11120f92023-10-19 15:27:59 +010086 title='TF-PSA-Crypto'
87fi
88
Ronald Cron4802aaa2024-10-18 09:32:19 +020089lcov_dirs=""
90for dir in ${library_dirs}; do
91 lcov_dirs="${lcov_dirs} --directory ${dir}"
92done
93
Gilles Peskine749a0d72022-11-30 18:08:14 +010094main=lcov_library_report
95while getopts r OPTLET; do
96 case $OPTLET in
97 r) main=lcov_reset_traces;;
98 *) help 2>&1; exit 120;;
99 esac
100done
101shift $((OPTIND - 1))
102
103"$main" "$@"