# Copyright (c) 2009 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import logging import os import re import shutil from autotest_lib.client.common_lib import utils from autotest_lib.server import autotest, test def gen_gcov_report(report, files): results = {} for f in files: escf = re.escape(f) match = re.search("File '.*%s'\nLines executed:([0-9.]+)%%" % escf, report) if match: # simple replace to make a valid identifier key = f.replace('/', '_').replace('.', '_') results[key] = float(match.group(1)) return results class unit_test_server(test.test): version = 1 def run_once(self, host=None): self.client = host # Collect the gcov by running a client side test client_at = autotest.Autotest(self.client) client_at.run_test(self.client_test) def postprocess(self): logging.info('UnitTestServer: postprocess %s' % self.client.hostname) # Get the result director of the client results_dir = os.path.join(self.outputdir, self.client_test, 'results/') # Execute gcov on the result os.chdir(results_dir) report = utils.system_output('gcov ' + ''.join(self.test_files)) # Filter report for the files of interest filtered = gen_gcov_report(report, self.test_files) # Promote the client test keyval as our own src = os.path.join(self.outputdir, self.client_test, 'results/keyval') dst = os.path.join(self.resultsdir, 'keyval') if os.path.exists(src): shutil.copy(src, dst) else: logging.warning('Unable to locate %s' % src) # Append the coverage report self.write_perf_keyval(filtered)