Introduction
A few notes on how to get code coverage for O2 (and QC).
In a nutshell :
- must compile with
--coverage -g -O0 - then run the tests
- then use lcov (or gcovr) to get e.g. html reports
The compilation phase will create *.gcno files.
The running phase will create *.gdca files.
Both lcov and gcovr are using gcov to go from the *.gcno and *.gcda files to produce *.gcov files and then work from the *.gcov files.
Step by step
First one must establish a suitable build environment. I do this with the buildenv shell function that is defined (in my alice-dev module file) as :
buildenv () {
if [ "$#" -lt 1 ]
then
echo "Missing argument"
else
echo "Setting up build env for $1"
export WORK_DIR=$ALIBUILD_WORK_DIR
source $WORK_DIR/osx_x86-64/O2/latest/etc/profile.d/init.sh
echo "Removing from LD_LIBRARY_PATH the package we are asking to develop"
export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ":" "\n" | grep -v $1 | tr "\n" ":")
echo "Unset DYLD_LIBRARY_PATH"
unset DYLD_LIBRARY_PATH
fi
}
Then, assuming O2 has been built already at least once successfully with aliBuild (so all its dependencies are installed), it’s a matter of configuring the build with cmake :
cd someemptybuildplace
enter-alice-dev
buildenv O2
cmake $HOME/alice/dev/O2 \
-DCMAKE_GENERATOR=Ninja \
-DBUILD_TEST_ROOT_MACROS=OFF \
-DBUILD_EXAMPLES=OFF \
-DCMAKE_CXX_FLAGS="--coverage -g -O0"
At this stage can check in build.ninja that indeed the different targets use the required flags : should get --coverage -g -O0 in the FLAGS of the build edges.
Then build all or part of the project (in the example below all the targets of MCH) :
cmake --build . --target $(ninja -t targets | grep -i "^O2" | grep -i mch | cut -d ':' -f 1 | tr "\n" " ")
And check that *.gdco files have indeed been produced :
find . -name '*.gc*'
Now run (some) tests :
ctest -L mch -L raw -E Detectors/Raw -j 16
And check that *.gcda files have been produced besides the *.gcdo ones
find . -name '*.gc*'
One can then run lcov to collect and filter the coverage data (from the *.gcno and *.gcda files).
dir=Detectors/MUON/MCH/Raw
lcov -c -d $dir -i -o coverage.info.zero
lcov --exclude "$(pwd)/*" --exclude '*/osx_x86-64/*' --exclude '*/Xcode.app/*' -c -d $dir -o coverage.info.test --rc lcov_branch_coverage=1
lcov -a coverage.info.zero -a coverage.info.test -o coverage.info.total
lcov -e coverage.info.total "*/$dir/*" -o coverage.info
lcov --remove coverage.info '*/test*' -o coverage.info
First note that we make two passes of collection (lcov -c) : one with -i to get the baseline (i.e. using all gcdo files) and a second one (with some exclusions as well, see below) which will only get relevant information from existing gcda files. The initial pass is necessary to get a fair view of the coverage (otherwise not tested parts simply do not appear in the coverage.info.test). The two passes are merged using the -a option.
Then, the --exclude options are there to avoid having information from places we do not care about. The -d option specify where to start in the current directory : here we use Detectors/MUON/MCH as we only ran mch-based tests so there’s no point looking elsewhere.
Finally we remove from the coverage information the unit tests themselves and anything that was found in the build directory (e.g. Root dictionaries) using the --remove option.
At this point one can have a textual dump of the coverage using :
lcov --list coverage.info
And a html report can be produced using the genhtml command :
genhtml --legend --branch-coverage -s --ignore-errors source -o html coverage.info && open html/index.html
Automated way using coverage.cmake
curl -sLO https://raw.githubusercontent.com/aphecetche/scripts/master/cmake/coverage.cmake
enter-alice-dev
buildenv O2
ctest -S coverage.cmake -DSOURCEDIR=$HOME/alice/dev/O2 -DCMAKE_GENERATOR=Ninja -V
The coverage.cmake basically implements the steps described above. (use -VV
instead of -V to a more verbose output if needed).
Coverage for QualityControl using coverage.cmake
Currently the buildenv is not enough for QualityControl, so a few env. variables must be set by hand first
curl -sLO https://raw.githubusercontent.com/aphecetche/scripts/master/cmake/coverage.cmake
export gRPC_ROOT=$HOME/alice/dev/sw/osx_x86-64/grpc/latest
export Occ_ROOT=$HOME/alice/dev/sw/osx_x86-64/Control-OCCPlugin/latest
export OPENSSL_ROOT_DIR=$(brew --prefix openssl)
enter-alice-dev
buildenv QualityControl
ctest -S coverage.cmake -DSOURCEDIR=$HOME/alice/dev/QualityControl -DCMAKE_GENERATOR=Ninja -V
Seems a lot of tests are failing with that setup… Probably some assumed environment not set in this setup…