# Copyright 2021 The ChromiumOS Authors
# 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 sys
import tempfile
import shutil

from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import utils
from autotest_lib.server import test

from autotest_lib.server.cros import chrome_sideloader


class chromium(test.test):
    """Run Chromium tests built on a Skylab DUT."""

    version = 1

    def initialize(self, host=None, args=None):
        self.host = host
        args_dict = utils.args_to_dict(args)
        self.exe_rel_path = args_dict.get('exe_rel_path', '')
        self.server_pkg = tempfile.mkdtemp()
        self.executable = os.path.join(self.server_pkg, self.exe_rel_path)
        self.test_args = chrome_sideloader.get_test_args(
                args_dict, 'test_args')

        with tempfile.TemporaryDirectory() as tmp_archive_dir:
            archive_file_path = chrome_sideloader.download_gs(
                    args_dict.get('lacros_gcs_path'), tmp_archive_dir)
            chrome_sideloader.unsquashfs(archive_file_path, self.server_pkg,
                                         **args_dict)
            cmd = ['chmod', '-R', '755', self.server_pkg]
            try:
                utils.run(cmd, stdout_tee=sys.stdout, stderr_tee=sys.stderr)
            except error.CmdError as e:
                raise Exception('Error changing file permissions', e)

        self.shard_number = args_dict.get('shard_number', 1)
        self.shard_index = args_dict.get('shard_index', 0)
        self.max_run_sec = int(args_dict.get('max_run_sec', 3600))

    def cleanup(self):
        shutil.rmtree(self.server_pkg)

    def run_once(self):
        cmd = [
                'vpython3',
                '-vpython-spec',
                f'{self.server_pkg}/.vpython3',
                self.executable,
                '--test-launcher-summary-output',
                f'{self.resultsdir}/output.json',
                '--test-launcher-shard-index',
                f'{self.shard_index}',
                '--test-launcher-total-shards',
                f'{self.shard_number}',
                '--board',
                self.host.host_info_store.get().board,
                '--path-to-outdir',
                f'{self.server_pkg}/out/Release',
        ]
        if self.host.port:
            cmd.extend(['--device', f'{self.host.hostname}:{self.host.port}'])
        else:
            cmd.extend(['--device', self.host.hostname])
        cmd_str = (' ').join(cmd)
        # Test args from chromium builders are unknown to the autotest wrapper,
        # so just append whatever received here to the command string.
        if self.test_args:
            cmd_str += ' ' + self.test_args
        logging.info('Running: %s', cmd_str)
        exit_code = 0
        try:
            result = utils.run(
                    cmd_str,
                    stdout_tee=sys.stdout,
                    stderr_tee=sys.stderr,
                    timeout=self.max_run_sec,
                    extra_paths=['/opt/infra-tools', '/opt/browser-tools'])
            exit_code = result.exit_status
        except error.CmdError as e:
            logging.debug('Error occurred executing gtest tests.')
            exit_code = e.result_obj.exit_status

        if exit_code:
            raise error.TestFail(
                    f'Chromium Test failed to run. Exit code: {exit_code}')
