| /* |
| * 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.ons; |
| |
| import static org.mockito.Mockito.doNothing; |
| import static org.mockito.Mockito.doReturn; |
| import static org.mockito.Mockito.times; |
| import static org.mockito.Mockito.verify; |
| |
| import android.content.Context; |
| import android.content.res.Resources; |
| import android.net.ConnectivityManager; |
| import android.net.NetworkCapabilities; |
| import android.net.NetworkRequest; |
| import android.os.Looper; |
| import android.os.ParcelUuid; |
| import android.os.PersistableBundle; |
| import android.telephony.CarrierConfigManager; |
| import android.telephony.SubscriptionInfo; |
| import android.telephony.SubscriptionManager; |
| import android.telephony.TelephonyManager; |
| import android.telephony.euicc.EuiccManager; |
| import android.util.Log; |
| |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.mockito.Mock; |
| import org.mockito.MockitoAnnotations; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.UUID; |
| |
| public class ONSProfileActivatorTest extends ONSBaseTest { |
| private static final String TAG = ONSProfileActivatorTest.class.getName(); |
| private static final int TEST_SUBID_0 = 0; |
| private static final int TEST_SUBID_1 = 1; |
| |
| @Mock |
| Context mMockContext; |
| @Mock |
| SubscriptionManager mMockSubManager; |
| @Mock |
| EuiccManager mMockEuiccManager; |
| @Mock |
| TelephonyManager mMockTeleManager; |
| @Mock |
| ConnectivityManager mMockConnectivityManager; |
| @Mock |
| CarrierConfigManager mMockCarrierConfigManager; |
| @Mock |
| ONSProfileConfigurator mMockONSProfileConfigurator; |
| @Mock |
| ONSProfileDownloader mMockONSProfileDownloader; |
| @Mock |
| List<SubscriptionInfo> mMockactiveSubInfos; |
| @Mock |
| SubscriptionInfo mMockSubInfo; |
| @Mock |
| SubscriptionInfo mMockSubInfo1; |
| @Mock |
| List<SubscriptionInfo> mMocksubsInPSIMGroup; |
| @Mock |
| Resources mMockResources; |
| |
| @Before |
| public void setUp() throws Exception { |
| super.setUp("ONSTest"); |
| MockitoAnnotations.initMocks(this); |
| Looper.prepare(); |
| |
| doReturn(mMockResources).when(mMockContext).getResources(); |
| |
| doReturn(mMockConnectivityManager).when(mMockContext).getSystemService( |
| Context.CONNECTIVITY_SERVICE); |
| NetworkRequest request = new NetworkRequest.Builder().addCapability( |
| NetworkCapabilities.NET_CAPABILITY_VALIDATED).build(); |
| doNothing().when(mMockConnectivityManager).registerNetworkCallback(request, |
| new ConnectivityManager.NetworkCallback()); |
| |
| PersistableBundle persistableBundle = new PersistableBundle(); |
| persistableBundle.putBoolean(CarrierConfigManager |
| .KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL, true); |
| doReturn(persistableBundle).when(mMockCarrierConfigManager).getConfigForSubId(TEST_SUBID_1); |
| } |
| |
| // Worker thread is used for testing asynchronous APIs and Message Handlers. |
| // ASync APIs are called and Handler messages are processed by Worker thread. Test results are |
| // verified by Main Thread. |
| static class WorkerThread extends Thread { |
| Looper mWorkerLooper; |
| private final Runnable mRunnable; |
| |
| WorkerThread(Runnable runnable) { |
| mRunnable = runnable; |
| } |
| |
| @Override |
| public void run() { |
| super.run(); |
| Looper.prepare(); |
| mWorkerLooper = Looper.myLooper(); |
| mRunnable.run(); |
| mWorkerLooper.loop(); |
| } |
| |
| public void exit() { |
| mWorkerLooper.quitSafely(); |
| } |
| } |
| |
| /*@Test |
| public void testSIMNotReady() { |
| doReturn(TelephonyManager.SIM_STATE_NOT_READY).when(mMockTeleManager).getSimState(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_SIM_NOT_READY, |
| onsProfileActivator.handleSimStateChange()); |
| }*/ |
| |
| @Test |
| public void testONSAutoProvisioningDisabled() { |
| |
| doReturn(false).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_AUTO_PROVISIONING_DISABLED, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testESIMNotSupported() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(false).when(mMockEuiccManager).isEnabled(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_ESIM_NOT_SUPPORTED, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| //@DisplayName("Single SIM Device with eSIM support") |
| public void testMultiSIMNotSupported() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(1).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_MULTISIM_NOT_SUPPORTED, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testDeviceSwitchToDualSIMModeFailed() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(1).when(mMockTeleManager).getActiveModemCount(); |
| doReturn(true).when(mMockTeleManager).doesSwitchMultiSimConfigTriggerReboot(); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(TEST_SUBID_0); |
| doReturn(1).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_CANNOT_SWITCH_TO_DUAL_SIM_MODE, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testDeviceSwitchToDualSIMModeSuccess() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(1).when(mMockTeleManager).getActiveModemCount(); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(TEST_SUBID_0); |
| doReturn(1).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| |
| doReturn(false).when(mMockTeleManager).doesSwitchMultiSimConfigTriggerReboot(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_SWITCHING_TO_DUAL_SIM_MODE, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| //@DisplayName("Dual SIM device with no SIM inserted") |
| public void testNoActiveSubscriptions() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(0).when(mMockactiveSubInfos).size(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_NO_SIM_INSERTED, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device and non CBRS carrier pSIM inserted") |
| public void testNonCBRSCarrierPSIMInserted() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| PersistableBundle persistableBundle = new PersistableBundle(); |
| persistableBundle.putBoolean(CarrierConfigManager |
| .KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL, false); |
| doReturn(persistableBundle).when(mMockCarrierConfigManager).getConfigForSubId(TEST_SUBID_0); |
| |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(TEST_SUBID_0); |
| doReturn(TEST_SUBID_0).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_CARRIER_DOESNT_SUPPORT_CBRS, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device with Two PSIM active subscriptions") |
| public void testTwoActivePSIMSubscriptions() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| ArrayList<SubscriptionInfo> mActiveSubInfos = new ArrayList<>(); |
| mActiveSubInfos.add(mMockSubInfo); |
| mActiveSubInfos.add(mMockSubInfo1); |
| doReturn(mActiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(false).when(mMockSubInfo).isEmbedded(); |
| doReturn(false).when(mMockSubInfo1).isEmbedded(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_DUAL_ACTIVE_SUBSCRIPTIONS, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testOneCBRSPSIMAndOneNonCBRSESIM() { |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| ArrayList<SubscriptionInfo> mActiveSubInfos = new ArrayList<>(); |
| mActiveSubInfos.add(mMockSubInfo); |
| mActiveSubInfos.add(mMockSubInfo1); |
| doReturn(mActiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(false).when(mMockSubInfo).isEmbedded(); |
| doReturn(true).when(mMockSubInfo1).isEmbedded(); |
| doReturn(TEST_SUBID_0).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(TEST_SUBID_1).when(mMockSubInfo1).getSubscriptionId(); |
| |
| PersistableBundle persistableBundle = new PersistableBundle(); |
| persistableBundle.putBoolean(CarrierConfigManager |
| .KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL, false); |
| doReturn(persistableBundle).when(mMockCarrierConfigManager).getConfigForSubId(TEST_SUBID_0); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_DUAL_ACTIVE_SUBSCRIPTIONS, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testOneCBRSPSIMAndOneOpportunisticESIM() { |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| ArrayList<SubscriptionInfo> mActiveSubInfos = new ArrayList<>(); |
| mActiveSubInfos.add(mMockSubInfo); //Primary CBRS SIM |
| mActiveSubInfos.add(mMockSubInfo1); //Opportunistic eSIM |
| doReturn(mActiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(mActiveSubInfos).when(mMockSubManager).getAvailableSubscriptionInfoList(); |
| |
| doReturn(mMockSubInfo).when(mMockSubManager).getActiveSubscriptionInfo(TEST_SUBID_0); |
| doReturn(TEST_SUBID_0).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(true).when(mMockSubManager).isActiveSubscriptionId(TEST_SUBID_0); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| doReturn(false).when(mMockSubInfo).isEmbedded(); |
| ParcelUuid pSIMSubGroupId = new ParcelUuid(new UUID(0, 1)); |
| doReturn(pSIMSubGroupId).when(mMockSubInfo).getGroupUuid(); |
| PersistableBundle persistableBundle = new PersistableBundle(); |
| persistableBundle.putBoolean(CarrierConfigManager |
| .KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL, true); |
| persistableBundle.putIntArray(CarrierConfigManager |
| .KEY_OPPORTUNISTIC_CARRIER_IDS_INT_ARRAY, new int[]{1, 2}); |
| doReturn(persistableBundle).when(mMockCarrierConfigManager).getConfigForSubId(TEST_SUBID_0); |
| |
| doReturn(mMockSubInfo1).when(mMockSubManager).getActiveSubscriptionInfo(TEST_SUBID_1); |
| doReturn(TEST_SUBID_1).when(mMockSubInfo1).getSubscriptionId(); |
| doReturn(true).when(mMockSubManager).isActiveSubscriptionId(TEST_SUBID_1); |
| doReturn(true).when(mMockSubInfo1).isOpportunistic(); |
| doReturn(true).when(mMockSubInfo1).isEmbedded(); |
| doReturn(pSIMSubGroupId).when(mMockSubInfo1).getGroupUuid(); |
| doReturn(1).when(mMockSubInfo1).getCarrierId(); |
| |
| doReturn(mMockSubInfo1).when(mMockONSProfileConfigurator) |
| .findOpportunisticSubscription(TEST_SUBID_0); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.SUCCESS, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device with only opportunistic eSIM active") |
| public void testOnlyOpportunisticESIMActive() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(true).when(mMockSubInfo).isOpportunistic(); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_SINGLE_ACTIVE_OPPORTUNISTIC_SIM, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device, only CBRS carrier pSIM inserted and pSIM not Grouped") |
| public void testCBRSpSIMAndNotGrouped() { |
| |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| doReturn(TEST_SUBID_1).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(null).when(mMockSubInfo).getGroupUuid(); |
| doReturn(ONSProfileDownloader.DownloadProfileResult.SUCCESS).when(mMockONSProfileDownloader) |
| .downloadProfile(TEST_SUBID_1); |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, mMockEuiccManager, |
| mMockConnectivityManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| onsProfileActivator.mIsInternetConnAvailable = true; |
| assertEquals(ONSProfileActivator.Result.SUCCESS, |
| onsProfileActivator.handleCarrierConfigChange()); |
| } |
| |
| @Test |
| public void testCalculateBackoffDelay() { |
| final Object lock = new Object(); |
| |
| Runnable runnable = new Runnable() { |
| @Override |
| public void run() { |
| int delay = ONSProfileActivator.calculateBackoffDelay(1, 1) / 1000; |
| assertEquals(true, (delay >= 1 && delay <= 2)); |
| |
| Log.i(TAG, "calculateBackoffDelay(2, 1)"); |
| delay = ONSProfileActivator.calculateBackoffDelay(2, 1) / 1000; |
| assertEquals(true, (delay >= 1 && delay < 4)); |
| |
| delay = ONSProfileActivator.calculateBackoffDelay(3, 1) / 1000; |
| assertEquals(true, (delay >= 1 && delay < 8)); |
| |
| delay = ONSProfileActivator.calculateBackoffDelay(4, 1) / 1000; |
| assertEquals(true, (delay >= 1 && delay < 16)); |
| |
| delay = ONSProfileActivator.calculateBackoffDelay(1, 2) / 1000; |
| assertEquals(true, (delay >= 1 && delay <= 4)); |
| |
| delay = ONSProfileActivator.calculateBackoffDelay(1, 3) / 1000; |
| assertEquals(true, (delay >= 1 && delay <= 6)); |
| |
| delay = ONSProfileActivator.calculateBackoffDelay(2, 2) / 1000; |
| assertEquals(true, (delay >= 2 && delay < 8)); |
| |
| synchronized (lock) { |
| lock.notifyAll(); |
| } |
| } |
| }; |
| |
| WorkerThread workerThread = new WorkerThread(runnable); |
| workerThread.start(); |
| |
| synchronized (lock) { |
| try { |
| lock.wait(); |
| } catch (Exception e) { |
| Log.e(TAG, e.getLocalizedMessage()); |
| } |
| } |
| |
| workerThread.exit(); |
| } |
| |
| /* Unable to mock final class ParcelUuid. These testcases should be enabled once the solution |
| is found */ |
| /*@Test |
| //@DisplayName("Dual SIM device, only CBRS carrier pSIM inserted and pSIM Grouped") |
| public void testOneSubscriptionInCBRSpSIMGroup() { |
| ParcelUuid mMockParcelUuid = crateMock(ParcelUuid.class); |
| |
| doReturn(true).when(mMockONSProfileConfigurator) |
| .isESIMSupported(); |
| doReturn(true).when(mMockONSUtil).isMultiSIMPhone(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockPrimaryCBRSSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(false).when(mMockPrimaryCBRSSubInfo).isOpportunistic(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockParcelUuid).when(mMockPrimaryCBRSSubInfo).getGroupUuid(); |
| doReturn(mMocksubsInPSIMGroup).when(mMockSubManager).getSubscriptionsInGroup( |
| mMockParcelUuid); |
| doReturn(1).when(mMocksubsInPSIMGroup).size(); |
| |
| ONSProfileActivator onsProfileActivator = |
| new ONSProfileActivator(mMockContext, mMockSubManager, mMockEuiCCManager, |
| mMockTeleManager, |
| mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.SUCCESS, |
| onsProfileActivator.handleSimStateChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device, only CBRS carrier pSIM inserted and pSIM Group has two |
| subscription info.") |
| public void testTwoSubscriptionsInCBRSpSIMGroup() { |
| ParcelUuid mMockParcelUuid = crateMock(ParcelUuid.class); |
| |
| doReturn(true).when(mMockONSProfileConfigurator) |
| .isESIMSupported(); |
| doReturn(true).when(mMockONSUtil).isMultiSIMPhone(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockPrimaryCBRSSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(false).when(mMockPrimaryCBRSSubInfo).isOpportunistic(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockParcelUuid).when(mMockPrimaryCBRSSubInfo).getGroupUuid(); |
| doReturn(mMocksubsInPSIMGroup).when(mMockSubManager).getSubscriptionsInGroup( |
| mMockParcelUuid); |
| doReturn(2).when(mMocksubsInPSIMGroup).size(); |
| |
| ONSProfileActivator onsProfileActivator = |
| new ONSProfileActivator(mMockContext, mMockSubManager, mMockEuiCCManager, |
| mMockTeleManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.SUCCESS, |
| onsProfileActivator.handleSimStateChange()); |
| } |
| |
| @Test |
| //@DisplayName("Dual SIM device, only CBRS carrier pSIM inserted and pSIM Group has more than |
| two subscription info.") |
| public void testMoreThanTwoSubscriptionsInCBRSpSIMGroup() { |
| ParcelUuid mMockParcelUuid = crateMock(ParcelUuid.class); |
| |
| doReturn(true).when(mMockONSProfileConfigurator) |
| .isESIMSupported(); |
| doReturn(true).when(mMockONSUtil).isMultiSIMPhone(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockPrimaryCBRSSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(false).when(mMockPrimaryCBRSSubInfo).isOpportunistic(); |
| doReturn(true).when(mMockONSProfileConfigurator).isOppDataAutoProvisioningSupported( |
| mMockPrimaryCBRSSubInfo); |
| doReturn(mMockParcelUuid).when(mMockPrimaryCBRSSubInfo).getGroupUuid(); |
| doReturn(mMocksubsInPSIMGroup).when(mMockSubManager).getSubscriptionsInGroup( |
| mMockParcelUuid); |
| doReturn(3).when(mMocksubsInPSIMGroup).size(); |
| |
| ONSProfileActivator onsProfileActivator = |
| new ONSProfileActivator(mMockContext, mMockSubManager, mMockEuiCCManager, |
| mMockTeleManager, mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.SUCCESS, |
| onsProfileActivator.handleSimStateChange()); |
| } |
| |
| @Test |
| public void testRetryDownloadAfterRebootWithOppESIMAlreadyDownloaded() { |
| doReturn(true).when(mMockONSProfileConfigurator).getRetryDownloadAfterReboot(); |
| doReturn(1).when(mMockONSProfileConfigurator).getRetryDownloadPSIMSubId(); |
| doReturn(mMockSubManager).when(mMockONSUtil).getSubscriptionManager(); |
| doReturn(mMocksubsInPSIMGroup).when(mMockSubManager).getActiveSubscriptionInfo(); |
| //TODO: mock ParcelUuid - pSIM group |
| |
| ONSProfileActivator onsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockONSProfileConfigurator, mMockONSProfileDownloader); |
| |
| assertEquals(ONSProfileActivator.Result.ERR_INVALID_PSIM_SUBID, |
| onsProfileActivator.retryDownloadAfterReboot()); |
| } |
| */ |
| |
| /*@Test |
| public void testNoInternetDownloadRequest() { |
| doReturn(TEST_SUB_ID).when(mMockSubInfo).getSubscriptionId(); |
| |
| ONSProfileDownloader onsProfileDownloader = new ONSProfileDownloader(mMockContext, |
| mMockCarrierConfigManager, mMockEUICCManager, mMockONSProfileConfig, null); |
| |
| onsProfileDownloader.mIsInternetConnAvailable = false; |
| onsProfileDownloader.downloadOpportunisticESIM(mMockSubInfo); |
| |
| assertEquals(onsProfileDownloader.mRetryDownloadWhenNWConnected, true); |
| verify(mMockEUICCManager, never()).downloadSubscription(null, true, null); |
| }*/ |
| |
| @Test |
| public void testESIMDownloadFailureAndRetry() { |
| doReturn(true).when(mMockResources).getBoolean(R.bool.enable_ons_auto_provisioning); |
| doReturn(true).when(mMockEuiccManager).isEnabled(); |
| doReturn(2).when(mMockTeleManager).getSupportedModemCount(); |
| doReturn(2).when(mMockTeleManager).getActiveModemCount(); |
| doReturn(ONSProfileDownloader.DownloadProfileResult.SUCCESS).when(mMockONSProfileDownloader) |
| .downloadProfile(TEST_SUBID_0); |
| |
| doReturn(mMockactiveSubInfos).when(mMockSubManager).getActiveSubscriptionInfoList(); |
| doReturn(1).when(mMockactiveSubInfos).size(); |
| doReturn(mMockSubInfo).when(mMockactiveSubInfos).get(0); |
| doReturn(false).when(mMockSubInfo).isOpportunistic(); |
| doReturn(TEST_SUBID_0).when(mMockSubInfo).getSubscriptionId(); |
| doReturn(null).when(mMockSubInfo).getGroupUuid(); |
| |
| final int maxRetryCount = 5; |
| final int retryBackoffTime = 1; //1 second |
| |
| PersistableBundle persistableBundle = new PersistableBundle(); |
| persistableBundle.putBoolean(CarrierConfigManager |
| .KEY_CARRIER_SUPPORTS_OPP_DATA_AUTO_PROVISIONING_BOOL, true); |
| persistableBundle.putInt(CarrierConfigManager |
| .KEY_ESIM_MAX_DOWNLOAD_RETRY_ATTEMPTS_INT, maxRetryCount); |
| persistableBundle.putInt(CarrierConfigManager |
| .KEY_ESIM_DOWNLOAD_RETRY_BACKOFF_TIMER_SEC_INT, retryBackoffTime); |
| doReturn(persistableBundle).when(mMockCarrierConfigManager).getConfigForSubId(TEST_SUBID_0); |
| |
| final Object lock = new Object(); |
| class TestRunnable implements Runnable { |
| public ONSProfileActivator mOnsProfileActivator; |
| |
| @Override |
| public void run() { |
| mOnsProfileActivator = new ONSProfileActivator(mMockContext, |
| mMockSubManager, mMockTeleManager, mMockCarrierConfigManager, |
| mMockEuiccManager, mMockConnectivityManager, mMockONSProfileConfigurator, |
| mMockONSProfileDownloader); |
| |
| synchronized (lock) { |
| lock.notify(); |
| } |
| } |
| } |
| |
| TestRunnable runnable = new TestRunnable(); |
| WorkerThread workerThread = new WorkerThread(runnable); |
| workerThread.start(); |
| |
| synchronized (lock) { |
| try { |
| lock.wait(); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| ONSProfileActivator onsProfileActivator = runnable.mOnsProfileActivator; |
| onsProfileActivator.mIsInternetConnAvailable = true; |
| |
| for (int idx = 0; idx <= maxRetryCount; idx++) { |
| onsProfileActivator.onDownloadError(ONSProfileDownloader |
| .DownloadRetryOperationCode.ERR_RETRY_DOWNLOAD, TEST_SUBID_0); |
| |
| //Wait for Handler to process download message. Backoff delay + 500 milli secs. |
| try { |
| Thread.sleep(onsProfileActivator.calculateBackoffDelay( |
| onsProfileActivator.mDownloadRetryCount, retryBackoffTime) + 1000); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| workerThread.exit(); |
| |
| verify(mMockONSProfileDownloader, times(maxRetryCount)).downloadProfile(TEST_SUBID_0); |
| } |
| |
| @After |
| public void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| } |
| |