@matheusbsbs / matheus-bagliano / commits / 901c369af5
Fork 0

Support coverage testing with GCC/gcov

With gcc's --coverage option, we can perform automatic coverage data collection for the test suite. Add a new Makefile target 'coverage' that scraps all previous coverage results, recompiles git with the required compiler/linker flags (in addition to any flags you specify manually), then runs the test suite and compiles a report. The compilation must be done with all optimizations disabled, since inlined functions (and for line-by-line coverage, also optimized branches/loops) break coverage tracking. The tests are run serially (with -j1). The coverage code should theoretically allow concurrent access to its data files, but the author saw random test failures. Obviously this could be improved. The report currently consists of a list of functions that were never executed during the tests, which is written to 'coverage-untested-functions'. Once this list becomes reasonably short, we would also want to look at branches that were never taken. Currently only toplevel *.c files are considered. It would be nice to at least include xdiff, but --coverage did not save data to subdirectories on the system used to write this (gcc 4.3.2). Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Thomas Rast committed Feb 19, 2009 at 12:13 UTC 901c369af52ffcc8c08457fb5b330eab217a9cfb
1 file changed +24
Makefile
+24
@@ -1640,3 +1640,27 @@ check-docs::
1640 check-builtins::
1641 ./check-builtins.sh
1642
1643 +### Test suite coverage testing
1644 +#
1645 +.PHONY: coverage coverage-clean coverage-build coverage-report
1646 +
1647 +coverage:
1648 + $(MAKE) coverage-build
1649 + $(MAKE) coverage-report
1650 +
1651 +coverage-clean:
1652 + rm -f *.gcda *.gcno
1653 +
1654 +COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
1655 +COVERAGE_LDFLAGS = $(CFLAGS) -O0 -lgcov
1656 +
1657 +coverage-build: coverage-clean
1658 + $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
1659 + $(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
1660 + -j1 test
1661 +
1662 +coverage-report:
1663 + gcov -b *.c
1664 + grep '^function.*called 0 ' *.c.gcov \
1665 + | sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
1666 + | tee coverage-untested-functions