xref: /aosp_15_r20/external/autotest/server/site_tests/chromium/chromium.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li# Copyright (c) 2021 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Liimport base64
7*9c5db199SXin Liimport logging
8*9c5db199SXin Liimport os
9*9c5db199SXin Li
10*9c5db199SXin Lifrom autotest_lib.client.common_lib.error import TestFail
11*9c5db199SXin Lifrom autotest_lib.server import test
12*9c5db199SXin Lifrom autotest_lib.server import utils
13*9c5db199SXin Li
14*9c5db199SXin Li
15*9c5db199SXin Liclass chromium(test.test):
16*9c5db199SXin Li    """Run Chromium tests built on a Skylab DUT."""
17*9c5db199SXin Li
18*9c5db199SXin Li    version = 1
19*9c5db199SXin Li
20*9c5db199SXin Li    PROVISION_POINT = '/var/lib/imageloader/lacros'
21*9c5db199SXin Li    MOUNT_POINT = '/usr/local/tmp/chromium'
22*9c5db199SXin Li    CHRONOS_RES_DIR = '/home/chronos/user/results'
23*9c5db199SXin Li
24*9c5db199SXin Li    def initialize(self, host=None, args=None):
25*9c5db199SXin Li        self.host = host
26*9c5db199SXin Li        assert host.path_exists(self.PROVISION_POINT), (
27*9c5db199SXin Li                'chromium test artifact is not provisioned by CTP. '
28*9c5db199SXin Li                'Please check the CTP request.')
29*9c5db199SXin Li        self._mount_runtime()
30*9c5db199SXin Li        args_dict = utils.args_to_dict(args)
31*9c5db199SXin Li        self.exe_rel_path = args_dict.get('exe_rel_path', '')
32*9c5db199SXin Li        path_to_executable = os.path.join(self.MOUNT_POINT, self.exe_rel_path)
33*9c5db199SXin Li        assert self.host.path_exists(path_to_executable), (
34*9c5db199SXin Li                'chromium test executable is not mounted at the '
35*9c5db199SXin Li                'expected path, %s' % path_to_executable)
36*9c5db199SXin Li
37*9c5db199SXin Li        test_args = args_dict.get('test_args')
38*9c5db199SXin Li        if not test_args:
39*9c5db199SXin Li            test_args_b64 = args_dict.get('test_args_b64')
40*9c5db199SXin Li            if test_args_b64:
41*9c5db199SXin Li                test_args = base64.b64decode(test_args_b64)
42*9c5db199SXin Li        if isinstance(test_args, bytes):
43*9c5db199SXin Li            test_args = test_args.decode()
44*9c5db199SXin Li        self.test_args = test_args
45*9c5db199SXin Li
46*9c5db199SXin Li        self.shard_number = args_dict.get('shard_number', 1)
47*9c5db199SXin Li        self.shard_index = args_dict.get('shard_index', 0)
48*9c5db199SXin Li
49*9c5db199SXin Li    def _mount_runtime(self):
50*9c5db199SXin Li        try:
51*9c5db199SXin Li            self.host.run(
52*9c5db199SXin Li                    'mkdir -p {mount} && '
53*9c5db199SXin Li                    'imageloader --mount --mount_component=lacros'
54*9c5db199SXin Li                    ' --mount_point={mount}'.format(mount=self.MOUNT_POINT))
55*9c5db199SXin Li        except Exception as e:
56*9c5db199SXin Li            raise TestFail('Exception while mount test artifact: %s', e)
57*9c5db199SXin Li
58*9c5db199SXin Li    def cleanup(self):
59*9c5db199SXin Li        try:
60*9c5db199SXin Li            self.host.run('imageloader --unmount --mount_point={mount};'
61*9c5db199SXin Li                          'rm -rf {mount} {chronos_res}'.format(
62*9c5db199SXin Li                                  chronos_res=self.CHRONOS_RES_DIR,
63*9c5db199SXin Li                                  mount=self.MOUNT_POINT))
64*9c5db199SXin Li        except Exception as e:
65*9c5db199SXin Li            logging.exception('Exception while clear test files: %s', e)
66*9c5db199SXin Li
67*9c5db199SXin Li    def run_once(self):
68*9c5db199SXin Li        cmd = ('{mount}/{exe} '
69*9c5db199SXin Li               '--test-launcher-summary-output {chronos_res}/output.json '
70*9c5db199SXin Li               '--test-launcher-shard-index {idx} '
71*9c5db199SXin Li               '--test-launcher-total-shards {num} '.format(
72*9c5db199SXin Li                       mount=self.MOUNT_POINT,
73*9c5db199SXin Li                       exe=self.exe_rel_path,
74*9c5db199SXin Li                       chronos_res=self.CHRONOS_RES_DIR,
75*9c5db199SXin Li                       idx=self.shard_index,
76*9c5db199SXin Li                       num=self.shard_number))
77*9c5db199SXin Li        if self.test_args:
78*9c5db199SXin Li            cmd += '-- %s' % self.test_args
79*9c5db199SXin Li        try:
80*9c5db199SXin Li            self.host.run('su chronos -c -- "%s"' % cmd)
81*9c5db199SXin Li        except Exception as e:
82*9c5db199SXin Li            raise TestFail('Exception while execute test: %s', e)
83*9c5db199SXin Li        finally:
84*9c5db199SXin Li            self.host.get_file('%s/*' % self.CHRONOS_RES_DIR,
85*9c5db199SXin Li                               self.resultsdir,
86*9c5db199SXin Li                               delete_dest=True)
87