From 049aa73cb1018dcbfea10650dec26e3a0de2d552 Mon Sep 17 00:00:00 2001 From: Calvin Pan Date: Mon, 25 Apr 2022 11:29:39 +0000 Subject: [PATCH] Add unit test for AppLocalePickerActivity Bug: 223503670 Test: atest Change-Id: I0e92be43d661dd3bff19c3274d1572ef1f4e9c46 --- .../localepicker/AppLocalePickerActivity.java | 8 +- .../AppLocalePickerActivityTest.java | 118 ++++++++++++++++++ 2 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index 4700f3f5383..1ed6f5be3b1 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -30,7 +30,6 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.ListView; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.LocalePickerWithRegion; import com.android.internal.app.LocaleStore; import com.android.settings.R; @@ -38,10 +37,6 @@ import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.core.SettingsBaseActivity; -/** - * TODO(b/223503670): Add unit test for AppLocalePickerActivity. - * A activity to show the locale picker and information page. - */ public class AppLocalePickerActivity extends SettingsBaseActivity implements LocalePickerWithRegion.LocaleSelectedListener { private static final String TAG = AppLocalePickerActivity.class.getSimpleName(); @@ -128,8 +123,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity return appLocaleDetailsContainer; } - @VisibleForTesting - void launchLocalePickerPage() { + private void launchLocalePickerPage() { // LocalePickerWithRegion use android.app.ListFragment. Thus, it can not use // getSupportFragmentManager() to add this into container. android.app.FragmentManager fragmentManager = getFragmentManager(); diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java new file mode 100644 index 00000000000..4d5e0b98172 --- /dev/null +++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.localepicker; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Activity; +import android.app.ApplicationPackageManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.InstallSourceInfo; +import android.net.Uri; +import android.os.Process; +import android.os.UserHandle; +import android.telephony.TelephonyManager; + +import androidx.fragment.app.Fragment; + +import com.android.settings.R; +import com.android.settings.applications.AppInfoBase; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.shadows.ShadowTelephonyManager; + +@RunWith(RobolectricTestRunner.class) +@Config( + shadows = { + AppLocalePickerActivityTest.ShadowApplicationPackageManager.class, + }) +public class AppLocalePickerActivityTest { + private static final String TEST_PACKAGE_NAME = "com.android.settings"; + private static final Uri TEST_PACKAGE_URI = Uri.parse("package:" + TEST_PACKAGE_NAME); + + @Rule + public MockitoRule rule = MockitoJUnit.rule(); + + @Test + public void launchAppLocalePickerActivity_hasPackageName_success() { + ActivityController controller = + initActivityController(true); + + controller.create(); + + assertThat(controller.get().isFinishing()).isFalse(); + } + + @Test + public void launchAppLocalePickerActivity_intentWithoutPackageName_failed() { + ActivityController controller = + initActivityController(false); + + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + private ActivityController initActivityController( + boolean hasPackageName) { + Intent data = new Intent(); + if (hasPackageName) { + data.setData(TEST_PACKAGE_URI); + } + data.putExtra(AppInfoBase.ARG_PACKAGE_UID, UserHandle.getUserId(Process.myUid())); + ActivityController activityController = + Robolectric.buildActivity(TestAppLocalePickerActivity.class, data); + Activity activity = activityController.get(); + + ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf( + activity.getSystemService(TelephonyManager.class)); + shadowTelephonyManager.setSimCountryIso("US"); + shadowTelephonyManager.setNetworkCountryIso("US"); + + return activityController; + } + + private static class TestAppLocalePickerActivity extends AppLocalePickerActivity { + @Override + public Context createContextAsUser(UserHandle user, int flags) { + // return the current context as a work profile + return this; + } + } + + @Implements(ApplicationPackageManager.class) + public static class ShadowApplicationPackageManager extends + org.robolectric.shadows.ShadowApplicationPackageManager { + + @Implementation + protected Object getInstallSourceInfo(String packageName) { + return new InstallSourceInfo("", null, null, ""); + } + } +}