# 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)