# Copyright (c) 2010 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 = "Chrome OS Team"
NAME = "Network3GGobi"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs automated, Gobi-specific 3G tests that should all pass.
"""

from autotest_lib.server import site_host_attributes


# List of tests to be run.
CLIENT_TESTS = [
    ('network_GobiUncleanDisconnect', {}),

    # See network_3GDisableGobiWhileConnecting/control
    ('network_3GDisableWhileConnecting', {
        'timeout_s': 20,
        'delay_before_disable_ms': 200,
        'async_connect_sleep_ms': 3000,
        'iterations': 1,
        'tag': 'short_delay_disable'}),
    ('network_3GDisableWhileConnecting', {
        'timeout_s': 20,
        'delay_before_disable_ms': 0,
        'disable_delay_per_iteration_ms': 0,
        'connect_fails_with_error_sending_qmi_request': 1,
        'iterations': 1,
        'tag': 'qmi_failure'}),

    ('network_3GGobiPorts', {}),
    ('network_3GRecoverFromGobiDesync', {}),

# These tests shouldn't be run on activated devices.
#    'network_3GActivate',
#    'network_3GFailedConnect',
]

SERVER_TESTS = [
    'network_3GLoadFirmware'
]


def run_tests(machine):
    client = hosts.create_host(machine)
    client_at = autotest.Autotest(client)
    for test, kwargs in CLIENT_TESTS:
        client_at.run_test(test, **kwargs)

    for test in SERVER_TESTS:
        job.run_test(test, host=client)


job.parallel_on_machines(run_tests, machines)
