| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.payments; | 5 package org.chromium.chrome.browser.payments; |
| 6 | 6 |
| 7 import android.content.pm.ActivityInfo; | 7 import android.content.pm.ActivityInfo; |
| 8 import android.content.pm.PackageInfo; | 8 import android.content.pm.PackageInfo; |
| 9 import android.content.pm.ResolveInfo; | 9 import android.content.pm.ResolveInfo; |
| 10 import android.content.pm.Signature; | 10 import android.content.pm.Signature; |
| 11 | 11 |
| 12 import org.junit.Test; | 12 import org.junit.Test; |
| 13 import org.junit.runner.RunWith; | 13 import org.junit.runner.RunWith; |
| 14 import org.mockito.Mockito; | 14 import org.mockito.Mockito; |
| 15 import org.robolectric.RobolectricTestRunner; | 15 import org.robolectric.RobolectricTestRunner; |
| 16 import org.robolectric.annotation.Config; | 16 import org.robolectric.annotation.Config; |
| 17 | 17 |
| 18 import org.chromium.chrome.browser.payments.PaymentManifestVerifier.ManifestVeri
fyCallback; | 18 import org.chromium.chrome.browser.payments.PaymentManifestVerifier.ManifestVeri
fyCallback; |
| 19 import org.chromium.components.payments.PaymentManifestDownloader; | 19 import org.chromium.components.payments.PaymentManifestDownloader; |
| 20 import org.chromium.components.payments.PaymentManifestParser; | 20 import org.chromium.components.payments.PaymentManifestParser; |
| 21 import org.chromium.payments.mojom.PaymentManifestSection; | 21 import org.chromium.payments.mojom.WebAppManifestSection; |
| 22 | 22 |
| 23 import java.net.URI; | 23 import java.net.URI; |
| 24 import java.net.URISyntaxException; | 24 import java.net.URISyntaxException; |
| 25 import java.util.ArrayList; | 25 import java.util.ArrayList; |
| 26 import java.util.List; | 26 import java.util.List; |
| 27 | 27 |
| 28 /** A test for the verifier of a payment app manifest. */ | 28 /** A test for the verifier of a payment app manifest. */ |
| 29 @RunWith(RobolectricTestRunner.class) | 29 @RunWith(RobolectricTestRunner.class) |
| 30 @Config(sdk = 21, manifest = Config.NONE) | 30 @Config(sdk = 21, manifest = Config.NONE) |
| 31 public class PaymentManifestVerifierTest { | 31 public class PaymentManifestVerifierTest { |
| 32 private final URI mMethodName; | 32 private final URI mMethodName; |
| 33 private final ResolveInfo mAlicePay; | 33 private final ResolveInfo mAlicePay; |
| 34 private final ResolveInfo mBobPay; | 34 private final ResolveInfo mBobPay; |
| 35 private final List<ResolveInfo> mMatchingApps; | 35 private final List<ResolveInfo> mMatchingApps; |
| 36 private final PaymentManifestDownloader mDownloader; | 36 private final PaymentManifestDownloader mDownloader; |
| 37 private final PaymentManifestParser mAnyAppAllowedParser; | 37 private final PaymentManifestParser mParser; |
| 38 private final PackageManagerDelegate mPackageManagerDelegate; | 38 private final PackageManagerDelegate mPackageManagerDelegate; |
| 39 private final ManifestVerifyCallback mCallback; | 39 private final ManifestVerifyCallback mCallback; |
| 40 | 40 |
| 41 public PaymentManifestVerifierTest() throws URISyntaxException { | 41 public PaymentManifestVerifierTest() throws URISyntaxException { |
| 42 mMethodName = new URI("https://example.com"); | 42 mMethodName = new URI("https://example.com"); |
| 43 | 43 |
| 44 mAlicePay = new ResolveInfo(); | 44 mAlicePay = new ResolveInfo(); |
| 45 mAlicePay.activityInfo = new ActivityInfo(); | 45 mAlicePay.activityInfo = new ActivityInfo(); |
| 46 mAlicePay.activityInfo.packageName = "com.alicepay.app"; | 46 mAlicePay.activityInfo.packageName = "com.alicepay.app"; |
| 47 | 47 |
| 48 mBobPay = new ResolveInfo(); | 48 mBobPay = new ResolveInfo(); |
| 49 mBobPay.activityInfo = new ActivityInfo(); | 49 mBobPay.activityInfo = new ActivityInfo(); |
| 50 mBobPay.activityInfo.packageName = "com.bobpay.app"; | 50 mBobPay.activityInfo.packageName = "com.bobpay.app"; |
| 51 | 51 |
| 52 mMatchingApps = new ArrayList<>(); | 52 mMatchingApps = new ArrayList<>(); |
| 53 mMatchingApps.add(mAlicePay); | 53 mMatchingApps.add(mAlicePay); |
| 54 mMatchingApps.add(mBobPay); | 54 mMatchingApps.add(mBobPay); |
| 55 | 55 |
| 56 mDownloader = new PaymentManifestDownloader(null) { | 56 mDownloader = new PaymentManifestDownloader(null) { |
| 57 @Override | 57 @Override |
| 58 public void download(URI uri, ManifestDownloadCallback callback) { | 58 public void downloadPaymentMethodManifest(URI uri, ManifestDownloadC
allback callback) { |
| 59 callback.onManifestDownloadSuccess("some content here"); | 59 callback.onPaymentMethodManifestDownloadSuccess("some content he
re"); |
| 60 } |
| 61 |
| 62 @Override |
| 63 public void downloadWebAppManifest(URI uri, ManifestDownloadCallback
callback) { |
| 64 callback.onWebAppManifestDownloadSuccess("some content here"); |
| 60 } | 65 } |
| 61 }; | 66 }; |
| 62 | 67 |
| 63 mAnyAppAllowedParser = new PaymentManifestParser() { | 68 mParser = new PaymentManifestParser() { |
| 64 @Override | 69 @Override |
| 65 public void parse(String content, ManifestParseCallback callback) { | 70 public void parsePaymentMethodManifest(String content, ManifestParse
Callback callback) { |
| 66 PaymentManifestSection[] manifest = new PaymentManifestSection[1
]; | 71 try { |
| 67 manifest[0] = new PaymentManifestSection(); | 72 callback.onPaymentMethodManifestParseSuccess( |
| 68 manifest[0].packageName = "*"; | 73 new URI[] {new URI("https://bobpay.com/app.json")}); |
| 69 callback.onManifestParseSuccess(manifest); | 74 } catch (URISyntaxException e) { |
| 75 assert false; |
| 76 } |
| 77 } |
| 78 |
| 79 @Override |
| 80 public void parseWebAppManifest(String content, ManifestParseCallbac
k callback) { |
| 81 WebAppManifestSection[] manifest = new WebAppManifestSection[1]; |
| 82 manifest[0] = new WebAppManifestSection(); |
| 83 manifest[0].id = "com.bobpay.app"; |
| 84 manifest[0].minVersion = 10; |
| 85 // SHA256("01020304050607080900"): |
| 86 manifest[0].fingerprints = new byte[][] {{(byte) 0x9A, (byte) 0x
89, (byte) 0xC6, |
| 87 (byte) 0x8C, (byte) 0x4C, (byte) 0x5E, (byte) 0x28, (byt
e) 0xB8, |
| 88 (byte) 0xC4, (byte) 0xA5, (byte) 0x56, (byte) 0x76, (byt
e) 0x73, |
| 89 (byte) 0xD4, (byte) 0x62, (byte) 0xFF, (byte) 0xF5, (byt
e) 0x15, |
| 90 (byte) 0xDB, (byte) 0x46, (byte) 0x11, (byte) 0x6F, (byt
e) 0x99, |
| 91 (byte) 0x00, (byte) 0x62, (byte) 0x4D, (byte) 0x09, (byt
e) 0xC4, |
| 92 (byte) 0x74, (byte) 0xF5, (byte) 0x93, (byte) 0xFB}}; |
| 93 callback.onWebAppManifestParseSuccess(manifest); |
| 70 } | 94 } |
| 71 }; | 95 }; |
| 72 | 96 |
| 73 mPackageManagerDelegate = Mockito.mock(PackageManagerDelegate.class); | 97 mPackageManagerDelegate = Mockito.mock(PackageManagerDelegate.class); |
| 74 | 98 |
| 75 PackageInfo bobPayPackageInfo = new PackageInfo(); | 99 PackageInfo bobPayPackageInfo = new PackageInfo(); |
| 76 bobPayPackageInfo.versionCode = 10; | 100 bobPayPackageInfo.versionCode = 10; |
| 77 bobPayPackageInfo.signatures = new Signature[1]; | 101 bobPayPackageInfo.signatures = new Signature[1]; |
| 78 bobPayPackageInfo.signatures[0] = new Signature("01020304050607080900"); | 102 bobPayPackageInfo.signatures[0] = new Signature("01020304050607080900"); |
| 79 Mockito.when(mPackageManagerDelegate.getPackageInfoWithSignatures("com.b
obpay.app")) | 103 Mockito.when(mPackageManagerDelegate.getPackageInfoWithSignatures("com.b
obpay.app")) |
| 80 .thenReturn(bobPayPackageInfo); | 104 .thenReturn(bobPayPackageInfo); |
| 81 | 105 |
| 82 PackageInfo alicePayPackageInfo = new PackageInfo(); | 106 PackageInfo alicePayPackageInfo = new PackageInfo(); |
| 83 alicePayPackageInfo.versionCode = 10; | 107 alicePayPackageInfo.versionCode = 10; |
| 84 alicePayPackageInfo.signatures = new Signature[1]; | 108 alicePayPackageInfo.signatures = new Signature[1]; |
| 85 alicePayPackageInfo.signatures[0] = new Signature("ABCDEFABCDEFABCDEFAB"
); | 109 alicePayPackageInfo.signatures[0] = new Signature("ABCDEFABCDEFABCDEFAB"
); |
| 86 Mockito.when(mPackageManagerDelegate.getPackageInfoWithSignatures("com.a
licepay.app")) | 110 Mockito.when(mPackageManagerDelegate.getPackageInfoWithSignatures("com.a
licepay.app")) |
| 87 .thenReturn(alicePayPackageInfo); | 111 .thenReturn(alicePayPackageInfo); |
| 88 | 112 |
| 89 mCallback = Mockito.mock(ManifestVerifyCallback.class); | 113 mCallback = Mockito.mock(ManifestVerifyCallback.class); |
| 90 } | 114 } |
| 91 | 115 |
| 92 @Test | 116 @Test |
| 93 public void testUnableToDownload() { | 117 public void testUnableToDownloadPaymentMethodManifest() { |
| 94 PaymentManifestVerifier verifier = new PaymentManifestVerifier( | 118 PaymentManifestVerifier verifier = new PaymentManifestVerifier( |
| 95 mMethodName, mMatchingApps, new PaymentManifestDownloader(null)
{ | 119 mMethodName, mMatchingApps, new PaymentManifestDownloader(null)
{ |
| 96 @Override | 120 @Override |
| 97 public void download(URI uri, ManifestDownloadCallback callb
ack) { | 121 public void downloadPaymentMethodManifest( |
| 122 URI uri, ManifestDownloadCallback callback) { |
| 98 callback.onManifestDownloadFailure(); | 123 callback.onManifestDownloadFailure(); |
| 99 } | 124 } |
| 100 }, mAnyAppAllowedParser, mPackageManagerDelegate, mCallback); | 125 }, mParser, mPackageManagerDelegate, mCallback); |
| 101 | 126 |
| 102 verifier.verify(); | 127 verifier.verify(); |
| 103 | 128 |
| 104 Mockito.verify(mCallback).onInvalidManifest(mMethodName); | 129 Mockito.verify(mCallback).onInvalidManifest(mMethodName); |
| 105 } | 130 } |
| 106 | 131 |
| 107 @Test | 132 @Test |
| 108 public void testUnableToParse() { | 133 public void testUnableToDownloadWebAppManifest() { |
| 109 PaymentManifestVerifier verifier = new PaymentManifestVerifier( | 134 PaymentManifestVerifier verifier = new PaymentManifestVerifier( |
| 110 mMethodName, mMatchingApps, mDownloader, new PaymentManifestPars
er() { | 135 mMethodName, mMatchingApps, new PaymentManifestDownloader(null)
{ |
| 111 @Override | 136 @Override |
| 112 public void parse(String content, ManifestParseCallback call
back) { | 137 public void downloadPaymentMethodManifest( |
| 113 callback.onManifestParseFailure(); | 138 URI uri, ManifestDownloadCallback callback) { |
| 139 callback.onPaymentMethodManifestDownloadSuccess("some co
ntent"); |
| 114 } | 140 } |
| 115 }, mPackageManagerDelegate, mCallback); | 141 |
| 142 @Override |
| 143 public void downloadWebAppManifest(URI uri, ManifestDownload
Callback callback) { |
| 144 callback.onManifestDownloadFailure(); |
| 145 } |
| 146 }, mParser, mPackageManagerDelegate, mCallback); |
| 116 | 147 |
| 117 verifier.verify(); | 148 verifier.verify(); |
| 118 | 149 |
| 119 Mockito.verify(mCallback).onInvalidManifest(mMethodName); | 150 Mockito.verify(mCallback).onInvalidManifest(mMethodName); |
| 120 } | 151 } |
| 121 | 152 |
| 122 @Test | 153 @Test |
| 123 public void testAnyAppAllowed() { | 154 public void testUnableToParsePaymentMethodManifest() { |
| 124 PaymentManifestVerifier verifier = new PaymentManifestVerifier(mMethodNa
me, mMatchingApps, | 155 PaymentManifestVerifier verifier = new PaymentManifestVerifier( |
| 125 mDownloader, mAnyAppAllowedParser, mPackageManagerDelegate, mCal
lback); | 156 mMethodName, mMatchingApps, mDownloader, new PaymentManifestPars
er() { |
| 157 @Override |
| 158 public void parsePaymentMethodManifest( |
| 159 String content, ManifestParseCallback callback) { |
| 160 callback.onManifestParseFailure(); |
| 161 } |
| 162 }, mPackageManagerDelegate, mCallback); |
| 126 | 163 |
| 127 verifier.verify(); | 164 verifier.verify(); |
| 128 | 165 |
| 129 Mockito.verify(mCallback).onValidPaymentApp(mMethodName, mAlicePay); | 166 Mockito.verify(mCallback).onInvalidManifest(mMethodName); |
| 130 Mockito.verify(mCallback).onValidPaymentApp(mMethodName, mBobPay); | 167 } |
| 168 |
| 169 @Test |
| 170 public void testUnableToParseWebAppManifest() { |
| 171 PaymentManifestVerifier verifier = new PaymentManifestVerifier( |
| 172 mMethodName, mMatchingApps, mDownloader, new PaymentManifestPars
er() { |
| 173 @Override |
| 174 public void parsePaymentMethodManifest( |
| 175 String content, ManifestParseCallback callback) { |
| 176 try { |
| 177 callback.onPaymentMethodManifestParseSuccess( |
| 178 new URI[] {new URI("https://alicepay.com/app
.json")}); |
| 179 } catch (URISyntaxException e) { |
| 180 assert false; |
| 181 } |
| 182 } |
| 183 |
| 184 @Override |
| 185 public void parseWebAppManifest( |
| 186 String content, ManifestParseCallback callback) { |
| 187 callback.onManifestParseFailure(); |
| 188 } |
| 189 }, mPackageManagerDelegate, mCallback); |
| 190 |
| 191 verifier.verify(); |
| 192 |
| 193 Mockito.verify(mCallback).onInvalidManifest(mMethodName); |
| 131 } | 194 } |
| 132 | 195 |
| 133 @Test | 196 @Test |
| 134 public void testBobPayAllowed() { | 197 public void testBobPayAllowed() { |
| 135 PaymentManifestVerifier verifier = new PaymentManifestVerifier( | 198 PaymentManifestVerifier verifier = new PaymentManifestVerifier(mMethodNa
me, mMatchingApps, |
| 136 mMethodName, mMatchingApps, mDownloader, new PaymentManifestPars
er() { | 199 mDownloader, mParser, mPackageManagerDelegate, mCallback); |
| 137 @Override | |
| 138 public void parse(String content, ManifestParseCallback call
back) { | |
| 139 PaymentManifestSection[] manifest = new PaymentManifestS
ection[1]; | |
| 140 manifest[0] = new PaymentManifestSection(); | |
| 141 manifest[0].packageName = "com.bobpay.app"; | |
| 142 manifest[0].version = 10; | |
| 143 // SHA256("01020304050607080900"): | |
| 144 manifest[0].sha256CertFingerprints = new byte[][] {{(byt
e) 0x9A, | |
| 145 (byte) 0x89, (byte) 0xC6, (byte) 0x8C, (byte) 0x
4C, (byte) 0x5E, | |
| 146 (byte) 0x28, (byte) 0xB8, (byte) 0xC4, (byte) 0x
A5, (byte) 0x56, | |
| 147 (byte) 0x76, (byte) 0x73, (byte) 0xD4, (byte) 0x
62, (byte) 0xFF, | |
| 148 (byte) 0xF5, (byte) 0x15, (byte) 0xDB, (byte) 0x
46, (byte) 0x11, | |
| 149 (byte) 0x6F, (byte) 0x99, (byte) 0x00, (byte) 0x
62, (byte) 0x4D, | |
| 150 (byte) 0x09, (byte) 0xC4, (byte) 0x74, (byte) 0x
F5, (byte) 0x93, | |
| 151 (byte) 0xFB}}; | |
| 152 callback.onManifestParseSuccess(manifest); | |
| 153 } | |
| 154 }, mPackageManagerDelegate, mCallback); | |
| 155 | 200 |
| 156 verifier.verify(); | 201 verifier.verify(); |
| 157 | 202 |
| 158 Mockito.verify(mCallback).onInvalidPaymentApp(mMethodName, mAlicePay); | 203 Mockito.verify(mCallback).onInvalidPaymentApp(mMethodName, mAlicePay); |
| 159 Mockito.verify(mCallback).onValidPaymentApp(mMethodName, mBobPay); | 204 Mockito.verify(mCallback).onValidPaymentApp(mMethodName, mBobPay); |
| 160 } | 205 } |
| 161 } | 206 } |
| OLD | NEW |