# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

AUTHOR = "chromeos-moblab@google.com"
NAME = "moblab_BVTInline"
PURPOSE = "Test that Moblab can run the bvt-inline suite."
ATTRIBUTES = "suite:moblab"
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "moblab"
TEST_TYPE = "server"
MAX_RESULT_SIZE_KB = 5120000

DOC = """
Kicks off the bvt-inline suite on a Moblab host against the DUTs on its subnet
and ensures the suite completes successfully.

To invole this test locally:
  test_that -b guado_moblab <remote> moblab_BVTInline --args="<ARGLIST>"

where ARGLIST is a whitespace separated list of the following key=value pairs.
Values pertaining to the test case include:

  boto_path=<boto_path>                path to the boto file to be installed on
                                       the Moblab DUT. If not specified, the
                                       boto file in the current home directory
                                       will be installed if it exists.
  image_storage_server=<server_name>   Google Storage Bucket from which to
                                       fetch test images from. If not
                                       specified, the value will be fetched
                                       from global_config.
  service_init_timeout_m=<int>         Timeout (in minutes) to wait for upstart
                                       services to start on the moblab host.
                                       This can take ~5 minutes on a physical
                                       devices and ~10 minutes on a VM.
  test_timeout_hint_m=<int>            The overall timeout to expect for the
                                       test run. For this test, it is very
                                       important to collect post failure data
                                       from the moblab device. If the overall
                                       timeout is provided, the test will try to
                                       fail early to save some time for log
                                       collection from the DUT.
  clear_devserver_cache=<boolean>      If True, image cache of the devserver
                                       running on moblab is cleared before
                                       running the test to validate devserver
                                       imaging staging flow.
"""
from autotest_lib.client.bin import sysinfo
from autotest_lib.client.common_lib import utils

MOBLAB_AUTOTEST_FOLDERS = ['/usr/local/autotest/logs']


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

    logging.info('Logs from moblab\'s instance of autotest will be collected '
                 'under the sysinfo/ folder in results.')
    for folder in MOBLAB_AUTOTEST_FOLDERS:
        logging.info('  Will collect %s', folder)
        job.sysinfo.add_logdir(sysinfo.logdir(folder, excludes=()))

    job.run_test('moblab_RunSuite', host=host, suite_name='bvt-inline',
                 moblab_suite_max_retries=1, **args_dict)

parallel_simple(run, machines)
