diff options
author | samalin <samalin@google.com> | 2021-07-08 17:53:42 +0800 |
---|---|---|
committer | samalin <samalin@google.com> | 2021-07-22 14:58:58 +0800 |
commit | 3daf7190af2efc27bdd7a4698a082e8762ad3d68 (patch) | |
tree | 5e0ad2f5a37b4ec90e4e0b4c187812a91d79c3bf | |
parent | 456140e3b31e8c168a878195bf95ae49189f7821 (diff) | |
download | ImsServiceEntitlement-3daf7190af2efc27bdd7a4698a082e8762ad3d68.tar.gz |
Add test cases for the code coverage
Coverage increased from 57% to 60%
Test result: https://docs.google.com/spreadsheets/d/1JLl7cGpCtbeC4miYWP3RjYapRKAg-xUBOo4B3EZkXO4/edit?resourcekey=0-ErUUgGfICLRntN_aSfcJtg#gid=630428311
Bug: 191426388
Test: unit tests
Change-Id: I65525276cd7b3219825fab18af02a0f3c9b0125b
11 files changed, 577 insertions, 153 deletions
diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java index bd9ab76..04a5750 100644 --- a/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java +++ b/src/com/android/imsserviceentitlement/ImsEntitlementPollingService.java @@ -16,7 +16,6 @@ package com.android.imsserviceentitlement; -import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__ENABLED; @@ -47,6 +46,7 @@ import com.android.imsserviceentitlement.entitlement.EntitlementConfiguration.Cl import com.android.imsserviceentitlement.entitlement.EntitlementResult; import com.android.imsserviceentitlement.job.JobManager; import com.android.imsserviceentitlement.utils.ImsUtils; +import com.android.imsserviceentitlement.utils.MetricsLogger; import com.android.imsserviceentitlement.utils.TelephonyUtils; import java.time.Duration; @@ -147,6 +147,7 @@ public class ImsEntitlementPollingService extends JobService { private final ImsEntitlementApi mImsEntitlementApi; private final ImsUtils mImsUtils; private final TelephonyUtils mTelephonyUtils; + private final MetricsLogger mMetricsLogger; private final int mSubid; private final boolean mNeedsImsProvisioning; @@ -168,15 +169,15 @@ public class ImsEntitlementPollingService extends JobService { this.mImsEntitlementApi = ImsEntitlementPollingService.this.mImsEntitlementApi != null ? ImsEntitlementPollingService.this.mImsEntitlementApi : new ImsEntitlementApi(ImsEntitlementPollingService.this, subId); + this.mMetricsLogger = new MetricsLogger(mTelephonyUtils); } @Override protected Void doInBackground(Void... unused) { - mStartTime = mTelephonyUtils.getUptimeMillis(); int jobId = JobManager.getPureJobId(mParams.getJobId()); switch (jobId) { case JobManager.QUERY_ENTITLEMENT_STATUS_JOB_ID: - mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING; + mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__POLLING); doEntitlementCheck(); break; default: @@ -343,13 +344,11 @@ public class ImsEntitlementPollingService extends JobService { } private void sendStatsLogToMetrics() { - mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime; - // If no result set, it was cancelled for reasons. if (mVowifiResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) { mVowifiResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED; } - writeStateLogByApps( + mMetricsLogger.write( IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, mVowifiResult); if (mNeedsImsProvisioning) { @@ -359,22 +358,11 @@ public class ImsEntitlementPollingService extends JobService { if (mSmsoipResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) { mSmsoipResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED; } - writeStateLogByApps( + mMetricsLogger.write( IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOLTE, mVolteResult); - writeStateLogByApps( + mMetricsLogger.write( IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__SMSOIP, mSmsoipResult); } } - - private void writeStateLogByApps(int appId, int appResult) { - ImsServiceEntitlementStatsLog.write( - IMS_SERVICE_ENTITLEMENT_UPDATED, - mTelephonyUtils.getCarrierId(), - mTelephonyUtils.getSpecificCarrierId(), - mPurpose, - appId, - appResult, - mDurationMillis); - } } } diff --git a/src/com/android/imsserviceentitlement/ImsEntitlementReceiver.java b/src/com/android/imsserviceentitlement/ImsEntitlementReceiver.java index dc78b0a..e2741a6 100644 --- a/src/com/android/imsserviceentitlement/ImsEntitlementReceiver.java +++ b/src/com/android/imsserviceentitlement/ImsEntitlementReceiver.java @@ -68,7 +68,8 @@ public class ImsEntitlementReceiver extends BroadcastReceiver { SubscriptionManager.INVALID_SIM_SLOT_INDEX); Dependencies dependencies = createDependency(context, currentSubId); if (!dependencies.userManager.isSystemUser() - || !TelephonyUtils.isImsProvisioningRequired(context, currentSubId)) { + || !TelephonyUtils.isImsProvisioningRequired(context, currentSubId) + || !SubscriptionManager.isValidSubscriptionId(currentSubId)) { return; } @@ -89,9 +90,6 @@ public class ImsEntitlementReceiver extends BroadcastReceiver { private void handleCarrierConfigChanged( Context context, int currentSubId, int slotId, JobManager jobManager, PendingResult result) { - if (!SubscriptionManager.isValidSubscriptionId(currentSubId)) { - return; - } boolean shouldQuery = false; // Handle device boot up. diff --git a/src/com/android/imsserviceentitlement/WfcActivationController.java b/src/com/android/imsserviceentitlement/WfcActivationController.java index ed63bf9..6bcd9ec 100644 --- a/src/com/android/imsserviceentitlement/WfcActivationController.java +++ b/src/com/android/imsserviceentitlement/WfcActivationController.java @@ -16,7 +16,6 @@ package com.android.imsserviceentitlement; -import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED; @@ -26,7 +25,6 @@ import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IM import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNEXPECTED_RESULT; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION; -import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE; import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI; @@ -44,8 +42,11 @@ import androidx.annotation.StringRes; import com.android.imsserviceentitlement.entitlement.EntitlementResult; import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus; import com.android.imsserviceentitlement.utils.ImsUtils; +import com.android.imsserviceentitlement.utils.MetricsLogger; import com.android.imsserviceentitlement.utils.TelephonyUtils; +import com.google.common.annotations.VisibleForTesting; + import java.time.Duration; /** @@ -67,14 +68,10 @@ public class WfcActivationController { private final ImsEntitlementApi mImsEntitlementApi; private final ImsUtils mImsUtils; private final Intent mStartIntent; + private final MetricsLogger mMetricsLogger; // States private int mEvaluateTimes = 0; - - // States for metrics - private long mStartTime; - private long mDurationMillis; - private int mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE; private int mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT; @MainThread @@ -88,6 +85,23 @@ public class WfcActivationController { this.mImsEntitlementApi = imsEntitlementApi; this.mTelephonyUtils = new TelephonyUtils(context, getSubId()); this.mImsUtils = ImsUtils.getInstance(context, getSubId()); + this.mMetricsLogger = new MetricsLogger(mTelephonyUtils); + } + + @VisibleForTesting + WfcActivationController( + Context context, + WfcActivationUi wfcActivationUi, + ImsEntitlementApi imsEntitlementApi, + Intent intent, + ImsUtils imsUtils, + MetricsLogger metricsLogger) { + this.mStartIntent = intent; + this.mActivationUi = wfcActivationUi; + this.mImsEntitlementApi = imsEntitlementApi; + this.mTelephonyUtils = new TelephonyUtils(context, getSubId()); + this.mImsUtils = imsUtils; + this.mMetricsLogger = metricsLogger; } /** Indicates the controller to start WFC activation or emergency address update flow. */ @@ -96,11 +110,10 @@ public class WfcActivationController { showGeneralWaitingUi(); evaluateEntitlementStatus(); if (isActivationFlow()) { - mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION; + mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION); } else { - mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE; + mMetricsLogger.start(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UPDATE); } - mStartTime = mTelephonyUtils.getUptimeMillis(); } /** Evaluates entitlement status for activation or update. */ @@ -141,22 +154,11 @@ public class WfcActivationController { public void finish() { EntitlementUtils.cancelEntitlementCheck(); - // If no duration set, set now. - if (mDurationMillis == 0L) { - mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime; - } // If no result set, it must be cancelled by user pressing back button. if (mAppResult == IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNKNOWN_RESULT) { mAppResult = IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__CANCELED; } - ImsServiceEntitlementStatsLog.write( - IMS_SERVICE_ENTITLEMENT_UPDATED, - /* carrier_id= */ mTelephonyUtils.getCarrierId(), - /* actual_carrier_id= */ mTelephonyUtils.getSpecificCarrierId(), - mPurpose, - IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, - mAppResult, - mDurationMillis); + mMetricsLogger.write(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI, mAppResult); } /** @@ -268,9 +270,10 @@ public class WfcActivationController { } else { if (vowifiStatus.incompatible()) { showErrorUi(R.string.failure_contact_carrier); - turnOffWfc(() -> { - finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__INCOMPATIBLE); - }); + mImsUtils.turnOffWfc( + () -> finishStatsLog( + IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__INCOMPATIBLE) + ); } else { Log.e(TAG, "Unexpected status. Show error UI."); finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__UNEXPECTED_RESULT); @@ -334,10 +337,11 @@ public class WfcActivationController { finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL); } else if (vowifiStatus.serverDataMissing()) { // Some carrier allows de-activating in updating flow. - turnOffWfc(() -> { - finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED); - mActivationUi.setResultAndFinish(Activity.RESULT_OK); - }); + mImsUtils.turnOffWfc( + () -> { + finishStatsLog(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__DISABLED); + mActivationUi.setResultAndFinish(Activity.RESULT_OK); + }); } else { Log.e(TAG, "Unexpected status. Show error UI."); showGeneralErrorUi(); @@ -361,14 +365,7 @@ public class WfcActivationController { }.start(); } - /** Turns WFC off and then runs {@code action} on main thread. */ - @MainThread - private void turnOffWfc(Runnable action) { - ImsUtils.turnOffWfc(mImsUtils, action); - } - private void finishStatsLog(int result) { mAppResult = result; - mDurationMillis = mTelephonyUtils.getUptimeMillis() - mStartTime; } } diff --git a/src/com/android/imsserviceentitlement/utils/ImsUtils.java b/src/com/android/imsserviceentitlement/utils/ImsUtils.java index 2ae94d8..d24456f 100644 --- a/src/com/android/imsserviceentitlement/utils/ImsUtils.java +++ b/src/com/android/imsserviceentitlement/utils/ImsUtils.java @@ -28,14 +28,15 @@ import android.util.SparseArray; import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; +import com.google.common.annotations.VisibleForTesting; + /** A helper class for IMS relevant APIs with subscription id. */ public class ImsUtils { private static final String TAG = "IMSSE-ImsUtils"; - private final CarrierConfigManager mCarrierConfigManager; + @Nullable private final PersistableBundle mCarrierConfigs; private final ImsMmTelManager mImsMmTelManager; private final ProvisioningManager mProvisioningManager; - private final int mSubId; /** * Turns Volte provisioning status ON/OFF. @@ -63,11 +64,20 @@ public class ImsUtils { private static SparseArray<ImsUtils> sInstances = new SparseArray<ImsUtils>(); private ImsUtils(Context context, int subId) { - mCarrierConfigManager = - (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE); - mImsMmTelManager = getImsMmTelManager(context, subId); - mProvisioningManager = getProvisioningManager(subId); - this.mSubId = subId; + this( + context.getSystemService(CarrierConfigManager.class).getConfigForSubId(subId), + getImsMmTelManager(subId), + getProvisioningManager(subId)); + } + + @VisibleForTesting + ImsUtils( + PersistableBundle carrierConfigs, + ImsMmTelManager imsMmTelManager, + ProvisioningManager provisioningManager) { + mCarrierConfigs = carrierConfigs; + mImsMmTelManager = imsMmTelManager; + mProvisioningManager = provisioningManager; } /** Returns {@link ImsUtils} instance. */ @@ -83,7 +93,7 @@ public class ImsUtils { } /** Changes persistent WFC enabled setting. */ - public void setWfcSetting(boolean enabled, boolean force) { + private void setWfcSetting(boolean enabled, boolean force) { try { if (force) { mImsMmTelManager.setVoWiFiSettingEnabled(enabled); @@ -134,21 +144,19 @@ public class ImsUtils { } /** Disables WFC and reset WFC mode to carrier default value */ - public void disableAndResetVoWiFiImsSettings() { + @VisibleForTesting + void disableAndResetVoWiFiImsSettings() { try { disableWfc(); // Reset WFC mode to carrier default value - if (mCarrierConfigManager != null) { - PersistableBundle b = mCarrierConfigManager.getConfigForSubId(mSubId); - if (b != null) { - mImsMmTelManager.setVoWiFiModeSetting( - b.getInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)); - mImsMmTelManager.setVoWiFiRoamingModeSetting( - b.getInt( - CarrierConfigManager - .KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT)); - } + if (mCarrierConfigs != null) { + mImsMmTelManager.setVoWiFiModeSetting( + mCarrierConfigs.getInt( + CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT)); + mImsMmTelManager.setVoWiFiRoamingModeSetting( + mCarrierConfigs.getInt( + CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT)); } } catch (RuntimeException e) { // ignore this exception, possible exception should be NullPointerException or @@ -161,7 +169,7 @@ public class ImsUtils { * Returns {@code null} if provided subscription id invalid. */ @Nullable - public static ImsMmTelManager getImsMmTelManager(Context context, int subId) { + private static ImsMmTelManager getImsMmTelManager(int subId) { try { return ImsMmTelManager.createForSubscriptionId(subId); } catch (IllegalArgumentException e) { @@ -176,7 +184,7 @@ public class ImsUtils { * Returns {@code null} if provided subscription id invalid. */ @Nullable - public static ProvisioningManager getProvisioningManager(int subId) { + private static ProvisioningManager getProvisioningManager(int subId) { try { return ProvisioningManager.createForSubscriptionId(subId); } catch (IllegalArgumentException e) { @@ -197,11 +205,11 @@ public class ImsUtils { } /** Calls {@link #disableAndResetVoWiFiImsSettings()} in background thread. */ - public static void turnOffWfc(ImsUtils imsUtils, Runnable action) { + public void turnOffWfc(Runnable action) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { - imsUtils.disableAndResetVoWiFiImsSettings(); + disableAndResetVoWiFiImsSettings(); return null; // To satisfy compiler } diff --git a/src/com/android/imsserviceentitlement/utils/MetricsLogger.java b/src/com/android/imsserviceentitlement/utils/MetricsLogger.java new file mode 100644 index 0000000..8eec246 --- /dev/null +++ b/src/com/android/imsserviceentitlement/utils/MetricsLogger.java @@ -0,0 +1,54 @@ +/* + * 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.imsserviceentitlement.utils; + +import static android.os.SystemClock.uptimeMillis; + +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED; +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE; + +import com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog; + +/** Utility for writing the metrics logs. */ +public class MetricsLogger { + private final TelephonyUtils mTelephonyUtils; + + private int mPurpose = IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__UNKNOWN_PURPOSE; + private long mStartTime = uptimeMillis(); + + public MetricsLogger(TelephonyUtils telephonyUtils) { + mTelephonyUtils = telephonyUtils; + } + + /** Starts the log session for the purpose as well as record the start time. */ + public void start(int purpose) { + mStartTime = uptimeMillis(); + mPurpose = purpose; + } + + /** Writes the metrics log. */ + public void write(int appId, int appResult) { + ImsServiceEntitlementStatsLog.write( + IMS_SERVICE_ENTITLEMENT_UPDATED, + mTelephonyUtils.getCarrierId(), + mTelephonyUtils.getSpecificCarrierId(), + mPurpose, + appId, + appResult, + uptimeMillis() - mStartTime); + } +} diff --git a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java index 2601fd8..d081016 100644 --- a/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java +++ b/src/com/android/imsserviceentitlement/utils/TelephonyUtils.java @@ -19,7 +19,6 @@ package com.android.imsserviceentitlement.utils; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.os.Build; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; @@ -62,32 +61,12 @@ public class TelephonyUtils { return android.os.SystemClock.uptimeMillis(); } - /** Returns device model name. */ - public String getDeviceName() { - return Build.MODEL; - } - - /** Returns device OS version. */ - public String getDeviceOsVersion() { - return Build.VERSION.RELEASE; - } - /** Returns {@code true} if network is connected (cellular or WiFi). */ public boolean isNetworkConnected() { NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnected(); } - /** - * Returns the response of EAP-AKA authetication {@code data} or {@code null} on failure. - * - * <p>Requires permission: READ_PRIVILEGED_PHONE_STATE - */ - public String getEapAkaAuthentication(String data) { - return mTelephonyManager.getIccAuthentication( - TelephonyManager.APPTYPE_USIM, TelephonyManager.AUTHTYPE_EAP_AKA, data); - } - /** Returns carrier ID. */ public int getCarrierId() { return mTelephonyManager.getSimCarrierId(); diff --git a/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java b/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java index 474e755..04477c9 100644 --- a/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java +++ b/tests/unittests/src/com/android/imsserviceentitlement/EntitlementUtilsTest.java @@ -44,10 +44,8 @@ public class EntitlementUtilsTest { @Mock private EntitlementResult mEntitlementResult; @Before - public void setup() throws Exception { - Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest"); - field.setAccessible(true); - field.set(null, true); + public void setUp() throws Exception { + useDirectExecutor(true); } @Test @@ -67,4 +65,21 @@ public class EntitlementUtilsTest { verify(mEntitlementResultCallback, never()).onEntitlementResult(mEntitlementResult); } + + @Test + public void entitlementCheck_cancelEntitlementCheck_onFailure() throws Exception { + useDirectExecutor(false); + when(mMockImsEntitlementApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + + EntitlementUtils.entitlementCheck(mMockImsEntitlementApi, mEntitlementResultCallback); + EntitlementUtils.cancelEntitlementCheck(); + + verify(mEntitlementResultCallback, never()).onEntitlementResult(mEntitlementResult); + } + + private void useDirectExecutor(boolean enable) throws Exception { + Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest"); + field.setAccessible(true); + field.set(null, enable); + } } diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java index d0ea3ee..217ac7b 100644 --- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java +++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementApiTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; +import android.telephony.SubscriptionManager; import androidx.test.core.app.ApplicationProvider; import androidx.test.runner.AndroidJUnit4; @@ -296,6 +297,16 @@ public class ImsEntitlementApiTest { assertThat(result.getRetryAfterSeconds()).isEqualTo(120); } + @Test + public void checkEntitlementStatus_invalidSubId_resultNull() { + ImsEntitlementApi imsEntitlementApi = + new ImsEntitlementApi(mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + + EntitlementResult result = imsEntitlementApi.checkEntitlementStatus(); + + assertThat(result).isNull(); + } + private ServiceEntitlementRequest authenticationRequest(String token) { ServiceEntitlementRequest.Builder requestBuilder = ServiceEntitlementRequest.builder(); if (token != null) { diff --git a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java index dbea9a1..91fab63 100644 --- a/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java +++ b/tests/unittests/src/com/android/imsserviceentitlement/ImsEntitlementReceiverTest.java @@ -29,6 +29,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.PersistableBundle; import android.os.UserManager; +import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; @@ -167,8 +168,6 @@ public class ImsEntitlementReceiverTest { @Test public void onReceive_isSystemUser_jobScheduled() { - when(mMockUserManager.isSystemUser()).thenReturn(true); - mReceiver.onReceive( mContext, getCarrierConfigChangedIntent(SUB_ID, /* slotId= */ 0)); @@ -177,9 +176,9 @@ public class ImsEntitlementReceiverTest { @Test public void onReceive_notSystemUser_noJobScheduled() { - when(mMockUserManager.isSystemUser()).thenReturn(false); + ImsEntitlementReceiver receiver = new ImsEntitlementReceiver(); - mReceiver.onReceive( + receiver.onReceive( mContext, getCarrierConfigChangedIntent(SUB_ID, /* slotId= */ 0)); verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady(); @@ -205,6 +204,27 @@ public class ImsEntitlementReceiverTest { verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady(); } + @Test + public void onReceive_invalidSubId_noJobScheduled() { + mReceiver.onReceive(mContext, + getCarrierConfigChangedIntent(SubscriptionManager.INVALID_SUBSCRIPTION_ID, 0)); + + verify(mMockJobManager, never()).queryEntitlementStatusOnceNetworkReady(); + } + + @Test + public void isBootUp_compareWithLastBootCount_returnResult() { + int currentBootCount = + Settings.Global.getInt( + mContext.getContentResolver(), Settings.Global.BOOT_COUNT, /* def= */ -1); + setLastBootCount(/* slotId= */ 0, /* count=*/ currentBootCount); + setLastBootCount(/* slotId= */ 1, /* count=*/ currentBootCount - 1); + ImsEntitlementReceiver receiver = new ImsEntitlementReceiver(); + + assertThat(receiver.isBootUp(mContext, 0)).isFalse(); + assertThat(receiver.isBootUp(mContext, 1)).isTrue(); + } + private Intent getCarrierConfigChangedIntent(int subId, int slotId) { Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, subId); @@ -228,6 +248,12 @@ public class ImsEntitlementReceiverTest { preferences.edit().putInt("last_sub_id_" + slotId, subId).apply(); } + private void setLastBootCount(int slotId, int count) { + SharedPreferences preferences = + mContext.getSharedPreferences("PREFERENCE_ACTIVATION_INFO", Context.MODE_PRIVATE); + preferences.edit().putInt("last_boot_count_" + slotId, count).apply(); + } + private void useDirectExecutor() throws Exception { Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest"); field.setAccessible(true); diff --git a/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java b/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java index 72b9341..cf72f1f 100644 --- a/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java +++ b/tests/unittests/src/com/android/imsserviceentitlement/WfcActivationControllerTest.java @@ -16,13 +16,19 @@ package com.android.imsserviceentitlement; +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED; +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL; +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION; +import static com.android.imsserviceentitlement.ImsServiceEntitlementStatsLog.IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; -import android.app.Instrumentation; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; @@ -40,6 +46,8 @@ import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.EntitlementStatus import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.ProvStatus; import com.android.imsserviceentitlement.ts43.Ts43VowifiStatus.TcStatus; import com.android.imsserviceentitlement.utils.Executors; +import com.android.imsserviceentitlement.utils.ImsUtils; +import com.android.imsserviceentitlement.utils.MetricsLogger; import org.junit.Before; import org.junit.Rule; @@ -52,32 +60,32 @@ import org.mockito.junit.MockitoRule; import java.lang.reflect.Field; -// TODO(b/176127289) add tests @RunWith(AndroidJUnit4.class) public class WfcActivationControllerTest { @Rule public final MockitoRule rule = MockitoJUnit.rule(); - @Mock private TelephonyManager mTelephonyManager; - @Mock private ImsEntitlementApi mActivationApi; - @Mock private WfcActivationUi mActivationUi; - @Mock private ConnectivityManager mConnectivityManager; - @Mock private NetworkInfo mNetworkInfo; + @Mock private TelephonyManager mMockTelephonyManager; + @Mock private ImsEntitlementApi mMockActivationApi; + @Mock private WfcActivationUi mMockActivationUi; + @Mock private ConnectivityManager mMockConnectivityManager; + @Mock private NetworkInfo mMockNetworkInfo; + @Mock private ImsUtils mMockImsUtils; + @Mock private MetricsLogger mMockMetricsLogger; private static final int SUB_ID = 1; + private static final int CARRIER_ID = 1234; private static final String EMERGENCY_ADDRESS_WEB_URL = "webUrl"; private static final String EMERGENCY_ADDRESS_WEB_DATA = "webData"; - private static final String TERMS_AND_CONDITION_WEB_URL = "tncUrl"; - private static final String WEBVIEW_JS_CONTROLLER_NAME = "webviewJsControllerName"; private WfcActivationController mWfcActivationController; private Context mContext; - private Instrumentation mInstrumentation; @Before public void setUp() throws Exception { mContext = spy(ApplicationProvider.getApplicationContext()); - when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); - when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mMockTelephonyManager); + when(mMockTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn( + mMockTelephonyManager); setNetworkConnected(true); Field field = Executors.class.getDeclaredField("sUseDirectExecutorForTest"); @@ -87,7 +95,7 @@ public class WfcActivationControllerTest { @Test public void startFlow_launchAppForActivation_setPurposeActivation() { - InOrder mOrderVerifier = inOrder(mActivationUi); + InOrder mOrderVerifier = inOrder(mMockActivationUi); setNetworkConnected(false); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); @@ -102,7 +110,7 @@ public class WfcActivationControllerTest { @Test public void startFlow_launchAppForUpdate_setPurposeUpdate() { - InOrder mOrderVerifier = inOrder(mActivationUi); + InOrder mOrderVerifier = inOrder(mMockActivationUi); setNetworkConnected(false); buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); @@ -114,7 +122,7 @@ public class WfcActivationControllerTest { @Test public void startFlow_launchAppForShowTc_setPurposeUpdate() { - InOrder mOrderVerifier = inOrder(mActivationUi); + InOrder mOrderVerifier = inOrder(mMockActivationUi); setNetworkConnected(false); buildActivity(ActivityConstants.LAUNCH_APP_SHOW_TC); @@ -129,14 +137,14 @@ public class WfcActivationControllerTest { @Test public void finishFlow_isFinishing_showGeneralWaitingUi() { - InOrder mOrderVerifier = inOrder(mActivationUi); - when(mActivationApi.checkEntitlementStatus()).thenReturn(null); + InOrder mOrderVerifier = inOrder(mMockActivationUi); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(null); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.finishFlow(); mOrderVerifier - .verify(mActivationUi) + .verify(mMockActivationUi) .showActivationUi( R.string.activate_title, R.string.progress_text, @@ -145,7 +153,7 @@ public class WfcActivationControllerTest { Activity.RESULT_CANCELED, 0); mOrderVerifier - .verify(mActivationUi) + .verify(mMockActivationUi) .showActivationUi( R.string.activate_title, R.string.wfc_activation_error, @@ -156,8 +164,105 @@ public class WfcActivationControllerTest { } @Test + public void finishFlow_startForUpdate_showGeneralWaitingUi() { + when(mMockActivationApi.checkEntitlementStatus()).thenReturn( + EntitlementResult + .builder() + .setVowifiStatus( + Ts43VowifiStatus + .builder() + .setEntitlementStatus(EntitlementStatus.ENABLED) + .setProvStatus(ProvStatus.PROVISIONED) + .setTcStatus(TcStatus.AVAILABLE) + .setAddrStatus(AddrStatus.AVAILABLE) + .build()) + .build()); + setNetworkConnected(false); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID); + intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, + ActivityConstants.LAUNCH_APP_UPDATE); + mWfcActivationController = + new WfcActivationController( + mContext, + mMockActivationUi, + mMockActivationApi, + null, + mMockImsUtils, + mMockMetricsLogger); + + mWfcActivationController.finishFlow(); + + verify(mMockActivationUi).setResultAndFinish(eq(Activity.RESULT_OK)); + } + + @Test + public void finish_startFlowForActivate_writeLoggerPurposeActivation() { + when(mMockTelephonyManager.getSimCarrierId()).thenReturn(CARRIER_ID); + when(mMockTelephonyManager.getSimSpecificCarrierId()).thenReturn(CARRIER_ID); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID); + intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, + ActivityConstants.LAUNCH_APP_ACTIVATE); + mWfcActivationController = + new WfcActivationController( + mContext, + mMockActivationUi, + mMockActivationApi, + intent, + mMockImsUtils, + mMockMetricsLogger); + + mWfcActivationController.startFlow(); + mWfcActivationController.finish(); + + verify(mMockMetricsLogger).start(eq(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION)); + verify(mMockMetricsLogger).write( + eq(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI), + eq(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__FAILED)); + } + + @Test + public void finish_entitlementResultWfcEntitled_writeLoggerAppResultSuccessful() { + when(mMockTelephonyManager.getSimCarrierId()).thenReturn(CARRIER_ID); + when(mMockTelephonyManager.getSimSpecificCarrierId()).thenReturn(CARRIER_ID); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID); + intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, + ActivityConstants.LAUNCH_APP_ACTIVATE); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn( + EntitlementResult + .builder() + .setVowifiStatus( + Ts43VowifiStatus + .builder() + .setEntitlementStatus(EntitlementStatus.ENABLED) + .setProvStatus(ProvStatus.PROVISIONED) + .setTcStatus(TcStatus.AVAILABLE) + .setAddrStatus(AddrStatus.AVAILABLE) + .build()) + .build()); + mWfcActivationController = + new WfcActivationController( + mContext, + mMockActivationUi, + mMockActivationApi, + intent, + mMockImsUtils, + mMockMetricsLogger); + + mWfcActivationController.startFlow(); + mWfcActivationController.finish(); + + verify(mMockMetricsLogger).start(eq(IMS_SERVICE_ENTITLEMENT_UPDATED__PURPOSE__ACTIVATION)); + verify(mMockMetricsLogger).write( + eq(IMS_SERVICE_ENTITLEMENT_UPDATED__SERVICE_TYPE__VOWIFI), + eq(IMS_SERVICE_ENTITLEMENT_UPDATED__APP_RESULT__SUCCESSFUL)); + } + + @Test public void handleEntitlementStatusForActivation_isVowifiEntitledTrue_setActivityResultOk() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() @@ -167,17 +272,17 @@ public class WfcActivationControllerTest { .setProvStatus(ProvStatus.PROVISIONED) .build()) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.evaluateEntitlementStatus(); - verify(mActivationUi).setResultAndFinish(Activity.RESULT_OK); + verify(mMockActivationUi).setResultAndFinish(Activity.RESULT_OK); } @Test public void handleEntitlementStatusForActivation_isServerDataMissingTrue_showWebview() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() @@ -188,24 +293,45 @@ public class WfcActivationControllerTest { .setEmergencyAddressWebUrl(EMERGENCY_ADDRESS_WEB_URL) .setEmergencyAddressWebData(EMERGENCY_ADDRESS_WEB_DATA) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); + + mWfcActivationController.evaluateEntitlementStatus(); + + verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, + EMERGENCY_ADDRESS_WEB_DATA); + } + + @Test + public void handleEntitlementStatusForActivation_showTc_showWebview() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.DISABLED) + .setTcStatus(TcStatus.NOT_AVAILABLE) + .setAddrStatus(AddrStatus.NOT_AVAILABLE) + .build()) + .setTermsAndConditionsWebUrl(EMERGENCY_ADDRESS_WEB_URL) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.evaluateEntitlementStatus(); - verify(mActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, EMERGENCY_ADDRESS_WEB_DATA); + verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, null); } @Test public void handleEntitlementStatusForActivation_isIncompatibleTrue_showErrorUi() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() .setEntitlementStatus(EntitlementStatus.INCOMPATIBLE) .build()) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.evaluateEntitlementStatus(); @@ -215,7 +341,7 @@ public class WfcActivationControllerTest { @Test public void handleEntitlementStatusForActivation_unexpectedStatus_showGeneralErrorUi() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() @@ -224,7 +350,7 @@ public class WfcActivationControllerTest { .setAddrStatus(AddrStatus.IN_PROGRESS) .build()) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.evaluateEntitlementStatus(); @@ -234,7 +360,7 @@ public class WfcActivationControllerTest { @Test public void handleEntitlementStatusAfterActivation_isVowifiEntitledTrue_setActivityResultOk() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() @@ -244,17 +370,17 @@ public class WfcActivationControllerTest { .setProvStatus(ProvStatus.PROVISIONED) .build()) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.reevaluateEntitlementStatus(); - verify(mActivationUi).setResultAndFinish(Activity.RESULT_OK); + verify(mMockActivationUi).setResultAndFinish(Activity.RESULT_OK); } @Test public void handleEntitlementStatusAfterActivation_unexpectedStatus_showGeneralErrorUi() { - EntitlementResult mEntitlementResult = + EntitlementResult entitlementResult = EntitlementResult.builder() .setVowifiStatus( Ts43VowifiStatus.builder() @@ -263,7 +389,7 @@ public class WfcActivationControllerTest { .setAddrStatus(AddrStatus.IN_PROGRESS) .build()) .build(); - when(mActivationApi.checkEntitlementStatus()).thenReturn(mEntitlementResult); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); buildActivity(ActivityConstants.LAUNCH_APP_ACTIVATE); mWfcActivationController.reevaluateEntitlementStatus(); @@ -271,24 +397,174 @@ public class WfcActivationControllerTest { verifyErrorUi(R.string.activate_title, R.string.wfc_activation_error); } + @Test + public void handleEntitlementStatusAfterUpdating_entitlementStatusEnabled_setResultOk() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.ENABLED) + .setTcStatus(TcStatus.AVAILABLE) + .setAddrStatus(AddrStatus.AVAILABLE) + .setProvStatus(ProvStatus.PROVISIONED) + .build()) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); + + mWfcActivationController.reevaluateEntitlementStatus(); + + verify(mMockActivationUi).setResultAndFinish(eq(Activity.RESULT_OK)); + } + + @Test + public void handleEntitlementStatusAfterUpdating_entitlementStatusNoServerData_turnOffWfc() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.DISABLED) + .setTcStatus(TcStatus.NOT_AVAILABLE) + .setAddrStatus(AddrStatus.NOT_AVAILABLE) + .build()) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID); + intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, + ActivityConstants.LAUNCH_APP_UPDATE); + mWfcActivationController = + new WfcActivationController( + mContext, + mMockActivationUi, + mMockActivationApi, + intent, + mMockImsUtils, + mMockMetricsLogger); + + mWfcActivationController.reevaluateEntitlementStatus(); + + verify(mMockImsUtils).turnOffWfc(any()); + } + + @Test + public void handleEntitlementStatusAfterUpdating_unexpectedStatus_showGeneralErrorUi() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.DISABLED) + .setTcStatus(TcStatus.IN_PROGRESS) + .setAddrStatus(AddrStatus.IN_PROGRESS) + .build()) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); + + mWfcActivationController.reevaluateEntitlementStatus(); + + verifyErrorUi(R.string.e911_title, R.string.address_update_error); + } + + @Test + public void handleEntitlementStatusForUpdate_serviceEntitled_showWebview() { + when(mMockActivationApi.checkEntitlementStatus()).thenReturn( + EntitlementResult + .builder() + .setVowifiStatus( + Ts43VowifiStatus + .builder() + .setEntitlementStatus(EntitlementStatus.ENABLED) + .setProvStatus(ProvStatus.PROVISIONED) + .setTcStatus(TcStatus.AVAILABLE) + .setAddrStatus(AddrStatus.AVAILABLE) + .build()) + .setEmergencyAddressWebUrl(EMERGENCY_ADDRESS_WEB_URL) + .setEmergencyAddressWebData(EMERGENCY_ADDRESS_WEB_DATA) + .build()); + buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); + + mWfcActivationController.evaluateEntitlementStatus(); + + verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, + EMERGENCY_ADDRESS_WEB_DATA); + } + + @Test + public void handleEntitlementStatusForUpdate_showTc_showWebview() { + when(mMockActivationApi.checkEntitlementStatus()).thenReturn( + EntitlementResult + .builder() + .setVowifiStatus( + Ts43VowifiStatus + .builder() + .setEntitlementStatus(EntitlementStatus.ENABLED) + .setProvStatus(ProvStatus.PROVISIONED) + .setTcStatus(TcStatus.AVAILABLE) + .setAddrStatus(AddrStatus.AVAILABLE) + .build()) + .setTermsAndConditionsWebUrl(EMERGENCY_ADDRESS_WEB_URL) + .build()); + buildActivity(ActivityConstants.LAUNCH_APP_SHOW_TC); + + mWfcActivationController.evaluateEntitlementStatus(); + + verify(mMockActivationUi).showWebview(EMERGENCY_ADDRESS_WEB_URL, null); + } + + @Test + public void handleEntitlementStatusForUpdate_entitlementStatusIncompatible_showErrorUi() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.INCOMPATIBLE) + .build()) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); + + mWfcActivationController.evaluateEntitlementStatus(); + + verifyErrorUi(R.string.e911_title, R.string.failure_contact_carrier); + } + + @Test + public void handleEntitlementStatusForUpdate_entitlementStatusDisabled_showGenericErrorUi() { + EntitlementResult entitlementResult = + EntitlementResult.builder() + .setVowifiStatus( + Ts43VowifiStatus.builder() + .setEntitlementStatus(EntitlementStatus.DISABLED) + .build()) + .build(); + when(mMockActivationApi.checkEntitlementStatus()).thenReturn(entitlementResult); + buildActivity(ActivityConstants.LAUNCH_APP_UPDATE); + + mWfcActivationController.evaluateEntitlementStatus(); + + verifyErrorUi(R.string.e911_title, R.string.address_update_error); + } + private void buildActivity(int extraLaunchCarrierApp) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.putExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, SUB_ID); intent.putExtra(ActivityConstants.EXTRA_LAUNCH_CARRIER_APP, extraLaunchCarrierApp); mWfcActivationController = - new WfcActivationController(mContext, mActivationUi, mActivationApi, intent); + new WfcActivationController(mContext, mMockActivationUi, mMockActivationApi, + intent); } private void setNetworkConnected(boolean isConnected) { - when(mNetworkInfo.isConnected()).thenReturn(isConnected); + when(mMockNetworkInfo.isConnected()).thenReturn(isConnected); when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn( - mConnectivityManager); - when(mConnectivityManager.getActiveNetworkInfo()).thenReturn(mNetworkInfo); - when(mNetworkInfo.isConnected()).thenReturn(isConnected); + mMockConnectivityManager); + when(mMockConnectivityManager.getActiveNetworkInfo()).thenReturn(mMockNetworkInfo); + when(mMockNetworkInfo.isConnected()).thenReturn(isConnected); } private void verifyErrorUi(int title, int errorMesssage) { - verify(mActivationUi) + verify(mMockActivationUi) .showActivationUi( title, errorMesssage, @@ -298,7 +574,7 @@ public class WfcActivationControllerTest { } private void verifyErrorUiInOrder(InOrder inOrder, int title, int errorMesssage) { - inOrder.verify(mActivationUi) + inOrder.verify(mMockActivationUi) .showActivationUi( title, errorMesssage, @@ -308,7 +584,7 @@ public class WfcActivationControllerTest { } private void verifyGeneralWaitingUiInOrder(InOrder inOrder, int title) { - inOrder.verify(mActivationUi) + inOrder.verify(mMockActivationUi) .showActivationUi(title, R.string.progress_text, true, 0, 0, 0); } } diff --git a/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java b/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java new file mode 100644 index 0000000..bd5397b --- /dev/null +++ b/tests/unittests/src/com/android/imsserviceentitlement/utils/ImsUtilsTest.java @@ -0,0 +1,72 @@ +/* + * 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.imsserviceentitlement.utils; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.os.PersistableBundle; +import android.telephony.CarrierConfigManager; +import android.telephony.SubscriptionManager; +import android.telephony.ims.ImsMmTelManager; +import android.telephony.ims.ProvisioningManager; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidJUnit4.class) +public class ImsUtilsTest { + @Rule public final MockitoRule rule = MockitoJUnit.rule(); + + @Mock CarrierConfigManager mMockCarrierConfigManager; + @Mock ImsMmTelManager mMockImsMmTelManager; + @Mock ProvisioningManager mMockProvisioningManager; + + private Context mContext = ApplicationProvider.getApplicationContext(); + + @Test + public void isWfcEnabledByUser_invalidSubId_defaultValues() { + ImsUtils imsUtils = + ImsUtils.getInstance(mContext, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + + assertThat(imsUtils.isWfcEnabledByUser()).isFalse(); + } + + @Test + public void disableAndResetVoWiFiImsSettings_hasCarrierConfig_() { + PersistableBundle carrierConfig = new PersistableBundle(); + carrierConfig.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_MODE_INT, 1); + carrierConfig.putInt(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ROAMING_MODE_INT, 2); + ImsUtils imsUtils = + new ImsUtils(carrierConfig, mMockImsMmTelManager, mMockProvisioningManager); + + imsUtils.disableAndResetVoWiFiImsSettings(); + + verify(mMockImsMmTelManager).setVoWiFiModeSetting(eq(1)); + verify(mMockImsMmTelManager).setVoWiFiRoamingModeSetting(eq(2)); + } +} |