diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java index 4bcc15fba43..10cf413f2b8 100644 --- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java +++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java @@ -21,7 +21,6 @@ import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -36,11 +35,8 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.content.pm.PackageItemInfo; -import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.graphics.drawable.ColorDrawable; -import android.os.UserManager; import android.webkit.UserPackage; import androidx.fragment.app.FragmentActivity; @@ -49,17 +45,18 @@ import com.android.settings.widget.RadioButtonPreference; import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowPackageManager; +import org.robolectric.shadows.ShadowUserManager; import org.robolectric.util.ReflectionHelpers; import java.util.Arrays; @@ -68,34 +65,40 @@ import java.util.Collections; @RunWith(RobolectricTestRunner.class) public class WebViewAppPickerTest { - private final static String DEFAULT_PACKAGE_NAME = "DEFAULT_PACKAGE_NAME"; - - private Context mContext; - - private UserInfo mFirstUser; - private UserInfo mSecondUser; + private final static String PACKAGE_NAME = "com.example.test"; + private final static String PACKAGE_VERSION = "1.0.0"; @Mock private FragmentActivity mActivity; - @Mock - private UserManager mUserManager; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private PackageManager mPackageManager; + private Context mContext; + private UserInfo mFirstUser; + private UserInfo mSecondUser; + private ShadowPackageManager mPackageManager; private WebViewAppPicker mPicker; private WebViewUpdateServiceWrapper mWvusWrapper; - - private static ApplicationInfo createApplicationInfo(String packageName) { - ApplicationInfo ai = new ApplicationInfo(); - ai.packageName = packageName; - return ai; - } + private ShadowUserManager mUserManager; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - doReturn(mUserManager).when(mContext).getSystemService(Context.USER_SERVICE); + mUserManager = Shadow.extract(mContext.getSystemService(Context.USER_SERVICE)); + mPackageManager = Shadows.shadowOf(mContext.getPackageManager()); + + final ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.name = PACKAGE_NAME; + applicationInfo.uid = 0; + applicationInfo.flags = 0; + applicationInfo.packageName = PACKAGE_NAME; + + final PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = PACKAGE_NAME; + packageInfo.applicationInfo = applicationInfo; + packageInfo.versionName = PACKAGE_VERSION; + mPackageManager.addPackage(packageInfo); + mPackageManager.setUnbadgedApplicationIcon(PACKAGE_NAME, new ColorDrawable()); + mFirstUser = new UserInfo(0, "FIRST_USER", 0); mSecondUser = new UserInfo(0, "SECOND_USER", 0); mPicker = new WebViewAppPicker(); @@ -104,13 +107,17 @@ public class WebViewAppPickerTest { doNothing().when(mPicker).updateCheckedState(any()); doReturn(mActivity).when(mPicker).getActivity(); - ReflectionHelpers.setField(mPicker, "mPm", mPackageManager); ReflectionHelpers.setField(mPicker, "mMetricsFeatureProvider", mock(MetricsFeatureProvider.class)); mWvusWrapper = mock(WebViewUpdateServiceWrapper.class); mPicker.setWebViewUpdateServiceWrapper(mWvusWrapper); } + @After + public void tearDown() { + mPackageManager.removePackage(PACKAGE_NAME); + } + @Test public void testClickingItemChangesProvider() { testSuccessfulClickChangesProvider(); @@ -134,105 +141,70 @@ public class WebViewAppPickerTest { testFailingClick(); } - private void useWebViewSettingIntent() { - Intent intent = new Intent(ACTION_WEBVIEW_SETTINGS); - when(mActivity.getIntent()).thenReturn(intent); - } - - private void testSuccessfulClickChangesProvider() { - when(mWvusWrapper.getValidWebViewApplicationInfos(any())) - .thenReturn(Collections.singletonList(createApplicationInfo(DEFAULT_PACKAGE_NAME))); - when(mWvusWrapper.setWebViewProvider(eq(DEFAULT_PACKAGE_NAME))).thenReturn(true); - - RadioButtonPreference defaultPackagePref = mock(RadioButtonPreference.class); - when(defaultPackagePref.getKey()).thenReturn(DEFAULT_PACKAGE_NAME); - mPicker.onRadioButtonClicked(defaultPackagePref); - - verify(mWvusWrapper, times(1)).setWebViewProvider(eq(DEFAULT_PACKAGE_NAME)); - verify(mPicker, times(1)).updateCheckedState(DEFAULT_PACKAGE_NAME); - verify(mWvusWrapper, never()).showInvalidChoiceToast(any()); - } - - private void testFailingClickUpdatesSetting() { - when(mWvusWrapper.getValidWebViewApplicationInfos(any())) - .thenReturn(Collections.singletonList(createApplicationInfo(DEFAULT_PACKAGE_NAME))); - when(mWvusWrapper.setWebViewProvider(eq(DEFAULT_PACKAGE_NAME))).thenReturn(false); - - RadioButtonPreference defaultPackagePref = mock(RadioButtonPreference.class); - when(defaultPackagePref.getKey()).thenReturn(DEFAULT_PACKAGE_NAME); - mPicker.onRadioButtonClicked(defaultPackagePref); - - verify(mWvusWrapper, times(1)).setWebViewProvider(eq(DEFAULT_PACKAGE_NAME)); - // Ensure we update the list of packages when we click a non-valid package - the list must - // have changed, otherwise this click wouldn't fail. - verify(mPicker, times(1)).updateCandidates(); - verify(mWvusWrapper, times(1)).showInvalidChoiceToast(any()); - } - @Test - @Ignore public void testDisabledPackageShownAsDisabled() { - DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mPackageManager, - createApplicationInfo(DEFAULT_PACKAGE_NAME), "disabled"); + DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, + mContext.getPackageManager(), + createApplicationInfo(PACKAGE_NAME), "disabled"); RadioButtonPreference preference = mock(RadioButtonPreference.class); - mPicker.bindPreference(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null); - mPicker.bindPreferenceExtra(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null); + mPicker.bindPreference(preference, PACKAGE_NAME, webviewAppInfo, null); + mPicker.bindPreferenceExtra(preference, PACKAGE_NAME, webviewAppInfo, null, null); verify(preference, times(1)).setEnabled(eq(false)); verify(preference, never()).setEnabled(eq(true)); } @Test - @Ignore public void testEnabledPackageShownAsEnabled() { String disabledReason = ""; - DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mPackageManager, - createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason); + DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, + mContext.getPackageManager(), + createApplicationInfo(PACKAGE_NAME), disabledReason); RadioButtonPreference preference = mock(RadioButtonPreference.class); - mPicker.bindPreference(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null); - mPicker.bindPreferenceExtra(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null); + mPicker.bindPreference(preference, PACKAGE_NAME, webviewAppInfo, null); + mPicker.bindPreferenceExtra(preference, PACKAGE_NAME, webviewAppInfo, null, null); verify(preference, times(1)).setEnabled(eq(true)); verify(preference, never()).setEnabled(eq(false)); } @Test - @Ignore public void testDisabledPackageShowsDisabledReasonSummary() { String disabledReason = "disabled"; - DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mPackageManager, - createApplicationInfo(DEFAULT_PACKAGE_NAME), disabledReason); + DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, + mContext.getPackageManager(), + createApplicationInfo(PACKAGE_NAME), disabledReason); RadioButtonPreference preference = mock(RadioButtonPreference.class); - mPicker.bindPreference(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null); - mPicker.bindPreferenceExtra(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null); + mPicker.bindPreference(preference, PACKAGE_NAME, webviewAppInfo, null); + mPicker.bindPreferenceExtra(preference, PACKAGE_NAME, webviewAppInfo, null, null); verify(preference, times(1)).setSummary(eq(disabledReason)); // Ensure we haven't called setSummary several times. verify(preference, times(1)).setSummary(any()); } @Test - @Ignore public void testEnabledPackageShowsEmptySummary() { - DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mPackageManager, - createApplicationInfo(DEFAULT_PACKAGE_NAME), null); + DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, + mContext.getPackageManager(), + createApplicationInfo(PACKAGE_NAME), null); RadioButtonPreference preference = mock(RadioButtonPreference.class); - mPicker.bindPreference(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null); - mPicker.bindPreferenceExtra(preference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null); + mPicker.bindPreference(preference, PACKAGE_NAME, webviewAppInfo, null); + mPicker.bindPreferenceExtra(preference, PACKAGE_NAME, webviewAppInfo, null, null); verify(preference, never()).setSummary(any()); } @Test public void testFinishIfNotAdmin() { - doReturn(false).when(mUserManager).isAdminUser(); + mUserManager.setIsAdminUser(false); mPicker.onAttach(mContext); verify(mActivity, times(1)).finish(); } @Test public void testNotFinishedIfAdmin() { - doReturn(true).when(mUserManager).isAdminUser(); + mUserManager.setIsAdminUser(true); mPicker.onAttach(mContext); verify(mActivity, never()).finish(); } @@ -248,10 +220,10 @@ public class WebViewAppPickerTest { when(packageForSecondUser.isInstalledPackage()).thenReturn(true); WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class); - when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME))) + when(wvusWrapper.getPackageInfosAllUsers(any(), eq(PACKAGE_NAME))) .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser)); - assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)).isNull(); + assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, PACKAGE_NAME)).isNull(); } @Test @@ -262,11 +234,11 @@ public class WebViewAppPickerTest { when(packageForFirstUser.getUserInfo()).thenReturn(mFirstUser); WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class); - when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME))) + when(wvusWrapper.getPackageInfosAllUsers(any(), eq(PACKAGE_NAME))) .thenReturn(Collections.singletonList(packageForFirstUser)); final String expectedReason = String.format("(disabled for user %s)", mFirstUser.name); - assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)) + assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, PACKAGE_NAME)) .isEqualTo(expectedReason); } @@ -278,11 +250,11 @@ public class WebViewAppPickerTest { when(packageForFirstUser.getUserInfo()).thenReturn(mFirstUser); WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class); - when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME))) + when(wvusWrapper.getPackageInfosAllUsers(any(), eq(PACKAGE_NAME))) .thenReturn(Collections.singletonList(packageForFirstUser)); final String expectedReason = String.format("(uninstalled for user %s)", mFirstUser.name); - assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)) + assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, PACKAGE_NAME)) .isEqualTo(expectedReason); } @@ -299,11 +271,11 @@ public class WebViewAppPickerTest { when(packageForSecondUser.getUserInfo()).thenReturn(mSecondUser); WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class); - when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME))) + when(wvusWrapper.getPackageInfosAllUsers(any(), eq(PACKAGE_NAME))) .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser)); final String expectedReason = String.format("(disabled for user %s)", mFirstUser.name); - assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)) + assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, PACKAGE_NAME)) .isEqualTo(expectedReason); } @@ -324,11 +296,11 @@ public class WebViewAppPickerTest { when(packageForSecondUser.getUserInfo()).thenReturn(mSecondUser); WebViewUpdateServiceWrapper wvusWrapper = mock(WebViewUpdateServiceWrapper.class); - when(wvusWrapper.getPackageInfosAllUsers(any(), eq(DEFAULT_PACKAGE_NAME))) + when(wvusWrapper.getPackageInfosAllUsers(any(), eq(PACKAGE_NAME))) .thenReturn(Arrays.asList(packageForFirstUser, packageForSecondUser)); final String expectedReason = String.format("(uninstalled for user %s)", mFirstUser.name); - assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, DEFAULT_PACKAGE_NAME)) + assertThat(mPicker.getDisabledReason(wvusWrapper, mContext, PACKAGE_NAME)) .isEqualTo(expectedReason); } @@ -337,29 +309,58 @@ public class WebViewAppPickerTest { * preference title. */ @Test - public void testWebViewVersionAddedAfterLabel() throws PackageManager.NameNotFoundException { - PackageItemInfo mockPackageItemInfo = mock(PackageItemInfo.class); - mockPackageItemInfo.packageName = DEFAULT_PACKAGE_NAME; - when(mockPackageItemInfo.loadLabel(any())).thenReturn("myPackage"); - DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mPackageManager, - mockPackageItemInfo, "" /* disabledReason */); + public void testWebViewVersionAddedAfterLabel() { + final DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, + mContext.getPackageManager(), + createApplicationInfo(PACKAGE_NAME), "" /* disabledReason */); - PackageInfo packageInfo = new PackageInfo(); - packageInfo.versionName = "myVersionName"; - when(mPackageManager.getPackageInfo(eq(DEFAULT_PACKAGE_NAME), anyInt())).thenReturn( - packageInfo); + final RadioButtonPreference mockPreference = mock(RadioButtonPreference.class); + mPicker.bindPreference(mockPreference, PACKAGE_NAME, webviewAppInfo, null); + mPicker.bindPreferenceExtra( + mockPreference, PACKAGE_NAME, webviewAppInfo, null, null); - // Subvert attempts to load an unbadged icon for the application. - PackageManager pm = RuntimeEnvironment.application.getPackageManager(); - ShadowPackageManager spm = Shadows.shadowOf(pm); - spm.setUnbadgedApplicationIcon(DEFAULT_PACKAGE_NAME, new ColorDrawable()); + verify(mockPreference).setTitle(eq(PACKAGE_NAME + " " + PACKAGE_VERSION)); + verify(mockPreference).setTitle(any()); + } - RadioButtonPreference mockPreference = mock(RadioButtonPreference.class); - mPicker.bindPreference(mockPreference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null); - mPicker - .bindPreferenceExtra(mockPreference, DEFAULT_PACKAGE_NAME, webviewAppInfo, null, - null); - verify(mockPreference, times(1)).setTitle(eq("myPackage myVersionName")); - verify(mockPreference, times(1)).setTitle(any()); + private static ApplicationInfo createApplicationInfo(String packageName) { + ApplicationInfo ai = new ApplicationInfo(); + ai.packageName = packageName; + return ai; + } + + private void useWebViewSettingIntent() { + Intent intent = new Intent(ACTION_WEBVIEW_SETTINGS); + when(mActivity.getIntent()).thenReturn(intent); + } + + private void testSuccessfulClickChangesProvider() { + when(mWvusWrapper.getValidWebViewApplicationInfos(any())) + .thenReturn(Collections.singletonList(createApplicationInfo(PACKAGE_NAME))); + when(mWvusWrapper.setWebViewProvider(eq(PACKAGE_NAME))).thenReturn(true); + + RadioButtonPreference defaultPackagePref = mock(RadioButtonPreference.class); + when(defaultPackagePref.getKey()).thenReturn(PACKAGE_NAME); + mPicker.onRadioButtonClicked(defaultPackagePref); + + verify(mWvusWrapper, times(1)).setWebViewProvider(eq(PACKAGE_NAME)); + verify(mPicker, times(1)).updateCheckedState(PACKAGE_NAME); + verify(mWvusWrapper, never()).showInvalidChoiceToast(any()); + } + + private void testFailingClickUpdatesSetting() { + when(mWvusWrapper.getValidWebViewApplicationInfos(any())) + .thenReturn(Collections.singletonList(createApplicationInfo(PACKAGE_NAME))); + when(mWvusWrapper.setWebViewProvider(eq(PACKAGE_NAME))).thenReturn(false); + + RadioButtonPreference defaultPackagePref = mock(RadioButtonPreference.class); + when(defaultPackagePref.getKey()).thenReturn(PACKAGE_NAME); + mPicker.onRadioButtonClicked(defaultPackagePref); + + verify(mWvusWrapper, times(1)).setWebViewProvider(eq(PACKAGE_NAME)); + // Ensure we update the list of packages when we click a non-valid package - the list must + // have changed, otherwise this click wouldn't fail. + verify(mPicker, times(1)).updateCandidates(); + verify(mWvusWrapper, times(1)).showInvalidChoiceToast(any()); } }