# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import dbus import logging import time from autotest_lib.client.bin import test from autotest_lib.client.common_lib import error from autotest_lib.client.cros.cellular import mm1_constants from autotest_lib.client.cros.cellular import test_environment from autotest_lib.client.cros.networking import pm_proxy class cellular_DeferredRegistration(test.test): """ Tests that shill can handle temporary registration loss without disconnecting the service because some modems periodically go searching for a better signal while still connected to the network. Conversely, make sure that shill still disconnects a service that has suffered a registration loss for an extended period of time (>15s). """ version = 1 DEFERRED_REGISTRATION_TIMEOUT_SECONDS = 15 def _init(self): self.pseudomm = pm_proxy.PseudoMMProxy.get_proxy() service = self.test_env.shill.find_cellular_service_object() self.test_env.shill.connect_service_synchronous( service, timeout_seconds=self.test_env.shill.SERVICE_CONNECT_TIMEOUT) def _set_modem_registration_state(self, state): self.pseudomm.get_modem().iface_properties.Set( mm1_constants.I_MODEM_3GPP, 'RegistrationState', dbus.types.UInt32(state)) def _test_temporary_registration_loss(self): logging.info('Verifying temporary loss of registration behavior') self._set_modem_registration_state( mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING) time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS / 2) self._set_modem_registration_state( mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_HOME) time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS * 2) if self.test_env.shill.find_cellular_service_object() is None: raise error.TestFail('Cellular service should not have been ' 'destroyed after temporary registration loss.') logging.info('Successfully verified temporary loss of registration ' 'behavior') def _test_permanent_registration_loss(self): logging.info('Verifying permanent loss of registration behavior') self._set_modem_registration_state( mm1_constants.MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING) time.sleep(self.DEFERRED_REGISTRATION_TIMEOUT_SECONDS * 2) if self.test_env.shill.find_cellular_service_object() is not None: raise error.TestFail('Cellular service should have been destroyed ' 'after permanent registration loss.') logging.info('Successfully verified permanent loss of registration ' 'behavior') def run_once(self): """Called by autotest to run this test.""" with test_environment.CellularPseudoMMTestEnvironment( pseudomm_args=({'family': '3GPP'},)) as self.test_env: self._init() tests = [self._test_temporary_registration_loss, self._test_permanent_registration_loss] for test in tests: test()