blob: 532d6e18aa1b4359141a2738dad979f74435bf40 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.services.telephony.domainselection;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.EUTRAN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.GERAN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.NGRAN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.UNKNOWN;
import static android.telephony.AccessNetworkConstants.AccessNetworkType.UTRAN;
import static android.telephony.BarringInfo.BARRING_SERVICE_TYPE_EMERGENCY;
import static android.telephony.BarringInfo.BarringServiceInfo.BARRING_TYPE_UNCONDITIONAL;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CALL_SETUP_TIMER_ON_CURRENT_NETWORK_SEC_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_DOMAIN_PREFERENCE_ROAMING_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_CS_ROAMING_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_IMS_ROAMING_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_REQUIRES_IMS_REGISTRATION_BOOL;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_SCAN_TIMER_SEC_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_MAXIMUM_NUMBER_OF_EMERGENCY_TRIES_OVER_VOWIFI_INT;
import static android.telephony.CarrierConfigManager.ImsEmergency.KEY_PREFER_IMS_EMERGENCY_WHEN_VOICE_CALLS_ON_CS_BOOL;
import static android.telephony.CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE;
import static android.telephony.CarrierConfigManager.ImsEmergency.SCAN_TYPE_FULL_SERVICE_FOLLOWED_BY_LIMITED_SERVICE;
import static android.telephony.CarrierConfigManager.ImsEmergency.SCAN_TYPE_NO_PREFERENCE;
import static android.telephony.CarrierConfigManager.ImsEmergency.VOWIFI_REQUIRES_NONE;
import static android.telephony.CarrierConfigManager.ImsEmergency.VOWIFI_REQUIRES_SETTING_ENABLED;
import static android.telephony.CarrierConfigManager.ImsEmergency.VOWIFI_REQUIRES_VALID_EID;
import static android.telephony.CarrierConfigManager.ImsWfc.KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL;
import static android.telephony.DomainSelectionService.SELECTOR_TYPE_CALLING;
import static android.telephony.NetworkRegistrationInfo.DOMAIN_CS;
import static android.telephony.NetworkRegistrationInfo.DOMAIN_PS;
import static android.telephony.NetworkRegistrationInfo.REGISTRATION_STATE_HOME;
import static android.telephony.NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN;
import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_MAX_CELLULAR_TIMEOUT;
import static com.android.services.telephony.domainselection.EmergencyCallDomainSelector.MSG_NETWORK_SCAN_TIMEOUT;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkRequest;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IPowerManager;
import android.os.IThermalService;
import android.os.Looper;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.BarringInfo;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentityLte;
import android.telephony.DisconnectCause;
import android.telephony.DomainSelectionService;
import android.telephony.DomainSelectionService.SelectionAttributes;
import android.telephony.EmergencyRegResult;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PreciseDisconnectCause;
import android.telephony.TelephonyManager;
import android.telephony.TransportSelectorCallback;
import android.telephony.WwanSelectorCallback;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.ProvisioningManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.TestableLooper;
import android.util.Log;
import android.util.SparseArray;
import com.android.TestContext;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.lang.reflect.Field;
import java.util.List;
import java.util.function.Consumer;
/**
* Unit tests for EmergencyCallDomainSelector
*/
public class EmergencyCallDomainSelectorTest {
private static final String TAG = "EmergencyCallDomainSelectorTest";
private static final int SLOT_0 = 0;
private static final int SLOT_0_SUB_ID = 1;
@Mock private CarrierConfigManager mCarrierConfigManager;
@Mock private ConnectivityManager mConnectivityManager;
@Mock private TelephonyManager mTelephonyManager;
@Mock private WwanSelectorCallback mWwanSelectorCallback;
@Mock private TransportSelectorCallback mTransportSelectorCallback;
@Mock private ImsMmTelManager mMmTelManager;
@Mock private ImsStateTracker mImsStateTracker;
@Mock private DomainSelectorBase.DestroyListener mDestroyListener;
@Mock private ProvisioningManager mProvisioningManager;
@Mock private CrossSimRedialingController mCsrdCtrl;
private Context mContext;
private HandlerThread mHandlerThread;
private TestableLooper mLooper;
private EmergencyCallDomainSelector mDomainSelector;
private SelectionAttributes mSelectionAttributes;
private @AccessNetworkConstants.RadioAccessNetworkType List<Integer> mAccessNetwork;
private PowerManager mPowerManager;
private ConnectivityManager.NetworkCallback mNetworkCallback;
private Consumer<EmergencyRegResult> mResultConsumer;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mContext = new TestContext() {
@Override
public String getSystemServiceName(Class<?> serviceClass) {
if (serviceClass == ImsManager.class) {
return Context.TELEPHONY_IMS_SERVICE;
} else if (serviceClass == TelephonyManager.class) {
return Context.TELEPHONY_SERVICE;
} else if (serviceClass == CarrierConfigManager.class) {
return Context.CARRIER_CONFIG_SERVICE;
} else if (serviceClass == PowerManager.class) {
return Context.POWER_SERVICE;
} else if (serviceClass == ConnectivityManager.class) {
return Context.CONNECTIVITY_SERVICE;
}
return super.getSystemServiceName(serviceClass);
}
@Override
public Object getSystemService(String name) {
switch (name) {
case (Context.POWER_SERVICE) : {
return mPowerManager;
}
case (Context.CONNECTIVITY_SERVICE) : {
return mConnectivityManager;
}
}
return super.getSystemService(name);
}
@Override
public String getOpPackageName() {
return "";
}
};
if (Looper.myLooper() == null) {
Looper.prepare();
}
mHandlerThread = new HandlerThread("EmergencyCallDomainSelectorTest");
mHandlerThread.start();
try {
mLooper = new TestableLooper(mHandlerThread.getLooper());
} catch (Exception e) {
logd("Unable to create looper from handler.");
}
mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
when(mTelephonyManager.createForSubscriptionId(anyInt()))
.thenReturn(mTelephonyManager);
when(mTelephonyManager.getNetworkCountryIso()).thenReturn("");
mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
when(mCarrierConfigManager.getConfigForSubId(anyInt()))
.thenReturn(getDefaultPersistableBundle());
mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
mNetworkCallback = (ConnectivityManager.NetworkCallback)
invocation.getArguments()[1];
return null;
}
}).when(mConnectivityManager).registerNetworkCallback(
any(NetworkRequest.class), any(ConnectivityManager.NetworkCallback.class));
IPowerManager powerManager = mock(IPowerManager.class);
mPowerManager = new PowerManager(mContext, powerManager, mock(IThermalService.class),
new Handler(mHandlerThread.getLooper()));
ImsManager imsManager = mContext.getSystemService(ImsManager.class);
when(imsManager.getImsMmTelManager(anyInt())).thenReturn(mMmTelManager);
when(mMmTelManager.isAdvancedCallingSettingEnabled()).thenReturn(true);
doReturn(mProvisioningManager).when(imsManager).getProvisioningManager(anyInt());
doReturn(null).when(mProvisioningManager).getProvisioningStringValue(anyInt());
when(mTransportSelectorCallback.onWwanSelected()).thenReturn(mWwanSelectorCallback);
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Consumer<WwanSelectorCallback> consumer =
(Consumer<WwanSelectorCallback>) invocation.getArguments()[0];
consumer.accept(mWwanSelectorCallback);
return null;
}
}).when(mTransportSelectorCallback).onWwanSelected(any());
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
mAccessNetwork = (List<Integer>) invocation.getArguments()[0];
mResultConsumer = (Consumer<EmergencyRegResult>) invocation.getArguments()[3];
return null;
}
}).when(mWwanSelectorCallback).onRequestEmergencyNetworkScan(
any(), anyInt(), any(), any());
}
@After
public void tearDown() throws Exception {
if (mDomainSelector != null) {
mDomainSelector.destroy();
mDomainSelector = null;
}
if (mLooper != null) {
mLooper.destroy();
mLooper = null;
}
}
@SmallTest
@Test
public void testInit() throws Exception {
createSelector(SLOT_0_SUB_ID);
verify(mWwanSelectorCallback, times(0)).onRequestEmergencyNetworkScan(
any(), anyInt(), any(), any());
verify(mWwanSelectorCallback, times(0)).onDomainSelected(anyInt(), eq(true));
}
@Test
public void testNoRedundantDomainSelectionFromInitialState() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
unsolBarringInfoChanged(false);
processAllMessages();
verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
verify(mWwanSelectorCallback, times(1)).onDomainSelected(anyInt(), anyBoolean());
}
@Test
public void testNoUnexpectedTransportChangeFromInitialState() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_NON_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
bindImsService(true);
processAllMessages();
verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
}
@Test
public void testNoRedundantScanRequestFromInitialState() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(
UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
unsolBarringInfoChanged(false);
processAllMessages();
verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), anyInt(), any(), any());
}
@Test
public void testNoRedundantTerminationFromInitialState() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
doReturn(2).when(mTelephonyManager).getActiveModemCount();
doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
.when(mTelephonyManager).getSimState(anyInt());
doReturn(true).when(mCsrdCtrl).isThereOtherSlot();
EmergencyRegResult regResult = getEmergencyRegResult(
UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "", "jp");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
unsolBarringInfoChanged(false);
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
verify(mTransportSelectorCallback, times(0)).onWwanSelected(any());
verify(mTransportSelectorCallback, times(1)).onSelectionTerminated(anyInt());
}
@Test
public void testDefaultCombinedImsRegisteredBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredSelectPs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyPsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredSelectPsThenCsfb() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyPsDialed();
mDomainSelector.reselectDomain(attr);
processAllMessages();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testNoCsCombinedImsNotRegisteredSelectPs() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
new int[0]);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyPsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredEmsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredEmsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredEmsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredEmsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredVopsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredVopsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredVopsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredVopsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredVopsOffEmsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsRegisteredVopsOffEmsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredVopsOffEmsOffSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCombinedImsNotRegisteredVopsOffEmsOffBarredSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS | NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultCsSelectCs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
}
@Test
public void testDefaultEpsImsRegisteredBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredSelectPs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyPsDialed();
}
@Test
public void testDefaultEpsImsNotRegisteredSelectPs() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyPsDialed();
}
@Test
public void testDefaultEpsImsNotRegisteredBarredSelectScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredEmsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredEmsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsNotRegisteredEmsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsNotRegisteredEmsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredVopsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredVopsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsNotRegisteredVopsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsNotRegisteredVopsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredVopsOffEmsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredVopsOffEmsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsImsNotRegisteredVopsOffEmsOffScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultEpsNotRegisteredVopsOffEmsOffBarredScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testDefaultOutOfServiceScanPsPreferred() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(
UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
}
@Test
public void testVoLteOnEpsImsNotRegisteredSelectPs() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL, true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
// Requires VoLTE enabled and VoLTE is enabled.
verifyPsDialed();
}
@Test
public void testVoLteOffEpsImsNotRegisteredScanCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL, true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
// Disable VoLTE.
when(mMmTelManager.isAdvancedCallingSettingEnabled()).thenReturn(false);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
// Requires VoLTE enabled but VoLTE is'nt enabled.
verifyScanCsPreferred();
}
@Test
public void testRequiresRegEpsImsNotRegisteredScanCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_REQUIRES_IMS_REGISTRATION_BOOL, true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanCsPreferred();
}
@Test
public void testDefaultEpsImsRegisteredBarredScanTimeoutWifi() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService(true);
verifyScanPsPreferred();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
// Wi-Fi is not connected.
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(true));
}
@Test
public void testVoWifiSosPdnRequiresSettingEnabled() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT, VOWIFI_REQUIRES_SETTING_ENABLED);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
bindImsServiceUnregistered();
processAllMessages();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
// Wi-Fi is not connected.
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected. But Wi-Fi calling setting is disabled.
mNetworkCallback.onAvailable(null);
when(mMmTelManager.isVoWiFiRoamingSettingEnabled()).thenReturn(false);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected and Wi-Fi calling setting is enabled.
when(mMmTelManager.isVoWiFiSettingEnabled()).thenReturn(true);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(true));
}
@Test
public void testVoWifiSosPdnRequiresValidEid() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT, VOWIFI_REQUIRES_VALID_EID);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
bindImsServiceUnregistered();
processAllMessages();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
// Wi-Fi is not connected.
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected. But Wi-Fi calling s not activated.
mNetworkCallback.onAvailable(null);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected and Wi-Fi calling is activated.
doReturn("1").when(mProvisioningManager).getProvisioningStringValue(anyInt());
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(true));
}
@Test
public void testVoWifiImsPdnRequiresNone() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
bindImsServiceUnregistered();
processAllMessages();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
// Wi-Fi is not connected.
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected but IMS is not registered over Wi-Fi.
mNetworkCallback.onAvailable(null);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// IMS is registered over Wi-Fi.
bindImsService(true);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(false));
}
@Test
public void testIgnoreDuplicatedCallbacks() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService(true);
verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
// duplicated event
unsolBarringInfoChanged(true);
// ignore duplicated callback, no change in interaction
verify(mTransportSelectorCallback, times(1)).onWwanSelected(any());
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(eq(false));
// duplicated event
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
// ignore duplicated callback, no change in interaction
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
}
@Test
public void testDualSimInvalidSubscription() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
doReturn(2).when(mTelephonyManager).getActiveModemCount();
doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
.when(mTelephonyManager).getSimState(anyInt());
doReturn(true).when(mCsrdCtrl).isThereOtherSlot();
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "", "jp");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mTransportSelectorCallback, times(1))
.onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
}
@Test
public void testDualSimInvalidSubscriptionButNoOtherSlot() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
doReturn(2).when(mTelephonyManager).getActiveModemCount();
doReturn(TelephonyManager.SIM_STATE_PIN_REQUIRED)
.when(mTelephonyManager).getSimState(anyInt());
doReturn(false).when(mCsrdCtrl).isThereOtherSlot();
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "", "jp");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mTransportSelectorCallback, times(0))
.onSelectionTerminated(eq(DisconnectCause.EMERGENCY_PERM_FAILURE));
verifyScanPsPreferred();
}
@Test
public void testEutranWithCsDomainOnly() throws Exception {
setupForHandleScanResult();
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
DOMAIN_CS, false, false, 0, 0, "", "");
mResultConsumer.accept(regResult);
processAllMessages();
verifyCsDialed();
}
@Test
public void testFullService() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putInt(KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT, SCAN_TYPE_FULL_SERVICE);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
mResultConsumer = null;
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(UNKNOWN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), any(), any());
assertNotNull(mResultConsumer);
mResultConsumer.accept(regResult);
processAllMessages();
verify(mWwanSelectorCallback, times(2)).onRequestEmergencyNetworkScan(
any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), any(), any());
}
@Test
public void testFullServiceThenLimtedService() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putInt(KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT,
SCAN_TYPE_FULL_SERVICE_FOLLOWED_BY_LIMITED_SERVICE);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
mResultConsumer = null;
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(UNKNOWN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), eq(DomainSelectionService.SCAN_TYPE_FULL_SERVICE), any(), any());
assertNotNull(mResultConsumer);
mResultConsumer.accept(regResult);
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), eq(DomainSelectionService.SCAN_TYPE_LIMITED_SERVICE), any(), any());
}
@Test
public void testCsThenPsPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle);
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testPsThenCsPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle);
verifyPsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testPsOnlyPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle);
verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testCsOnlyPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle);
verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testCsThenPsPreferenceCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle);
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testPsThenCsPreferenceCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle);
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testPsOnlyPreferenceCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle);
verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testCsOnlyPreferenceCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle);
verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testCsThenPsPreferencePsFail() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testPsThenCsPreferencePsFail() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testPsOnlyPreferencePsFail() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false, false));
}
@Test
public void testCsThenPsPreferencePsFailCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testPsThenCsPreferencePsFailCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testPsOnlyPreferencePsFailCsPreferred() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
new int[0]);
setupForScanListTest(bundle, true);
bindImsService();
processAllMessages();
verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false, false));
}
@Test
public void testEpsFallbackThenCsPreference() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
};
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
new int[] { NGRAN, EUTRAN });
setupForScanListTest(bundle);
List<Integer> networks = mDomainSelector.getNextPreferredNetworks(false, true, false);
assertFalse(networks.isEmpty());
assertTrue(networks.contains(EUTRAN));
assertTrue(networks.contains(NGRAN));
assertTrue(networks.contains(UTRAN));
assertTrue(networks.contains(GERAN));
assertTrue(networks.indexOf(EUTRAN) < networks.indexOf(UTRAN));
assertTrue(networks.indexOf(UTRAN) < networks.indexOf(GERAN));
assertTrue(networks.indexOf(GERAN) < networks.indexOf(NGRAN));
}
@Test
public void testStartCrossStackTimer() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(
UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mCsrdCtrl).startTimer(any(), eq(mDomainSelector), any(),
any(), anyBoolean(), anyBoolean(), anyInt());
}
@Test
public void testStopCrossStackTimerOnCancel() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
mDomainSelector.cancelSelection();
verify(mCsrdCtrl).stopTimer();
}
@Test
public void testStopCrossStackTimerOnFinish() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
mDomainSelector.finishSelection();
verify(mCsrdCtrl).stopTimer();
}
@Test
public void testCrossStackTimerTempFailure() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
attr = new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
.setEmergency(true)
.setEmergencyRegResult(regResult)
.setCsDisconnectCause(PreciseDisconnectCause.EMERGENCY_TEMP_FAILURE)
.build();
mDomainSelector.reselectDomain(attr);
processAllMessages();
verify(mCsrdCtrl).notifyCallFailure(eq(PreciseDisconnectCause.EMERGENCY_TEMP_FAILURE));
}
@Test
public void testCrossStackTimerPermFailure() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
attr = new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
.setEmergency(true)
.setEmergencyRegResult(regResult)
.setCsDisconnectCause(PreciseDisconnectCause.EMERGENCY_PERM_FAILURE)
.build();
mDomainSelector.reselectDomain(attr);
processAllMessages();
verify(mCsrdCtrl).notifyCallFailure(eq(PreciseDisconnectCause.EMERGENCY_PERM_FAILURE));
}
@Test
public void testCrossStackTimerExpired() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(
UNKNOWN, REGISTRATION_STATE_UNKNOWN, 0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyScanPsPreferred();
mDomainSelector.notifyCrossStackTimerExpired();
verify(mTransportSelectorCallback)
.onSelectionTerminated(eq(DisconnectCause.EMERGENCY_TEMP_FAILURE));
}
@Test
public void testCrossStackTimerExpiredAfterDomainSelected() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
mDomainSelector.notifyCrossStackTimerExpired();
verify(mTransportSelectorCallback, times(0))
.onSelectionTerminated(eq(DisconnectCause.EMERGENCY_TEMP_FAILURE));
mDomainSelector.reselectDomain(attr);
processAllMessages();
verify(mTransportSelectorCallback)
.onSelectionTerminated(eq(DisconnectCause.EMERGENCY_TEMP_FAILURE));
}
@Test
public void testDefaultEpsImsRegisteredSelectPsEmergencyRegFailed() throws Exception {
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsService();
verifyPsDialed();
attr = new SelectionAttributes.Builder(SLOT_0, SLOT_0_SUB_ID, SELECTOR_TYPE_CALLING)
.setEmergency(true)
.setEmergencyRegResult(regResult)
.setPsDisconnectCause(
new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NOT_REGISTERED, 0, null))
.build();
mDomainSelector.reselectDomain(attr);
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), anyInt(), any(), any());
assertFalse(mAccessNetwork.contains(EUTRAN));
}
@Test
public void testMaxCellularTimeout() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
setupForHandleScanResult();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
// Max cellular timer expired
mDomainSelector.removeMessages(MSG_MAX_CELLULAR_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_MAX_CELLULAR_TIMEOUT));
assertFalse(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
}
@Test
public void testMaxCellularTimeoutScanTimeout() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
setupForHandleScanResult();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
// Scan timer expired
mDomainSelector.removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
}
@Test
public void testMaxCellularTimeoutWhileDialingOnCellular() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 5);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
verifyCsDialed();
assertFalse(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
mDomainSelector.reselectDomain(attr);
processAllMessages();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
processAllMessages();
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Max cellular timer expired
mDomainSelector.removeMessages(MSG_MAX_CELLULAR_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_MAX_CELLULAR_TIMEOUT));
processAllMessages();
mDomainSelector.reselectDomain(attr);
processAllMessages();
assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
}
@Test
public void testMaxCellularTimeoutWileDialingOnWlan() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
setupForHandleScanResult();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
// Network scan timer expired
mDomainSelector.removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
}
@Test
public void testMaxCellularTimeoutWileDialingOnWlanAllowMultipleTries() throws Exception {
PersistableBundle bundle = getDefaultPersistableBundle();
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, true);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, 20);
bundle.putInt(KEY_MAXIMUM_NUMBER_OF_EMERGENCY_TRIES_OVER_VOWIFI_INT, 2);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
setupForHandleScanResult();
assertTrue(mDomainSelector.hasMessages(MSG_NETWORK_SCAN_TIMEOUT));
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
verify(mTransportSelectorCallback, times(0)).onWlanSelected(anyBoolean());
// Wi-Fi is connected.
mNetworkCallback.onAvailable(null);
// Network scan timer expired
mDomainSelector.removeMessages(MSG_NETWORK_SCAN_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_NETWORK_SCAN_TIMEOUT));
verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
assertFalse(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
EmergencyRegResult regResult = getEmergencyRegResult(UTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_CS,
true, true, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.reselectDomain(attr);
processAllMessages();
assertTrue(mDomainSelector.hasMessages(MSG_MAX_CELLULAR_TIMEOUT));
// Max cellular timer expired
mDomainSelector.removeMessages(MSG_MAX_CELLULAR_TIMEOUT);
mDomainSelector.handleMessage(mDomainSelector.obtainMessage(MSG_MAX_CELLULAR_TIMEOUT));
processAllMessages();
verify(mTransportSelectorCallback, times(2)).onWlanSelected(anyBoolean());
}
private void setupForScanListTest(PersistableBundle bundle) throws Exception {
setupForScanListTest(bundle, false);
}
private void setupForScanListTest(PersistableBundle bundle, boolean psFailed) throws Exception {
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(bundle);
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(false);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "");
if (psFailed) {
regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_HOME,
NetworkRegistrationInfo.DOMAIN_PS, true, true, 0, 0, "", "");
}
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
}
private void verifyCsPreferredScanList(List<Integer> networks) {
assertFalse(networks.isEmpty());
assertTrue(networks.contains(EUTRAN));
assertTrue(networks.contains(UTRAN));
assertTrue(networks.contains(GERAN));
assertTrue(networks.indexOf(UTRAN) < networks.indexOf(EUTRAN));
}
private void verifyPsPreferredScanList(List<Integer> networks) {
assertFalse(networks.isEmpty());
assertTrue(networks.contains(EUTRAN));
assertTrue(networks.contains(UTRAN));
assertTrue(networks.contains(GERAN));
assertTrue(networks.indexOf(EUTRAN) < networks.indexOf(UTRAN));
}
private void verifyPsOnlyScanList(List<Integer> networks) {
assertFalse(networks.isEmpty());
assertTrue(networks.contains(EUTRAN));
assertFalse(networks.contains(UTRAN));
assertFalse(networks.contains(GERAN));
}
private void verifyCsOnlyScanList(List<Integer> networks) {
assertFalse(networks.isEmpty());
assertFalse(networks.contains(EUTRAN));
assertTrue(networks.contains(UTRAN));
assertTrue(networks.contains(GERAN));
}
private void setupForHandleScanResult() throws Exception {
mResultConsumer = null;
createSelector(SLOT_0_SUB_ID);
unsolBarringInfoChanged(true);
EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
0, false, false, 0, 0, "", "");
SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
processAllMessages();
bindImsServiceUnregistered();
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), anyInt(), any(), any());
assertNotNull(mResultConsumer);
}
private void createSelector(int subId) throws Exception {
mDomainSelector = new EmergencyCallDomainSelector(
mContext, SLOT_0, subId, mHandlerThread.getLooper(),
mImsStateTracker, mDestroyListener, mCsrdCtrl);
replaceInstance(DomainSelectorBase.class,
"mWwanSelectorCallback", mDomainSelector, mWwanSelectorCallback);
}
private void verifyCsDialed() {
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_CS), eq(false));
}
private void verifyPsDialed() {
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onDomainSelected(eq(DOMAIN_PS), eq(true));
}
private void verifyScanPsPreferred() {
verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, EUTRAN);
}
private void verifyScanCsPreferred() {
verifyScanPreferred(DomainSelectionService.SCAN_TYPE_NO_PREFERENCE, UTRAN);
}
private void verifyScanPreferred(int scanType, int expectedPreferredAccessNetwork) {
processAllMessages();
verify(mWwanSelectorCallback, times(1)).onRequestEmergencyNetworkScan(
any(), eq(scanType), any(), any());
assertEquals(expectedPreferredAccessNetwork, (int) mAccessNetwork.get(0));
}
private void unsolBarringInfoChanged(boolean barred) {
SparseArray<BarringInfo.BarringServiceInfo> serviceInfos = new SparseArray<>();
if (barred) {
serviceInfos.put(BARRING_SERVICE_TYPE_EMERGENCY,
new BarringInfo.BarringServiceInfo(BARRING_TYPE_UNCONDITIONAL, false, 0, 0));
}
mDomainSelector.onBarringInfoUpdated(new BarringInfo(new CellIdentityLte(), serviceInfos));
}
private void bindImsService() {
bindImsService(false);
}
private void bindImsService(boolean isWifi) {
doReturn(isWifi).when(mImsStateTracker).isImsRegisteredOverWlan();
doReturn(true).when(mImsStateTracker).isImsRegistered();
mDomainSelector.onImsRegistrationStateChanged();
doReturn(true).when(mImsStateTracker).isImsVoiceCapable();
mDomainSelector.onImsMmTelCapabilitiesChanged();
}
private void bindImsServiceUnregistered() {
doReturn(false).when(mImsStateTracker).isImsRegistered();
mDomainSelector.onImsRegistrationStateChanged();
doReturn(false).when(mImsStateTracker).isImsVoiceCapable();
mDomainSelector.onImsMmTelCapabilitiesChanged();
}
private static EmergencyRegResult getEmergencyRegResult(
@AccessNetworkConstants.RadioAccessNetworkType int accessNetwork,
@NetworkRegistrationInfo.RegistrationState int regState,
@NetworkRegistrationInfo.Domain int domain,
boolean isVopsSupported, boolean isEmcBearerSupported, int emc, int emf,
@NonNull String mcc, @NonNull String mnc) {
return getEmergencyRegResult(accessNetwork, regState, domain, isVopsSupported,
isEmcBearerSupported, emc, emf, mcc, mnc, "");
}
private static EmergencyRegResult getEmergencyRegResult(
@AccessNetworkConstants.RadioAccessNetworkType int accessNetwork,
@NetworkRegistrationInfo.RegistrationState int regState,
@NetworkRegistrationInfo.Domain int domain,
boolean isVopsSupported, boolean isEmcBearerSupported, int emc, int emf,
@NonNull String mcc, @NonNull String mnc, @NonNull String iso) {
return new EmergencyRegResult(accessNetwork, regState,
domain, isVopsSupported, isEmcBearerSupported,
emc, emf, mcc, mnc, iso);
}
private static PersistableBundle getDefaultPersistableBundle() {
int[] imsRats = new int[] { EUTRAN };
int[] csRats = new int[] { UTRAN, GERAN };
int[] imsRoamRats = new int[] { EUTRAN };
int[] csRoamRats = new int[] { UTRAN, GERAN };
int[] domainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_NON_3GPP
};
int[] roamDomainPreference = new int[] {
CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
CarrierConfigManager.ImsEmergency.DOMAIN_CS,
CarrierConfigManager.ImsEmergency.DOMAIN_PS_NON_3GPP
};
boolean imsWhenVoiceOnCs = false;
int voWifiRequiresCondition = VOWIFI_REQUIRES_NONE;
int maxRetriesOverWiFi = 1;
int cellularScanTimerSec = 10;
int maxCellularTimerSec = 0;
boolean voWifiOverEmergencyPdn = false;
int scanType = SCAN_TYPE_NO_PREFERENCE;
boolean requiresImsRegistration = false;
boolean requiresVoLteEnabled = false;
boolean ltePreferredAfterNrFailed = false;
String[] cdmaPreferredNumbers = new String[] {};
return getPersistableBundle(imsRats, csRats, imsRoamRats, csRoamRats,
domainPreference, roamDomainPreference, imsWhenVoiceOnCs,
voWifiRequiresCondition, maxRetriesOverWiFi, cellularScanTimerSec,
maxCellularTimerSec, scanType, voWifiOverEmergencyPdn, requiresImsRegistration,
requiresVoLteEnabled, ltePreferredAfterNrFailed, cdmaPreferredNumbers);
}
private static PersistableBundle getPersistableBundle(
@Nullable int[] imsRats, @Nullable int[] csRats,
@Nullable int[] imsRoamRats, @Nullable int[] csRoamRats,
@Nullable int[] domainPreference, @Nullable int[] roamDomainPreference,
boolean imsWhenVoiceOnCs, int voWifiRequiresCondition,
int maxRetriesOverWiFi, int cellularScanTimerSec,
int maxCellularTimerSec, int scanType,
boolean voWifiOverEmergencyPdn, boolean requiresImsRegistration,
boolean requiresVoLteEnabled, boolean ltePreferredAfterNrFailed,
@Nullable String[] cdmaPreferredNumbers) {
PersistableBundle bundle = new PersistableBundle();
if (imsRats != null) {
bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
imsRats);
}
if (imsRoamRats != null) {
bundle.putIntArray(
KEY_EMERGENCY_OVER_IMS_ROAMING_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
imsRoamRats);
}
if (csRats != null) {
bundle.putIntArray(KEY_EMERGENCY_OVER_CS_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
csRats);
}
if (csRoamRats != null) {
bundle.putIntArray(
KEY_EMERGENCY_OVER_CS_ROAMING_SUPPORTED_ACCESS_NETWORK_TYPES_INT_ARRAY,
csRoamRats);
}
if (domainPreference != null) {
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
}
if (roamDomainPreference != null) {
bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_ROAMING_INT_ARRAY,
roamDomainPreference);
}
bundle.putBoolean(KEY_PREFER_IMS_EMERGENCY_WHEN_VOICE_CALLS_ON_CS_BOOL, imsWhenVoiceOnCs);
bundle.putInt(KEY_EMERGENCY_VOWIFI_REQUIRES_CONDITION_INT, voWifiRequiresCondition);
bundle.putInt(KEY_MAXIMUM_NUMBER_OF_EMERGENCY_TRIES_OVER_VOWIFI_INT, maxRetriesOverWiFi);
bundle.putInt(KEY_EMERGENCY_SCAN_TIMER_SEC_INT, cellularScanTimerSec);
bundle.putInt(KEY_MAXIMUM_CELLULAR_SEARCH_TIMER_SEC_INT, maxCellularTimerSec);
bundle.putBoolean(KEY_EMERGENCY_CALL_OVER_EMERGENCY_PDN_BOOL, voWifiOverEmergencyPdn);
bundle.putInt(KEY_EMERGENCY_NETWORK_SCAN_TYPE_INT, scanType);
bundle.putBoolean(KEY_EMERGENCY_REQUIRES_IMS_REGISTRATION_BOOL, requiresImsRegistration);
bundle.putBoolean(KEY_EMERGENCY_REQUIRES_VOLTE_ENABLED_BOOL, requiresVoLteEnabled);
bundle.putInt(KEY_EMERGENCY_CALL_SETUP_TIMER_ON_CURRENT_NETWORK_SEC_INT, 0);
bundle.putBoolean(KEY_EMERGENCY_LTE_PREFERRED_AFTER_NR_FAILED_BOOL,
ltePreferredAfterNrFailed);
bundle.putStringArray(KEY_EMERGENCY_CDMA_PREFERRED_NUMBERS_STRING_ARRAY,
cdmaPreferredNumbers);
return bundle;
}
public static SelectionAttributes getSelectionAttributes(int slotId, int subId,
EmergencyRegResult regResult) {
SelectionAttributes.Builder builder =
new SelectionAttributes.Builder(slotId, subId, SELECTOR_TYPE_CALLING)
.setEmergency(true)
.setEmergencyRegResult(regResult);
return builder.build();
}
private static void replaceInstance(final Class c,
final String instanceName, final Object obj, final Object newValue) throws Exception {
Field field = c.getDeclaredField(instanceName);
field.setAccessible(true);
field.set(obj, newValue);
}
private void processAllMessages() {
while (!mLooper.getLooper().getQueue().isIdle()) {
mLooper.processAllMessages();
}
}
private static void logd(String str) {
Log.d(TAG, str);
}
}