| # Copyright (c) 2013 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. |
| |
| import logging |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros.cellular import mm1_constants |
| from autotest_lib.client.cros.cellular import test_environment |
| from autotest_lib.client.cros.cellular.pseudomodem import pm_constants |
| from autotest_lib.client.cros.networking import pm_proxy |
| from autotest_lib.client.cros.networking.chrome_testing \ |
| import chrome_networking_test_context as cntc |
| from autotest_lib.client.cros.networking.chrome_testing import test_utils |
| |
| class network_ChromeCellularSmokeTest(test.test): |
| """ |
| Tests that Chrome can bring the network to a connected state and effectively |
| access the internet through the cellular network. The test repeats a |
| connect/disconnect sequence several times and makes sure that Chrome can |
| always connect to the network via chrome.networkingPrivate. |
| |
| """ |
| version = 1 |
| |
| CONNECT_COUNT = 5 |
| |
| def _setup_modem_proxy(self): |
| pseudomm = pm_proxy.PseudoMMProxy.get_proxy() |
| self._modem = pseudomm.get_modem() |
| |
| |
| def _get_modem_state(self): |
| props = self._modem.properties(mm1_constants.I_MODEM) |
| return props[mm1_constants.MM_MODEM_PROPERTY_NAME_STATE] |
| |
| |
| def _get_cellular_network(self): |
| networks = self._chrome_testing.find_cellular_networks() |
| if len(networks) != 1: |
| raise error.TestFail( |
| 'Expected 1 cellular network, found ' + str(len(networks))) |
| network = networks[0] |
| test_utils.simple_network_sanity_check( |
| network, pm_constants.DEFAULT_TEST_NETWORK_PREFIX, |
| self._chrome_testing.CHROME_NETWORK_TYPE_CELLULAR) |
| return network |
| |
| |
| def _assert_modem_state(self, expected_state): |
| modem_state = self._get_modem_state() |
| if modem_state != expected_state: |
| raise error.TestFail( |
| 'Expected modem state to be "' + |
| mm1_constants.ModemStateToString(expected_state) + |
| '", found: ' + |
| mm1_constants.ModemStateToString(modem_state)) |
| |
| |
| def _ensure_network_status(self, network_id, status, timeout): |
| test_utils.check_ui_property( |
| self._chrome_testing, network_id, 'ConnectionState', status) |
| |
| |
| def _disconnect_cellular_network(self): |
| # Make sure that the network becomes disconnected. |
| network_id = self._network['GUID'] |
| logging.info('Disconnecting from network: ' + network_id) |
| call_status = self._chrome_testing.call_test_function( |
| test_utils.LONG_TIMEOUT, |
| 'disconnectFromNetwork', |
| '"' + network_id + '"') |
| logging.info('Checking that the network is disconnected.') |
| self._ensure_network_status( |
| network_id, 'NotConnected', test_utils.LONG_TIMEOUT) |
| logging.info('The network is disconnected. Checking that the modem is ' |
| 'in the REGISTERED state.') |
| self._assert_modem_state(mm1_constants.MM_MODEM_STATE_REGISTERED) |
| logging.info('Modem is disconnected. Disconnect was successful.') |
| |
| |
| def _connect_cellular_network(self): |
| # Make sure that the network becomes connected. |
| network_id = self._network['GUID'] |
| logging.info('Connecting to network: ' + network_id) |
| call_status = self._chrome_testing.call_test_function( |
| test_utils.LONG_TIMEOUT, |
| 'connectToNetwork', |
| '"' + network_id + '"') |
| logging.info('Checking that the network is connected.') |
| self._ensure_network_status( |
| network_id, 'Connected', test_utils.LONG_TIMEOUT) |
| logging.info('The network is connected. Checking that the modem is in ' |
| 'the CONNECTED state.') |
| self._assert_modem_state(mm1_constants.MM_MODEM_STATE_CONNECTED) |
| logging.info('Modem is connected. Connect was successful.') |
| |
| |
| def _run_once_internal(self): |
| # Set up a ModemManager proxy to use to verify the modem state. |
| self._setup_modem_proxy() |
| |
| # Make sure that there is a single cellular network and it matches |
| # the data from pseudomm. |
| self._network = self._get_cellular_network() |
| |
| # Disconnect from the network before doing any operations. |
| self._disconnect_cellular_network() |
| |
| logging.info('Starting connect/disconnect sequence.') |
| for _ in xrange(self.CONNECT_COUNT): |
| self._connect_cellular_network() |
| self._disconnect_cellular_network() |
| |
| |
| def run_once(self, family): |
| test_env = test_environment.CellularPseudoMMTestEnvironment( |
| pseudomm_args=({'family': family},)) |
| testing_context = cntc.ChromeNetworkingTestContext() |
| with test_env, testing_context: |
| self._chrome_testing = testing_context |
| self._run_once_internal() |