Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 package org.chromium.chrome.browser.payments; | |
| 6 | |
| 7 import android.content.Intent; | |
| 8 import android.content.pm.ActivityInfo; | |
| 9 import android.content.pm.PackageInfo; | |
| 10 import android.content.pm.ResolveInfo; | |
| 11 import android.content.pm.ServiceInfo; | |
| 12 import android.content.pm.Signature; | |
| 13 import android.net.Uri; | |
| 14 | |
| 15 import org.junit.Test; | |
| 16 import org.junit.runner.RunWith; | |
| 17 import org.mockito.ArgumentMatcher; | |
| 18 import org.mockito.ArgumentMatchers; | |
| 19 import org.mockito.Mockito; | |
| 20 import org.robolectric.RobolectricTestRunner; | |
| 21 import org.robolectric.annotation.Config; | |
| 22 | |
| 23 import org.chromium.chrome.browser.payments.PaymentAppFactory.PaymentAppCreatedC allback; | |
| 24 import org.chromium.components.payments.PaymentManifestDownloader; | |
| 25 import org.chromium.components.payments.PaymentManifestParser; | |
| 26 import org.chromium.content_public.browser.WebContents; | |
| 27 import org.chromium.payments.mojom.PaymentManifestSection; | |
| 28 | |
| 29 import java.net.URI; | |
| 30 import java.util.ArrayList; | |
| 31 import java.util.HashSet; | |
| 32 import java.util.List; | |
| 33 import java.util.Set; | |
| 34 | |
| 35 /** Tests for the native Android payment app finder. */ | |
| 36 @RunWith(RobolectricTestRunner.class) | |
| 37 @Config(sdk = 21, manifest = Config.NONE) | |
| 38 public class AndroidPaymentAppFinderTest { | |
| 39 public AndroidPaymentAppFinderTest() {} | |
| 40 | |
| 41 @Test | |
| 42 public void testNoValidPaymentMethodNames() { | |
| 43 Set<String> methodNames = new HashSet<>(); | |
| 44 methodNames.add("unknown-payment-method-name"); | |
| 45 methodNames.add("http://not.secure.payment.method.name.com"); | |
| 46 methodNames.add("https://"); // Invalid URI. | |
| 47 PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallb ack.class); | |
| 48 | |
| 49 AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodName s, false, | |
| 50 Mockito.mock(PaymentManifestDownloader.class), | |
| 51 Mockito.mock(PaymentManifestParser.class), | |
| 52 Mockito.mock(PackageManagerDelegate.class), callback); | |
| 53 | |
| 54 Mockito.verify(callback, Mockito.never()) | |
| 55 .onPaymentAppCreated(Mockito.any(PaymentApp.class)); | |
| 56 Mockito.verify(callback).onAllPaymentAppsCreated(); | |
| 57 } | |
| 58 | |
| 59 @Test | |
| 60 public void testQueryBasicCardsWithoutApps() { | |
| 61 PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageMana gerDelegate.class); | |
| 62 Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent( | |
| 63 new Intent("org.chromium.intent.action.PAY_BASIC_CA RD"))) | |
|
Ted C
2017/03/13 21:13:34
can you make this string package protected in the
please use gerrit instead
2017/03/13 22:19:54
Done.
| |
| 64 .thenReturn(new ArrayList<ResolveInfo>()); | |
| 65 Set<String> methodNames = new HashSet<>(); | |
| 66 methodNames.add("basic-card"); | |
|
Ted C
2017/03/13 21:13:34
same throughout where we can share strings
please use gerrit instead
2017/03/13 22:19:54
Done. (Sharing "basic-card" and "READY_TO_PAY".)
| |
| 67 PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallb ack.class); | |
| 68 | |
| 69 AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodName s, false, | |
| 70 Mockito.mock(PaymentManifestDownloader.class), | |
| 71 Mockito.mock(PaymentManifestParser.class), packageManagerDelegat e, callback); | |
| 72 | |
| 73 Mockito.verify(callback, Mockito.never()) | |
| 74 .onPaymentAppCreated(Mockito.any(PaymentApp.class)); | |
| 75 Mockito.verify(callback).onAllPaymentAppsCreated(); | |
| 76 } | |
| 77 | |
| 78 @Test | |
| 79 public void testQueryBasicCardsWithTwoApps() { | |
| 80 List<ResolveInfo> activities = new ArrayList<>(); | |
| 81 ResolveInfo alicePay = new ResolveInfo(); | |
| 82 alicePay.activityInfo = new ActivityInfo(); | |
| 83 alicePay.activityInfo.packageName = "com.alicepay.app"; | |
| 84 alicePay.activityInfo.name = "com.alicepay.app.WebPaymentActivity"; | |
| 85 activities.add(alicePay); | |
| 86 ResolveInfo bobPay = new ResolveInfo(); | |
| 87 bobPay.activityInfo = new ActivityInfo(); | |
| 88 bobPay.activityInfo.packageName = "com.bobpay.app"; | |
| 89 bobPay.activityInfo.name = "com.bobpay.app.WebPaymentActivity"; | |
| 90 activities.add(bobPay); | |
| 91 PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageMana gerDelegate.class); | |
| 92 Mockito.when(packageManagerDelegate.getAppLabel(Mockito.any(ResolveInfo. class))) | |
| 93 .thenReturn("A non-empty label"); | |
| 94 Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent( | |
| 95 new Intent("org.chromium.intent.action.PAY_BASIC_CA RD"))) | |
| 96 .thenReturn(activities); | |
| 97 Mockito.when(packageManagerDelegate.getServicesThatCanRespondToIntent( | |
| 98 new Intent("org.chromium.intent.action.IS_READY_TO_ PAY"))) | |
| 99 .thenReturn(new ArrayList<ResolveInfo>()); | |
| 100 Set<String> methodNames = new HashSet<>(); | |
| 101 methodNames.add("basic-card"); | |
| 102 PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallb ack.class); | |
| 103 | |
| 104 AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodName s, false, | |
| 105 Mockito.mock(PaymentManifestDownloader.class), | |
| 106 Mockito.mock(PaymentManifestParser.class), packageManagerDelegat e, callback); | |
| 107 | |
| 108 Mockito.verify(callback).onPaymentAppCreated( | |
| 109 ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.alice pay.app"))); | |
| 110 Mockito.verify(callback).onPaymentAppCreated( | |
| 111 ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.bobpa y.app"))); | |
| 112 Mockito.verify(callback).onAllPaymentAppsCreated(); | |
| 113 } | |
| 114 | |
| 115 @Test | |
| 116 public void testQueryBobPayWithoutApps() { | |
| 117 Intent bobPayIntent = new Intent("org.chromium.intent.action.PAY"); | |
| 118 bobPayIntent.setData(Uri.parse("https://bobpay.com")); | |
| 119 PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageMana gerDelegate.class); | |
| 120 Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent( bobPayIntent)) | |
| 121 .thenReturn(new ArrayList<ResolveInfo>()); | |
| 122 Set<String> methodNames = new HashSet<>(); | |
| 123 methodNames.add("https://bobpay.com"); | |
| 124 PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallb ack.class); | |
| 125 | |
| 126 AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodName s, false, | |
| 127 Mockito.mock(PaymentManifestDownloader.class), | |
| 128 Mockito.mock(PaymentManifestParser.class), packageManagerDelegat e, callback); | |
| 129 | |
| 130 Mockito.verify(callback, Mockito.never()) | |
| 131 .onPaymentAppCreated(Mockito.any(PaymentApp.class)); | |
| 132 Mockito.verify(callback).onAllPaymentAppsCreated(); | |
| 133 } | |
| 134 | |
| 135 @Test | |
| 136 public void testQueryBobPayWithOneAppThatHasIsReadyToPayService() { | |
| 137 List<ResolveInfo> activities = new ArrayList<>(); | |
| 138 ResolveInfo bobPay = new ResolveInfo(); | |
| 139 bobPay.activityInfo = new ActivityInfo(); | |
| 140 bobPay.activityInfo.packageName = "com.bobpay.app"; | |
| 141 bobPay.activityInfo.name = "com.bobpay.app.WebPaymentActivity"; | |
| 142 activities.add(bobPay); | |
| 143 Intent bobPayIntent = new Intent("org.chromium.intent.action.PAY"); | |
| 144 bobPayIntent.setData(Uri.parse("https://bobpay.com")); | |
| 145 PackageManagerDelegate packageManagerDelegate = Mockito.mock(PackageMana gerDelegate.class); | |
| 146 Mockito.when(packageManagerDelegate.getAppLabel(Mockito.any(ResolveInfo. class))) | |
| 147 .thenReturn("A non-empty label"); | |
| 148 Mockito.when(packageManagerDelegate.getActivitiesThatCanRespondToIntent( bobPayIntent)) | |
| 149 .thenReturn(activities); | |
| 150 | |
| 151 List<ResolveInfo> services = new ArrayList<>(); | |
| 152 ResolveInfo isBobPayReadyToPay = new ResolveInfo(); | |
| 153 isBobPayReadyToPay.serviceInfo = new ServiceInfo(); | |
| 154 isBobPayReadyToPay.serviceInfo.packageName = "com.bobpay.app"; | |
| 155 isBobPayReadyToPay.serviceInfo.name = "com.bobpay.app.IsReadyToWebPay"; | |
| 156 services.add(isBobPayReadyToPay); | |
| 157 Intent isReadyToPayIntent = new Intent("org.chromium.intent.action.IS_RE ADY_TO_PAY"); | |
| 158 Mockito.when(packageManagerDelegate.getServicesThatCanRespondToIntent(is ReadyToPayIntent)) | |
| 159 .thenReturn(services); | |
| 160 | |
| 161 PackageInfo bobPayPackageInfo = new PackageInfo(); | |
| 162 bobPayPackageInfo.versionCode = 10; | |
| 163 bobPayPackageInfo.signatures = new Signature[1]; | |
| 164 bobPayPackageInfo.signatures[0] = new Signature("01020304050607080900"); | |
| 165 Mockito.when(packageManagerDelegate.getPackageInfoWithSignatures("com.bo bpay.app")) | |
| 166 .thenReturn(bobPayPackageInfo); | |
| 167 | |
| 168 PaymentManifestDownloader downloader = new PaymentManifestDownloader(nul l) { | |
| 169 @Override | |
| 170 public void download(URI uri, ManifestDownloadCallback callback) { | |
| 171 callback.onManifestDownloadSuccess("some content here"); | |
| 172 } | |
| 173 }; | |
| 174 | |
| 175 PaymentManifestParser parser = new PaymentManifestParser() { | |
| 176 @Override | |
| 177 public void parse(String content, ManifestParseCallback callback) { | |
| 178 PaymentManifestSection[] manifest = new PaymentManifestSection[1 ]; | |
| 179 manifest[0] = new PaymentManifestSection(); | |
| 180 manifest[0].packageName = "com.bobpay.app"; | |
| 181 manifest[0].version = 10; | |
| 182 // SHA256("01020304050607080900"): | |
| 183 manifest[0].sha256CertFingerprints = new byte[][] {{(byte) 0x9A, (byte) 0x89, | |
| 184 (byte) 0xC6, (byte) 0x8C, (byte) 0x4C, (byte) 0x5E, (byt e) 0x28, | |
| 185 (byte) 0xB8, (byte) 0xC4, (byte) 0xA5, (byte) 0x56, (byt e) 0x76, | |
| 186 (byte) 0x73, (byte) 0xD4, (byte) 0x62, (byte) 0xFF, (byt e) 0xF5, | |
| 187 (byte) 0x15, (byte) 0xDB, (byte) 0x46, (byte) 0x11, (byt e) 0x6F, | |
| 188 (byte) 0x99, (byte) 0x00, (byte) 0x62, (byte) 0x4D, (byt e) 0x09, | |
| 189 (byte) 0xC4, (byte) 0x74, (byte) 0xF5, (byte) 0x93, (byt e) 0xFB}}; | |
| 190 callback.onManifestParseSuccess(manifest); | |
| 191 } | |
| 192 | |
| 193 @Override | |
| 194 public void startUtilityProcess() {} | |
| 195 | |
| 196 @Override | |
| 197 public void stopUtilityProcess() {} | |
| 198 }; | |
| 199 | |
| 200 Set<String> methodNames = new HashSet<>(); | |
| 201 methodNames.add("https://bobpay.com"); | |
| 202 PaymentAppCreatedCallback callback = Mockito.mock(PaymentAppCreatedCallb ack.class); | |
| 203 | |
| 204 AndroidPaymentAppFinder.find(Mockito.mock(WebContents.class), methodName s, false, | |
| 205 downloader, parser, packageManagerDelegate, callback); | |
| 206 | |
| 207 Mockito.verify(callback).onPaymentAppCreated( | |
| 208 ArgumentMatchers.argThat(Matches.paymentAppIdentifier("com.bobpa y.app"))); | |
| 209 Mockito.verify(callback).onAllPaymentAppsCreated(); | |
| 210 } | |
| 211 | |
| 212 private static final class Matches implements ArgumentMatcher<PaymentApp> { | |
| 213 private final String mExpectedAppIdentifier; | |
| 214 | |
| 215 private Matches(String expectedAppIdentifier) { | |
| 216 mExpectedAppIdentifier = expectedAppIdentifier; | |
| 217 } | |
| 218 | |
| 219 /** | |
| 220 * Builds a matcher based on payment app identifier. | |
| 221 * | |
| 222 * @param expectedAppIdentifier The expected app identifier to match. | |
| 223 * @return A matcher to use in a mock expectation. | |
| 224 */ | |
| 225 public static ArgumentMatcher<PaymentApp> paymentAppIdentifier( | |
| 226 String expectedAppIdentifier) { | |
| 227 return new Matches(expectedAppIdentifier); | |
| 228 } | |
| 229 | |
| 230 @Override | |
| 231 public boolean matches(PaymentApp app) { | |
| 232 return app.getAppIdentifier().equals(mExpectedAppIdentifier); | |
| 233 } | |
| 234 } | |
| 235 } | |
| OLD | NEW |