Index: content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java |
diff --git a/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java b/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..abb710b0f748a81c7c53671e768014cee9ab4ec5 |
--- /dev/null |
+++ b/content/public/android/junit/src/org/chromium/content/browser/installedapp/InstalledAppProviderTest.java |
@@ -0,0 +1,178 @@ |
+// Copyright 2016 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.content.browser.installedapp; |
+ |
+import android.content.pm.PackageInfo; |
+import android.content.pm.PackageManager.NameNotFoundException; |
+import android.content.res.AssetManager; |
+import android.content.res.Resources; |
+ |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.mojom.content.RelatedApplication; |
+import org.chromium.testing.local.LocalRobolectricTestRunner; |
+ |
+import org.junit.Assert; |
+import org.junit.Before; |
+import org.junit.Test; |
+import org.junit.runner.RunWith; |
+ |
+import org.robolectric.Robolectric; |
+import org.robolectric.annotation.Config; |
+import org.robolectric.res.builder.RobolectricPackageManager; |
+ |
+import java.util.ArrayList; |
+import java.util.HashMap; |
+ |
+ |
+/** |
+ * Ensure that the InstalledAppProvider returns the correct apps. |
+ */ |
+@RunWith(LocalRobolectricTestRunner.class) |
+@Config(manifest = Config.NONE) |
+public class InstalledAppProviderTest { |
+ private FakePackageManager mPackageManager; |
+ private InstalledAppProviderImpl mInstalledAppProvider; |
+ |
+ /** |
+ * FakePackageManager allows for the "installation" of Android package names |
+ * and setting up Resources for installed packages. |
+ */ |
+ public class FakePackageManager extends RobolectricPackageManager { |
+ HashMap<String, Resources> mResourceMap; |
+ |
+ public FakePackageManager() { |
+ mResourceMap = new HashMap<String, Resources>(); |
+ } |
+ |
+ @Override |
+ public Resources getResourcesForApplication(String appPackageName) |
+ throws NameNotFoundException { |
+ return mResourceMap.get(appPackageName); |
+ } |
+ |
+ public void setResourcesForTest(String packageName, Resources resources) { |
+ mResourceMap.put(packageName, resources); |
+ } |
+ |
+ public void installPackage(String packageName) { |
+ PackageInfo info = new PackageInfo(); |
+ info.packageName = packageName; |
+ addPackage(info); |
+ } |
+ } |
+ |
+ /** |
+ * MockResources allow us to define a pre-defined String array which is |
+ * returned when a resource from a package is requested. In this case, |
+ * this allows us to define site relationships. |
+ */ |
+ public class MockResources extends Resources { |
+ String[] mFakeStrings; |
+ public MockResources(String[] array) { |
+ super(new AssetManager(), null, null); |
+ mFakeStrings = array; |
+ } |
+ |
+ @Override |
+ public int getIdentifier(String name, String defType, String defPackage) { |
+ if (mFakeStrings == null) { |
+ return 0; |
+ } |
+ return 1; |
+ } |
+ |
+ @Override |
+ public String[] getStringArray(int identifier) { |
+ return mFakeStrings; |
+ } |
+ } |
+ |
+ private void addSiteAssociation(String url, String packageName) { |
+ String association = "{\"relation\": [\"delegate_permission/common.handle_all_urls\"]," |
+ + "\"target\": {\"namespace\": \"web\", \"site\": \"" + url + "\"}}"; |
+ MockResources fr = new MockResources(new String[] {association}); |
+ mPackageManager.setResourcesForTest(packageName, fr); |
+ } |
+ |
+ private RelatedApplication createRelatedApplication(String platform, String id, String url) { |
+ RelatedApplication realApplication = new RelatedApplication(); |
+ realApplication.platform = platform; |
+ realApplication.id = id; |
+ realApplication.url = url; |
+ return realApplication; |
+ } |
+ |
+ @Before |
+ public void setUp() { |
+ mPackageManager = new FakePackageManager(); |
+ Robolectric.packageManager = mPackageManager; |
+ mInstalledAppProvider = new InstalledAppProviderImpl(Robolectric.application); |
+ } |
+ |
+ @Test |
+ @Feature({"InstalledApp"}) |
+ public void testOneInstalledRelatedApplication() throws Exception { |
+ mPackageManager.installPackage("com.real.package"); |
+ addSiteAssociation("http://localhost:8000/", "com.real.package"); |
+ |
+ RelatedApplication realApplication = |
+ createRelatedApplication("play", "com.real.package", ""); |
+ RelatedApplication installedAppsArray[] = new RelatedApplication[1]; |
+ installedAppsArray[0] = realApplication; |
+ |
+ RelatedApplication[] installedApplications = |
+ mInstalledAppProvider.filterAndroidInstalledApps( |
+ installedAppsArray, "http://localhost:8000/"); |
+ |
+ Assert.assertEquals(installedApplications.length, 1); |
+ Assert.assertEquals(installedApplications[0], realApplication); |
+ } |
+ |
+ @Test |
+ @Feature({"InstalledApp"}) |
+ public void testExtraInstalledApplication() throws Exception { |
+ RelatedApplication realApplication = |
+ createRelatedApplication("play", "com.real.package", ""); |
+ RelatedApplication installedAppsArray[] = new RelatedApplication[1]; |
+ installedAppsArray[0] = realApplication; |
+ |
+ mPackageManager.installPackage("com.real.package"); |
+ mPackageManager.installPackage("com.different.package"); |
+ addSiteAssociation("http://localhost:8000/", "com.real.package"); |
+ addSiteAssociation("http://localhost:8000/", "com.different.package"); |
+ |
+ RelatedApplication[] installedApplications = |
+ mInstalledAppProvider.filterAndroidInstalledApps( |
+ installedAppsArray, "http://localhost:8000/"); |
+ Assert.assertEquals(installedApplications.length, 1); |
+ Assert.assertEquals(installedApplications[0], realApplication); |
+ } |
+ |
+ @Test |
+ @Feature({"InstalledApp"}) |
+ public void testMultipleInstalledRelatedApplications() throws Exception { |
+ ArrayList<RelatedApplication> manifestRelatedApplications = |
+ new ArrayList<RelatedApplication>(); |
+ manifestRelatedApplications.add(createRelatedApplication("play", "com.real.package", "")); |
+ manifestRelatedApplications.add(createRelatedApplication("play", "com.other.package", "")); |
+ manifestRelatedApplications.add( |
+ createRelatedApplication("itunes", "com.other.package", "")); |
+ |
+ mPackageManager.installPackage("com.real.package"); |
+ mPackageManager.installPackage("com.different.package"); |
+ addSiteAssociation("http://localhost:8000/", "com.real.package"); |
+ addSiteAssociation("http://localhost:8000/", "com.other.package"); |
+ |
+ RelatedApplication[] relatedApplications = |
+ new RelatedApplication[manifestRelatedApplications.size()]; |
+ manifestRelatedApplications.toArray(relatedApplications); |
+ RelatedApplication[] installedApplications = |
+ mInstalledAppProvider.filterAndroidInstalledApps( |
+ relatedApplications, "http://localhost:8000/"); |
+ Assert.assertTrue(installedApplications.length == 2); |
+ Assert.assertEquals(installedApplications[0], manifestRelatedApplications.get(0)); |
+ Assert.assertEquals(installedApplications[1], manifestRelatedApplications.get(1)); |
+ } |
+} |