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