Add test for loading init location from rootUri.
Bug: 31858715
Change-Id: I51130d15a545526d6ba5101edaa4fbeb58f3e229
diff --git a/tests/common/com/android/documentsui/TestActivity.java b/tests/common/com/android/documentsui/TestActivity.java
index 54ebf3e..4cca190 100644
--- a/tests/common/com/android/documentsui/TestActivity.java
+++ b/tests/common/com/android/documentsui/TestActivity.java
@@ -19,11 +19,13 @@
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import com.android.documentsui.AbstractActionHandler.CommonAddons;
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.testing.TestEventListener;
+import com.android.documentsui.testing.android.TestPackageManager;
import com.android.documentsui.testing.android.TestResources;
import org.mockito.Mockito;
@@ -35,6 +37,7 @@
public abstract class TestActivity extends AbstractBase {
public TestResources resources;
+ public TestPackageManager packageMgr;
public Intent intent;
public TestEventListener<Intent> startActivity;
@@ -49,6 +52,7 @@
public void init() {
resources = TestResources.create();
+ packageMgr = TestPackageManager.create();
intent = new Intent();
startActivity = new TestEventListener<>();
@@ -83,6 +87,11 @@
}
@Override
+ public PackageManager getPackageManager() {
+ return packageMgr;
+ }
+
+ @Override
public final void onRootPicked(RootInfo root) {
rootPicked.accept(root);
}
diff --git a/tests/common/com/android/documentsui/testing/TestRootsAccess.java b/tests/common/com/android/documentsui/testing/TestRootsAccess.java
index 641753f..5678cf3 100644
--- a/tests/common/com/android/documentsui/testing/TestRootsAccess.java
+++ b/tests/common/com/android/documentsui/testing/TestRootsAccess.java
@@ -18,6 +18,7 @@
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.base.State;
import com.android.documentsui.roots.RootsAccess;
+import com.android.documentsui.testing.android.TestPackageManager;
import java.util.ArrayList;
import java.util.Collection;
@@ -31,6 +32,8 @@
public static final RootInfo DOWNLOADS;
public static final RootInfo HOME;
+ public static final RootInfo HAMMY;
+ public static final RootInfo PICKLES;
static {
DOWNLOADS = new RootInfo();
@@ -40,6 +43,14 @@
HOME = new RootInfo();
HOME.authority = "com.android.externalstorage.documents";
HOME.rootId = "home";
+
+ HAMMY = new RootInfo();
+ HAMMY.authority = "yummies";
+ HAMMY.rootId = "hamsandwich";
+
+ PICKLES = new RootInfo();
+ PICKLES.authority = "yummies";
+ PICKLES.rootId = "pickles";
}
public final Map<String, Collection<RootInfo>> roots = new HashMap<>();
@@ -48,15 +59,24 @@
public TestRootsAccess() {
add(DOWNLOADS);
add(HOME);
+ add(HAMMY);
+ add(PICKLES);
}
- public void add(RootInfo root) {
+ private void add(RootInfo root) {
if (!roots.containsKey(root.authority)) {
roots.put(root.authority, new ArrayList<>());
}
roots.get(root.authority).add(root);
}
+ public void configurePm(TestPackageManager pm) {
+ pm.addStubContentProviderForRoot(TestRootsAccess.DOWNLOADS);
+ pm.addStubContentProviderForRoot(TestRootsAccess.HOME);
+ pm.addStubContentProviderForRoot(TestRootsAccess.HAMMY);
+ pm.addStubContentProviderForRoot(TestRootsAccess.PICKLES);
+ }
+
@Override
public RootInfo getRootOneshot(String authority, String rootId) {
if (roots.containsKey(authority)) {
diff --git a/tests/common/com/android/documentsui/testing/android/TestPackageManager.java b/tests/common/com/android/documentsui/testing/android/TestPackageManager.java
new file mode 100644
index 0000000..a078c6c
--- /dev/null
+++ b/tests/common/com/android/documentsui/testing/android/TestPackageManager.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2016 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.documentsui.testing.android;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+
+import com.android.documentsui.base.RootInfo;
+
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Abstract to avoid having to implement unnecessary Activity stuff.
+ * Instances are created using {@link #create()}.
+ */
+public abstract class TestPackageManager extends PackageManager {
+
+ public Map<String, ResolveInfo> contentProviders;
+
+ private TestPackageManager() {}
+
+ public void addStubContentProviderForRoot(RootInfo... roots) {
+ for (RootInfo root : roots) {
+ // only one entry per authority is required.
+ if (!contentProviders.containsKey(root.authority)) {
+ ResolveInfo info = new ResolveInfo();
+ contentProviders.put(root.authority, info);
+ info.providerInfo = new ProviderInfo();
+ info.providerInfo.authority = root.authority;
+ }
+ }
+ }
+
+ public static TestPackageManager create() {
+ TestPackageManager pm = Mockito.mock(
+ TestPackageManager.class, Mockito.CALLS_REAL_METHODS);
+ pm.contentProviders = new HashMap<>();
+ return pm;
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
+ List<ResolveInfo> result = new ArrayList<>();
+ result.addAll(contentProviders.values());
+ return result;
+ }
+}
diff --git a/tests/functional/com/android/documentsui/ActivityTest.java b/tests/functional/com/android/documentsui/ActivityTest.java
index f68b708..026aab4 100644
--- a/tests/functional/com/android/documentsui/ActivityTest.java
+++ b/tests/functional/com/android/documentsui/ActivityTest.java
@@ -23,14 +23,14 @@
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
+import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.support.test.uiautomator.Configurator;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObjectNotFoundException;
import android.test.ActivityInstrumentationTestCase2;
import android.view.MotionEvent;
-import com.android.documentsui.DocumentsProviderHelper;
-import com.android.documentsui.StubProvider;
+
import com.android.documentsui.base.RootInfo;
import com.android.documentsui.bots.Bots;
import com.android.documentsui.bots.UiBot;
@@ -138,6 +138,7 @@
UiBot.TARGET_PKG);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
if (getInitialRoot() != null) {
+ intent.setAction(DocumentsContract.ACTION_BROWSE);
intent.setData(getInitialRoot().getUri());
}
setActivityIntent(intent);
diff --git a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
index aec2f19..ada1b5f 100644
--- a/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
+++ b/tests/unit/com/android/documentsui/files/ActionHandlerTest.java
@@ -19,17 +19,18 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import android.content.Intent;
import android.net.Uri;
+import android.provider.DocumentsContract;
import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.documentsui.R;
import com.android.documentsui.base.RootInfo;
-import com.android.documentsui.base.Shared;
import com.android.documentsui.dirlist.MultiSelectManager.Selection;
-import com.android.documentsui.files.ActionHandler;
import com.android.documentsui.testing.TestConfirmationCallback;
import com.android.documentsui.testing.TestEnv;
+import com.android.documentsui.testing.TestRootsAccess;
import com.android.documentsui.ui.TestDialogController;
import org.junit.Before;
@@ -53,6 +54,7 @@
mActivity = TestActivity.create();
mDialogs = new TestDialogController();
mCallback = new TestConfirmationCallback();
+ mEnv.roots.configurePm(mActivity.packageMgr);
mHandler = new ActionHandler<>(
mActivity,
@@ -89,11 +91,35 @@
}
@Test
- public void testInitLocation_DefaultsToHome() throws Exception {
+ public void testInitLocation_DefaultsToDownloads() throws Exception {
+ mActivity.resources.bools.put(R.bool.productivity_device, false);
+
+ mHandler.initLocation(mActivity.getIntent());
+ assertRootPicked(TestRootsAccess.DOWNLOADS.getUri());
+ }
+
+ @Test
+ public void testInitLocation_ProductivityDefaultsToHome() throws Exception {
mActivity.resources.bools.put(R.bool.productivity_device, true);
mHandler.initLocation(mActivity.getIntent());
- assertRootPicked(Shared.getDefaultRootUri(mActivity));
+ assertRootPicked(TestRootsAccess.HOME.getUri());
+ }
+
+ @Test
+ public void testInitLocation_LoadsFromRootUri() throws Exception {
+ mActivity.resources.bools.put(R.bool.productivity_device, true);
+
+ Intent intent = mActivity.getIntent();
+ intent.setAction(DocumentsContract.ACTION_BROWSE);
+ intent.setData(TestRootsAccess.PICKLES.getUri());
+
+ mHandler.initLocation(intent);
+ assertRootPicked(TestRootsAccess.PICKLES);
+ }
+
+ private void assertRootPicked(RootInfo root) throws Exception {
+ assertRootPicked(root.getUri());
}
private void assertRootPicked(Uri expectedUri) throws Exception {