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 dbus.types 7import time 8 9from autotest_lib.client.cros.cellular import mm1_constants 10from autotest_lib.client.cros.cellular.pseudomodem import modem_3gpp 11from autotest_lib.client.cros.cellular.pseudomodem import sim 12from autotest_lib.client.cros.cellular.pseudomodem import utils as pm_utils 13 14I_ACTIVATION_TEST = 'Interface.LTEActivationTest' 15 16class TestModem(modem_3gpp.Modem3gpp): 17 """ 18 Base class for the custom 3GPP fake modems that are defined in this test. 19 This modem boots up as unprovisioned & becomes activated only if it has 20 been explicitly activated by calling CompleteCellularActivation 21 22 """ 23 def __init__(self, 24 state_machine_factory=None, 25 bus=None, 26 device='pseudomodem0', 27 index=0, 28 roaming_networks=None, 29 config=None): 30 super(TestModem, self).__init__(state_machine_factory, 31 bus=bus, 32 device=device, 33 roaming_networks=roaming_networks, 34 config=config) 35 # Update the registered susbscription state as unprovisioned 36 # for this activation test 37 self._cached_registered_subscription_state = ( 38 mm1_constants.MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNPROVISIONED) 39 40 41 def _InitializeProperties(self): 42 props = modem_3gpp.Modem3gpp._InitializeProperties(self) 43 modem_props = props[mm1_constants.I_MODEM] 44 modem_props['OwnNumbers'] = ['0000000000'] 45 modem_props['AccessTechnologies'] = dbus.types.UInt32( 46 mm1_constants.MM_MODEM_ACCESS_TECHNOLOGY_LTE) 47 modem_props['ModemCapabilities'] = dbus.types.UInt32( 48 mm1_constants.MM_MODEM_CAPABILITY_LTE) 49 modem_props['CurrentCapabilities'] = dbus.types.UInt32( 50 mm1_constants.MM_MODEM_CAPABILITY_LTE) 51 52 # For the purposes of this test, introduce a property to help 53 # verify that a reset has taken place. Expose this under a test 54 # specific interface. 55 if hasattr(self, '_properties'): 56 reset_called = \ 57 self._properties[I_ACTIVATION_TEST]['ResetCalled'] 58 else: 59 reset_called = False 60 props[I_ACTIVATION_TEST] = { 61 'ResetCalled' : dbus.types.Boolean(reset_called) 62 } 63 return props 64 65 66 @pm_utils.log_dbus_method() 67 def Reset(self): 68 self.Set( 69 I_ACTIVATION_TEST, 'ResetCalled', dbus.types.Boolean(True)) 70 modem_3gpp.Modem3gpp.Reset(self) 71 72 73class ResetRequiredForActivationModem(TestModem): 74 """ 75 Fake modem boots up as unprovisioned & becomes activated only if it has 76 been explicitly activated by calling CompleteCellularActivation 77 and has been reset at least once after initiating activatation 78 """ 79 def RegisterWithNetwork( 80 self, operator_id='', return_cb=None, raise_cb=None): 81 if self.Get(I_ACTIVATION_TEST, 'ResetCalled'): 82 modem_3gpp.Modem3gpp.RegisterWithNetwork( 83 self, operator_id, return_cb, raise_cb) 84 85 86class TestSIM(sim.SIM): 87 """ SIM instantiated with the default test network, for ease of use. """ 88 def __init__(self): 89 # Shill's activating ICCID store tracks which SIM identifiers are in 90 # the process of activation. If we use the same SIM identifier for 91 # every test pass, then a failed test may leave a stale entry in the 92 # activating ICCD store which will erroneously mark the SIM as pending 93 # activation. So, to avoid this, try to use a unique SIM identifier 94 # each time. 95 sim_identifier = int(time.time()) 96 sim.SIM.__init__( 97 self, 98 sim.SIM.Carrier('test'), 99 mm1_constants.MM_MODEM_ACCESS_TECHNOLOGY_LTE, 100 msin=str(sim_identifier)) 101