| 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));
|
| + }
|
| +}
|
|
|