普通文本  |  83行  |  3.31 KB

# 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()