# 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 beta channel",
    "hw_agnostic": False,
}
NAME = 'tast.lacros-version-skew-beta'
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
ATTRIBUTES = 'suite:lacros-version-skew-beta'
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 beta 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 beta channel
    gs_path = args_dict.get('lacros_gcs_path', '')
    chrome_sideloader.deploy_lacros(host, channel='beta', 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)