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