Loading tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java +116 −115 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); } Loading @@ -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 Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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 */); PackageInfo packageInfo = new PackageInfo(); packageInfo.versionName = "myVersionName"; when(mPackageManager.getPackageInfo(eq(DEFAULT_PACKAGE_NAME), anyInt())).thenReturn( packageInfo); // 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()); 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()); public void testWebViewVersionAddedAfterLabel() { final DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mContext.getPackageManager(), createApplicationInfo(PACKAGE_NAME), "" /* disabledReason */); final RadioButtonPreference mockPreference = mock(RadioButtonPreference.class); mPicker.bindPreference(mockPreference, PACKAGE_NAME, webviewAppInfo, null); mPicker.bindPreferenceExtra( mockPreference, PACKAGE_NAME, webviewAppInfo, null, null); verify(mockPreference).setTitle(eq(PACKAGE_NAME + " " + PACKAGE_VERSION)); verify(mockPreference).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()); } } Loading
tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java +116 −115 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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(); Loading @@ -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(); Loading @@ -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(); } Loading @@ -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 Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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); } Loading @@ -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 */); PackageInfo packageInfo = new PackageInfo(); packageInfo.versionName = "myVersionName"; when(mPackageManager.getPackageInfo(eq(DEFAULT_PACKAGE_NAME), anyInt())).thenReturn( packageInfo); // 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()); 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()); public void testWebViewVersionAddedAfterLabel() { final DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(mContext, mContext.getPackageManager(), createApplicationInfo(PACKAGE_NAME), "" /* disabledReason */); final RadioButtonPreference mockPreference = mock(RadioButtonPreference.class); mPicker.bindPreference(mockPreference, PACKAGE_NAME, webviewAppInfo, null); mPicker.bindPreferenceExtra( mockPreference, PACKAGE_NAME, webviewAppInfo, null, null); verify(mockPreference).setTitle(eq(PACKAGE_NAME + " " + PACKAGE_VERSION)); verify(mockPreference).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()); } }