# 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 the latest from Lacros dev channel",
    "hw_agnostic": False,
}
NAME = 'tast.lacros-version-skew-dev'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
ATTRIBUTES = 'suite:lacros-version-skew-dev'
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 latest from Lacros dev channel.

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 latest version of lacros from dev channel
    gs_path = args_dict.get('lacros_gcs_path', '')
    chrome_sideloader.deploy_lacros(host, channel='dev', 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)