Merge "Support dynamically update IMSI" am: 59f6e81b10
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1418348 Change-Id: Id06d5d37ad5f12e689643c916548e9a59089eb3b
This commit is contained in:
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.mockito.Mockito.any;
|
||||
import static org.mockito.Mockito.anyInt;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
@@ -150,7 +151,7 @@ public final class NetworkStatsSubscriptionsMonitorTest {
|
||||
}
|
||||
|
||||
private void assertRatTypeChangedForSub(String subscriberId, int ratType) {
|
||||
assertEquals(mMonitor.getRatTypeForSubscriberId(subscriberId), ratType);
|
||||
assertEquals(ratType, mMonitor.getRatTypeForSubscriberId(subscriberId));
|
||||
final ArgumentCaptor<Integer> typeCaptor = ArgumentCaptor.forClass(Integer.class);
|
||||
// Verify callback with the subscriberId and the RAT type should be as expected.
|
||||
// It will fail if get a callback with an unexpected RAT type.
|
||||
@@ -302,26 +303,84 @@ public final class NetworkStatsSubscriptionsMonitorTest {
|
||||
reset(mDelegate);
|
||||
|
||||
// Set IMSI to null again to simulate somehow IMSI is not available, such as
|
||||
// modem crash. Verify service should not unregister listener.
|
||||
// modem crash. Verify service should unregister listener.
|
||||
updateSubscriberIdForTestSub(TEST_SUBID1, null);
|
||||
verify(mTelephonyManager, never()).listen(any(), anyInt());
|
||||
assertRatTypeNotChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UMTS);
|
||||
verify(mTelephonyManager, times(1)).listen(eq(ratTypeListenerCaptor.getValue()),
|
||||
eq(PhoneStateListener.LISTEN_NONE));
|
||||
assertRatTypeChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
reset(mDelegate);
|
||||
clearInvocations(mTelephonyManager);
|
||||
|
||||
// Set RAT type of sim1 to LTE. Verify RAT type of sim1 is still changed even if the IMSI
|
||||
// is not available. The monitor keeps the listener even if the IMSI disappears because
|
||||
// the IMSI can never change for any given subId, therefore even if the IMSI is updated
|
||||
// to null, the monitor should continue accepting updates of the RAT type. However,
|
||||
// telephony is never actually supposed to do this, if the IMSI disappears there should
|
||||
// not be updates, but it's still the right thing to do theoretically.
|
||||
setRatTypeForSub(ratTypeListenerCaptor.getAllValues(), TEST_SUBID1,
|
||||
// Simulate somehow IMSI is back. Verify service will register with
|
||||
// another listener and fire callback accordingly.
|
||||
final ArgumentCaptor<RatTypeListener> ratTypeListenerCaptor2 =
|
||||
ArgumentCaptor.forClass(RatTypeListener.class);
|
||||
updateSubscriberIdForTestSub(TEST_SUBID1, TEST_IMSI1);
|
||||
verify(mTelephonyManager, times(1)).listen(ratTypeListenerCaptor2.capture(),
|
||||
eq(PhoneStateListener.LISTEN_SERVICE_STATE));
|
||||
assertRatTypeNotChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
reset(mDelegate);
|
||||
clearInvocations(mTelephonyManager);
|
||||
|
||||
// Set RAT type of sim1 to LTE. Verify RAT type of sim1 still works.
|
||||
setRatTypeForSub(ratTypeListenerCaptor2.getAllValues(), TEST_SUBID1,
|
||||
TelephonyManager.NETWORK_TYPE_LTE);
|
||||
assertRatTypeChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_LTE);
|
||||
reset(mDelegate);
|
||||
|
||||
mMonitor.stop();
|
||||
verify(mTelephonyManager, times(1)).listen(eq(ratTypeListenerCaptor.getValue()),
|
||||
verify(mTelephonyManager, times(1)).listen(eq(ratTypeListenerCaptor2.getValue()),
|
||||
eq(PhoneStateListener.LISTEN_NONE));
|
||||
assertRatTypeChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify that when IMSI suddenly changed for a given subId, the service will register a new
|
||||
* listener and unregister the old one, and report changes on updated IMSI. This is for modem
|
||||
* feature that may be enabled for certain carrier, which changes to use a different IMSI while
|
||||
* roaming on certain networks for multi-IMSI SIM cards, but the subId stays the same.
|
||||
*/
|
||||
@Test
|
||||
public void testSubscriberIdChanged() {
|
||||
mMonitor.start();
|
||||
// Insert sim1, verify RAT type is NETWORK_TYPE_UNKNOWN, and never get any callback
|
||||
// before changing RAT type.
|
||||
addTestSub(TEST_SUBID1, TEST_IMSI1);
|
||||
final ArgumentCaptor<RatTypeListener> ratTypeListenerCaptor =
|
||||
ArgumentCaptor.forClass(RatTypeListener.class);
|
||||
verify(mTelephonyManager, times(1)).listen(ratTypeListenerCaptor.capture(),
|
||||
eq(PhoneStateListener.LISTEN_SERVICE_STATE));
|
||||
assertRatTypeNotChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
|
||||
// Set RAT type of sim1 to UMTS.
|
||||
// Verify RAT type of sim1 changes accordingly.
|
||||
setRatTypeForSub(ratTypeListenerCaptor.getAllValues(), TEST_SUBID1,
|
||||
TelephonyManager.NETWORK_TYPE_UMTS);
|
||||
assertRatTypeChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UMTS);
|
||||
reset(mDelegate);
|
||||
clearInvocations(mTelephonyManager);
|
||||
|
||||
// Simulate IMSI of sim1 changed to IMSI2. Verify the service will register with
|
||||
// another listener and remove the old one. The RAT type of new IMSI stays at
|
||||
// NETWORK_TYPE_UNKNOWN until received initial callback from telephony.
|
||||
final ArgumentCaptor<RatTypeListener> ratTypeListenerCaptor2 =
|
||||
ArgumentCaptor.forClass(RatTypeListener.class);
|
||||
updateSubscriberIdForTestSub(TEST_SUBID1, TEST_IMSI2);
|
||||
verify(mTelephonyManager, times(1)).listen(ratTypeListenerCaptor2.capture(),
|
||||
eq(PhoneStateListener.LISTEN_SERVICE_STATE));
|
||||
verify(mTelephonyManager, times(1)).listen(eq(ratTypeListenerCaptor.getValue()),
|
||||
eq(PhoneStateListener.LISTEN_NONE));
|
||||
assertRatTypeChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
assertRatTypeNotChangedForSub(TEST_IMSI2, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
reset(mDelegate);
|
||||
|
||||
// Set RAT type of sim1 to UMTS for new listener to simulate the initial callback received
|
||||
// from telephony after registration. Verify RAT type of sim1 changes with IMSI2
|
||||
// accordingly.
|
||||
setRatTypeForSub(ratTypeListenerCaptor2.getAllValues(), TEST_SUBID1,
|
||||
TelephonyManager.NETWORK_TYPE_UMTS);
|
||||
assertRatTypeNotChangedForSub(TEST_IMSI1, TelephonyManager.NETWORK_TYPE_UNKNOWN);
|
||||
assertRatTypeChangedForSub(TEST_IMSI2, TelephonyManager.NETWORK_TYPE_UMTS);
|
||||
reset(mDelegate);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user