diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/ui/android/junit | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/ui/android/junit')
7 files changed, 349 insertions, 26 deletions
diff --git a/chromium/ui/android/junit/AndroidManifest.xml b/chromium/ui/android/junit/AndroidManifest.xml new file mode 100644 index 00000000000..26fe399d700 --- /dev/null +++ b/chromium/ui/android/junit/AndroidManifest.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2020 The Chromium Authors. All rights reserved. + Use of this source code is governed by a BSD-style license that can be + found in the LICENSE file. +--> + +<!-- This manifest is required for tests using + androidx.test.core.app.ActivityScenario to work. +--> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.chromium.test.ui"> + + <!-- Value used by ActivityAndroidPermissionDelegateTest --> + <uses-permission android:name="android.permission.INTERNET"/> + + <application android:theme="@style/Theme.AppCompat.Light"> + <activity android:name="org.chromium.ui.base.TestActivity"/> + </application> +</manifest> diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java new file mode 100644 index 00000000000..1df70151bcb --- /dev/null +++ b/chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java @@ -0,0 +1,260 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.ui.base; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import android.content.pm.PackageManager; + +import androidx.test.core.app.ActivityScenario; +import androidx.test.ext.junit.rules.ActivityScenarioRule; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowActivity; +import org.robolectric.shadows.ShadowActivity.PermissionsRequest; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +import java.lang.ref.WeakReference; + +/** + * Robolectric unit tests for {@link ActivityAndroidPermissionDelegate} and + * {@link AndroidPermissionDelegateWithRequester}. + */ +@RunWith(BaseRobolectricTestRunner.class) +public class ActivityAndroidPermissionDelegateTest { + /** + * Rule managing the lifecycle of activity in each {@code @Test}. + * <p> + * To access the activity and run code on its main thread, use + * {@link ActivityScenario#onActivity}: + * <pre> + * mActivityScenarios.getScenario().onActivity(activity -> { + * // Your test code using the activity here. + * }); + * </pre> + */ + @Rule + public ActivityScenarioRule<TestActivity> mActivityScenarios = + new ActivityScenarioRule<>(TestActivity.class); + + @Test + public void testHasPermissionDenied() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + + boolean hasPermission = + permissionDelegate.hasPermission(android.Manifest.permission.INTERNET); + + assertFalse("The default result of hasPermission should be false", hasPermission); + }); + } + + @Test + public void testHasPermissionGranted() { + mActivityScenarios.getScenario().onActivity(activity -> { + Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET); + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + + boolean hasPermission = + permissionDelegate.hasPermission(android.Manifest.permission.INTERNET); + + assertTrue("hasPermission should return true if permission is granted", hasPermission); + }); + } + + @Test + public void testCanRequestPermissionInitial() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertTrue("The default result of canRequestPermission should be true", canRequest); + }); + } + + @Test + public void testRequestPermissionsGranted() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + PermissionCallback callback = Mockito.mock(PermissionCallback.class); + + // Request permission + permissionDelegate.requestPermissions( + new String[] {android.Manifest.permission.INTERNET}, callback); + + PermissionsRequest lastRequest = + Shadows.shadowOf(activity).getLastRequestedPermission(); + assertEquals(new String[] {android.Manifest.permission.INTERNET}, + lastRequest.requestedPermissions); + verify(callback, + never().description("PermissionCallback should not receive results before " + + "handlePermissionResult is invoked")) + .onRequestPermissionsResult(any(), any()); + + // Respond to the request + int[] grantResults = new int[] {PackageManager.PERMISSION_GRANTED}; + permissionDelegate.handlePermissionResult( + lastRequest.requestCode, lastRequest.requestedPermissions, grantResults); + + verify(callback, + Mockito.description( + "handlePermissionResult should invoke the PermissionCallback")) + .onRequestPermissionsResult(lastRequest.requestedPermissions, grantResults); + }); + } + + @Test + public void testRequestPermissionsDenied() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + PermissionCallback callback = Mockito.mock(PermissionCallback.class); + + // Request permission + permissionDelegate.requestPermissions( + new String[] {android.Manifest.permission.INTERNET}, callback); + + PermissionsRequest lastRequest = + Shadows.shadowOf(activity).getLastRequestedPermission(); + assertEquals(new String[] {android.Manifest.permission.INTERNET}, + lastRequest.requestedPermissions); + verify(callback, + never().description("PermissionCallback should not receive results before " + + "handlePermissionResult is invoked")) + .onRequestPermissionsResult(any(), any()); + + // Respond to the request + int[] grantResults = new int[] {PackageManager.PERMISSION_DENIED}; + permissionDelegate.handlePermissionResult( + lastRequest.requestCode, lastRequest.requestedPermissions, grantResults); + + verify(callback, + Mockito.description( + "handlePermissionResult should invoke the PermissionCallback")) + .onRequestPermissionsResult(lastRequest.requestedPermissions, grantResults); + }); + } + + @Test + public void testCanRequestPermissionAfterRequestGranted() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + performRequestPermission(permissionDelegate, Shadows.shadowOf(activity), + android.Manifest.permission.INTERNET, PackageManager.PERMISSION_GRANTED); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertTrue("After a granted permission request canRequestPermission should return true", + canRequest); + }); + } + + @Test + public void testCanRequestPermissionAfterRequestDenied() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + performRequestPermission(permissionDelegate, Shadows.shadowOf(activity), + android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertFalse( + "After a denied permission request canRequestPermission should return false", + canRequest); + }); + } + + @Test + public void testCanRequestPermissionWithShowRequestRationale() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + performRequestPermission(permissionDelegate, Shadows.shadowOf(activity), + android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED); + Shadows.shadowOf(activity.getPackageManager()) + .setShouldShowRequestPermissionRationale( + android.Manifest.permission.INTERNET, true); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertTrue("When shouldShowRequestPermissionRationale is true " + + "canRequestPermission should return true", + canRequest); + }); + } + + @Test + public void testCanRequestPermissionAfterHasPermissionGranted() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + performRequestPermission(permissionDelegate, Shadows.shadowOf(activity), + android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED); + + Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET); + permissionDelegate.hasPermission(android.Manifest.permission.INTERNET); + Shadows.shadowOf(activity).denyPermissions(android.Manifest.permission.INTERNET); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertTrue("After hasPermission sees that a permission is granted " + + "canRequestPermission should return true", + canRequest); + }); + } + + @Test + public void testCanRequestPermissionWhileGranted() { + mActivityScenarios.getScenario().onActivity(activity -> { + AndroidPermissionDelegate permissionDelegate = + new ActivityAndroidPermissionDelegate(new WeakReference(activity)); + performRequestPermission(permissionDelegate, Shadows.shadowOf(activity), + android.Manifest.permission.INTERNET, PackageManager.PERMISSION_DENIED); + Shadows.shadowOf(activity).grantPermissions(android.Manifest.permission.INTERNET); + + boolean canRequest = + permissionDelegate.canRequestPermission(android.Manifest.permission.INTERNET); + + assertTrue( + "If a permission is currently granted canRequestPermission should return true", + canRequest); + }); + } + + /** + * Calls {@link AndroidPermissionDelegate#requestPermissions} and {@link + * AndroidPermissionDelegate#handlePermissionResult} for a single permission. + */ + private void performRequestPermission(AndroidPermissionDelegate permissionDelegate, + ShadowActivity shadowActivity, String permission, int grantResult) { + permissionDelegate.requestPermissions( + new String[] {permission}, Mockito.mock(PermissionCallback.class)); + PermissionsRequest lastRequest = shadowActivity.getLastRequestedPermission(); + permissionDelegate.handlePermissionResult( + lastRequest.requestCode, lastRequest.requestedPermissions, new int[] {grantResult}); + } +} diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java index 09724c4210f..2698c6be83e 100644 --- a/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java +++ b/chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java @@ -4,12 +4,12 @@ package org.chromium.ui.base; -import android.support.test.filters.SmallTest; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import androidx.test.filters.SmallTest; + import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java b/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java index 49e622b471b..cd5fe373955 100644 --- a/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java +++ b/chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java @@ -5,6 +5,8 @@ package org.chromium.ui.base; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import android.net.Uri; import android.webkit.MimeTypeMap; @@ -16,8 +18,12 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowMimeTypeMap; import org.chromium.base.ContextUtils; +import org.chromium.base.PathUtils; import org.chromium.base.test.BaseRobolectricTestRunner; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; @@ -153,4 +159,42 @@ public class SelectFileDialogTest { assertEquals(task.mFilePaths[1].toString(), "///storage/emulated/0/DCIM/Camera/IMG_1.jpg"); } + + @Test + public void testFilePathSelected() throws IOException { + SelectFileDialog selectFileDialog = new SelectFileDialog(0); + PathUtils.setPrivateDataDirectorySuffix("test"); + String dataDir = new File(PathUtils.getDataDirectory()).getCanonicalPath(); + + SelectFileDialog.FilePathSelectedTask task = selectFileDialog.new FilePathSelectedTask( + ContextUtils.getApplicationContext(), dataDir, null); + assertFalse(task.doInBackground()); + + task = selectFileDialog.new FilePathSelectedTask( + ContextUtils.getApplicationContext(), dataDir + "/tmp/xyz.jpg", null); + assertFalse(task.doInBackground()); + + task = selectFileDialog.new FilePathSelectedTask( + ContextUtils.getApplicationContext(), dataDir + "/../xyz.jpg", null); + assertTrue(task.doInBackground()); + + task = selectFileDialog.new FilePathSelectedTask( + ContextUtils.getApplicationContext(), dataDir + "/tmp/../xyz.jpg", null); + assertFalse(task.doInBackground()); + + task = selectFileDialog.new FilePathSelectedTask( + ContextUtils.getApplicationContext(), "/data/local/tmp.jpg", null); + assertTrue(task.doInBackground()); + + Path path = new File(dataDir).toPath(); + String parent = path.getParent().toString(); + String lastComponent = path.getName(path.getNameCount() - 1).toString(); + task = selectFileDialog.new FilePathSelectedTask(ContextUtils.getApplicationContext(), + parent + "/./" + lastComponent + "/xyz.jpg", null); + assertFalse(task.doInBackground()); + + task = selectFileDialog.new FilePathSelectedTask(ContextUtils.getApplicationContext(), + dataDir + "/../" + lastComponent + "/xyz.jpg", null); + assertFalse(task.doInBackground()); + } } diff --git a/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java b/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java new file mode 100644 index 00000000000..aaabcf4097f --- /dev/null +++ b/chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java @@ -0,0 +1,14 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.ui.base; + +import androidx.appcompat.app.AppCompatActivity; + +/** + * Activity used in {@code ui/base} tests. + * <p> + * This activity is declared in {@code ui/android/junit/AndroidManifest.xml}. + */ +public class TestActivity extends AppCompatActivity {} diff --git a/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java b/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java index 4b033999efa..8a13da1e3c3 100644 --- a/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java +++ b/chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java @@ -15,7 +15,6 @@ import org.junit.runner.RunWith; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; -import org.robolectric.shadows.ShadowStateListDrawable; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.ui.shadows.ShadowAnimatedStateListDrawable; @@ -31,23 +30,7 @@ public class StateListDrawableBuilderTest { private static final int DEFAULT_DRAWABLE = 45678; @Test - @Config(sdk = 19) - public void testPreL() { - StateListDrawableBuilder b = new StateListDrawableBuilder(RuntimeEnvironment.application); - b.addState(CHECKED_DRAWABLE, android.R.attr.state_checked); - b.addState(DEFAULT_DRAWABLE, WILDCARD_STATE); - StateListDrawable result = b.build(); - assertEquals(result.getClass(), StateListDrawable.class); - ShadowStateListDrawable drawable = shadowOf(result); - assertEquals(CHECKED_DRAWABLE, - shadowOf(drawable.getDrawableForState(CHECKED_STATE)).getCreatedFromResId()); - assertEquals(DEFAULT_DRAWABLE, - shadowOf(drawable.getDrawableForState(WILDCARD_STATE)).getCreatedFromResId()); - } - - @Test - @Config(sdk = 21) - public void testPostL() { + public void testBuild() { StateListDrawableBuilder b = new StateListDrawableBuilder(RuntimeEnvironment.application); b.addState(CHECKED_DRAWABLE, android.R.attr.state_checked); b.addState(DEFAULT_DRAWABLE, WILDCARD_STATE); diff --git a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java index 0e7e800f582..f23cb9c94ee 100644 --- a/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java +++ b/chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java @@ -79,16 +79,19 @@ public class ModalDialogManagerTest { @Feature({"ModalDialogManagerObserver"}) public void testModalDialogObserver() { // Show two dialogs and make sure show is only called on one until it is hidden. - verify(mObserver, times(0)).onDialogShown(mDialogModels.get(0)); + verify(mObserver, times(0)).onDialogAdded(mDialogModels.get(0)); mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP); mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP); - verify(mObserver, times(1)).onDialogShown(mDialogModels.get(0)); - verify(mObserver, times(0)).onDialogShown(mDialogModels.get(1)); + verify(mObserver, times(1)).onDialogAdded(mDialogModels.get(0)); + verify(mObserver, times(0)).onDialogAdded(mDialogModels.get(1)); - verify(mObserver, times(0)).onDialogHidden(mDialogModels.get(0)); + verify(mObserver, times(0)).onDialogDismissed(mDialogModels.get(0)); mModalDialogManager.dismissDialog(mDialogModels.get(0), ModalDialogType.APP); - verify(mObserver, times(1)).onDialogHidden(mDialogModels.get(0)); - verify(mObserver, times(1)).onDialogShown(mDialogModels.get(1)); + verify(mObserver, times(1)).onDialogDismissed(mDialogModels.get(0)); + verify(mObserver, times(1)).onDialogAdded(mDialogModels.get(1)); + + mModalDialogManager.dismissDialog(mDialogModels.get(1), ModalDialogType.APP); + verify(mObserver, times(1)).onLastDialogDismissed(); } /** Tests showing a dialog when no dialog is currently showing. */ |