| Index: chrome/android/junit/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
|
| diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bf68431017cf1e2b9d9de54ffad9a22f76207a1e
|
| --- /dev/null
|
| +++ b/chrome/android/junit/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderTest.java
|
| @@ -0,0 +1,235 @@
|
| +// Copyright 2017 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.chrome.browser.payments;
|
| +
|
| +import android.content.Intent;
|
| +import android.content.pm.ActivityInfo;
|
| +import android.content.pm.PackageInfo;
|
| +import android.content.pm.ResolveInfo;
|
| +import android.content.pm.ServiceInfo;
|
| +import android.content.pm.Signature;
|
| +import android.net.Uri;
|
| +
|
| +import org.junit.Test;
|
| +import org.junit.runner.RunWith;
|
| +import org.mockito.ArgumentMatcher;
|
| +import org.mockito.ArgumentMatchers;
|
| +import org.mockito.Mockito;
|
| +import org.robolectric.RobolectricTestRunner;
|
| +import org.robolectric.annotation.Config;
|
| +
|
| +import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedCallback;
|
| +import org.chromium.components.payments.PaymentManifestDownloader;
|
| +import org.chromium.components.payments.PaymentManifestParser;
|
| +import org.chromium.content_public.browser.WebContents;
|
| +import org.chromium.payments.mojom.PaymentManifestSection;
|
| +
|
| +import java.net.URI;
|
| +import java.util.ArrayList;
|
| +import java.util.HashSet;
|
| +import java.util.List;
|
| +import java.util.Set;
|
| +
|
| +/** Tests for the native Android payment app finder. */
|
| +@RunWith(RobolectricTestRunner.class)
|
| +@Config(sdk = 21, manifest = Config.NONE)
|
| +public class AndroidPaymentAppFinderTest {
|
| + public AndroidPaymentAppFinderTest() {}
|
| +
|
| + @Test
|
| + public void testNoValidPaymentMethodNames() {
|
| + Set<String> methodNames = new HashSet<>();
|
| + methodNames.add("unknown-payment-method-name");
|
| + methodNames.add("http://not.secure.payment.method.name.com");
|
| + methodNames.add("https://"); // Invalid URI.
|
| + PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallback.class);
|
| +
|
| + AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodNames, false,
|
| + Mockito.mock(PaymentManifestDownloader.class),
|
| + Mockito.mock(PaymentManifestParser.class),
|
| + Mockito.mock(PackageManagerDelegate.class), callback);
|
| +
|
| + Mockito.verify(callback, Mockito.never())
|
| + .onPaymentAppCreated(Mockito.any(PaymentApp.class));
|
| + Mockito.verify(callback).onAllPaymentAppsCreated();
|
| + }
|
| +
|
| + @Test
|
| + public void testQueryBasicCardsWithoutApps() {
|
| + PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageManagerDelegate.class);
|
| + Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent(
|
| + new Intent(AndroidPaymentAppFinder.ACTION_PAY_BASIC_CARD)))
|
| + .thenReturn(new ArrayList<ResolveInfo>());
|
| + Set<String> methodNames = new HashSet<>();
|
| + methodNames.add(AndroidPaymentAppFinder.BASIC_CARD_PAYMENT_METHOD);
|
| + PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallback.class);
|
| +
|
| + AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodNames, false,
|
| + Mockito.mock(PaymentManifestDownloader.class),
|
| + Mockito.mock(PaymentManifestParser.class), packageManagerDelegate, callback);
|
| +
|
| + Mockito.verify(callback, Mockito.never())
|
| + .onPaymentAppCreated(Mockito.any(PaymentApp.class));
|
| + Mockito.verify(callback).onAllPaymentAppsCreated();
|
| + }
|
| +
|
| + @Test
|
| + public void testQueryBasicCardsWithTwoApps() {
|
| + List<ResolveInfo> activities = new ArrayList<>();
|
| + ResolveInfo alicePay = new ResolveInfo();
|
| + alicePay.activityInfo = new ActivityInfo();
|
| + alicePay.activityInfo.packageName = "com.alicepay.app";
|
| + alicePay.activityInfo.name = "com.alicepay.app.WebPaymentActivity";
|
| + activities.add(alicePay);
|
| + ResolveInfo bobPay = new ResolveInfo();
|
| + bobPay.activityInfo = new ActivityInfo();
|
| + bobPay.activityInfo.packageName = "com.bobpay.app";
|
| + bobPay.activityInfo.name = "com.bobpay.app.WebPaymentActivity";
|
| + activities.add(bobPay);
|
| + PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageManagerDelegate.class);
|
| + Mockito.when(packageManagerDelegate.getAppLabel(Mockito.any(ResolveInfo.class)))
|
| + .thenReturn("A non-empty label");
|
| + Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent(
|
| + new Intent(AndroidPaymentAppFinder.ACTION_PAY_BASIC_CARD)))
|
| + .thenReturn(activities);
|
| + Mockito.when(packageManagerDelegate.getServicesThatCanRespondToIntent(
|
| + new Intent(AndroidPaymentAppFinder.ACTION_IS_READY_TO_PAY)))
|
| + .thenReturn(new ArrayList<ResolveInfo>());
|
| + Set<String> methodNames = new HashSet<>();
|
| + methodNames.add(AndroidPaymentAppFinder.BASIC_CARD_PAYMENT_METHOD);
|
| + PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallback.class);
|
| +
|
| + AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodNames, false,
|
| + Mockito.mock(PaymentManifestDownloader.class),
|
| + Mockito.mock(PaymentManifestParser.class), packageManagerDelegate, callback);
|
| +
|
| + Mockito.verify(callback).onPaymentAppCreated(
|
| + ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.alicepay.app")));
|
| + Mockito.verify(callback).onPaymentAppCreated(
|
| + ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.bobpay.app")));
|
| + Mockito.verify(callback).onAllPaymentAppsCreated();
|
| + }
|
| +
|
| + @Test
|
| + public void testQueryBobPayWithoutApps() {
|
| + Intent bobPayIntent = new Intent("org.chromium.intent.action.PAY");
|
| + bobPayIntent.setData(Uri.parse("https://bobpay.com"));
|
| + PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageManagerDelegate.class);
|
| + Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent(bobPayIntent))
|
| + .thenReturn(new ArrayList<ResolveInfo>());
|
| + Set<String> methodNames = new HashSet<>();
|
| + methodNames.add("https://bobpay.com");
|
| + PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallback.class);
|
| +
|
| + AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodNames, false,
|
| + Mockito.mock(PaymentManifestDownloader.class),
|
| + Mockito.mock(PaymentManifestParser.class), packageManagerDelegate, callback);
|
| +
|
| + Mockito.verify(callback, Mockito.never())
|
| + .onPaymentAppCreated(Mockito.any(PaymentApp.class));
|
| + Mockito.verify(callback).onAllPaymentAppsCreated();
|
| + }
|
| +
|
| + @Test
|
| + public void testQueryBobPayWithOneAppThatHasIsReadyToPayService() {
|
| + List<ResolveInfo> activities = new ArrayList<>();
|
| + ResolveInfo bobPay = new ResolveInfo();
|
| + bobPay.activityInfo = new ActivityInfo();
|
| + bobPay.activityInfo.packageName = "com.bobpay.app";
|
| + bobPay.activityInfo.name = "com.bobpay.app.WebPaymentActivity";
|
| + activities.add(bobPay);
|
| + Intent bobPayIntent = new Intent("org.chromium.intent.action.PAY");
|
| + bobPayIntent.setData(Uri.parse("https://bobpay.com"));
|
| + PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageManagerDelegate.class);
|
| + Mockito.when(packageManagerDelegate.getAppLabel(Mockito.any(ResolveInfo.class)))
|
| + .thenReturn("A non-empty label");
|
| + Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent(bobPayIntent))
|
| + .thenReturn(activities);
|
| +
|
| + List<ResolveInfo> services = new ArrayList<>();
|
| + ResolveInfo isBobPayReadyToPay = new ResolveInfo();
|
| + isBobPayReadyToPay.serviceInfo = new ServiceInfo();
|
| + isBobPayReadyToPay.serviceInfo.packageName = "com.bobpay.app";
|
| + isBobPayReadyToPay.serviceInfo.name = "com.bobpay.app.IsReadyToWebPay";
|
| + services.add(isBobPayReadyToPay);
|
| + Intent isReadyToPayIntent = new Intent(AndroidPaymentAppFinder.ACTION_IS_READY_TO_PAY);
|
| + Mockito.when(packageManagerDelegate.getServicesThatCanRespondToIntent(isReadyToPayIntent))
|
| + .thenReturn(services);
|
| +
|
| + PackageInfo bobPayPackageInfo = new PackageInfo();
|
| + bobPayPackageInfo.versionCode = 10;
|
| + bobPayPackageInfo.signatures = new Signature[1];
|
| + bobPayPackageInfo.signatures[0] = new Signature("01020304050607080900");
|
| + Mockito.when(packageManagerDelegate.getPackageInfoWithSignatures("com.bobpay.app"))
|
| + .thenReturn(bobPayPackageInfo);
|
| +
|
| + PaymentManifestDownloader downloader = new PaymentManifestDownloader(null) {
|
| + @Override
|
| + public void download(URI uri, ManifestDownloadCallback callback) {
|
| + callback.onManifestDownloadSuccess("some content here");
|
| + }
|
| + };
|
| +
|
| + PaymentManifestParser parser = new PaymentManifestParser() {
|
| + @Override
|
| + public void parse(String content, ManifestParseCallback callback) {
|
| + PaymentManifestSection[] manifest = new PaymentManifestSection[1];
|
| + manifest[0] = new PaymentManifestSection();
|
| + manifest[0].packageName = "com.bobpay.app";
|
| + manifest[0].version = 10;
|
| + // SHA256("01020304050607080900"):
|
| + manifest[0].sha256CertFingerprints = new byte[][] {{(byte) 0x9A, (byte) 0x89,
|
| + (byte) 0xC6, (byte) 0x8C, (byte) 0x4C, (byte) 0x5E, (byte) 0x28,
|
| + (byte) 0xB8, (byte) 0xC4, (byte) 0xA5, (byte) 0x56, (byte) 0x76,
|
| + (byte) 0x73, (byte) 0xD4, (byte) 0x62, (byte) 0xFF, (byte) 0xF5,
|
| + (byte) 0x15, (byte) 0xDB, (byte) 0x46, (byte) 0x11, (byte) 0x6F,
|
| + (byte) 0x99, (byte) 0x00, (byte) 0x62, (byte) 0x4D, (byte) 0x09,
|
| + (byte) 0xC4, (byte) 0x74, (byte) 0xF5, (byte) 0x93, (byte) 0xFB}};
|
| + callback.onManifestParseSuccess(manifest);
|
| + }
|
| +
|
| + @Override
|
| + public void startUtilityProcess() {}
|
| +
|
| + @Override
|
| + public void stopUtilityProcess() {}
|
| + };
|
| +
|
| + Set<String> methodNames = new HashSet<>();
|
| + methodNames.add("https://bobpay.com");
|
| + PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallback.class);
|
| +
|
| + AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodNames, false,
|
| + downloader, parser, packageManagerDelegate, callback);
|
| +
|
| + Mockito.verify(callback).onPaymentAppCreated(
|
| + ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.bobpay.app")));
|
| + Mockito.verify(callback).onAllPaymentAppsCreated();
|
| + }
|
| +
|
| + private static final class Matches implements ArgumentMatcher<PaymentApp> {
|
| + private final String mExpectedAppIdentifier;
|
| +
|
| + private Matches(String expectedAppIdentifier) {
|
| + mExpectedAppIdentifier = expectedAppIdentifier;
|
| + }
|
| +
|
| + /**
|
| + * Builds a matcher based on payment app identifier.
|
| + *
|
| + * @param expectedAppIdentifier The expected app identifier to match.
|
| + * @return A matcher to use in a mock expectation.
|
| + */
|
| + public static ArgumentMatcher<PaymentApp> paymentAppIdentifier(
|
| + String expectedAppIdentifier) {
|
| + return new Matches(expectedAppIdentifier);
|
| + }
|
| +
|
| + @Override
|
| + public boolean matches(PaymentApp app) {
|
| + return app.getAppIdentifier().equals(mExpectedAppIdentifier);
|
| + }
|
| + }
|
| +}
|
|
|