| # 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 logging |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.bin import utils |
| 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 cellular_proxy |
| from autotest_lib.client.cros.networking import pm_proxy |
| from autotest_lib.client.cros.networking import shill_context |
| |
| SHORT_TIMEOUT = 10 |
| |
| |
| class cellular_OutOfCreditsSubscriptionState(test.test): |
| """ |
| This test verifies that shill out-of-credits behavior works properly based |
| on the modem subscription state. |
| |
| """ |
| version = 1 |
| |
| def _initialize_modem(self, subscription_state): |
| # Simulate an Altair 3100 modem since that modem supports subscription |
| # state information. |
| self.test_env.shill.disable_modem_for_test_setup() |
| # TODO(thieule): Set the modem model using the pseudomodem testing |
| # interface (crbug.com/343258). |
| self.modem.iface_properties.Set( |
| mm1_constants.I_MODEM, |
| mm1_constants.MM_MODEM_PROPERTY_NAME_PLUGIN, |
| 'Altair LTE') |
| self.pseudomm.iface_testing.SetSubscriptionState( |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNKNOWN, |
| subscription_state) |
| self.test_env.shill.manager.EnableTechnology( |
| cellular_proxy.CellularProxy.TECHNOLOGY_CELLULAR) |
| # Wait for a registered state. |
| self.modem.wait_for_states([mm1_constants.MM_MODEM_STATE_REGISTERED, |
| mm1_constants.MM_MODEM_STATE_CONNECTED]) |
| |
| |
| def _is_out_of_credits(self, cellular_service): |
| properties = cellular_service.GetProperties(utf8_strings=True) |
| return properties[cellular_proxy.CellularProxy. |
| DEVICE_PROPERTY_OUT_OF_CREDITS] |
| |
| |
| def _test_provisioned(self): |
| logging.info('Initialize modem with provisioned state') |
| self._initialize_modem( |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_PROVISIONED) |
| logging.info('Verify out-of-credits is not set in cellular service') |
| cellular_service = \ |
| self.test_env.shill.wait_for_cellular_service_object() |
| if self._is_out_of_credits(cellular_service): |
| error_msg = 'Service marked as out-of-credits when it ' \ |
| 'should not be.' |
| logging.error(error_msg) |
| raise error.TestFail(error_msg) |
| |
| |
| def _test_out_of_credits_at_start(self): |
| logging.info('Initialize modem with out-of-credits state') |
| self._initialize_modem( |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_OUT_OF_DATA) |
| logging.info('Verify out-of-credits is set in cellular service') |
| cellular_service = \ |
| self.test_env.shill.wait_for_cellular_service_object() |
| if not self._is_out_of_credits(cellular_service): |
| error_msg = 'Service not marked out-of-credits when it ' \ |
| 'should be.' |
| logging.error(error_msg) |
| raise error.TestFail(error_msg) |
| |
| |
| def _test_out_of_credits_while_connected(self): |
| logging.info('Initialize modem with provisioned state') |
| self._initialize_modem( |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_PROVISIONED) |
| cellular_service = \ |
| self.test_env.shill.wait_for_cellular_service_object() |
| logging.info('Mark modem as out-of-credits') |
| self.pseudomm.iface_testing.SetSubscriptionState( |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNKNOWN, |
| mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_OUT_OF_DATA) |
| logging.info('Verify out-of-credits set in cellular service') |
| try: |
| utils.poll_for_condition( |
| lambda: self._is_out_of_credits(cellular_service), |
| exception=error.TestFail('Service failed to be marked as ' |
| 'out-of-credits.'), |
| timeout=SHORT_TIMEOUT) |
| except error.TestFail as e: |
| logging.error(repr(e)) |
| raise e |
| |
| |
| def run_once(self): |
| """Calls by autotest to run this test.""" |
| self.test_env = test_environment.CellularPseudoMMTestEnvironment( |
| pseudomm_args=({'family': '3GPP'},)) |
| with self.test_env, shill_context.ServiceAutoConnectContext( |
| self.test_env.shill.find_cellular_service_object, False): |
| self.pseudomm = pm_proxy.PseudoMMProxy.get_proxy() |
| self.modem = self.pseudomm.get_modem() |
| |
| tests = [self._test_provisioned, |
| self._test_out_of_credits_at_start, |
| self._test_out_of_credits_while_connected] |
| |
| for test in tests: |
| test() |