#!/usr/bin/env python # # Copyright 2016 Google Inc. # # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import default_flavor import os import subprocess import time """Utils for running coverage tests.""" class CoverageFlavorUtils(default_flavor.DefaultFlavorUtils): def compile(self, target): """Build the given target.""" cmd = [os.path.join(self._bot_info.skia_dir, 'tools', 'llvm_coverage_build'), target] self._bot_info.run(cmd) def step(self, cmd, **kwargs): """Run the given step through coverage.""" # Slice out the 'key' and 'properties' arguments to be reused. key = [] properties = [] current = None for i in xrange(0, len(cmd)): if isinstance(cmd[i], basestring) and cmd[i] == '--key': current = key elif isinstance(cmd[i], basestring) and cmd[i] == '--properties': current = properties elif isinstance(cmd[i], basestring) and cmd[i].startswith('--'): current = None if current is not None: current.append(cmd[i]) results_dir = self._bot_info.out_dir.join('coverage_results') self.create_clean_host_dir(results_dir) # Run DM under coverage. report_file_basename = '%s.cov' % self._bot_info.got_revision report_file = os.path.join(results_dir, report_file_basename) args = [ 'python', os.path.join(self._bot_info.skia_dir, 'tools', 'llvm_coverage_run.py'), ] + cmd + ['--outResultsFile', report_file] self._bot_info.run(args, **kwargs) # Generate nanobench-style JSON output from the coverage report. git_timestamp = subprocess.check_output(['git', 'log', '-n1', self._bot_info.got_revision, '--format=%%ci']).rstrip() nanobench_json = results_dir.join('nanobench_%s_%s.json' % ( self._bot_info.got_revision, git_timestamp)) line_by_line_basename = ('coverage_by_line_%s_%s.json' % ( self._bot_info.got_revision, git_timestamp)) line_by_line = results_dir.join(line_by_line_basename) args = [ 'python', os.path.join(self._bot_info.skia_dir, 'tools', 'parse_llvm_coverage.py'), '--report', report_file, '--nanobench', nanobench_json, '--linebyline', line_by_line] args.extend(key) args.extend(properties) self._bot_info.run(args) # Upload raw coverage data. now = time.utcnow() gs_json_path = '/'.join(( str(now.year).zfill(4), str(now.month).zfill(2), str(now.day).zfill(2), str(now.hour).zfill(2), self._bot_info.name, str(self._bot_info.build_number))) if self._bot_info.is_trybot: gs_json_path = '/'.join(('trybot', gs_json_path, str(self._bot_info.issue))) self._bot_info.gsutil_upload( 'upload raw coverage data', source=report_file, bucket='skia-infra', dest='/'.join(('coverage-raw-v1', gs_json_path, report_file_basename))) # Upload nanobench JSON data. gsutil_path = self._bot_info.m.path['depot_tools'].join( 'third_party', 'gsutil', 'gsutil') upload_args = [self._bot_info.name, self._bot_info.m.properties['buildnumber'], results_dir, self._bot_info.got_revision, gsutil_path] if self._bot_info.is_trybot: upload_args.append(self._bot_info.m.properties['issue']) self._bot_info.run( self._bot_info.m.python, 'upload nanobench coverage results', script=self._bot_info.resource('upload_bench_results.py'), args=upload_args, cwd=self._bot_info.m.path['checkout'], abort_on_failure=False, infra_step=True) # Upload line-by-line coverage data. self._bot_info.gsutil_upload( 'upload line-by-line coverage data', source=line_by_line, bucket='skia-infra', dest='/'.join(('coverage-json-v1', gs_json_path, line_by_line_basename)))