# Copyright (c) 2015 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_DummyServerSuite"
PURPOSE = "Test that Moblab can run the Dummy Server suite."
ATTRIBUTES = "suite:moblab_quick"
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "moblab"
TEST_TYPE = "server"

DOC = """
Kicks off the Dummy Server 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 stumpy_moblab <remote> moblab_DummyServerSuite
  --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/results',
                           '/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='dummy_server',
                 moblab_suite_max_retries=1, **args_dict)

parallel_simple(run, machines)
