xref: /aosp_15_r20/external/autotest/server/bin/unit_test_server.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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