1*9c5db199SXin Li# Copyright (c) 2009 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Liimport logging 6*9c5db199SXin Liimport os 7*9c5db199SXin Liimport re 8*9c5db199SXin Liimport shutil 9*9c5db199SXin Li 10*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils 11*9c5db199SXin Lifrom autotest_lib.server import autotest, test 12*9c5db199SXin Li 13*9c5db199SXin Lidef gen_gcov_report(report, files): 14*9c5db199SXin Li results = {} 15*9c5db199SXin Li 16*9c5db199SXin Li for f in files: 17*9c5db199SXin Li escf = re.escape(f) 18*9c5db199SXin Li match = re.search("File '.*%s'\nLines executed:([0-9.]+)%%" % escf, 19*9c5db199SXin Li report) 20*9c5db199SXin Li if match: 21*9c5db199SXin Li # simple replace to make a valid identifier 22*9c5db199SXin Li key = f.replace('/', '_').replace('.', '_') 23*9c5db199SXin Li results[key] = float(match.group(1)) 24*9c5db199SXin Li 25*9c5db199SXin Li return results 26*9c5db199SXin Li 27*9c5db199SXin Liclass unit_test_server(test.test): 28*9c5db199SXin Li version = 1 29*9c5db199SXin Li 30*9c5db199SXin Li def run_once(self, host=None): 31*9c5db199SXin Li self.client = host 32*9c5db199SXin Li 33*9c5db199SXin Li # Collect the gcov by running a client side test 34*9c5db199SXin Li client_at = autotest.Autotest(self.client) 35*9c5db199SXin Li client_at.run_test(self.client_test) 36*9c5db199SXin Li 37*9c5db199SXin Li def postprocess(self): 38*9c5db199SXin Li logging.info('UnitTestServer: postprocess %s' % 39*9c5db199SXin Li self.client.hostname) 40*9c5db199SXin Li 41*9c5db199SXin Li # Get the result director of the client 42*9c5db199SXin Li results_dir = os.path.join(self.outputdir, self.client_test, 'results/') 43*9c5db199SXin Li 44*9c5db199SXin Li # Execute gcov on the result 45*9c5db199SXin Li os.chdir(results_dir) 46*9c5db199SXin Li report = utils.system_output('gcov ' + ''.join(self.test_files)) 47*9c5db199SXin Li 48*9c5db199SXin Li # Filter report for the files of interest 49*9c5db199SXin Li filtered = gen_gcov_report(report, self.test_files) 50*9c5db199SXin Li 51*9c5db199SXin Li # Promote the client test keyval as our own 52*9c5db199SXin Li src = os.path.join(self.outputdir, self.client_test, 'results/keyval') 53*9c5db199SXin Li dst = os.path.join(self.resultsdir, 'keyval') 54*9c5db199SXin Li if os.path.exists(src): 55*9c5db199SXin Li shutil.copy(src, dst) 56*9c5db199SXin Li else: 57*9c5db199SXin Li logging.warning('Unable to locate %s' % src) 58*9c5db199SXin Li 59*9c5db199SXin Li # Append the coverage report 60*9c5db199SXin Li self.write_perf_keyval(filtered) 61