# Copyright (c) 2012 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 Team"
NAME = "cellular_ModemControl.pseudomodem"
PURPOSE = "Verify commands sent to a modem manager are reflected in shill."
CRITERIA = """
This test will fail if modem manager state differs from shill state.
"""
ATTRIBUTES = "suite:cellular_pseudomodem"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "network"
TEST_TYPE = "client"

DOC = """
  Tests that commands sent to ModemManager1 are reflected in shill.

  Issues many connect, disconnect, enable, and disable commands to
  ensure that the modem state is always properly reflected in shill --
  even if the commands are sent to the modem manager instead of shill.
  Uses a pseudo modem to simulate modem manager so that this test can
  be run on a virtual machine.
"""

from autotest_lib.client.cros.cellular import test_environment

# 3GPP
test_env = test_environment.CellularPseudoMMTestEnvironment(
        pseudomm_args=({'family': '3GPP'},))
job.run_test('cellular_ModemControl', test_env=test_env, autoconnect=False,
             tag='no-autoconnect-pseudomodem.3GPP')
job.run_test('cellular_ModemControl', test_env=test_env, autoconnect=True,
             tag='autoconnect-pseudomodem.3GPP')

# CDMA
test_env = test_environment.CellularPseudoMMTestEnvironment(
        pseudomm_args=({'family': 'CDMA'},))
job.run_test('cellular_ModemControl', test_env=test_env, autoconnect=False,
             tag='no-autoconnect-pseudomodem.CDMA')
job.run_test('cellular_ModemControl', test_env=test_env, autoconnect=True,
             tag='autoconnect-pseudomodem.CDMA')
