1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.telephony; 18 19 import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; 20 21 import static org.junit.Assert.assertEquals; 22 import static org.junit.Assert.assertFalse; 23 import static org.junit.Assert.assertTrue; 24 import static org.mockito.Matchers.any; 25 import static org.mockito.Matchers.anyLong; 26 import static org.mockito.Matchers.nullable; 27 import static org.mockito.Mockito.anyInt; 28 import static org.mockito.Mockito.anyString; 29 import static org.mockito.Mockito.atLeast; 30 import static org.mockito.Mockito.doReturn; 31 import static org.mockito.Mockito.eq; 32 import static org.mockito.Mockito.mock; 33 import static org.mockito.Mockito.spy; 34 import static org.mockito.Mockito.times; 35 import static org.mockito.Mockito.verify; 36 import static org.mockito.Mockito.when; 37 38 import android.app.IAlarmManager; 39 import android.app.Notification; 40 import android.app.NotificationManager; 41 import android.content.Context; 42 import android.content.Intent; 43 import android.content.IntentFilter; 44 import android.content.pm.ApplicationInfo; 45 import android.content.pm.ServiceInfo; 46 import android.content.res.Resources; 47 import android.graphics.drawable.Drawable; 48 import android.os.AsyncResult; 49 import android.os.Bundle; 50 import android.os.Handler; 51 import android.os.HandlerThread; 52 import android.os.Message; 53 import android.os.Parcel; 54 import android.os.PersistableBundle; 55 import android.os.Process; 56 import android.os.SystemClock; 57 import android.os.UserHandle; 58 import android.os.WorkSource; 59 import android.support.test.filters.FlakyTest; 60 import android.telephony.AccessNetworkConstants.AccessNetworkType; 61 import android.telephony.CarrierConfigManager; 62 import android.telephony.CellIdentityGsm; 63 import android.telephony.CellIdentityLte; 64 import android.telephony.CellInfo; 65 import android.telephony.CellInfoGsm; 66 import android.telephony.NetworkRegistrationState; 67 import android.telephony.NetworkService; 68 import android.telephony.PhysicalChannelConfig; 69 import android.telephony.ServiceState; 70 import android.telephony.SignalStrength; 71 import android.telephony.SubscriptionManager; 72 import android.telephony.TelephonyManager; 73 import android.telephony.gsm.GsmCellLocation; 74 import android.test.suitebuilder.annotation.MediumTest; 75 import android.test.suitebuilder.annotation.SmallTest; 76 import android.util.Pair; 77 78 import com.android.internal.R; 79 import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; 80 import com.android.internal.telephony.dataconnection.DcTracker; 81 import com.android.internal.telephony.test.SimulatedCommands; 82 import com.android.internal.telephony.uicc.IccCardApplicationStatus; 83 import com.android.internal.telephony.util.TimeStampedValue; 84 85 import org.junit.After; 86 import org.junit.Before; 87 import org.junit.Ignore; 88 import org.junit.Test; 89 import org.mockito.ArgumentCaptor; 90 import org.mockito.Mock; 91 import org.mockito.Mockito; 92 93 import java.util.ArrayList; 94 import java.util.Arrays; 95 import java.util.HashSet; 96 import java.util.List; 97 98 public class ServiceStateTrackerTest extends TelephonyTest { 99 100 @Mock 101 private DcTracker mDct; 102 @Mock 103 private ProxyController mProxyController; 104 @Mock 105 private Handler mTestHandler; 106 @Mock 107 protected IAlarmManager mAlarmManager; 108 109 CellularNetworkService mCellularNetworkService; 110 111 private ServiceStateTracker sst; 112 private ServiceStateTrackerTestHandler mSSTTestHandler; 113 private PersistableBundle mBundle; 114 115 private static final int EVENT_REGISTERED_TO_NETWORK = 1; 116 private static final int EVENT_SUBSCRIPTION_INFO_READY = 2; 117 private static final int EVENT_DATA_ROAMING_ON = 3; 118 private static final int EVENT_DATA_ROAMING_OFF = 4; 119 private static final int EVENT_DATA_CONNECTION_ATTACHED = 5; 120 private static final int EVENT_DATA_CONNECTION_DETACHED = 6; 121 private static final int EVENT_DATA_RAT_CHANGED = 7; 122 private static final int EVENT_PS_RESTRICT_ENABLED = 8; 123 private static final int EVENT_PS_RESTRICT_DISABLED = 9; 124 private static final int EVENT_VOICE_ROAMING_ON = 10; 125 private static final int EVENT_VOICE_ROAMING_OFF = 11; 126 127 private class ServiceStateTrackerTestHandler extends HandlerThread { 128 129 private ServiceStateTrackerTestHandler(String name) { 130 super(name); 131 } 132 133 @Override 134 public void onLooperPrepared() { 135 sst = new ServiceStateTracker(mPhone, mSimulatedCommands); 136 setReady(true); 137 } 138 } 139 140 private void addNetworkService() { 141 mCellularNetworkService = new CellularNetworkService(); 142 ServiceInfo serviceInfo = new ServiceInfo(); 143 serviceInfo.packageName = "com.android.phone"; 144 serviceInfo.permission = "android.permission.BIND_NETWORK_SERVICE"; 145 IntentFilter filter = new IntentFilter(); 146 mContextFixture.addService( 147 NetworkService.NETWORK_SERVICE_INTERFACE, 148 null, 149 "com.android.phone", 150 mCellularNetworkService.mBinder, 151 serviceInfo, 152 filter); 153 } 154 155 @Before 156 public void setUp() throws Exception { 157 158 logd("ServiceStateTrackerTest +Setup!"); 159 super.setUp("ServiceStateTrackerTest"); 160 161 mContextFixture.putResource(R.string.config_wwan_network_service_package, 162 "com.android.phone"); 163 addNetworkService(); 164 165 doReturn(true).when(mDct).isDisconnected(); 166 mPhone.mDcTracker = mDct; 167 168 replaceInstance(ProxyController.class, "sProxyController", null, mProxyController); 169 mBundle = mContextFixture.getCarrierConfigBundle(); 170 mBundle.putStringArray( 171 CarrierConfigManager.KEY_ROAMING_OPERATOR_STRING_ARRAY, new String[]{"123456"}); 172 173 mBundle.putStringArray( 174 CarrierConfigManager.KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, new String[]{"123456"}); 175 176 mBundle.putStringArray(CarrierConfigManager.KEY_RATCHET_RAT_FAMILIES, 177 // UMTS < GPRS < EDGE 178 new String[]{"3,1,2"}); 179 180 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 181 mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA); 182 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 183 mSimulatedCommands.setDataRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA); 184 185 int dds = SubscriptionManager.getDefaultDataSubscriptionId(); 186 doReturn(dds).when(mPhone).getSubId(); 187 188 mSSTTestHandler = new ServiceStateTrackerTestHandler(getClass().getSimpleName()); 189 mSSTTestHandler.start(); 190 waitUntilReady(); 191 waitForMs(600); 192 logd("ServiceStateTrackerTest -Setup!"); 193 } 194 195 @After 196 public void tearDown() throws Exception { 197 sst = null; 198 mSSTTestHandler.quit(); 199 super.tearDown(); 200 } 201 202 @Test 203 @MediumTest 204 public void testSetRadioPower() { 205 boolean oldState = mSimulatedCommands.getRadioState().isOn(); 206 sst.setRadioPower(!oldState); 207 waitForMs(100); 208 assertTrue(oldState != mSimulatedCommands.getRadioState().isOn()); 209 } 210 211 @Test 212 @MediumTest 213 public void testSetRadioPowerFromCarrier() { 214 // Carrier disable radio power 215 sst.setRadioPowerFromCarrier(false); 216 waitForMs(100); 217 assertFalse(mSimulatedCommands.getRadioState().isOn()); 218 assertTrue(sst.getDesiredPowerState()); 219 assertFalse(sst.getPowerStateFromCarrier()); 220 221 // User toggle radio power will not overrides carrier settings 222 sst.setRadioPower(true); 223 waitForMs(100); 224 assertFalse(mSimulatedCommands.getRadioState().isOn()); 225 assertTrue(sst.getDesiredPowerState()); 226 assertFalse(sst.getPowerStateFromCarrier()); 227 228 // Carrier re-enable radio power 229 sst.setRadioPowerFromCarrier(true); 230 waitForMs(100); 231 assertTrue(mSimulatedCommands.getRadioState().isOn()); 232 assertTrue(sst.getDesiredPowerState()); 233 assertTrue(sst.getPowerStateFromCarrier()); 234 235 // User toggle radio power off (airplane mode) and set carrier on 236 sst.setRadioPower(false); 237 sst.setRadioPowerFromCarrier(true); 238 waitForMs(100); 239 assertFalse(mSimulatedCommands.getRadioState().isOn()); 240 assertFalse(sst.getDesiredPowerState()); 241 assertTrue(sst.getPowerStateFromCarrier()); 242 } 243 244 @Test 245 @MediumTest 246 public void testRilTrafficAfterSetRadioPower() { 247 sst.setRadioPower(true); 248 final int getOperatorCallCount = mSimulatedCommands.getGetOperatorCallCount(); 249 final int getDataRegistrationStateCallCount = 250 mSimulatedCommands.getGetDataRegistrationStateCallCount(); 251 final int getVoiceRegistrationStateCallCount = 252 mSimulatedCommands.getGetVoiceRegistrationStateCallCount(); 253 final int getNetworkSelectionModeCallCount = 254 mSimulatedCommands.getGetNetworkSelectionModeCallCount(); 255 sst.setRadioPower(false); 256 257 waitForMs(500); 258 sst.pollState(); 259 waitForMs(250); 260 261 // This test was meant to be for *no* ril traffic. However, RADIO_STATE_CHANGED is 262 // considered a modem triggered action and that causes a pollState() to be done 263 assertEquals(getOperatorCallCount + 1, mSimulatedCommands.getGetOperatorCallCount()); 264 assertEquals(getDataRegistrationStateCallCount + 1, 265 mSimulatedCommands.getGetDataRegistrationStateCallCount()); 266 assertEquals(getVoiceRegistrationStateCallCount + 1, 267 mSimulatedCommands.getGetVoiceRegistrationStateCallCount()); 268 assertEquals(getNetworkSelectionModeCallCount + 1, 269 mSimulatedCommands.getGetNetworkSelectionModeCallCount()); 270 271 // Note that if the poll is triggered by a network change notification 272 // and the modem is supposed to be off, we should still do the poll 273 mSimulatedCommands.notifyNetworkStateChanged(); 274 waitForMs(250); 275 276 assertEquals(getOperatorCallCount + 2 , mSimulatedCommands.getGetOperatorCallCount()); 277 assertEquals(getDataRegistrationStateCallCount + 2, 278 mSimulatedCommands.getGetDataRegistrationStateCallCount()); 279 assertEquals(getVoiceRegistrationStateCallCount + 2, 280 mSimulatedCommands.getGetVoiceRegistrationStateCallCount()); 281 assertEquals(getNetworkSelectionModeCallCount + 2, 282 mSimulatedCommands.getGetNetworkSelectionModeCallCount()); 283 } 284 285 @FlakyTest 286 @Ignore 287 @Test 288 @MediumTest 289 public void testSpnUpdateShowPlmnOnly() { 290 doReturn(0x02).when(mSimRecords).getDisplayRule(new ServiceState()); 291 doReturn(IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN). 292 when(mUiccCardApplication3gpp).getState(); 293 294 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED, null)); 295 296 waitForMs(750); 297 298 ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); 299 verify(mContextFixture.getTestDouble(), times(3)) 300 .sendStickyBroadcastAsUser(intentArgumentCaptor.capture(), eq(UserHandle.ALL)); 301 302 // We only want to verify the intent SPN_STRINGS_UPDATED_ACTION. 303 List<Intent> intents = intentArgumentCaptor.getAllValues(); 304 logd("Total " + intents.size() + " intents"); 305 for (Intent intent : intents) { 306 logd(" " + intent.getAction()); 307 } 308 Intent intent = intents.get(2); 309 assertEquals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION, intent.getAction()); 310 311 Bundle b = intent.getExtras(); 312 313 // For boolean we need to make sure the key exists first 314 assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_SPN)); 315 assertFalse(b.getBoolean(TelephonyIntents.EXTRA_SHOW_SPN)); 316 317 assertEquals(null, b.getString(TelephonyIntents.EXTRA_SPN)); 318 assertEquals(null, b.getString(TelephonyIntents.EXTRA_DATA_SPN)); 319 320 // For boolean we need to make sure the key exists first 321 assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_PLMN)); 322 assertTrue(b.getBoolean(TelephonyIntents.EXTRA_SHOW_PLMN)); 323 324 assertEquals(SimulatedCommands.FAKE_LONG_NAME, b.getString(TelephonyIntents.EXTRA_PLMN)); 325 326 ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class); 327 verify(mTelephonyManager).setDataNetworkTypeForPhone(anyInt(), intArgumentCaptor.capture()); 328 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA, 329 intArgumentCaptor.getValue().intValue()); 330 } 331 332 @Test 333 @MediumTest 334 public void testCellInfoList() { 335 Parcel p = Parcel.obtain(); 336 p.writeInt(1); 337 p.writeInt(1); 338 p.writeInt(2); 339 p.writeLong(1453510289108L); 340 p.writeInt(310); 341 p.writeInt(260); 342 p.writeInt(123); 343 p.writeInt(456); 344 p.writeInt(99); 345 p.writeInt(3); 346 p.setDataPosition(0); 347 348 CellInfoGsm cellInfo = CellInfoGsm.CREATOR.createFromParcel(p); 349 350 ArrayList<CellInfo> list = new ArrayList(); 351 list.add(cellInfo); 352 mSimulatedCommands.setCellInfoList(list); 353 354 WorkSource workSource = new WorkSource(Process.myUid(), 355 mContext.getPackageName()); 356 assertEquals(sst.getAllCellInfo(workSource), list); 357 } 358 359 @Test 360 @MediumTest 361 public void testImsRegState() { 362 // Simulate IMS registered 363 mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM}); 364 365 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null)); 366 waitForMs(200); 367 368 assertTrue(sst.isImsRegistered()); 369 370 // Simulate IMS unregistered 371 mSimulatedCommands.setImsRegistrationState(new int[]{0, PhoneConstants.PHONE_TYPE_GSM}); 372 373 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null)); 374 waitForMs(200); 375 376 assertFalse(sst.isImsRegistered()); 377 } 378 379 @Test 380 public void testOnImsServiceStateChanged() { 381 // The service state of GsmCdmaPhone is STATE_OUT_OF_SERVICE, and IMS is unregistered. 382 ServiceState ss = new ServiceState(); 383 ss.setVoiceRegState(ServiceState.STATE_OUT_OF_SERVICE); 384 sst.mSS = ss; 385 386 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_SERVICE_STATE_CHANGED)); 387 waitForMs(200); 388 389 // The listener will be notified that the service state was changed. 390 verify(mPhone).notifyServiceStateChanged(any(ServiceState.class)); 391 392 // The service state of GsmCdmaPhone is STATE_IN_SERVICE, and IMS is registered. 393 ss = new ServiceState(); 394 ss.setVoiceRegState(ServiceState.STATE_IN_SERVICE); 395 sst.mSS = ss; 396 397 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_SERVICE_STATE_CHANGED)); 398 waitForMs(200); 399 400 // Nothing happened because the IMS service state was not affected the merged service state. 401 verify(mPhone, times(1)).notifyServiceStateChanged(any(ServiceState.class)); 402 } 403 404 @Test 405 @MediumTest 406 public void testSignalStrength() { 407 SignalStrength ss = new SignalStrength( 408 30, // gsmSignalStrength 409 0, // gsmBitErrorRate 410 -1, // cdmaDbm 411 -1, // cdmaEcio 412 -1, // evdoDbm 413 -1, // evdoEcio 414 -1, // evdoSnr 415 99, // lteSignalStrength 416 SignalStrength.INVALID, // lteRsrp 417 SignalStrength.INVALID, // lteRsrq 418 SignalStrength.INVALID, // lteRssnr 419 SignalStrength.INVALID, // lteCqi 420 SignalStrength.INVALID // tdScdmaRscp 421 ); 422 423 mSimulatedCommands.setSignalStrength(ss); 424 mSimulatedCommands.notifySignalStrength(); 425 waitForMs(300); 426 assertEquals(sst.getSignalStrength(), ss); 427 assertEquals(sst.getSignalStrength().isGsm(), true); 428 429 // switch to CDMA 430 doReturn(false).when(mPhone).isPhoneTypeGsm(); 431 doReturn(true).when(mPhone).isPhoneTypeCdmaLte(); 432 sst.updatePhoneType(); 433 sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_LTE); 434 435 mSimulatedCommands.notifySignalStrength(); 436 waitForMs(300); 437 assertEquals(sst.getSignalStrength(), ss); 438 assertEquals(sst.getSignalStrength().isGsm(), true); 439 440 // notify signal strength again, but this time data RAT is not LTE 441 sst.mSS.setRilVoiceRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT); 442 sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD); 443 mSimulatedCommands.notifySignalStrength(); 444 waitForMs(300); 445 assertEquals(sst.getSignalStrength(), ss); 446 assertEquals(sst.getSignalStrength().isGsm(), false); 447 } 448 449 @Test 450 public void testSetsNewSignalStrengthReportingCriteria() { 451 int[] wcdmaThresholds = { 452 -110, /* SIGNAL_STRENGTH_POOR */ 453 -100, /* SIGNAL_STRENGTH_MODERATE */ 454 -90, /* SIGNAL_STRENGTH_GOOD */ 455 -80 /* SIGNAL_STRENGTH_GREAT */ 456 }; 457 mBundle.putIntArray(CarrierConfigManager.KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY, 458 wcdmaThresholds); 459 460 int[] lteThresholds = { 461 -130, /* SIGNAL_STRENGTH_POOR */ 462 -120, /* SIGNAL_STRENGTH_MODERATE */ 463 -110, /* SIGNAL_STRENGTH_GOOD */ 464 -100, /* SIGNAL_STRENGTH_GREAT */ 465 }; 466 mBundle.putIntArray(CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, 467 lteThresholds); 468 469 CarrierConfigManager mockConfigManager = Mockito.mock(CarrierConfigManager.class); 470 when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)) 471 .thenReturn(mockConfigManager); 472 when(mockConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle); 473 474 Intent intent = new Intent().setAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); 475 mContext.sendBroadcast(intent); 476 waitForMs(300); 477 478 verify(mPhone).setSignalStrengthReportingCriteria(eq(wcdmaThresholds), 479 eq(AccessNetworkType.UTRAN)); 480 verify(mPhone).setSignalStrengthReportingCriteria(eq(lteThresholds), 481 eq(AccessNetworkType.EUTRAN)); 482 } 483 484 @Test 485 @MediumTest 486 public void testSignalLevelWithWcdmaRscpThresholds() { 487 mBundle.putIntArray(CarrierConfigManager.KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY, 488 new int[] { 489 -110, /* SIGNAL_STRENGTH_POOR */ 490 -100, /* SIGNAL_STRENGTH_MODERATE */ 491 -90, /* SIGNAL_STRENGTH_GOOD */ 492 -80 /* SIGNAL_STRENGTH_GREAT */ 493 }); 494 mBundle.putString( 495 CarrierConfigManager.KEY_WCDMA_DEFAULT_SIGNAL_STRENGTH_MEASUREMENT_STRING, 496 "rscp"); 497 498 SignalStrength ss = new SignalStrength( 499 30, // gsmSignalStrength 500 0, // gsmBitErrorRate 501 -1, // cdmaDbm 502 -1, // cdmaEcio 503 -1, // evdoDbm 504 -1, // evdoEcio 505 -1, // evdoSnr 506 99, // lteSignalStrength 507 SignalStrength.INVALID, // lteRsrp 508 SignalStrength.INVALID, // lteRsrq 509 SignalStrength.INVALID, // lteRssnr 510 SignalStrength.INVALID, // lteCqi 511 SignalStrength.INVALID, // tdScdmaRscp 512 99, // wcdmaSignalStrength 513 45 // wcdmaRscpAsu 514 ); 515 mSimulatedCommands.setSignalStrength(ss); 516 mSimulatedCommands.notifySignalStrength(); 517 waitForMs(300); 518 assertEquals(sst.getSignalStrength(), ss); 519 assertEquals(sst.getSignalStrength().getWcdmaLevel(), SignalStrength.SIGNAL_STRENGTH_GREAT); 520 assertEquals(sst.getSignalStrength().getWcdmaAsuLevel(), 45); 521 assertEquals(sst.getSignalStrength().getWcdmaDbm(), -75); 522 523 ss = new SignalStrength( 524 30, // gsmSignalStrength 525 0, // gsmBitErrorRate 526 -1, // cdmaDbm 527 -1, // cdmaEcio 528 -1, // evdoDbm 529 -1, // evdoEcio 530 -1, // evdoSnr 531 99, // lteSignalStrength 532 SignalStrength.INVALID, // lteRsrp 533 SignalStrength.INVALID, // lteRsrq 534 SignalStrength.INVALID, // lteRssnr 535 SignalStrength.INVALID, // lteCqi 536 SignalStrength.INVALID, // tdScdmaRscp 537 99, // wcdmaSignalStrength 538 35 // wcdmaRscpAsu 539 ); 540 mSimulatedCommands.setSignalStrength(ss); 541 mSimulatedCommands.notifySignalStrength(); 542 waitForMs(300); 543 assertEquals(sst.getSignalStrength(), ss); 544 assertEquals(sst.getSignalStrength().getWcdmaLevel(), SignalStrength.SIGNAL_STRENGTH_GOOD); 545 assertEquals(sst.getSignalStrength().getWcdmaAsuLevel(), 35); 546 assertEquals(sst.getSignalStrength().getWcdmaDbm(), -85); 547 548 ss = new SignalStrength( 549 30, // gsmSignalStrength 550 0, // gsmBitErrorRate 551 -1, // cdmaDbm 552 -1, // cdmaEcio 553 -1, // evdoDbm 554 -1, // evdoEcio 555 -1, // evdoSnr 556 99, // lteSignalStrength 557 SignalStrength.INVALID, // lteRsrp 558 SignalStrength.INVALID, // lteRsrq 559 SignalStrength.INVALID, // lteRssnr 560 SignalStrength.INVALID, // lteCqi 561 SignalStrength.INVALID, // tdScdmaRscp 562 99, // wcdmaSignalStrength 563 25 // wcdmaRscpAsu 564 ); 565 mSimulatedCommands.setSignalStrength(ss); 566 mSimulatedCommands.notifySignalStrength(); 567 waitForMs(300); 568 assertEquals(sst.getSignalStrength(), ss); 569 assertEquals(sst.getSignalStrength().getWcdmaLevel(), 570 SignalStrength.SIGNAL_STRENGTH_MODERATE); 571 assertEquals(sst.getSignalStrength().getWcdmaAsuLevel(), 25); 572 assertEquals(sst.getSignalStrength().getWcdmaDbm(), -95); 573 574 ss = new SignalStrength( 575 30, // gsmSignalStrength 576 0, // gsmBitErrorRate 577 -1, // cdmaDbm 578 -1, // cdmaEcio 579 -1, // evdoDbm 580 -1, // evdoEcio 581 -1, // evdoSnr 582 99, // lteSignalStrength 583 SignalStrength.INVALID, // lteRsrp 584 SignalStrength.INVALID, // lteRsrq 585 SignalStrength.INVALID, // lteRssnr 586 SignalStrength.INVALID, // lteCqi 587 SignalStrength.INVALID, // tdScdmaRscp 588 99, // wcdmaSignalStrength 589 15 // wcdmaRscpAsu 590 ); 591 mSimulatedCommands.setSignalStrength(ss); 592 mSimulatedCommands.notifySignalStrength(); 593 waitForMs(300); 594 assertEquals(sst.getSignalStrength(), ss); 595 assertEquals(sst.getSignalStrength().getWcdmaLevel(), SignalStrength.SIGNAL_STRENGTH_POOR); 596 assertEquals(sst.getSignalStrength().getWcdmaAsuLevel(), 15); 597 assertEquals(sst.getSignalStrength().getWcdmaDbm(), -105); 598 599 ss = new SignalStrength( 600 30, // gsmSignalStrength 601 0, // gsmBitErrorRate 602 -1, // cdmaDbm 603 -1, // cdmaEcio 604 -1, // evdoDbm 605 -1, // evdoEcio 606 -1, // evdoSnr 607 99, // lteSignalStrength 608 SignalStrength.INVALID, // lteRsrp 609 SignalStrength.INVALID, // lteRsrq 610 SignalStrength.INVALID, // lteRssnr 611 SignalStrength.INVALID, // lteCqi 612 SignalStrength.INVALID, // tdScdmaRscp 613 99, // wcdmaSignalStrength 614 5 // wcdmaRscpAsu 615 ); 616 mSimulatedCommands.setSignalStrength(ss); 617 mSimulatedCommands.notifySignalStrength(); 618 waitForMs(300); 619 assertEquals(sst.getSignalStrength(), ss); 620 assertEquals(sst.getSignalStrength().getWcdmaLevel(), 621 SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN); 622 assertEquals(sst.getSignalStrength().getWcdmaAsuLevel(), 5); 623 assertEquals(sst.getSignalStrength().getWcdmaDbm(), -115); 624 } 625 626 @Test 627 @MediumTest 628 public void testGsmCellLocation() { 629 CellIdentityGsm cellIdentityGsm = new CellIdentityGsm(0, 0, 2, 3); 630 NetworkRegistrationState result = new NetworkRegistrationState( 631 0, 0, 0, 0, 0, false, null, cellIdentityGsm); 632 633 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_GET_LOC_DONE, 634 new AsyncResult(null, result, null))); 635 636 waitForMs(200); 637 WorkSource workSource = new WorkSource(Process.myUid(), mContext.getPackageName()); 638 GsmCellLocation cl = (GsmCellLocation) sst.getCellLocation(workSource); 639 assertEquals(2, cl.getLac()); 640 assertEquals(3, cl.getCid()); 641 } 642 643 @Test 644 @MediumTest 645 public void testUpdatePhoneType() { 646 doReturn(false).when(mPhone).isPhoneTypeGsm(); 647 doReturn(true).when(mPhone).isPhoneTypeCdmaLte(); 648 doReturn(CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM).when(mCdmaSSM). 649 getCdmaSubscriptionSource(); 650 651 logd("Calling updatePhoneType"); 652 // switch to CDMA 653 sst.updatePhoneType(); 654 655 ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class); 656 verify(mRuimRecords).registerForRecordsLoaded(eq(sst), integerArgumentCaptor.capture(), 657 nullable(Object.class)); 658 659 // response for mRuimRecords.registerForRecordsLoaded() 660 Message msg = Message.obtain(); 661 msg.what = integerArgumentCaptor.getValue(); 662 msg.obj = new AsyncResult(null, null, null); 663 sst.sendMessage(msg); 664 waitForMs(100); 665 666 // on RUIM_RECORDS_LOADED, sst is expected to call following apis 667 verify(mRuimRecords, times(1)).isProvisioned(); 668 669 // switch back to GSM 670 doReturn(true).when(mPhone).isPhoneTypeGsm(); 671 doReturn(false).when(mPhone).isPhoneTypeCdmaLte(); 672 673 // response for mRuimRecords.registerForRecordsLoaded() can be sent after switching to GSM 674 msg = Message.obtain(); 675 msg.what = integerArgumentCaptor.getValue(); 676 msg.obj = new AsyncResult(null, null, null); 677 sst.sendMessage(msg); 678 679 // There's no easy way to check if the msg was handled or discarded. Wait to make sure sst 680 // did not crash, and then verify that the functions called records loaded are not called 681 // again 682 waitForMs(200); 683 684 verify(mRuimRecords, times(1)).isProvisioned(); 685 } 686 687 @Test 688 @MediumTest 689 public void testRegAndUnregForVoiceRoamingOn() throws Exception { 690 sst.registerForVoiceRoamingOn(mTestHandler, EVENT_DATA_ROAMING_ON, null); 691 692 // Enable roaming and trigger events to notify handler registered 693 doReturn(true).when(mPhone).isPhoneTypeGsm(); 694 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 695 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 696 mSimulatedCommands.notifyNetworkStateChanged(); 697 698 waitForMs(200); 699 700 // verify if registered handler has message posted to it 701 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 702 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 703 assertEquals(EVENT_DATA_ROAMING_ON, messageArgumentCaptor.getValue().what); 704 705 // Disable roaming 706 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 707 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 708 mSimulatedCommands.notifyNetworkStateChanged(); 709 710 waitForMs(100); 711 712 // Unregister registrant 713 sst.unregisterForVoiceRoamingOn(mTestHandler); 714 715 // Enable roaming 716 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 717 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 718 mSimulatedCommands.notifyNetworkStateChanged(); 719 720 waitForMs(200); 721 722 // verify that no new message posted to handler 723 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 724 } 725 726 @Test 727 @MediumTest 728 public void testRegAndUnregForVoiceRoamingOff() throws Exception { 729 // Enable roaming 730 doReturn(true).when(mPhone).isPhoneTypeGsm(); 731 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 732 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 733 mSimulatedCommands.notifyNetworkStateChanged(); 734 735 waitForMs(100); 736 737 sst.registerForVoiceRoamingOff(mTestHandler, EVENT_DATA_ROAMING_OFF, null); 738 739 // Disable roaming 740 doReturn(true).when(mPhone).isPhoneTypeGsm(); 741 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 742 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 743 mSimulatedCommands.notifyNetworkStateChanged(); 744 745 waitForMs(200); 746 747 // verify if registered handler has message posted to it 748 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 749 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 750 assertEquals(EVENT_DATA_ROAMING_OFF, messageArgumentCaptor.getValue().what); 751 752 // Enable roaming 753 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 754 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 755 mSimulatedCommands.notifyNetworkStateChanged(); 756 757 waitForMs(100); 758 759 // Unregister registrant 760 sst.unregisterForVoiceRoamingOff(mTestHandler); 761 762 // Disable roaming 763 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 764 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 765 mSimulatedCommands.notifyNetworkStateChanged(); 766 767 waitForMs(100); 768 769 // verify that no new message posted to handler 770 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 771 } 772 773 @Test 774 @MediumTest 775 public void testRegAndUnregForDataRoamingOn() throws Exception { 776 sst.registerForDataRoamingOn(mTestHandler, EVENT_DATA_ROAMING_ON, null); 777 778 // Enable roaming and trigger events to notify handler registered 779 doReturn(true).when(mPhone).isPhoneTypeGsm(); 780 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 781 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 782 mSimulatedCommands.notifyNetworkStateChanged(); 783 784 waitForMs(200); 785 786 // verify if registered handler has message posted to it 787 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 788 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 789 assertEquals(EVENT_DATA_ROAMING_ON, messageArgumentCaptor.getValue().what); 790 791 // Disable roaming 792 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 793 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 794 mSimulatedCommands.notifyNetworkStateChanged(); 795 796 waitForMs(100); 797 798 // Unregister registrant 799 sst.unregisterForDataRoamingOn(mTestHandler); 800 801 // Enable roaming 802 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 803 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 804 mSimulatedCommands.notifyNetworkStateChanged(); 805 806 waitForMs(200); 807 808 // verify that no new message posted to handler 809 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 810 } 811 812 @Test 813 @MediumTest 814 public void testRegAndUnregForDataRoamingOff() throws Exception { 815 // Enable roaming 816 doReturn(true).when(mPhone).isPhoneTypeGsm(); 817 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 818 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 819 mSimulatedCommands.notifyNetworkStateChanged(); 820 821 waitForMs(100); 822 823 sst.registerForDataRoamingOff(mTestHandler, EVENT_DATA_ROAMING_OFF, null, true); 824 825 // Disable roaming 826 doReturn(true).when(mPhone).isPhoneTypeGsm(); 827 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 828 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 829 mSimulatedCommands.notifyNetworkStateChanged(); 830 831 waitForMs(100); 832 833 // verify if registered handler has message posted to it 834 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 835 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 836 assertEquals(EVENT_DATA_ROAMING_OFF, messageArgumentCaptor.getValue().what); 837 838 // Enable roaming 839 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 840 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 841 mSimulatedCommands.notifyNetworkStateChanged(); 842 843 waitForMs(100); 844 845 // Unregister registrant 846 sst.unregisterForDataRoamingOff(mTestHandler); 847 848 // Disable roaming 849 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_HOME); 850 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_HOME); 851 mSimulatedCommands.notifyNetworkStateChanged(); 852 853 waitForMs(100); 854 855 // verify that no new message posted to handler 856 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 857 } 858 859 @Test 860 @MediumTest 861 public void testRegAndInvalidregForDataConnAttach() throws Exception { 862 // Initially set service state out of service 863 doReturn(true).when(mPhone).isPhoneTypeGsm(); 864 mSimulatedCommands.setVoiceRegState(23); 865 mSimulatedCommands.setDataRegState(23); 866 mSimulatedCommands.notifyNetworkStateChanged(); 867 868 waitForMs(100); 869 870 sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null); 871 872 // set service state in service and trigger events to post message on handler 873 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 874 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 875 mSimulatedCommands.notifyNetworkStateChanged(); 876 877 waitForMs(200); 878 879 // verify if registered handler has message posted to it 880 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 881 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 882 assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what); 883 884 // set service state out of service 885 mSimulatedCommands.setVoiceRegState(-1); 886 mSimulatedCommands.setDataRegState(-1); 887 mSimulatedCommands.notifyNetworkStateChanged(); 888 889 waitForMs(100); 890 891 // Unregister registrant 892 sst.unregisterForDataConnectionAttached(mTestHandler); 893 894 // set service state in service 895 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 896 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 897 mSimulatedCommands.notifyNetworkStateChanged(); 898 899 waitForMs(100); 900 901 // verify that no new message posted to handler 902 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 903 } 904 905 @Test 906 @MediumTest 907 public void testRegAndUnregForDataConnAttach() throws Exception { 908 // Initially set service state out of service 909 doReturn(true).when(mPhone).isPhoneTypeGsm(); 910 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 911 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 912 mSimulatedCommands.notifyNetworkStateChanged(); 913 914 waitForMs(100); 915 916 sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null); 917 918 // set service state in service and trigger events to post message on handler 919 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 920 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 921 mSimulatedCommands.notifyNetworkStateChanged(); 922 923 waitForMs(200); 924 925 // verify if registered handler has message posted to it 926 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 927 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 928 assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what); 929 930 // set service state out of service 931 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 932 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 933 mSimulatedCommands.notifyNetworkStateChanged(); 934 935 waitForMs(100); 936 937 // Unregister registrant 938 sst.unregisterForDataConnectionAttached(mTestHandler); 939 940 // set service state in service 941 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 942 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 943 mSimulatedCommands.notifyNetworkStateChanged(); 944 945 waitForMs(100); 946 947 // verify that no new message posted to handler 948 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 949 } 950 951 @Test 952 @MediumTest 953 public void testRegAndUnregForDataConnDetach() throws Exception { 954 // Initially set service state in service 955 doReturn(true).when(mPhone).isPhoneTypeGsm(); 956 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 957 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 958 mSimulatedCommands.notifyNetworkStateChanged(); 959 960 sst.registerForDataConnectionDetached(mTestHandler, EVENT_DATA_CONNECTION_DETACHED, null); 961 962 // set service state out of service and trigger events to post message on handler 963 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 964 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 965 mSimulatedCommands.notifyNetworkStateChanged(); 966 967 waitForMs(200); 968 969 // verify if registered handler has message posted to it 970 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 971 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 972 assertEquals(EVENT_DATA_CONNECTION_DETACHED, messageArgumentCaptor.getValue().what); 973 974 // set service state in service 975 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 976 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 977 mSimulatedCommands.notifyNetworkStateChanged(); 978 979 waitForMs(100); 980 981 // Unregister registrant 982 sst.unregisterForDataConnectionDetached(mTestHandler); 983 984 // set service state out of service 985 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 986 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 987 mSimulatedCommands.notifyNetworkStateChanged(); 988 989 waitForMs(100); 990 991 // verify that no new message posted to handler 992 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 993 } 994 995 @Test 996 @MediumTest 997 public void testRegisterForDataRegStateOrRatChange() { 998 int drs = NetworkRegistrationState.REG_STATE_HOME; 999 int rat = sst.mSS.RIL_RADIO_TECHNOLOGY_LTE; 1000 sst.mSS.setRilDataRadioTechnology(rat); 1001 sst.mSS.setDataRegState(drs); 1002 sst.registerForDataRegStateOrRatChanged(mTestHandler, EVENT_DATA_RAT_CHANGED, null); 1003 1004 waitForMs(100); 1005 1006 // Verify if message was posted to handler and value of result 1007 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1008 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1009 assertEquals(EVENT_DATA_RAT_CHANGED, messageArgumentCaptor.getValue().what); 1010 assertEquals(new Pair<Integer, Integer>(drs, rat), 1011 ((AsyncResult)messageArgumentCaptor.getValue().obj).result); 1012 } 1013 1014 @Test 1015 @MediumTest 1016 public void testRegAndUnregForNetworkAttached() throws Exception { 1017 // Initially set service state out of service 1018 doReturn(true).when(mPhone).isPhoneTypeGsm(); 1019 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 1020 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 1021 mSimulatedCommands.notifyNetworkStateChanged(); 1022 1023 waitForMs(100); 1024 1025 sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); 1026 1027 // set service state in service and trigger events to post message on handler 1028 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1029 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1030 mSimulatedCommands.notifyNetworkStateChanged(); 1031 1032 waitForMs(100); 1033 1034 // verify if registered handler has message posted to it 1035 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1036 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1037 assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); 1038 1039 // set service state out of service 1040 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 1041 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_UNKNOWN); 1042 mSimulatedCommands.notifyNetworkStateChanged(); 1043 1044 waitForMs(100); 1045 1046 // Unregister registrant 1047 sst.unregisterForNetworkAttached(mTestHandler); 1048 1049 // set service state in service 1050 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1051 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1052 mSimulatedCommands.notifyNetworkStateChanged(); 1053 1054 waitForMs(100); 1055 1056 // verify that no new message posted to handler 1057 verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong()); 1058 } 1059 1060 @Test 1061 @MediumTest 1062 public void testRegAndInvalidRegForNetworkAttached() throws Exception { 1063 // Initially set service state out of service 1064 doReturn(true).when(mPhone).isPhoneTypeGsm(); 1065 mSimulatedCommands.setVoiceRegState(23); 1066 mSimulatedCommands.setDataRegState(23); 1067 mSimulatedCommands.notifyNetworkStateChanged(); 1068 1069 waitForMs(100); 1070 1071 sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); 1072 1073 // set service state in service and trigger events to post message on handler 1074 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1075 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1076 mSimulatedCommands.notifyNetworkStateChanged(); 1077 1078 waitForMs(100); 1079 1080 // verify if registered handler has message posted to it 1081 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1082 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1083 assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); 1084 1085 // set service state out of service 1086 mSimulatedCommands.setVoiceRegState(-1); 1087 mSimulatedCommands.setDataRegState(-1); 1088 mSimulatedCommands.notifyNetworkStateChanged(); 1089 1090 waitForMs(100); 1091 1092 // Unregister registrant 1093 sst.unregisterForNetworkAttached(mTestHandler); 1094 1095 1096 waitForMs(100); 1097 1098 sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null); 1099 1100 // set service state in service 1101 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1102 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1103 mSimulatedCommands.notifyNetworkStateChanged(); 1104 1105 waitForMs(100); 1106 1107 // verify if registered handler has message posted to it 1108 messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1109 verify(mTestHandler, times(2)).sendMessageAtTime(messageArgumentCaptor.capture(), 1110 anyLong()); 1111 assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what); 1112 } 1113 1114 @Test 1115 @MediumTest 1116 public void testRegisterForPsRestrictedEnabled() throws Exception { 1117 sst.mRestrictedState.setPsRestricted(true); 1118 // Since PsRestricted is set to true, registerForPsRestrictedEnabled will 1119 // also post message to handler 1120 sst.registerForPsRestrictedEnabled(mTestHandler, EVENT_PS_RESTRICT_ENABLED, null); 1121 1122 waitForMs(100); 1123 1124 // verify posted message 1125 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1126 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1127 assertEquals(EVENT_PS_RESTRICT_ENABLED, messageArgumentCaptor.getValue().what); 1128 } 1129 1130 @Test 1131 @MediumTest 1132 public void testRegisterForPsRestrictedDisabled() throws Exception { 1133 sst.mRestrictedState.setPsRestricted(true); 1134 // Since PsRestricted is set to true, registerForPsRestrictedDisabled will 1135 // also post message to handler 1136 sst.registerForPsRestrictedDisabled(mTestHandler, EVENT_PS_RESTRICT_DISABLED, null); 1137 1138 waitForMs(100); 1139 1140 // verify posted message 1141 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1142 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1143 assertEquals(EVENT_PS_RESTRICT_DISABLED, messageArgumentCaptor.getValue().what); 1144 } 1145 1146 @Test 1147 @MediumTest 1148 public void testOnRestrictedStateChanged() throws Exception { 1149 ServiceStateTracker spySst = spy(sst); 1150 doReturn(true).when(mPhone).isPhoneTypeGsm(); 1151 doReturn(IccCardApplicationStatus.AppState.APPSTATE_READY).when( 1152 mUiccCardApplication3gpp).getState(); 1153 1154 ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class); 1155 verify(mSimulatedCommandsVerifier).setOnRestrictedStateChanged(any(Handler.class), 1156 intArgumentCaptor.capture(), eq(null)); 1157 // Since spy() creates a copy of sst object we need to call 1158 // setOnRestrictedStateChanged() explicitly. 1159 mSimulatedCommands.setOnRestrictedStateChanged(spySst, 1160 intArgumentCaptor.getValue().intValue(), null); 1161 1162 // Combination of restricted state and expected notification type. 1163 final int CS_ALL[] = {RILConstants.RIL_RESTRICTED_STATE_CS_ALL, 1164 ServiceStateTracker.CS_ENABLED}; 1165 final int CS_NOR[] = {RILConstants.RIL_RESTRICTED_STATE_CS_NORMAL, 1166 ServiceStateTracker.CS_NORMAL_ENABLED}; 1167 final int CS_EME[] = {RILConstants.RIL_RESTRICTED_STATE_CS_EMERGENCY, 1168 ServiceStateTracker.CS_EMERGENCY_ENABLED}; 1169 final int CS_NON[] = {RILConstants.RIL_RESTRICTED_STATE_NONE, 1170 ServiceStateTracker.CS_DISABLED}; 1171 final int PS_ALL[] = {RILConstants.RIL_RESTRICTED_STATE_PS_ALL, 1172 ServiceStateTracker.PS_ENABLED}; 1173 final int PS_NON[] = {RILConstants.RIL_RESTRICTED_STATE_NONE, 1174 ServiceStateTracker.PS_DISABLED}; 1175 1176 int notifyCount = 0; 1177 // cs not restricted -> cs emergency/normal restricted 1178 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL); 1179 // cs emergency/normal restricted -> cs normal restricted 1180 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR); 1181 // cs normal restricted -> cs emergency restricted 1182 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME); 1183 // cs emergency restricted -> cs not restricted 1184 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON); 1185 // cs not restricted -> cs normal restricted 1186 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR); 1187 // cs normal restricted -> cs emergency/normal restricted 1188 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL); 1189 // cs emergency/normal restricted -> cs emergency restricted 1190 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME); 1191 // cs emergency restricted -> cs emergency/normal restricted 1192 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL); 1193 // cs emergency/normal restricted -> cs not restricted 1194 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON); 1195 // cs not restricted -> cs emergency restricted 1196 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME); 1197 // cs emergency restricted -> cs normal restricted 1198 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR); 1199 // cs normal restricted -> cs not restricted 1200 internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON); 1201 1202 // ps not restricted -> ps restricted 1203 internalCheckForRestrictedStateChange(spySst, ++notifyCount, PS_ALL); 1204 // ps restricted -> ps not restricted 1205 internalCheckForRestrictedStateChange(spySst, ++notifyCount, PS_NON); 1206 } 1207 1208 private void internalCheckForRestrictedStateChange(ServiceStateTracker serviceStateTracker, 1209 int times, int[] restrictedState) { 1210 mSimulatedCommands.triggerRestrictedStateChanged(restrictedState[0]); 1211 waitForMs(100); 1212 ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class); 1213 verify(serviceStateTracker, times(times)).setNotification(intArgumentCaptor.capture()); 1214 assertEquals(intArgumentCaptor.getValue().intValue(), restrictedState[1]); 1215 } 1216 1217 private boolean notificationHasTitleSet(Notification n) { 1218 // Notification has no methods to check the actual title, but #toString() includes the 1219 // word "tick" if the title is set so we check this as a workaround 1220 return n.toString().contains("tick"); 1221 } 1222 1223 private String getNotificationTitle(Notification n) { 1224 return n.extras.getString(Notification.EXTRA_TITLE); 1225 } 1226 1227 @Test 1228 @SmallTest 1229 public void testSetPsNotifications() { 1230 sst.mSubId = 1; 1231 final NotificationManager nm = (NotificationManager) 1232 mContext.getSystemService(Context.NOTIFICATION_SERVICE); 1233 mContextFixture.putBooleanResource( 1234 R.bool.config_user_notification_of_restrictied_mobile_access, true); 1235 doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); 1236 Drawable mockDrawable = mock(Drawable.class); 1237 Resources mockResources = mContext.getResources(); 1238 when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); 1239 1240 mContextFixture.putResource(com.android.internal.R.string.RestrictedOnDataTitle, "test1"); 1241 sst.setNotification(ServiceStateTracker.PS_ENABLED); 1242 ArgumentCaptor<Notification> notificationArgumentCaptor = 1243 ArgumentCaptor.forClass(Notification.class); 1244 verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); 1245 // if the postedNotification has title set then it must have been the correct notification 1246 Notification postedNotification = notificationArgumentCaptor.getValue(); 1247 assertTrue(notificationHasTitleSet(postedNotification)); 1248 assertEquals("test1", getNotificationTitle(postedNotification)); 1249 1250 sst.setNotification(ServiceStateTracker.PS_DISABLED); 1251 verify(nm).cancel(anyString(), anyInt()); 1252 } 1253 1254 @Test 1255 @SmallTest 1256 public void testSetCsNotifications() { 1257 sst.mSubId = 1; 1258 final NotificationManager nm = (NotificationManager) 1259 mContext.getSystemService(Context.NOTIFICATION_SERVICE); 1260 mContextFixture.putBooleanResource( 1261 R.bool.config_user_notification_of_restrictied_mobile_access, true); 1262 doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); 1263 Drawable mockDrawable = mock(Drawable.class); 1264 Resources mockResources = mContext.getResources(); 1265 when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); 1266 1267 mContextFixture.putResource(com.android.internal.R.string.RestrictedOnAllVoiceTitle, 1268 "test2"); 1269 sst.setNotification(ServiceStateTracker.CS_ENABLED); 1270 ArgumentCaptor<Notification> notificationArgumentCaptor = 1271 ArgumentCaptor.forClass(Notification.class); 1272 verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); 1273 // if the postedNotification has title set then it must have been the correct notification 1274 Notification postedNotification = notificationArgumentCaptor.getValue(); 1275 assertTrue(notificationHasTitleSet(postedNotification)); 1276 assertEquals("test2", getNotificationTitle(postedNotification)); 1277 1278 sst.setNotification(ServiceStateTracker.CS_DISABLED); 1279 verify(nm).cancel(anyString(), anyInt()); 1280 } 1281 1282 @Test 1283 @SmallTest 1284 public void testSetCsNormalNotifications() { 1285 sst.mSubId = 1; 1286 final NotificationManager nm = (NotificationManager) 1287 mContext.getSystemService(Context.NOTIFICATION_SERVICE); 1288 mContextFixture.putBooleanResource( 1289 R.bool.config_user_notification_of_restrictied_mobile_access, true); 1290 doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); 1291 Drawable mockDrawable = mock(Drawable.class); 1292 Resources mockResources = mContext.getResources(); 1293 when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); 1294 1295 mContextFixture.putResource(com.android.internal.R.string.RestrictedOnNormalTitle, "test3"); 1296 sst.setNotification(ServiceStateTracker.CS_NORMAL_ENABLED); 1297 ArgumentCaptor<Notification> notificationArgumentCaptor = 1298 ArgumentCaptor.forClass(Notification.class); 1299 verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); 1300 // if the postedNotification has title set then it must have been the correct notification 1301 Notification postedNotification = notificationArgumentCaptor.getValue(); 1302 assertTrue(notificationHasTitleSet(postedNotification)); 1303 assertEquals("test3", getNotificationTitle(postedNotification)); 1304 1305 sst.setNotification(ServiceStateTracker.CS_DISABLED); 1306 verify(nm).cancel(anyString(), anyInt()); 1307 } 1308 1309 @Test 1310 @SmallTest 1311 public void testSetCsEmergencyNotifications() { 1312 sst.mSubId = 1; 1313 final NotificationManager nm = (NotificationManager) 1314 mContext.getSystemService(Context.NOTIFICATION_SERVICE); 1315 mContextFixture.putBooleanResource( 1316 R.bool.config_user_notification_of_restrictied_mobile_access, true); 1317 doReturn(new ApplicationInfo()).when(mContext).getApplicationInfo(); 1318 Drawable mockDrawable = mock(Drawable.class); 1319 Resources mockResources = mContext.getResources(); 1320 when(mockResources.getDrawable(anyInt(), any())).thenReturn(mockDrawable); 1321 1322 mContextFixture.putResource(com.android.internal.R.string.RestrictedOnEmergencyTitle, 1323 "test4"); 1324 sst.setNotification(ServiceStateTracker.CS_EMERGENCY_ENABLED); 1325 ArgumentCaptor<Notification> notificationArgumentCaptor = 1326 ArgumentCaptor.forClass(Notification.class); 1327 verify(nm).notify(anyString(), anyInt(), notificationArgumentCaptor.capture()); 1328 // if the postedNotification has title set then it must have been the correct notification 1329 Notification postedNotification = notificationArgumentCaptor.getValue(); 1330 assertTrue(notificationHasTitleSet(postedNotification)); 1331 assertEquals("test4", getNotificationTitle(postedNotification)); 1332 1333 sst.setNotification(ServiceStateTracker.CS_DISABLED); 1334 verify(nm).cancel(anyString(), anyInt()); 1335 sst.setNotification(ServiceStateTracker.CS_REJECT_CAUSE_ENABLED); 1336 } 1337 1338 @Test 1339 @MediumTest 1340 public void testRegisterForSubscriptionInfoReady() { 1341 sst.registerForSubscriptionInfoReady(mTestHandler, EVENT_SUBSCRIPTION_INFO_READY, null); 1342 1343 // Call functions which would trigger posting of message on test handler 1344 doReturn(false).when(mPhone).isPhoneTypeGsm(); 1345 sst.updatePhoneType(); 1346 mSimulatedCommands.notifyOtaProvisionStatusChanged(); 1347 1348 waitForMs(200); 1349 1350 // verify posted message 1351 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1352 verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong()); 1353 assertEquals(EVENT_SUBSCRIPTION_INFO_READY, messageArgumentCaptor.getValue().what); 1354 } 1355 1356 @Test 1357 @MediumTest 1358 public void testRoamingPhoneTypeSwitch() { 1359 // Enable roaming 1360 doReturn(true).when(mPhone).isPhoneTypeGsm(); 1361 1362 mSimulatedCommands.setVoiceRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1363 mSimulatedCommands.setDataRegState(NetworkRegistrationState.REG_STATE_ROAMING); 1364 mSimulatedCommands.notifyNetworkStateChanged(); 1365 1366 waitForMs(200); 1367 1368 sst.registerForDataRoamingOff(mTestHandler, EVENT_DATA_ROAMING_OFF, null, true); 1369 sst.registerForVoiceRoamingOff(mTestHandler, EVENT_VOICE_ROAMING_OFF, null); 1370 sst.registerForDataConnectionDetached(mTestHandler, EVENT_DATA_CONNECTION_DETACHED, null); 1371 1372 // Call functions which would trigger posting of message on test handler 1373 doReturn(false).when(mPhone).isPhoneTypeGsm(); 1374 sst.updatePhoneType(); 1375 1376 // verify if registered handler has message posted to it 1377 ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class); 1378 verify(mTestHandler, atLeast(3)).sendMessageAtTime( 1379 messageArgumentCaptor.capture(), anyLong()); 1380 HashSet<Integer> messageSet = new HashSet<>(); 1381 for (Message m : messageArgumentCaptor.getAllValues()) { 1382 messageSet.add(m.what); 1383 } 1384 1385 assertTrue(messageSet.contains(EVENT_DATA_ROAMING_OFF)); 1386 assertTrue(messageSet.contains(EVENT_VOICE_ROAMING_OFF)); 1387 assertTrue(messageSet.contains(EVENT_DATA_CONNECTION_DETACHED)); 1388 } 1389 1390 @Test 1391 @SmallTest 1392 public void testGetDesiredPowerState() { 1393 sst.setRadioPower(true); 1394 assertEquals(sst.getDesiredPowerState(), true); 1395 } 1396 1397 @Test 1398 @MediumTest 1399 public void testEnableLocationUpdates() throws Exception { 1400 sst.enableLocationUpdates(); 1401 verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(true), 1402 any(Message.class)); 1403 } 1404 1405 @Test 1406 @SmallTest 1407 public void testDisableLocationUpdates() throws Exception { 1408 sst.disableLocationUpdates(); 1409 verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(false), 1410 nullable(Message.class)); 1411 } 1412 1413 @Test 1414 @SmallTest 1415 public void testGetCurrentDataRegState() throws Exception { 1416 sst.mSS.setDataRegState(ServiceState.STATE_OUT_OF_SERVICE); 1417 assertEquals(sst.getCurrentDataConnectionState(), ServiceState.STATE_OUT_OF_SERVICE); 1418 } 1419 1420 @Test 1421 @SmallTest 1422 public void testIsConcurrentVoiceAndDataAllowed() { 1423 doReturn(false).when(mPhone).isPhoneTypeGsm(); 1424 sst.mSS.setCssIndicator(1); 1425 assertEquals(true, sst.isConcurrentVoiceAndDataAllowed()); 1426 sst.mSS.setCssIndicator(0); 1427 assertEquals(false, sst.isConcurrentVoiceAndDataAllowed()); 1428 1429 doReturn(true).when(mPhone).isPhoneTypeGsm(); 1430 sst.mSS.setRilDataRadioTechnology(sst.mSS.RIL_RADIO_TECHNOLOGY_HSPA); 1431 assertEquals(true, sst.isConcurrentVoiceAndDataAllowed()); 1432 sst.mSS.setRilDataRadioTechnology(sst.mSS.RIL_RADIO_TECHNOLOGY_GPRS); 1433 assertEquals(false, sst.isConcurrentVoiceAndDataAllowed()); 1434 sst.mSS.setCssIndicator(1); 1435 assertEquals(true, sst.isConcurrentVoiceAndDataAllowed()); 1436 } 1437 1438 @Test 1439 @MediumTest 1440 public void testIsImsRegistered() throws Exception { 1441 mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM}); 1442 mSimulatedCommands.notifyImsNetworkStateChanged(); 1443 waitForMs(200); 1444 assertEquals(sst.isImsRegistered(), true); 1445 } 1446 1447 @Test 1448 @SmallTest 1449 public void testIsDeviceShuttingDown() throws Exception { 1450 sst.requestShutdown(); 1451 assertEquals(true, sst.isDeviceShuttingDown()); 1452 } 1453 1454 @Test 1455 @SmallTest 1456 public void testShuttingDownRequest() throws Exception { 1457 sst.setRadioPower(true); 1458 waitForMs(100); 1459 1460 sst.requestShutdown(); 1461 waitForMs(100); 1462 assertFalse(mSimulatedCommands.getRadioState().isAvailable()); 1463 } 1464 1465 @Test 1466 @SmallTest 1467 public void testShuttingDownRequestWithRadioPowerFailResponse() throws Exception { 1468 sst.setRadioPower(true); 1469 waitForMs(100); 1470 1471 // Simulate RIL fails the radio power settings. 1472 mSimulatedCommands.setRadioPowerFailResponse(true); 1473 sst.setRadioPower(false); 1474 waitForMs(100); 1475 assertTrue(mSimulatedCommands.getRadioState().isOn()); 1476 sst.requestShutdown(); 1477 waitForMs(100); 1478 assertFalse(mSimulatedCommands.getRadioState().isAvailable()); 1479 } 1480 1481 @Test 1482 @SmallTest 1483 public void testSetTimeFromNITZStr() throws Exception { 1484 { 1485 // Mock sending incorrect nitz str from RIL 1486 mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0"); 1487 waitForMs(200); 1488 verify(mNitzStateMachine, times(0)).handleNitzReceived(any()); 1489 } 1490 { 1491 // Mock sending correct nitz str from RIL 1492 String nitzStr = "15/06/20,00:00:00+0"; 1493 NitzData expectedNitzData = NitzData.parse(nitzStr); 1494 mSimulatedCommands.triggerNITZupdate(nitzStr); 1495 waitForMs(200); 1496 1497 ArgumentCaptor<TimeStampedValue<NitzData>> argumentsCaptor = 1498 ArgumentCaptor.forClass(TimeStampedValue.class); 1499 verify(mNitzStateMachine, times(1)) 1500 .handleNitzReceived(argumentsCaptor.capture()); 1501 1502 // Confirm the argument was what we expected. 1503 TimeStampedValue<NitzData> actualNitzSignal = argumentsCaptor.getValue(); 1504 assertEquals(expectedNitzData, actualNitzSignal.mValue); 1505 assertTrue(actualNitzSignal.mElapsedRealtime <= SystemClock.elapsedRealtime()); 1506 } 1507 } 1508 1509 // Edge and GPRS are grouped under the same family and Edge has higher rate than GPRS. 1510 // Expect no rat update when move from E to G. 1511 @Test 1512 public void testRatRatchet() throws Exception { 1513 CellIdentityGsm cellIdentity = new CellIdentityGsm(-1, -1, -1, -1, -1, -1); 1514 NetworkRegistrationState dataResult = new NetworkRegistrationState( 1515 0, 0, 1, 2, 0, false, null, cellIdentity, 1); 1516 sst.mPollingContext[0] = 2; 1517 // update data reg state to be in service 1518 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1519 new AsyncResult(sst.mPollingContext, dataResult, null))); 1520 waitForMs(200); 1521 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1522 1523 NetworkRegistrationState voiceResult = new NetworkRegistrationState( 1524 0, 0, 1, 2, 0, false, null, cellIdentity, false, 0, 0, 0); 1525 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1526 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1527 waitForMs(200); 1528 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_EDGE, sst.mSS.getRilVoiceRadioTechnology()); 1529 1530 // EDGE -> GPRS 1531 voiceResult = new NetworkRegistrationState( 1532 0, 0, 1, 1, 0, false, null, 1533 cellIdentity, false, 0, 0, 0); 1534 sst.mPollingContext[0] = 2; 1535 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1536 new AsyncResult(sst.mPollingContext, dataResult, null))); 1537 waitForMs(200); 1538 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1539 1540 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1541 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1542 waitForMs(200); 1543 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_EDGE, sst.mSS.getRilVoiceRadioTechnology()); 1544 } 1545 1546 // Edge and GPRS are grouped under the same family and Edge has higher rate than GPRS. 1547 // Bypass rat rachet when cell id changed. Expect rat update from E to G 1548 @Test 1549 public void testRatRatchetWithCellChange() throws Exception { 1550 CellIdentityGsm cellIdentity = new CellIdentityGsm(-1, -1, -1, -1, -1, -1); 1551 NetworkRegistrationState dataResult = new NetworkRegistrationState( 1552 0, 0, 1, 2, 0, false, null, cellIdentity, 1); 1553 sst.mPollingContext[0] = 2; 1554 // update data reg state to be in service 1555 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1556 new AsyncResult(sst.mPollingContext, dataResult, null))); 1557 waitForMs(200); 1558 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1559 1560 NetworkRegistrationState voiceResult = new NetworkRegistrationState( 1561 0, 0, 1, 2, 0, false, null, cellIdentity, false, 0, 0, 0); 1562 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1563 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1564 waitForMs(200); 1565 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_EDGE, sst.mSS.getRilVoiceRadioTechnology()); 1566 1567 // RAT: EDGE -> GPRS cell ID: -1 -> 5 1568 cellIdentity = new CellIdentityGsm(-1, -1, -1, 5, -1, -1); 1569 voiceResult = new NetworkRegistrationState( 1570 0, 0, 1, 1, 0, false, null, cellIdentity, false, 0, 0, 0); 1571 sst.mPollingContext[0] = 2; 1572 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1573 new AsyncResult(sst.mPollingContext, dataResult, null))); 1574 waitForMs(200); 1575 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1576 1577 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1578 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1579 waitForMs(200); 1580 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_GPRS, sst.mSS.getRilVoiceRadioTechnology()); 1581 } 1582 1583 // Edge, GPRS and UMTS are grouped under the same family where Edge > GPRS > UMTS . 1584 // Expect no rat update from E to G immediately following cell id change. 1585 // Expect ratratchet (from G to UMTS) for the following rat update within the cell location. 1586 @Test 1587 public void testRatRatchetWithCellChangeBeforeRatChange() throws Exception { 1588 // cell ID update 1589 CellIdentityGsm cellIdentity = new CellIdentityGsm(-1, -1, -1, 5, -1, -1); 1590 NetworkRegistrationState dataResult = new NetworkRegistrationState( 1591 0, 0, 1, 2, 0, false, null, cellIdentity, 1); 1592 sst.mPollingContext[0] = 2; 1593 // update data reg state to be in service 1594 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1595 new AsyncResult(sst.mPollingContext, dataResult, null))); 1596 waitForMs(200); 1597 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1598 1599 NetworkRegistrationState voiceResult = new NetworkRegistrationState( 1600 0, 0, 1, 2, 0, false, null, cellIdentity, false, 0, 0, 0); 1601 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1602 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1603 waitForMs(200); 1604 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_EDGE, sst.mSS.getRilVoiceRadioTechnology()); 1605 1606 // RAT: EDGE -> GPRS, cell ID unchanged. Expect no rat ratchet following cell Id change. 1607 voiceResult = new NetworkRegistrationState( 1608 0, 0, 1, 1, 0, false, null, cellIdentity, false, 0, 0, 0); 1609 sst.mPollingContext[0] = 2; 1610 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1611 new AsyncResult(sst.mPollingContext, dataResult, null))); 1612 waitForMs(200); 1613 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1614 1615 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1616 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1617 waitForMs(200); 1618 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_GPRS, sst.mSS.getRilVoiceRadioTechnology()); 1619 1620 // RAT: GPRS -> UMTS 1621 voiceResult = new NetworkRegistrationState( 1622 0, 0, 1, 3, 0, false, null, cellIdentity, false, 0, 0, 0); 1623 sst.mPollingContext[0] = 2; 1624 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1625 new AsyncResult(sst.mPollingContext, dataResult, null))); 1626 waitForMs(200); 1627 assertEquals(ServiceState.STATE_IN_SERVICE, mSST.getCurrentDataConnectionState()); 1628 1629 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1630 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1631 waitForMs(200); 1632 assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_GPRS, sst.mSS.getRilVoiceRadioTechnology()); 1633 } 1634 1635 private void sendPhyChanConfigChange(int[] bandwidths) { 1636 ArrayList<PhysicalChannelConfig> pc = new ArrayList<>(); 1637 int ssType = PhysicalChannelConfig.CONNECTION_PRIMARY_SERVING; 1638 for (int bw : bandwidths) { 1639 pc.add(new PhysicalChannelConfig(ssType, bw)); 1640 1641 // All cells after the first are secondary serving cells. 1642 ssType = PhysicalChannelConfig.CONNECTION_SECONDARY_SERVING; 1643 } 1644 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_PHYSICAL_CHANNEL_CONFIG, 1645 new AsyncResult(null, pc, null))); 1646 waitForMs(100); 1647 } 1648 1649 private void sendRegStateUpdateForLteCellId(CellIdentityLte cellId) { 1650 NetworkRegistrationState dataResult = new NetworkRegistrationState( 1651 1, 2, 1, TelephonyManager.NETWORK_TYPE_LTE, 0, false, null, cellId, 1); 1652 NetworkRegistrationState voiceResult = new NetworkRegistrationState( 1653 1, 1, 1, TelephonyManager.NETWORK_TYPE_LTE, 0, false, null, cellId, 1654 false, 0, 0, 0); 1655 sst.mPollingContext[0] = 2; 1656 // update data reg state to be in service 1657 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1658 new AsyncResult(sst.mPollingContext, dataResult, null))); 1659 waitForMs(200); 1660 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1661 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1662 waitForMs(200); 1663 } 1664 1665 @Test 1666 public void testPhyChanBandwidthUpdatedOnDataRegState() throws Exception { 1667 // Cell ID change should trigger hasLocationChanged. 1668 CellIdentityLte cellIdentity5 = 1669 new CellIdentityLte(1, 1, 5, 1, 5000, "001", "01", "test", "tst"); 1670 1671 sendPhyChanConfigChange(new int[] {10000}); 1672 sendRegStateUpdateForLteCellId(cellIdentity5); 1673 assertTrue(Arrays.equals(new int[] {5000}, sst.mSS.getCellBandwidths())); 1674 } 1675 1676 @Test 1677 public void testPhyChanBandwidthNotUpdatedWhenInvalidInCellIdentity() throws Exception { 1678 // Cell ID change should trigger hasLocationChanged. 1679 CellIdentityLte cellIdentityInv = 1680 new CellIdentityLte(1, 1, 5, 1, 12345, "001", "01", "test", "tst"); 1681 1682 sendPhyChanConfigChange(new int[] {10000}); 1683 sendRegStateUpdateForLteCellId(cellIdentityInv); 1684 assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); 1685 } 1686 1687 @Test 1688 public void testPhyChanBandwidthPrefersCarrierAggregationReport() throws Exception { 1689 // Cell ID change should trigger hasLocationChanged. 1690 CellIdentityLte cellIdentity10 = 1691 new CellIdentityLte(1, 1, 5, 1, 10000, "001", "01", "test", "tst"); 1692 1693 sendPhyChanConfigChange(new int[] {10000, 5000}); 1694 sendRegStateUpdateForLteCellId(cellIdentity10); 1695 assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); 1696 } 1697 1698 @Test 1699 public void testPhyChanBandwidthRatchetedOnPhyChanBandwidth() throws Exception { 1700 // LTE Cell with bandwidth = 10000 1701 CellIdentityLte cellIdentity10 = 1702 new CellIdentityLte(1, 1, 1, 1, 10000, "1", "1", "test", "tst"); 1703 1704 sendRegStateUpdateForLteCellId(cellIdentity10); 1705 assertTrue(Arrays.equals(new int[] {10000}, sst.mSS.getCellBandwidths())); 1706 sendPhyChanConfigChange(new int[] {10000, 5000}); 1707 assertTrue(Arrays.equals(new int[] {10000, 5000}, sst.mSS.getCellBandwidths())); 1708 } 1709 1710 @Test 1711 public void testPhyChanBandwidthResetsOnOos() throws Exception { 1712 testPhyChanBandwidthRatchetedOnPhyChanBandwidth(); 1713 NetworkRegistrationState dataResult = new NetworkRegistrationState( 1714 1, 2, 0, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0, false, null, null, 1); 1715 NetworkRegistrationState voiceResult = new NetworkRegistrationState( 1716 1, 1, 0, TelephonyManager.NETWORK_TYPE_UNKNOWN, 0, false, null, null, 1717 false, 0, 0, 0); 1718 sst.mPollingContext[0] = 2; 1719 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_GPRS, 1720 new AsyncResult(sst.mPollingContext, dataResult, null))); 1721 waitForMs(200); 1722 sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_POLL_STATE_REGISTRATION, 1723 new AsyncResult(sst.mPollingContext, voiceResult, null))); 1724 waitForMs(200); 1725 assertTrue(Arrays.equals(new int[0], sst.mSS.getCellBandwidths())); 1726 } 1727 } 1728