summaryrefslogtreecommitdiff
path: root/chromium/ui/android/junit
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/ui/android/junit
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/ui/android/junit/AndroidManifest.xml19
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/ActivityAndroidPermissionDelegateTest.java260
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/LocalizationUtilsTest.java4
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/SelectFileDialogTest.java44
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/base/TestActivity.java14
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/drawable/StateListDrawableBuilderTest.java19
-rw-r--r--chromium/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java15
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. */