1# Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import logging 6 7from autotest_lib.client.bin import test 8from autotest_lib.client.common_lib import error 9from autotest_lib.client.cros.cellular import mm1_constants 10from autotest_lib.client.cros.cellular import test_environment 11from autotest_lib.client.cros.cellular.pseudomodem import pm_constants 12from autotest_lib.client.cros.networking import pm_proxy 13from autotest_lib.client.cros.networking.chrome_testing \ 14 import chrome_networking_test_context as cntc 15from autotest_lib.client.cros.networking.chrome_testing import test_utils 16 17class network_ChromeCellularSmokeTest(test.test): 18 """ 19 Tests that Chrome can bring the network to a connected state and effectively 20 access the internet through the cellular network. The test repeats a 21 connect/disconnect sequence several times and makes sure that Chrome can 22 always connect to the network via chrome.networkingPrivate. 23 24 """ 25 version = 1 26 27 CONNECT_COUNT = 5 28 29 def _setup_modem_proxy(self): 30 pseudomm = pm_proxy.PseudoMMProxy.get_proxy() 31 self._modem = pseudomm.get_modem() 32 33 34 def _get_modem_state(self): 35 props = self._modem.properties(mm1_constants.I_MODEM) 36 return props[mm1_constants.MM_MODEM_PROPERTY_NAME_STATE] 37 38 39 def _get_cellular_network(self): 40 networks = self._chrome_testing.find_cellular_networks() 41 if len(networks) != 1: 42 raise error.TestFail( 43 'Expected 1 cellular network, found ' + str(len(networks))) 44 network = networks[0] 45 test_utils.simple_network_sanity_check( 46 network, pm_constants.DEFAULT_TEST_NETWORK_PREFIX, 47 self._chrome_testing.CHROME_NETWORK_TYPE_CELLULAR) 48 return network 49 50 51 def _assert_modem_state(self, expected_state): 52 modem_state = self._get_modem_state() 53 if modem_state != expected_state: 54 raise error.TestFail( 55 'Expected modem state to be "' + 56 mm1_constants.ModemStateToString(expected_state) + 57 '", found: ' + 58 mm1_constants.ModemStateToString(modem_state)) 59 60 61 def _ensure_network_status(self, network_id, status, timeout): 62 test_utils.check_ui_property( 63 self._chrome_testing, network_id, 'ConnectionState', status) 64 65 66 def _disconnect_cellular_network(self): 67 # Make sure that the network becomes disconnected. 68 network_id = self._network['GUID'] 69 logging.info('Disconnecting from network: ' + network_id) 70 call_status = self._chrome_testing.call_test_function( 71 test_utils.LONG_TIMEOUT, 72 'disconnectFromNetwork', 73 '"' + network_id + '"') 74 logging.info('Checking that the network is disconnected.') 75 self._ensure_network_status( 76 network_id, 'NotConnected', test_utils.LONG_TIMEOUT) 77 logging.info('The network is disconnected. Checking that the modem is ' 78 'in the REGISTERED state.') 79 self._assert_modem_state(mm1_constants.MM_MODEM_STATE_REGISTERED) 80 logging.info('Modem is disconnected. Disconnect was successful.') 81 82 83 def _connect_cellular_network(self): 84 # Make sure that the network becomes connected. 85 network_id = self._network['GUID'] 86 logging.info('Connecting to network: ' + network_id) 87 call_status = self._chrome_testing.call_test_function( 88 test_utils.LONG_TIMEOUT, 89 'connectToNetwork', 90 '"' + network_id + '"') 91 logging.info('Checking that the network is connected.') 92 self._ensure_network_status( 93 network_id, 'Connected', test_utils.LONG_TIMEOUT) 94 logging.info('The network is connected. Checking that the modem is in ' 95 'the CONNECTED state.') 96 self._assert_modem_state(mm1_constants.MM_MODEM_STATE_CONNECTED) 97 logging.info('Modem is connected. Connect was successful.') 98 99 100 def _run_once_internal(self): 101 # Set up a ModemManager proxy to use to verify the modem state. 102 self._setup_modem_proxy() 103 104 # Make sure that there is a single cellular network and it matches 105 # the data from pseudomm. 106 self._network = self._get_cellular_network() 107 108 # Disconnect from the network before doing any operations. 109 self._disconnect_cellular_network() 110 111 logging.info('Starting connect/disconnect sequence.') 112 for _ in xrange(self.CONNECT_COUNT): 113 self._connect_cellular_network() 114 self._disconnect_cellular_network() 115 116 117 def run_once(self, family): 118 test_env = test_environment.CellularPseudoMMTestEnvironment( 119 pseudomm_args=({'family': family},)) 120 testing_context = cntc.ChromeNetworkingTestContext() 121 with test_env, testing_context: 122 self._chrome_testing = testing_context 123 self._run_once_internal() 124