# Copyright 2022 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

from autotest_lib.server import utils
from autotest_lib.server.cros import chrome_sideloader


AUTHOR = 'The ChromiumOS Authors'
METADATA = {
    "contacts": ["chromeos-sw-engprod@google.com"],
    "bug_component": "b:1456869",
    "criteria": "Tast tests with input Lacros binary",
    "hw_agnostic": False,
}
NAME = 'tast.lacros-version-skew-gspath'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
MAX_RESULT_SIZE_KB = 256 * 1024
PY_VERSION = 3

# tast.py uses binaries installed from autotest_server_package.tar.bz2.
REQUIRE_SSP = True

# Location to put the sideloaded lacros artifacts
LACROS_DIR = '/usr/local/lacros-chrome'

DOC = '''
Run Tast tests with the Lacros binary specified by command line
argument 'lacros_gcs_path'.

The test provisions lacros onto the DUT and then execute all the tests
matching the Tast expressions.

'''

def run(machine):
    host=hosts.create_host(machine)
    varslist = []
    args_dict = utils.args_to_dict(args)

    # Deploy Lacros binary from 'lacros_gcs_path'
    gs_path = args_dict.get('lacros_gcs_path', '')
    chrome_sideloader.deploy_lacros(host, gs_path=gs_path,
                                    lacros_dir=LACROS_DIR, args_dict=args_dict)

    try:
        expr = chrome_sideloader.get_tast_expr(args_dict)
    except:
        expr = '("group:mainline" && "dep:lacros" && !informational)'
    logging.info('Tast expr: %s', expr)

    varslist.append('lacros.DeployedBinary=%s' % LACROS_DIR)

    total_shards=args_dict.get('total_shards', 1)
    shard_index=args_dict.get('shard_index', 0)

    def cleanup():
        chrome_sideloader.cleanup_host(host, LACROS_DIR, None)
        host.run('restart ui', ignore_status=True)

    job.add_post_run_hook(cleanup)

    job.run_test('tast',
                 host=host,
                 test_exprs=[expr],
                 download_data_lazily=False,
                 ignore_test_failures=False,
                 max_run_sec=7200,
                 command_args=args,
                 varslist=varslist,
                 clear_tpm=False,
                 totalshards=total_shards,
                 shardindex=shard_index)

parallel_simple(run, machines)