Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: chrome/android/junit/src/org/chromium/chrome/browser/payments/PaymentManifestVerifierTest.java

Issue 2802043002: Use web-app manifest format for Android payment apps. (Closed)
Patch Set: Update comment Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698