Implemented branch coverage and integration bot coverage on the dashboard.
BUG=
TEST=
Review URL: https://webrtc-codereview.appspot.com/434002
git-svn-id: http://webrtc.googlecode.com/svn/trunk@1873 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/tools/quality_tracking/track_coverage.py b/tools/quality_tracking/track_coverage.py
index 9d4ed61..248fad2 100755
--- a/tools/quality_tracking/track_coverage.py
+++ b/tools/quality_tracking/track_coverage.py
@@ -28,6 +28,7 @@
import os
import re
+import sys
import time
import constants
@@ -42,28 +43,39 @@
pass
-def _find_latest_32bit_debug_build(www_directory_contents, coverage_www_dir):
- """Finds the latest 32-bit coverage directory in the directory listing.
+def _find_latest_build_coverage(www_directory_contents, coverage_www_dir,
+ directory_prefix):
+ """Finds the most recent coverage directory in the directory listing.
- Coverage directories have the form Linux32bitDBG_<number>. There may be
- other directories in the list though, for instance for other build
- configurations. We assume here that build numbers keep rising and never
- wrap around or anything like that.
+ We assume here that build numbers keep rising and never wrap around.
+
+ Args:
+ www_directory_contents: A list of entries in the coverage directory.
+ coverage_www_dir: The coverage directory on the bot.
+ directory_prefix: Coverage directories have the form <prefix><number>,
+ and the prefix is different on different bots. The prefix is
+ generally the builder name, such as Linux32DBG.
+
+ Returns:
+ The most recent directory name.
+
+ Raises:
+ CouldNotFindCoverageDirectory: if we failed to find coverage data.
"""
found_build_numbers = []
for entry in www_directory_contents:
- match = re.match('Linux32DBG_(\d+)', entry)
+ match = re.match(directory_prefix + '(\d+)', entry)
if match is not None:
found_build_numbers.append(int(match.group(1)))
if not found_build_numbers:
- raise CouldNotFindCoverageDirectory('Error: Found no 32-bit '
- 'debug build in directory %s.' %
- coverage_www_dir)
+ raise CouldNotFindCoverageDirectory('Error: Found no directories %s* '
+ 'in directory %s.' %
+ (directory_prefix, coverage_www_dir))
most_recent = max(found_build_numbers)
- return 'Linux32DBG_' + str(most_recent)
+ return directory_prefix + str(most_recent)
def _grab_coverage_percentage(label, index_html_contents):
@@ -84,25 +96,37 @@
raise FailedToParseCoverageHtml('%s is not a float.' % match.group(1))
-def _report_coverage_to_dashboard(dashboard, now, line_coverage,
- function_coverage):
- parameters = {'date': '%d' % now,
- 'line_coverage': '%f' % line_coverage,
- 'function_coverage': '%f' % function_coverage
+def _report_coverage_to_dashboard(dashboard, line_coverage, function_coverage,
+ branch_coverage, report_category):
+ parameters = {'line_coverage': '%f' % line_coverage,
+ 'function_coverage': '%f' % function_coverage,
+ 'branch_coverage': '%f' % branch_coverage,
+ 'report_category': report_category,
}
dashboard.send_post_request(constants.ADD_COVERAGE_DATA_URL, parameters)
-def _main():
+def _main(report_category, directory_prefix):
+ """Grabs coverage data from disk on a bot and publishes it.
+
+ Args:
+ report_category: The kind of coverage to report. The dashboard
+ application decides what is acceptable here (see
+ dashboard/add_coverage_data.py for more information).
+ directory_prefix: This bot's coverage directory prefix. Generally a bot's
+ coverage directories will have the form <prefix><build number>,
+ like Linux32DBG_345.
+ """
dashboard = dashboard_connection.DashboardConnection(constants.CONSUMER_KEY)
dashboard.read_required_files(constants.CONSUMER_SECRET_FILE,
constants.ACCESS_TOKEN_FILE)
coverage_www_dir = constants.BUILD_BOT_COVERAGE_WWW_DIRECTORY
www_dir_contents = os.listdir(coverage_www_dir)
- latest_build_directory = _find_latest_32bit_debug_build(www_dir_contents,
- coverage_www_dir)
+ latest_build_directory = _find_latest_build_coverage(www_dir_contents,
+ coverage_www_dir,
+ directory_prefix)
index_html_path = os.path.join(coverage_www_dir, latest_build_directory,
'index.html')
@@ -111,12 +135,26 @@
line_coverage = _grab_coverage_percentage('Lines:', whole_file)
function_coverage = _grab_coverage_percentage('Functions:', whole_file)
- now = int(time.time())
+ branch_coverage = _grab_coverage_percentage('Branches:', whole_file)
- _report_coverage_to_dashboard(dashboard, now, line_coverage,
- function_coverage)
+ _report_coverage_to_dashboard(dashboard, line_coverage, function_coverage,
+ branch_coverage, report_category)
+
+
+def _parse_args():
+ if len(sys.argv) != 3:
+ print ('Usage: %s <coverage category> <directory prefix>\n\n'
+ 'The coverage category describes the kind of coverage you are '
+ 'uploading. Known acceptable values are small_medium_tests and'
+ 'large_tests. The directory prefix is what the directories in %s '
+ 'are prefixed on this bot (such as Linux32DBG_).' %
+ (sys.argv[0], constants.BUILD_BOT_COVERAGE_WWW_DIRECTORY))
+ return (None, None)
+ return (sys.argv[1], sys.argv[2])
if __name__ == '__main__':
- _main()
+ report_category, directory_prefix = _parse_args()
+ if report_category:
+ _main(report_category, directory_prefix)