OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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.webapk.lib.client; | |
6 | |
7 import static org.junit.Assert.assertFalse; | |
8 import static org.junit.Assert.assertTrue; | |
9 import static org.mockito.Mockito.mock; | |
10 import static org.mockito.Mockito.when; | |
11 | |
12 import android.content.Context; | |
13 import android.content.Intent; | |
14 import android.content.pm.ActivityInfo; | |
15 import android.content.pm.PackageInfo; | |
16 import android.content.pm.PackageManager; | |
17 import android.content.pm.PackageManager.NameNotFoundException; | |
18 import android.content.pm.ResolveInfo; | |
19 import android.content.pm.Signature; | |
20 | |
21 import junit.framework.Assert; | |
22 | |
23 import org.chromium.testing.local.LocalRobolectricTestRunner; | |
24 import org.junit.Before; | |
25 import org.junit.Test; | |
26 import org.junit.runner.RunWith; | |
27 import org.robolectric.Robolectric; | |
28 import org.robolectric.annotation.Config; | |
29 import org.robolectric.res.builder.RobolectricPackageManager; | |
30 | |
31 import java.net.URISyntaxException; | |
32 import java.util.ArrayList; | |
33 import java.util.List; | |
34 | |
35 /** | |
36 * Unit tests for {@link org.chromium.webapk.lib.client.WebApkValidator}. | |
37 */ | |
38 @RunWith(LocalRobolectricTestRunner.class) | |
39 @Config(manifest = Config.NONE) | |
40 public class WebApkValidatorTest { | |
41 private static final String WEBAPK_PACKAGE_NAME = "org.chromium.webapk.foo"; | |
42 private static final String INVALID_WEBAPK_PACKAGE_NAME = "invalid.org.chrom ium.webapk.foo"; | |
43 private static final String URL_OF_WEBAPK = "https://www.foo.com"; | |
44 private static final String URL_WITHOUT_WEBAPK = "https://www.other.com"; | |
45 private static final byte[] EXPECTED_SIGNATURE = new byte[] { | |
46 48, -126, 3, -121, 48, -126, 2, 111, -96, 3, 2, 1, 2, 2, 4, 20, -104, -6 6, -126, 48, 13, | |
47 6, 9, 42, -122, 72, -122, -9, 13, 1, 1, 11, 5, 0, 48, 116, 49, 11, 48, 9 , 6, 3, 85, 4, | |
48 6, 19, 2, 67, 65, 49, 16, 48, 14, 6, 3, 85, 4, 8, 19, 7, 79, 110, 116, 9 7, 114, 105, | |
49 111, 49, 17, 48, 15, 6, 3, 85, 4, 7, 19, 8, 87, 97, 116, 101, 114, 108, 111, 111, 49, | |
50 17, 48, 15, 6, 3, 85, 4, 10, 19, 8, 67, 104, 114, 111, 109, 105, 117, 10 9, 49, 17, 48}; | |
51 | |
52 private Context mContext; | |
53 private PackageManager mPackageManager; | |
54 private PackageInfo mWebApkPackageInfo; | |
55 private PackageInfo mInvalidWebApkPackageInfo; | |
56 | |
57 @Before | |
58 public void setUp() { | |
59 mContext = mock(Context.class); | |
60 mPackageManager = mock(PackageManager.class); | |
61 when(mContext.getPackageManager()).thenReturn(mPackageManager); | |
62 WebApkValidator.initWithBrowserHostSignature(EXPECTED_SIGNATURE); | |
63 } | |
64 | |
65 @Test | |
Yaron
2016/05/12 22:11:39
nit: move @Test annotation to after comments
Xi Han
2016/05/13 15:42:55
Done.
| |
66 /** | |
67 * Tests {@link WebApkValidator.queryWebApkPackage()} returns a WebAPK's pac kage name if it can | |
68 * handle the given URL. | |
69 */ | |
70 public void testQueryWebAPKPackageReturnWebApkPackageNameWhichCanHandleTheUR L() { | |
Yaron
2016/05/12 22:11:39
please add test for non-browsable (should not retu
Yaron
2016/05/12 22:11:40
WebApk (throughout)
Xi Han
2016/05/13 15:42:55
Done.
| |
71 Intent intent; | |
Yaron
2016/05/12 22:11:40
nit: move to L73 (no need to be separate declarati
Xi Han
2016/05/13 15:42:55
Done.
| |
72 try { | |
73 intent = Intent.parseUri(URL_OF_WEBAPK, Intent.URI_INTENT_SCHEME); | |
74 intent.addCategory(Intent.CATEGORY_BROWSABLE); | |
75 | |
76 ResolveInfo info = newResolveInfo(WEBAPK_PACKAGE_NAME); | |
77 RobolectricPackageManager packageManager = | |
78 (RobolectricPackageManager) Robolectric.application.getPacka geManager(); | |
79 packageManager.addResolveInfoForIntent(intent, info); | |
80 | |
81 assertTrue(WebApkValidator.queryWebAPKPackage( | |
Yaron
2016/05/12 22:11:40
assertEquals (throughout)
Xi Han
2016/05/13 15:42:55
Done.
| |
82 Robolectric.application, URL_OF_WEBAPK).equals(WEBAPK_PACKAG E_NAME)); | |
83 } catch (URISyntaxException e) { | |
84 Assert.fail("URI is invalid."); | |
85 } | |
86 } | |
87 | |
88 @Test | |
89 /** | |
90 * Tests {@link WebApkValidator.queryWebApkPackage()} returns null if no Web APK can handle | |
91 * the given URL. | |
92 */ | |
93 public void testQueryWebApkPackageReturnNullWhenNoWebApkCanHandleTheURL() { | |
94 Intent intent; | |
95 try { | |
96 intent = Intent.parseUri(URL_OF_WEBAPK, Intent.URI_INTENT_SCHEME); | |
97 intent.addCategory(Intent.CATEGORY_BROWSABLE); | |
98 | |
99 ResolveInfo info = newResolveInfo(WEBAPK_PACKAGE_NAME); | |
100 RobolectricPackageManager packageManager = | |
101 (RobolectricPackageManager) Robolectric.application.getPacka geManager(); | |
102 packageManager.addResolveInfoForIntent(intent, info); | |
103 | |
104 assertTrue(WebApkValidator.queryWebAPKPackage( | |
Yaron
2016/05/12 22:11:40
assertNull (throughout)
Xi Han
2016/05/13 15:42:54
Done.
| |
105 Robolectric.application, URL_WITHOUT_WEBAPK) == null); | |
106 } catch (URISyntaxException e) { | |
107 Assert.fail("URI is invalid."); | |
108 } | |
109 } | |
110 | |
111 @Test | |
112 /** | |
113 * Tests {@link WebApkValidator.findWebAPKPackage()} returns a WebAPK's pack age name when there | |
114 * are ResolveInfos corresponds to a WebAPK. | |
115 */ | |
116 public void testFindWebAPKPackageReturnValidWebApkPackageName() { | |
117 List<ResolveInfo> infos = new ArrayList<ResolveInfo>(); | |
118 infos.add(newResolveInfo(WEBAPK_PACKAGE_NAME)); | |
119 assertTrue(WebApkValidator.findWebAPKPackage(infos).equals(WEBAPK_PACKAG E_NAME)); | |
120 } | |
121 | |
122 @Test | |
123 /** | |
124 * Tests {@link WebApkValidator.findWebAPKPackage()} returns null when there isn't any | |
125 * ResolveInfos corresponds to a WebAPK. | |
126 */ | |
127 public void testFindWebAPKPackageReturnNullWhenNoResolvesInfosCorrespondsToW ebApk() { | |
Yaron
2016/05/12 22:11:40
s/ResolvesInfosCorresponds/ResolveInfosCorrespondi
Xi Han
2016/05/13 15:42:55
Done.
| |
128 List<ResolveInfo> infos = new ArrayList<ResolveInfo>(); | |
129 infos.add(newResolveInfo("com.google.android")); | |
130 assertTrue(WebApkValidator.findWebAPKPackage(infos) == null); | |
131 } | |
132 | |
133 @Test | |
134 /** | |
135 * Tests {@link WebApkValidator.IsValidWebApk} returns true if the WebAPK ha s the expected | |
136 * signature. | |
137 */ | |
138 public void testIsValidWebApkReturnsTrueForValidWebApk() throws NameNotFound Exception { | |
Yaron
2016/05/12 22:11:39
please add test for multiple signatures with one m
Xi Han
2016/05/13 15:42:55
It is possible to update these two tests to cover
| |
139 mWebApkPackageInfo = mock(PackageInfo.class); | |
140 when(mPackageManager.getPackageInfo(WEBAPK_PACKAGE_NAME, PackageManager. GET_SIGNATURES)) | |
141 .thenReturn(mWebApkPackageInfo); | |
142 mWebApkPackageInfo.signatures = new Signature[] {new Signature(EXPECTED_ SIGNATURE)}; | |
143 | |
144 assertTrue(WebApkValidator.isValidWebApk(mContext, WEBAPK_PACKAGE_NAME)) ; | |
145 } | |
146 | |
147 @Test | |
148 /** | |
149 * Tests {@link WebApkValidator.IsValidWebApk} returns true if the WebAPK do esn't have the | |
150 * expected signature. | |
151 */ | |
152 public void testIsValidWebApkReturnsFalseForInValidWebApk() throws NameNotFo undException { | |
Yaron
2016/05/12 22:11:39
s/InValid/Invalid/
Xi Han
2016/05/13 15:42:55
Done.
| |
153 mInvalidWebApkPackageInfo = mock(PackageInfo.class); | |
154 when(mPackageManager.getPackageInfo(INVALID_WEBAPK_PACKAGE_NAME, | |
155 PackageManager.GET_SIGNATURES)).thenReturn(mInvalidWebApkPackage Info); | |
156 mInvalidWebApkPackageInfo.signatures = new Signature[] {new Signature(ne w byte[] {})}; | |
157 | |
158 assertFalse(WebApkValidator.isValidWebApk(mContext, INVALID_WEBAPK_PACKA GE_NAME)); | |
159 } | |
160 | |
161 private static ResolveInfo newResolveInfo(String packageName) { | |
162 ActivityInfo activityInfo = new ActivityInfo(); | |
163 activityInfo.packageName = packageName; | |
164 ResolveInfo resolveInfo = new ResolveInfo(); | |
165 resolveInfo.activityInfo = activityInfo; | |
166 return resolveInfo; | |
167 } | |
168 } | |
OLD | NEW |