summaryrefslogtreecommitdiff
path: root/trim-lcov.py
diff options
context:
space:
mode:
authorRyan Lortie <desrt@desrt.ca>2012-07-10 12:33:46 -0400
committerRyan Lortie <desrt@desrt.ca>2012-07-10 12:33:46 -0400
commiteea502023950db2cccdb1d4fa563b05316b64419 (patch)
tree639bd6a4038adf99bbffc54d7f27bceff6316668 /trim-lcov.py
parent8317a107de299e5e03dc5511fefdcf5383a82bd7 (diff)
downloaddconf-eea502023950db2cccdb1d4fa563b05316b64419.tar.gz
Add script to trim bogus lcov data
There is no (apparent) way to trim branch or line coverage data from lcov output based on expression matching against the source file. This means that we get coverage results that tell us (for example) that we failed to test lines like 'g_assert_not_reached ();' or didn't test all branches of a g_assert(). Add a script to read the lcov output and remove line or branch coverage data according to a list of symbols that are known to have incomplete coverage when operating as expected.
Diffstat (limited to 'trim-lcov.py')
-rwxr-xr-xtrim-lcov.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/trim-lcov.py b/trim-lcov.py
new file mode 100755
index 0000000..c1709c3
--- /dev/null
+++ b/trim-lcov.py
@@ -0,0 +1,53 @@
+#!/usr/bin/python
+
+# This script removes branch and/or line coverage data for lines that
+# contain a particular substring.
+#
+# In the interest of "fairness" it removes all branch or coverage data
+# when a match is found -- not just negative data. It is therefore
+# likely that running this script will actually reduce the total number
+# of lines and branches that are marked as covered (in absolute terms).
+#
+# This script intentionally avoids checking for errors. Any exceptions
+# will trigger make to fail.
+#
+# Author: Ryan Lortie <desrt@desrt.ca>
+
+import sys
+
+line_suppress = ['g_assert_not_reached']
+branch_suppress = ['g_assert', 'g_return_if_fail', 'g_return_val_if_fail', 'G_DEFINE_TYPE']
+
+def check_suppress(suppressions, source, data):
+ line, _, rest = data.partition(',')
+ line = int(line) - 1
+
+ assert line < len(source)
+
+ for suppression in suppressions:
+ if suppression in source[line]:
+ return True
+
+ return False
+
+source = []
+for line in sys.stdin:
+ line = line[:-1]
+
+ keyword, _, rest = line.partition(':')
+
+ # Source file
+ if keyword == 'SF':
+ source = file(rest).readlines()
+
+ # Branch coverage data
+ elif keyword == 'BRDA':
+ if check_suppress(branch_suppress, source, rest):
+ continue
+
+ # Line coverage data
+ elif keyword == 'DA':
+ if check_suppress(line_suppress, source, rest):
+ continue
+
+ print line