summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'tools/coverage')
-rwxr-xr-xtools/coverage/FilterLCovData.py23
-rwxr-xr-xtools/coverage/GenerateCoverageResults.sh30
-rwxr-xr-xtools/coverage/GenerateOverview.py63
-rwxr-xr-xtools/coverage/GenerateSummary.py35
-rw-r--r--tools/coverage/descriptions.txt2
5 files changed, 153 insertions, 0 deletions
diff --git a/tools/coverage/FilterLCovData.py b/tools/coverage/FilterLCovData.py
new file mode 100755
index 0000000..b0d180f
--- /dev/null
+++ b/tools/coverage/FilterLCovData.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import sys, re
+
+assert(len(sys.argv) == 2)
+
+output = []
+inputFile = open(sys.argv[1])
+inIgnoredFile = False
+for line in inputFile.readlines() :
+ if inIgnoredFile :
+ if line == "end_of_record\n" :
+ inIgnoredFile = False
+ else :
+ if line.startswith("SF:") and (line.find("/Swift/") == -1 or line.find("/UnitTest/") != -1 or line.find("/QA/") != -1 or line.find("/3rdParty/") != -1):
+ inIgnoredFile = True
+ else :
+ output.append(line)
+inputFile.close()
+
+outputFile = open(sys.argv[1], 'w')
+outputFile.write(''.join(output))
+outputFile.close()
diff --git a/tools/coverage/GenerateCoverageResults.sh b/tools/coverage/GenerateCoverageResults.sh
new file mode 100755
index 0000000..9e32da4
--- /dev/null
+++ b/tools/coverage/GenerateCoverageResults.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# This script assumes that it is run from the toplevel directory, that
+# the 'configure' script has been called with '--enable-coverage'
+
+SOURCE_DIR=src/Swift
+SCRIPT_DIR=tools/coverage
+
+RESULTS_DIR=tools/coverage/results
+OUTPUT_DIR=$RESULTS_DIR/coverage-`git log --pretty=format:%ct-%h | head -n 1`
+
+make -C $SOURCE_DIR
+if [ ! -f $OUTPUT_DIR ]; then
+ mkdir -p $OUTPUT_DIR
+fi
+
+# Reset counters
+lcov --zerocounters --directory $SOURCE_DIR
+
+# All tests
+make -C $SOURCE_DIR test
+lcov --capture --directory $SOURCE_DIR -b $SOURCE_DIR --output-file $OUTPUT_DIR/all.info --test-name all
+$SCRIPT_DIR/FilterLCovData.py $OUTPUT_DIR/all.info
+
+# Generate HTML
+gendesc -o $OUTPUT_DIR/descriptions $SCRIPT_DIR/descriptions.txt
+genhtml --title "Swift Coverage" --output-directory $OUTPUT_DIR $OUTPUT_DIR/all.info
+
+# Generate summary
+$SCRIPT_DIR/GenerateSummary.py $OUTPUT_DIR/all.info $OUTPUT_DIR/summary
diff --git a/tools/coverage/GenerateOverview.py b/tools/coverage/GenerateOverview.py
new file mode 100755
index 0000000..8928afd
--- /dev/null
+++ b/tools/coverage/GenerateOverview.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+
+import sys, os.path
+
+assert(len(sys.argv) == 4)
+
+resultsDir = sys.argv[1]
+summaryFile = sys.argv[2]
+overviewFile = sys.argv[3]
+
+results = []
+for dir in os.listdir(resultsDir) :
+ summary = os.path.join(resultsDir, dir, summaryFile)
+ if os.path.exists(summary) :
+ file = open(summary)
+ lines = file.readlines()
+ if len(lines) == 0 or len(lines[0].split("/")) != 2 :
+ continue
+ coveredCount = int(lines[0].split("/")[0])
+ totalCount = int(lines[0].split("/")[1])
+ results.append((dir,coveredCount,totalCount))
+
+# Compute coverage chart URL
+chartparams = ["chs=320x240", "cht=lc", "chtt=Coverage (Relative)", "chxt=y", "chxl=0:|50%|80%|100%|", "chxp=0,50,80,100"]
+chartdata = []
+for (url,covered,total) in results :
+ chartdata.append(str(100*covered/total))
+chartparams.append("chd=t:" + ",".join(chartdata))
+coverageChartURL = "http://chart.apis.google.com/chart?" + '&'.join(chartparams)
+
+# Compute the maximum of lines over time
+maximumNumberOfLines = 0
+for (url,covered,total) in results :
+ maximumNumberOfLines = max(maximumNumberOfLines,total)
+
+# Compute code chart URL
+chartparams = ["chs=320x240", "cht=lc", "chtt=Coverage (Absolute)", "chxt=y", "chxl=0:|" + str(maximumNumberOfLines) + "|", "chxp=0,100", "chm=b,FF0000,0,1,0|b,80C65A,1,2,0", "chco=00000000,00000000,00000000"]
+coveredLinesData = []
+totalLinesData = []
+nullLinesData = []
+for (url,covered,total) in results :
+ coveredLinesData.append(str(100*covered/maximumNumberOfLines))
+ totalLinesData.append(str(100*total/maximumNumberOfLines))
+ nullLinesData.append("0")
+chartparams.append("chd=t:" + ",".join(totalLinesData) + "|" + ",".join(coveredLinesData) + "|" + ",".join(nullLinesData))
+codeChartURL = "http://chart.apis.google.com/chart?" + '&'.join(chartparams)
+
+
+# Output page
+output = open(os.path.join(resultsDir,overviewFile), 'w')
+output.write("<img src=\"%(url)s\"s/>" % {'url' : coverageChartURL})
+output.write("<img src=\"%(url)s\"s/>" % {'url' : codeChartURL})
+output.write("<ul>\n")
+for (url,covered,total) in results :
+ output.write("<li><a href='%(url)s/index.html'>%(url)s</a> %(percentage)s%% (%(covered)s/%(total)s)</li>\n" % {
+ 'url' : url,
+ 'percentage' : 100*covered / total,
+ 'covered' : covered,
+ 'total' : total
+ })
+output.write("</ul>")
+output.close()
+
diff --git a/tools/coverage/GenerateSummary.py b/tools/coverage/GenerateSummary.py
new file mode 100755
index 0000000..ec94a4f
--- /dev/null
+++ b/tools/coverage/GenerateSummary.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+
+import sys, re
+
+assert(len(sys.argv) == 3)
+
+inputFile = open(sys.argv[1])
+currentFile = ""
+coverage = {}
+for line in inputFile.readlines() :
+ line = line.strip()
+ m = re.match("^SF:(.*)", line)
+ if m :
+ currentFile = m.group(1)
+ else :
+ m = re.match("^DA:(\d+),(\d+)", line)
+ if m :
+ currentFileCoverage = coverage.get(currentFile, {})
+ line = int(m.group(1))
+ count = int(m.group(2))
+ currentFileCoverage[line] = currentFileCoverage.get(line, 0) + count
+ coverage[currentFile] = currentFileCoverage
+inputFile.close()
+
+totalLines = 0
+coveredLines = 0
+for c in coverage.values() :
+ totalLines += len(c)
+ for l in c.values() :
+ if l > 0 :
+ coveredLines += 1
+
+outputFile = open(sys.argv[2], 'w')
+outputFile.write(str(coveredLines) + "/" + str(totalLines))
+outputFile.close()
diff --git a/tools/coverage/descriptions.txt b/tools/coverage/descriptions.txt
new file mode 100644
index 0000000..5b07e04
--- /dev/null
+++ b/tools/coverage/descriptions.txt
@@ -0,0 +1,2 @@
+all
+ All tests