blob: 07b75010c1f48a3ae82c62d791df457366037146 [file] [log] [blame]
/*
* Copyright (C) 2021 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.qns;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TECH_LTE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.os.PersistableBundle;
import android.os.SystemProperties;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.ProvisioningManager;
import androidx.test.core.app.ApplicationProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@RunWith(JUnit4.class)
public class QnsImsManagerTest {
@Mock Context mContext;
@Mock ImsManager mImsManager;
@Mock ImsMmTelManager mImsMmTelManager;
@Mock CarrierConfigManager mCarrierConfigManager;
@Mock SubscriptionInfo mSubscriptionInfo;
@Mock SubscriptionManager mSubscriptionManager;
@Mock Resources mResources;
@Mock PersistableBundle mBundle;
@Mock ProvisioningManager mProvisioningManager;
@Mock QnsEventDispatcher mQnsEventDispatcher;
@Mock PackageManager mPackageManager;
@Mock TelephonyManager mTelephonyManager;
private MockitoSession mMockitoSession;
private QnsImsManager mQnsImsMgr;
@Before
public void setup() {
mMockitoSession =
mockitoSession()
.strictness(Strictness.LENIENT)
.mockStatic(SystemProperties.class)
.mockStatic(ProvisioningManager.class)
.mockStatic(QnsEventDispatcher.class)
.mockStatic(SubscriptionManager.class)
.startMocking();
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(ImsManager.class)).thenReturn(mImsManager);
when(mImsManager.getImsMmTelManager(anyInt())).thenReturn(mImsMmTelManager);
when(mContext.getSystemService(CarrierConfigManager.class))
.thenReturn(mCarrierConfigManager);
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
doReturn(mSubscriptionInfo, mSubscriptionInfo, null)
.when(mSubscriptionManager)
.getActiveSubscriptionInfoForSimSlotIndex(anyInt());
doReturn(1).when(mSubscriptionInfo).getSubscriptionId();
when(mContext.getResources()).thenReturn(mResources);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(ProvisioningManager.createForSubscriptionId(anyInt()))
.thenReturn(mProvisioningManager);
when(QnsEventDispatcher.getInstance(any(), anyInt())).thenReturn(mQnsEventDispatcher);
when(SubscriptionManager.isValidSubscriptionId(anyInt())).thenReturn(true);
mQnsImsMgr = new QnsImsManager(mContext, 0);
}
@After
public void tearDown() throws Exception {
if (mMockitoSession != null) {
mMockitoSession.finishMocking();
mMockitoSession = null;
}
}
@Test
public void testQnsImsManagerIsWfcEnabledByPlatform() {
when(mResources.getBoolean(com.android.internal.R.bool.config_device_wfc_ims_available))
.thenReturn(false);
assertFalse(mQnsImsMgr.isWfcEnabledByPlatform());
when(SystemProperties.getInt(eq("persist.dbg.wfc_avail_ovr0"), anyInt())).thenReturn(1);
assertTrue(mQnsImsMgr.isWfcEnabledByPlatform());
when(SystemProperties.getInt(eq("persist.dbg.wfc_avail_ovr0"), anyInt())).thenReturn(-1);
assertFalse(mQnsImsMgr.isWfcEnabledByPlatform());
when(SystemProperties.getInt(eq("persist.dbg.wfc_avail_ovr"), anyInt())).thenReturn(1);
assertTrue(mQnsImsMgr.isWfcEnabledByPlatform());
when(SystemProperties.getInt(eq("persist.dbg.wfc_avail_ovr"), anyInt())).thenReturn(-1);
assertFalse(mQnsImsMgr.isWfcEnabledByPlatform());
when(mResources.getBoolean(com.android.internal.R.bool.config_device_wfc_ims_available))
.thenReturn(true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL)))
.thenReturn(true);
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_IMS_GBA_REQUIRED_BOOL)))
.thenReturn(false);
assertTrue(mQnsImsMgr.isWfcEnabledByPlatform());
}
@Test
public void testQnsImsManagerIsWfcEnabledByUser() {
when(mImsMmTelManager.isVoWiFiSettingEnabled()).thenReturn(true);
assertTrue(mQnsImsMgr.isWfcEnabledByUser());
when(mImsMmTelManager.isVoWiFiSettingEnabled()).thenReturn(false);
assertFalse(mQnsImsMgr.isWfcEnabledByUser());
}
@Test
public void testQnsImsManagerIsWfcRoamingEnabledByUser() {
when(mImsMmTelManager.isVoWiFiRoamingSettingEnabled()).thenReturn(true);
assertTrue(mQnsImsMgr.isWfcRoamingEnabledByUser());
when(mImsMmTelManager.isVoWiFiRoamingSettingEnabled()).thenReturn(false);
assertFalse(mQnsImsMgr.isWfcRoamingEnabledByUser());
}
@Test
public void testQnsImsManagerIsWfcProvisionedOnDevice() {
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(true);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_LTE)))
.thenReturn(false);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_IWLAN)))
.thenReturn(true);
assertFalse(mQnsImsMgr.isWfcProvisionedOnDevice());
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(true);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_LTE)))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_IWLAN)))
.thenReturn(true);
assertTrue(mQnsImsMgr.isWfcProvisionedOnDevice());
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(false);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_LTE)))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_IWLAN)))
.thenReturn(false);
assertFalse(mQnsImsMgr.isWfcProvisionedOnDevice());
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(false);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(false);
assertTrue(mQnsImsMgr.isWfcProvisionedOnDevice());
}
@Test
public void testQnsImsManagerIsCrossSimCallingEnabled() throws ImsException {
when(mImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(false);
assertFalse(mQnsImsMgr.isCrossSimCallingEnabled());
when(mImsMmTelManager.isCrossSimCallingEnabled()).thenReturn(true);
when(mResources.getBoolean(com.android.internal.R.bool.config_device_wfc_ims_available))
.thenReturn(true);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL)))
.thenReturn(true);
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_IMS_GBA_REQUIRED_BOOL)))
.thenReturn(false);
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL)))
.thenReturn(false);
assertFalse(mQnsImsMgr.isCrossSimCallingEnabled());
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL)))
.thenReturn(true);
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(true);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_LTE)))
.thenReturn(false);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_IWLAN)))
.thenReturn(true);
assertFalse(mQnsImsMgr.isCrossSimCallingEnabled());
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_CROSS_SIM_IMS_AVAILABLE_BOOL)))
.thenReturn(true);
when(mBundle.getBoolean(
eq(CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)))
.thenReturn(true);
when(mProvisioningManager.isProvisioningRequiredForCapability(anyInt(), anyInt()))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_LTE)))
.thenReturn(true);
when(mProvisioningManager.getProvisioningStatusForCapability(
anyInt(), eq(REGISTRATION_TECH_IWLAN)))
.thenReturn(true);
assertTrue(mQnsImsMgr.isCrossSimCallingEnabled());
}
@Test
public void testQnsImsManagerGetWfcMode() {
when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(0);
assertEquals(0, mQnsImsMgr.getWfcMode(false));
when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(1);
assertEquals(1, mQnsImsMgr.getWfcMode(false));
when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(2);
assertEquals(2, mQnsImsMgr.getWfcMode(false));
}
@Test
public void testQnsImsManagerGetWfcRoamingMode() {
when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn(0);
assertEquals(0, mQnsImsMgr.getWfcMode(true));
when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn(1);
assertEquals(1, mQnsImsMgr.getWfcMode(true));
when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn(2);
assertEquals(2, mQnsImsMgr.getWfcMode(true));
}
@Test
public void testQnsImsManagerGetWfcModeFromCarrierConfig() throws ImsException {
mQnsImsMgr.dispose();
doThrow(new ImsException("Test Exception"))
.when(mImsMmTelManager)
.registerImsStateCallback(any(), any());
mQnsImsMgr = new QnsImsManager(mContext, 0);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)))
.thenReturn(0);
assertEquals(0, mQnsImsMgr.getWfcMode(false));
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)))
.thenReturn(1);
assertEquals(1, mQnsImsMgr.getWfcMode(false));
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)))
.thenReturn(2);
assertEquals(2, mQnsImsMgr.getWfcMode(false));
}
@Test
public void testQnsImsManagerGetWfcRoamingModeFromCarrierConfig() throws ImsException {
mQnsImsMgr.dispose();
doThrow(new ImsException("Test Exception"))
.when(mImsMmTelManager)
.registerImsStateCallback(any(), any());
mQnsImsMgr = new QnsImsManager(mContext, 0);
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT)))
.thenReturn(0);
assertEquals(0, mQnsImsMgr.getWfcMode(true));
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT)))
.thenReturn(1);
assertEquals(1, mQnsImsMgr.getWfcMode(true));
when(mBundle.getInt(eq(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT)))
.thenReturn(2);
assertEquals(2, mQnsImsMgr.getWfcMode(true));
}
@Test
public void testQnsImsManagerGetImsServiceState() throws InterruptedException {
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mPackageManager.hasSystemFeature(any())).thenReturn(false);
boolean bException = false;
try {
mQnsImsMgr.getImsServiceState();
} catch (ImsException e) {
bException = true;
}
assertTrue(bException);
bException = false;
when(mPackageManager.hasSystemFeature(any())).thenReturn(true);
try {
mQnsImsMgr.getImsServiceState();
} catch (ImsException e) {
bException = true;
}
assertFalse(bException);
}
@Test
public void testQnsImsManagerInit() throws NoSuchFieldException, IllegalAccessException {
Field initializedField = QnsImsManager.class.getDeclaredField("mQnsImsManagerInitialized");
initializedField.setAccessible(true);
boolean qnsImsManagerInitialized = (boolean) initializedField.get(mQnsImsMgr);
assertTrue(qnsImsManagerInitialized);
when(mImsManager.getImsMmTelManager(anyInt())).thenReturn(null);
mQnsImsMgr = new QnsImsManager(mContext, 1);
qnsImsManagerInitialized = (boolean) initializedField.get(mQnsImsMgr);
assertFalse(qnsImsManagerInitialized);
}
@Test
public void testQnsImsManagerIsGbaValid()
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = QnsImsManager.class.getDeclaredMethod("isGbaValid");
method.setAccessible(true);
assertTrue((Boolean) method.invoke(mQnsImsMgr));
when(mBundle.getBoolean(eq(CarrierConfigManager.KEY_CARRIER_IMS_GBA_REQUIRED_BOOL)))
.thenReturn(true);
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(null);
assertFalse((Boolean) method.invoke(mQnsImsMgr));
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
when(mTelephonyManager.getIsimIst()).thenReturn(null);
assertTrue((Boolean) method.invoke(mQnsImsMgr));
when(mTelephonyManager.getIsimIst()).thenReturn("22");
assertTrue((Boolean) method.invoke(mQnsImsMgr));
when(mTelephonyManager.getIsimIst()).thenReturn("21");
assertFalse((Boolean) method.invoke(mQnsImsMgr));
}
@Test
public void testQnsImsManagerQnsImsRegistrationState() {
QnsImsManager.ImsRegistrationState stateReg =
new QnsImsManager.ImsRegistrationState(
QnsConstants.IMS_REGISTRATION_CHANGED_REGISTERED,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
null);
QnsImsManager.ImsRegistrationState stateUnreg =
new QnsImsManager.ImsRegistrationState(
QnsConstants.IMS_REGISTRATION_CHANGED_UNREGISTERED,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
null);
QnsImsManager.ImsRegistrationState stateAccessNetworkChangeFail =
new QnsImsManager.ImsRegistrationState(
QnsConstants.IMS_REGISTRATION_CHANGED_ACCESS_NETWORK_CHANGE_FAILED,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
null);
assertTrue(stateReg.toString().contains("IMS_REG"));
assertTrue(stateUnreg.toString().contains("IMS_UNREG"));
assertTrue(stateAccessNetworkChangeFail.toString().contains("IMS_ACCESS"));
}
@Test
public void testQnsImsManagerQnsIsImsRegistered() {
mQnsImsMgr.notifyImsRegistrationChangedEvent(
QnsConstants.IMS_REGISTRATION_CHANGED_REGISTERED,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
null);
assertTrue(mQnsImsMgr.isImsRegistered(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
assertFalse(mQnsImsMgr.isImsRegistered(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
mQnsImsMgr.notifyImsRegistrationChangedEvent(
QnsConstants.IMS_REGISTRATION_CHANGED_UNREGISTERED,
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
null);
assertFalse(mQnsImsMgr.isImsRegistered(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
assertFalse(mQnsImsMgr.isImsRegistered(AccessNetworkConstants.TRANSPORT_TYPE_WLAN));
}
}