1b312dcf7a07ffdfe5a9625bbb1b5b08e81158b39Jason Glasgow# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow# Use of this source code is governed by a BSD-style license that can be 3428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow# found in the LICENSE file. 4428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 53b4d36e0018a3fac615f953cdf3417053f798f38Arman Ugurayimport dbus 63b4d36e0018a3fac615f953cdf3417053f798f38Arman Ugurayimport logging 73b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray 83b4d36e0018a3fac615f953cdf3417053f798f38Arman Ugurayfrom autotest_lib.client.bin import test 9428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgowfrom autotest_lib.client.common_lib import error 10ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.cellular.pseudomodem import modem_3gpp 11ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.cellular.pseudomodem import modem_cdma 12ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.cellular.pseudomodem import pm_errors 13ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.cellular.pseudomodem import utils as pm_utils 14ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.networking import cellular_proxy 15ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Lefrom autotest_lib.client.cros.networking import shill_proxy 16ebdf1698dc468116fcb1789e05c132cd66c46856Arman Uguray 17ebdf1698dc468116fcb1789e05c132cd66c46856Arman Uguray 18ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Ledef _GetModemSuperClass(family): 19ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le """ 20ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le Obtains the correct Modem base class to use for the given family. 21ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 22ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le @param family: The modem family. Should be one of |3GPP|/|CDMA|. 23ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le @returns: The relevant Modem base class. 24ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le @raises error.TestError, if |family| is not one of '3GPP' or 'CDMA'. 25ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 26ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le """ 27ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le if family == '3GPP': 28ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le return modem_3gpp.Modem3gpp 29ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le elif family == 'CDMA': 30ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le return modem_cdma.ModemCdma 31ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le else: 32ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le raise error.TestError('Invalid pseudomodem family: %s', family) 33ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 34ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 35ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Ledef GetFailConnectModem(family): 36ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le """ 37ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le Returns the correct modem subclass based on |family|. 38ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 39ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le @param family: A string containing either '3GPP' or 'CDMA'. 40ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 41ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le """ 42ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le modem_class = _GetModemSuperClass(family) 43ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 44ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le class FailConnectModem(modem_class): 45ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le """Custom fake Modem that always fails to connect.""" 46ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le @pm_utils.log_dbus_method(return_cb_arg='return_cb', 47ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le raise_cb_arg='raise_cb') 48ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le def Connect(self, properties, return_cb, raise_cb): 49ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le logging.info('Connect call will fail.') 50ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le raise_cb(pm_errors.MMCoreError(pm_errors.MMCoreError.FAILED)) 51ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 52ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le return FailConnectModem() 53ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 54428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 550da391e441550a0b5a9bea8cf09591d4369c4750Ben Chanclass cellular_ConnectFailure(test.test): 563b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray """ 573b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray Tests that 3G connect failures are handled by shill properly. 583b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray 593b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray This test will fail if a connect failure does not immediately cause the 603b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray service to enter the Failed state. 613b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray 623b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray """ 63428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow version = 1 64428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 65ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le def _connect_to_3g_network(self, config_timeout): 663b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray """ 673b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray Attempts to connect to a 3G network using shill. 683b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray 693b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray @param config_timeout: Timeout (in seconds) before giving up on 703b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray connect. 71428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 723b4d36e0018a3fac615f953cdf3417053f798f38Arman Uguray @raises: error.TestFail if connection fails. 73428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 74428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow """ 75ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le service = self.test_env.shill.find_cellular_service_object() 76428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 77428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow try: 78ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le service.Connect() 79ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le except dbus.DBusException as e: 80ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le logging.info('Expected error: %s', e) 81428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 82ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le _, state, _ = self.test_env.shill.wait_for_property_in( 83ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le service, 84ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le shill_proxy.ShillProxy.SERVICE_PROPERTY_STATE, 85ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le ('ready', 'portal', 'online', 'failure'), 86ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le config_timeout) 87428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 88ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le if state != 'failure': 89428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow raise error.TestFail('Service state should be failure not %s' % 90428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow state) 91428b1782ae2a99ecfd3c667f05278417d6dadef7Jason Glasgow 92ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le 93ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le def run_once(self, test_env, connect_count=4): 94ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le with test_env: 95ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le self.test_env = test_env 96ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le for count in xrange(connect_count): 97ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le logging.info('Connect attempt %d', count + 1) 98ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le self._connect_to_3g_network(config_timeout= 99ff9bd44cb93a8ad69887f6806371ae6393438a19Thieu Le cellular_proxy.CellularProxy.SERVICE_CONNECT_TIMEOUT) 100