• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2014 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 dbus
6import logging
7import time
8
9from autotest_lib.client.bin import test
10from autotest_lib.client.common_lib import error
11
12from autotest_lib.client.cros.cellular import mm1_constants
13from autotest_lib.client.cros.cellular import test_environment
14from autotest_lib.client.cros.networking import pm_proxy
15
16class cellular_DeferredRegistration(test.test):
17    """
18    Tests that shill can handle temporary registration loss without
19    disconnecting the service because some modems periodically go searching for
20    a better signal while still connected to the network.  Conversely, make
21    sure that shill still disconnects a service that has suffered a
22    registration loss for an extended period of time (>15s).
23
24    """
25    version = 1
26
27    DEFERRED_REGISTRATION_TIMEOUT_SECONDS = 15
28
29    def _init(self):
30        self.pseudomm = pm_proxy.PseudoMMProxy.get_proxy()
31        service = self.test_env.shill.find_cellular_service_object()
32        self.test_env.shill.connect_service_synchronous(
33                service,
34                timeout_seconds=self.test_env.shill.SERVICE_CONNECT_TIMEOUT)
35
36
37    def _set_modem_registration_state(self, state):
38        self.pseudomm.get_modem().iface_properties.Set(
39                mm1_constants.I_MODEM_3GPP,
40                'RegistrationState',
41                dbus.types.UInt32(state))
42
43
44    def _test_temporary_registration_loss(self):
45        logging.info('Verifying temporary loss of registration behavior')
46        self._set_modem_registration_state(
47                mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
48        time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS / 2)
49        self._set_modem_registration_state(
50                mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_HOME)
51        time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS * 2)
52        if self.test_env.shill.find_cellular_service_object() is None:
53            raise error.TestFail('Cellular service should not have been '
54                                 'destroyed after temporary registration loss.')
55        logging.info('Successfully verified temporary loss of registration '
56                     'behavior')
57
58
59    def _test_permanent_registration_loss(self):
60        logging.info('Verifying permanent loss of registration behavior')
61        self._set_modem_registration_state(
62                mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
63        time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS * 2)
64        if self.test_env.shill.find_cellular_service_object() is not None:
65            raise error.TestFail('Cellular service should have been destroyed '
66                                 'after permanent registration loss.')
67        logging.info('Successfully verified permanent loss of registration '
68                     'behavior')
69
70
71    def run_once(self):
72        """Called by autotest to run this test."""
73
74        with test_environment.CellularPseudoMMTestEnvironment(
75                pseudomm_args=({'family': '3GPP'},)) as self.test_env:
76            self._init()
77
78            tests = [self._test_temporary_registration_loss,
79                     self._test_permanent_registration_loss]
80
81            for test in tests:
82                test()
83