Home | History | Annotate | Download | only in network_3GFailedConnect
      1 # Copyright (c) 2012 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 
      5 import dbus
      6 import logging
      7 
      8 from autotest_lib.client.bin import test
      9 from autotest_lib.client.common_lib import error
     10 from autotest_lib.client.cros.cellular.pseudomodem import modem_3gpp
     11 from autotest_lib.client.cros.cellular.pseudomodem import modem_cdma
     12 from autotest_lib.client.cros.cellular.pseudomodem import pm_errors
     13 from autotest_lib.client.cros.cellular.pseudomodem import utils as pm_utils
     14 from autotest_lib.client.cros.networking import cellular_proxy
     15 from autotest_lib.client.cros.networking import shill_proxy
     16 
     17 
     18 def _GetModemSuperClass(family):
     19     """
     20     Obtains the correct Modem base class to use for the given family.
     21 
     22     @param family: The modem family. Should be one of |3GPP|/|CDMA|.
     23     @returns: The relevant Modem base class.
     24     @raises error.TestError, if |family| is not one of '3GPP' or 'CDMA'.
     25 
     26     """
     27     if family == '3GPP':
     28         return modem_3gpp.Modem3gpp
     29     elif family == 'CDMA':
     30         return modem_cdma.ModemCdma
     31     else:
     32         raise error.TestError('Invalid pseudomodem family: %s', family)
     33 
     34 
     35 def GetFailConnectModem(family):
     36     """
     37     Returns the correct modem subclass based on |family|.
     38 
     39     @param family: A string containing either '3GPP' or 'CDMA'.
     40 
     41     """
     42     modem_class = _GetModemSuperClass(family)
     43 
     44     class FailConnectModem(modem_class):
     45         """Custom fake Modem that always fails to connect."""
     46         @pm_utils.log_dbus_method(return_cb_arg='return_cb',
     47                                   raise_cb_arg='raise_cb')
     48         def Connect(self, properties, return_cb, raise_cb):
     49             logging.info('Connect call will fail.')
     50             raise_cb(pm_errors.MMCoreError(pm_errors.MMCoreError.FAILED))
     51 
     52     return FailConnectModem()
     53 
     54 
     55 class network_3GFailedConnect(test.test):
     56     """
     57     Tests that 3G connect failures are handled by shill properly.
     58 
     59     This test will fail if a connect failure does not immediately cause the
     60     service to enter the Failed state.
     61 
     62     """
     63     version = 1
     64 
     65     def _connect_to_3g_network(self, config_timeout):
     66         """
     67         Attempts to connect to a 3G network using shill.
     68 
     69         @param config_timeout: Timeout (in seconds) before giving up on
     70                                connect.
     71 
     72         @raises: error.TestFail if connection fails.
     73 
     74         """
     75         service = self.test_env.shill.find_cellular_service_object()
     76 
     77         try:
     78             service.Connect()
     79         except dbus.DBusException as e:
     80             logging.info('Expected error: %s', e)
     81 
     82         _, state, _ = self.test_env.shill.wait_for_property_in(
     83                 service,
     84                 shill_proxy.ShillProxy.SERVICE_PROPERTY_STATE,
     85                 ('ready', 'portal', 'online', 'failure'),
     86                 config_timeout)
     87 
     88         if state != 'failure':
     89             raise error.TestFail('Service state should be failure not %s' %
     90                                  state)
     91 
     92 
     93     def run_once(self, test_env, connect_count=4):
     94         with test_env:
     95             self.test_env = test_env
     96             for count in xrange(connect_count):
     97                 logging.info('Connect attempt %d', count + 1)
     98                 self._connect_to_3g_network(config_timeout=
     99                         cellular_proxy.CellularProxy.SERVICE_CONNECT_TIMEOUT)
    100