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.content.browser.installedapp; | |
| 6 | |
| 7 import android.content.pm.ApplicationInfo; | |
| 8 import android.content.pm.PackageManager; | |
| 9 import android.content.pm.PackageManager.NameNotFoundException; | |
| 10 import android.content.res.AssetManager; | |
| 11 import android.content.res.Resources; | |
| 12 import android.os.Bundle; | |
| 13 | |
| 14 import org.junit.Assert; | |
| 15 import org.junit.Before; | |
| 16 import org.junit.Test; | |
| 17 import org.junit.runner.RunWith; | |
| 18 | |
| 19 import org.robolectric.RuntimeEnvironment; | |
| 20 import org.robolectric.annotation.Config; | |
| 21 import org.robolectric.res.builder.DefaultPackageManager; | |
| 22 | |
| 23 import org.chromium.base.test.util.Feature; | |
| 24 import org.chromium.installedapp.mojom.InstalledAppProvider; | |
| 25 import org.chromium.installedapp.mojom.RelatedApplication; | |
| 26 import org.chromium.testing.local.LocalRobolectricTestRunner; | |
| 27 | |
| 28 import java.util.HashMap; | |
| 29 | |
| 30 /** | |
| 31 * Ensure that the InstalledAppProvider returns the correct apps. | |
| 32 */ | |
| 33 @RunWith(LocalRobolectricTestRunner.class) | |
| 34 @Config(manifest = Config.NONE) | |
| 35 public class InstalledAppProviderTest { | |
| 36 private static final String ASSET_STATEMENTS_KEY = "asset_statements"; | |
|
boliu
2017/03/17 18:02:56
some of these can just reuse the constants in Inst
Matt Giuca
2017/03/20 06:31:56
Done. (I kept these constants but defined them in
| |
| 37 private static final String RELATION_HANDLE_ALL_URLS = | |
| 38 "delegate_permission/common.handle_all_urls"; | |
| 39 private static final String NAMESPACE_WEB = "web"; | |
| 40 private static final String PLATFORM_ANDROID = "play"; | |
| 41 private static final String PLATFORM_OTHER = "itunes"; | |
| 42 // Note: Android package name and origin deliberately unrelated (there is no requirement that | |
| 43 // they be the same). | |
| 44 private static final String PACKAGE_NAME_1 = "com.app1.package"; | |
| 45 private static final String PACKAGE_NAME_2 = "com.app2.package"; | |
| 46 private static final String PACKAGE_NAME_3 = "com.app3.package"; | |
| 47 private static final String ORIGIN = "https://example.com:8000"; | |
| 48 private static final String URL_ON_ORIGIN = | |
| 49 "https://example.com:8000/path/to/page.html?key=value#fragment"; | |
| 50 private static final String ORIGIN_SYNTAX_ERROR = "https:{"; | |
| 51 private static final String ORIGIN_MISSING_SCHEME = "path/only"; | |
| 52 private static final String ORIGIN_MISSING_HOST = "file:///path/piece"; | |
| 53 private static final String ORIGIN_MISSING_PORT = "http://example.com"; | |
| 54 private static final String ORIGIN_DIFFERENT_SCHEME = "http://example.com:80 00"; | |
| 55 private static final String ORIGIN_DIFFERENT_HOST = "https://example.org:800 0"; | |
| 56 private static final String ORIGIN_DIFFERENT_PORT = "https://example.com:800 1"; | |
| 57 | |
| 58 private FakePackageManager mPackageManager; | |
| 59 private InstalledAppProviderImpl mInstalledAppProvider; | |
| 60 | |
| 61 /** | |
| 62 * FakePackageManager allows for the "installation" of Android package names and setting up | |
| 63 * Resources for installed packages. | |
| 64 */ | |
| 65 private class FakePackageManager extends DefaultPackageManager { | |
|
boliu
2017/03/17 18:02:56
static (I hope)
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 66 private final HashMap<String, Bundle> mMetaDataMap; | |
| 67 private final HashMap<String, Resources> mResourceMap; | |
| 68 | |
| 69 public FakePackageManager() { | |
| 70 super(); | |
| 71 mMetaDataMap = new HashMap<String, Bundle>(); | |
| 72 mResourceMap = new HashMap<String, Resources>(); | |
| 73 } | |
| 74 | |
| 75 @Override | |
| 76 public ApplicationInfo getApplicationInfo(String packageName, int flags) | |
| 77 throws NameNotFoundException { | |
| 78 if (packageName == null) throw new NullPointerException(); | |
| 79 | |
| 80 Bundle metaData = mMetaDataMap.get(packageName); | |
| 81 if (metaData == null) throw new NameNotFoundException(packageName); | |
| 82 | |
| 83 // Create an application with this metadata (but only if |flags| all ows). Doing it this | |
| 84 // way (rather than simply storing the ApplicationInfo in a map) ens ures that the | |
| 85 // |flags| is set correctly. | |
| 86 ApplicationInfo appInfo = new ApplicationInfo(); | |
| 87 appInfo.packageName = packageName; | |
| 88 if ((flags & PackageManager.GET_META_DATA) != 0) { | |
| 89 appInfo.metaData = metaData; | |
| 90 } | |
| 91 return appInfo; | |
| 92 } | |
| 93 | |
| 94 @Override | |
| 95 public Resources getResourcesForApplication(ApplicationInfo app) | |
| 96 throws NameNotFoundException { | |
| 97 if (app == null) throw new NullPointerException(); | |
| 98 | |
| 99 Resources result = mResourceMap.get(app.packageName); | |
| 100 if (result == null) throw new NameNotFoundException(app.packageName) ; | |
| 101 | |
| 102 return result; | |
| 103 } | |
| 104 | |
| 105 public void setMetaDataAndResourcesForTest( | |
| 106 String packageName, Bundle metaData, Resources resources) { | |
| 107 mMetaDataMap.put(packageName, metaData); | |
| 108 mResourceMap.put(packageName, resources); | |
| 109 } | |
| 110 } | |
| 111 | |
| 112 /** | |
| 113 * Fakes the Resources object, allowing lookup of a single String value. | |
| 114 * | |
| 115 * Note: The real Resources object defines a mapping to many values. This fa ke object only | |
| 116 * allows a single value in the mapping, and it must be a String (which is a ll that is required | |
| 117 * for these tests). | |
| 118 */ | |
| 119 private class FakeResources extends Resources { | |
|
boliu
2017/03/17 18:02:56
ditto static
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 120 private final int mId; | |
| 121 private final String mValue; | |
| 122 | |
| 123 public FakeResources(int identifier, String value) { | |
| 124 super(new AssetManager(), null, null); | |
|
Matt Giuca
2017/03/20 06:31:56
Hmm, I'm now seeing this deprecation warning:
Ins
boliu
2017/03/20 16:56:20
Yeah robolectric got rolled to N recently. Might h
Matt Giuca
2017/03/21 04:16:13
Ah... suppressed ;)
| |
| 125 mId = identifier; | |
| 126 mValue = value; | |
| 127 } | |
| 128 | |
| 129 @Override | |
| 130 public int getIdentifier(String name, String defType, String defPackage) { | |
| 131 if (name == null) throw new NullPointerException(); | |
| 132 | |
| 133 // There is *no guarantee* (in the Digital Asset Links spec) about w hat the string | |
| 134 // resource should be called ("asset_statements" is just an example) . Therefore, | |
| 135 // getIdentifier cannot be used to get the asset statements string. Always fail the | |
| 136 // lookup here, to ensure the implementation isn't relying on any pa rticular hard-coded | |
| 137 // string. | |
| 138 return 0; | |
| 139 } | |
| 140 | |
| 141 @Override | |
| 142 public String getString(int id) { | |
| 143 if (id != mId) { | |
| 144 throw new Resources.NotFoundException("id 0x" + Integer.toHexStr ing(id)); | |
| 145 } | |
| 146 | |
| 147 return mValue; | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 /** | |
| 152 * Creates a metaData bundle with a single resource-id key. | |
| 153 */ | |
| 154 private static Bundle createMetaData(String metaDataName, int metaDataResour ceId) { | |
| 155 Bundle metaData = new Bundle(); | |
| 156 metaData.putInt(metaDataName, metaDataResourceId); | |
| 157 return metaData; | |
| 158 } | |
| 159 | |
| 160 /** | |
| 161 * Sets a resource with a single key-value pair in an Android package's mani fest. | |
| 162 * | |
| 163 * The value is always a string. | |
| 164 */ | |
| 165 private void setStringResource(String packageName, String key, String value) { | |
| 166 int identifier = 0x1234; | |
| 167 Bundle metaData = createMetaData(key, identifier); | |
| 168 FakeResources resources = new FakeResources(identifier, value); | |
| 169 mPackageManager.setMetaDataAndResourcesForTest(packageName, metaData, re sources); | |
| 170 } | |
| 171 | |
| 172 /** | |
| 173 * Creates a valid Android asset statement string. | |
| 174 */ | |
| 175 private String createAssetStatement(String platform, String relation, String url) { | |
| 176 return "{\"relation\": [\"" + relation + "\"]," | |
|
boliu
2017/03/17 18:02:56
nit: there is String.format, might be easier to re
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 177 + "\"target\": {\"namespace\": \"" + platform + "\", \"site\": \ "" + url + "\"}}"; | |
| 178 } | |
| 179 | |
| 180 /** | |
| 181 * Sets an asset statement to an Android package's manifest (in the fake pac kage manager). | |
| 182 * | |
| 183 * Only one asset statement can be set for a given package (if this is calle d twice on the same | |
| 184 * package, overwrites the previous asset statement). | |
| 185 * | |
| 186 * This corresponds to a Statement List in the Digital Asset Links spec v1. | |
| 187 */ | |
| 188 private void setAssetStatement( | |
| 189 String packageName, String platform, String relation, String url) { | |
| 190 String statements = "[" + createAssetStatement(platform, relation, url) + "]"; | |
| 191 setStringResource(packageName, ASSET_STATEMENTS_KEY, statements); | |
| 192 } | |
| 193 | |
| 194 /** | |
| 195 * Creates a RelatedApplication to put in the web app manifest. | |
| 196 */ | |
| 197 private RelatedApplication createRelatedApplication(String platform, String id, String url) { | |
| 198 RelatedApplication application = new RelatedApplication(); | |
| 199 application.platform = platform; | |
| 200 application.id = id; | |
| 201 application.url = url; | |
| 202 return application; | |
| 203 } | |
| 204 | |
| 205 /** | |
| 206 * Calls filterInstalledApps with the given inputs, and tests that the expec ted result is | |
| 207 * returned. | |
| 208 */ | |
| 209 private void verifyInstalledApps(RelatedApplication[] manifestRelatedApps, | |
| 210 RelatedApplication[] expectedInstalledRelatedApps) { | |
| 211 mInstalledAppProvider.filterInstalledApps( | |
| 212 manifestRelatedApps, new InstalledAppProvider.FilterInstalledApp sResponse() { | |
| 213 @Override | |
| 214 public void call(RelatedApplication[] installedRelatedApps) { | |
| 215 Assert.assertEquals( | |
| 216 expectedInstalledRelatedApps.length, installedRe latedApps.length); | |
| 217 if (expectedInstalledRelatedApps.length != installedRela tedApps.length) { | |
|
boliu
2017/03/17 18:02:56
assertEquals throws an exception on failure, so th
Matt Giuca
2017/03/20 06:31:56
Done. (Oh yeah, I'm used to EXPECT_EQ in C++.)
| |
| 218 return; | |
| 219 } | |
| 220 | |
| 221 for (int i = 0; i < installedRelatedApps.length; i++) { | |
| 222 Assert.assertEquals( | |
| 223 expectedInstalledRelatedApps[i], installedRe latedApps[i]); | |
| 224 } | |
| 225 } | |
| 226 }); | |
| 227 } | |
| 228 | |
| 229 @Before | |
| 230 public void setUp() { | |
| 231 mPackageManager = new FakePackageManager(); | |
| 232 RuntimeEnvironment.setRobolectricPackageManager(mPackageManager); | |
| 233 mInstalledAppProvider = | |
| 234 new InstalledAppProviderImpl(URL_ON_ORIGIN, RuntimeEnvironment.a pplication); | |
| 235 } | |
| 236 | |
| 237 /** | |
| 238 * Origin of the page using the API is missing certain parts of the URI. | |
| 239 */ | |
| 240 @Test | |
| 241 @Feature({"InstalledApp"}) | |
| 242 public void testOriginMissingParts() { | |
| 243 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 244 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 245 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 246 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 247 | |
| 248 mInstalledAppProvider = | |
| 249 new InstalledAppProviderImpl(ORIGIN_MISSING_SCHEME, RuntimeEnvir onment.application); | |
| 250 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 251 | |
| 252 mInstalledAppProvider = | |
| 253 new InstalledAppProviderImpl(ORIGIN_MISSING_HOST, RuntimeEnviron ment.application); | |
| 254 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 255 } | |
| 256 | |
| 257 /** | |
| 258 * No related Android apps. | |
| 259 * | |
| 260 * An Android app relates to the web app, but not mutual. | |
| 261 */ | |
| 262 @Test | |
| 263 @Feature({"InstalledApp"}) | |
| 264 public void testNoRelatedApps() { | |
| 265 // The web manifest has no related apps. | |
| 266 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {}; | |
| 267 | |
| 268 // One Android app is installed named |PACKAGE_NAME_1|. It has a related web app with origin | |
| 269 // |ORIGIN|. | |
| 270 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 271 | |
| 272 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 273 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 274 } | |
| 275 | |
| 276 /** | |
| 277 * One related Android app with no id (package name). | |
| 278 * | |
| 279 * An Android app relates to the web app, but not mutual. | |
| 280 */ | |
| 281 @Test | |
| 282 @Feature({"InstalledApp"}) | |
| 283 public void testOneRelatedAppNoId() { | |
| 284 RelatedApplication manifestRelatedApps[] = | |
| 285 new RelatedApplication[] {createRelatedApplication(PLATFORM_ANDR OID, null, null)}; | |
| 286 | |
| 287 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 288 | |
| 289 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 290 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 291 } | |
| 292 | |
| 293 /** | |
| 294 * One related app (from a non-Android platform). | |
| 295 * | |
| 296 * An Android app with the same id relates to the web app. This should be ig nored since the | |
| 297 * manifest doesn't mention the Android app. | |
| 298 */ | |
| 299 @Test | |
| 300 @Feature({"InstalledApp"}) | |
| 301 public void testOneRelatedNonAndroidApp() { | |
| 302 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 303 createRelatedApplication(PLATFORM_OTHER, PACKAGE_NAME_1, null)}; | |
| 304 | |
| 305 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 306 | |
| 307 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 308 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 309 } | |
| 310 | |
| 311 /** | |
| 312 * One related Android app; Android app is not installed. | |
| 313 * | |
| 314 * Another Android app relates to the web app, but not mutual. | |
| 315 */ | |
| 316 @Test | |
| 317 @Feature({"InstalledApp"}) | |
| 318 public void testOneRelatedAppNotInstalled() { | |
| 319 // The web manifest has a related Android app named |PACKAGE_NAME_1|. | |
| 320 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 321 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 322 | |
| 323 // One Android app is installed named |PACKAGE_NAME_2|. It has a related web app with origin | |
| 324 // |ORIGIN|. | |
| 325 setAssetStatement(PACKAGE_NAME_2, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 326 | |
| 327 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 328 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 329 } | |
| 330 | |
| 331 /** | |
| 332 * Android app manifest has an asset_statements key, but the resource it lin ks to is missing. | |
| 333 */ | |
| 334 @Test | |
| 335 @Feature({"InstalledApp"}) | |
| 336 public void testOneRelatedAppBrokenAssetStatementsResource() { | |
| 337 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 338 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 339 | |
| 340 Bundle metaData = createMetaData(ASSET_STATEMENTS_KEY, 0x1234); | |
| 341 String statements = | |
| 342 "[" + createAssetStatement(NAMESPACE_WEB, RELATION_HANDLE_ALL_UR LS, ORIGIN) + "]"; | |
| 343 FakeResources resources = new FakeResources(0x4321, statements); | |
| 344 mPackageManager.setMetaDataAndResourcesForTest(PACKAGE_NAME_1, metaData, resources); | |
| 345 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 346 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 347 } | |
| 348 | |
| 349 /** | |
| 350 * One related Android app; Android app is not mutually related (has no asse t_statements). | |
| 351 */ | |
| 352 @Test | |
| 353 @Feature({"InstalledApp"}) | |
| 354 public void testOneRelatedAppNoAssetStatements() { | |
| 355 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 356 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 357 | |
| 358 setStringResource(PACKAGE_NAME_1, null, null); | |
| 359 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 360 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 361 } | |
| 362 | |
| 363 /** | |
| 364 * One related Android app; Android app is related to other origins. | |
| 365 * | |
| 366 * Tests three cases: | |
| 367 * - The Android app is related to a web app with a different scheme. | |
| 368 * - The Android app is related to a web app with a different host. | |
| 369 * - The Android app is related to a web app with a different port. | |
| 370 */ | |
| 371 @Test | |
| 372 @Feature({"InstalledApp"}) | |
| 373 public void testOneRelatedAppRelatedToDifferentOrigins() { | |
| 374 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 375 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 376 | |
| 377 setAssetStatement( | |
| 378 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ DIFFERENT_SCHEME); | |
| 379 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 380 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 381 | |
| 382 setAssetStatement( | |
| 383 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ DIFFERENT_HOST); | |
| 384 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 385 | |
| 386 setAssetStatement( | |
| 387 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ DIFFERENT_PORT); | |
| 388 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 389 } | |
| 390 | |
| 391 /** | |
| 392 * One related Android app; Android app is installed and mutually related. | |
| 393 */ | |
| 394 @Test | |
| 395 @Feature({"InstalledApp"}) | |
| 396 public void testOneInstalledRelatedApp() { | |
| 397 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 398 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 399 | |
| 400 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 401 | |
| 402 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 403 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 404 } | |
| 405 | |
| 406 /** | |
| 407 * One related Android app; Android app is related to multiple origins. | |
| 408 */ | |
| 409 @Test | |
| 410 @Feature({"InstalledApp"}) | |
| 411 public void testMultipleAssetStatements() { | |
| 412 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 413 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 414 | |
| 415 // Create an asset_statements field with multiple statements. The second one matches the web | |
| 416 // app. | |
| 417 String statements = "[" | |
| 418 + createAssetStatement( | |
| 419 NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_DIFFER ENT_HOST) | |
| 420 + ", " + createAssetStatement(NAMESPACE_WEB, RELATION_HANDLE_ALL _URLS, ORIGIN) | |
| 421 + "]"; | |
| 422 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 423 | |
| 424 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 425 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 426 } | |
| 427 | |
| 428 /** | |
| 429 * A JSON syntax error in the Android app's asset statement. | |
| 430 */ | |
| 431 @Test | |
| 432 @Feature({"InstalledApp"}) | |
| 433 public void testAssetStatementSyntaxError() { | |
| 434 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 435 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 436 | |
| 437 String statements = "[{\"target\" {}}]"; | |
|
boliu
2017/03/17 18:02:56
nit: statementsWithSyntaxError?
Matt Giuca
2017/03/20 06:31:56
Not really sure why this needs a special name (the
| |
| 438 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 439 | |
| 440 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 441 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 442 } | |
| 443 | |
| 444 /** | |
| 445 * The Android app's asset statement is not an array. | |
| 446 */ | |
| 447 @Test | |
| 448 @Feature({"InstalledApp"}) | |
| 449 public void testAssetStatementNotArray() { | |
| 450 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 451 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 452 | |
| 453 String statement = createAssetStatement(NAMESPACE_WEB, RELATION_HANDLE_A LL_URLS, ORIGIN); | |
| 454 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statement); | |
| 455 | |
| 456 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 457 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 458 } | |
| 459 | |
| 460 /** | |
| 461 * The Android app's asset statement array contains non-objects. | |
| 462 */ | |
| 463 @Test | |
| 464 @Feature({"InstalledApp"}) | |
| 465 public void testAssetStatementArrayNoObjects() { | |
| 466 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 467 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 468 | |
| 469 String statements = "[" | |
| 470 + createAssetStatement(NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN) + ", 4]"; | |
| 471 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 472 | |
| 473 // Expect it to ignore the integer and successfully parse the valid obje ct. | |
| 474 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 475 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 476 } | |
| 477 | |
| 478 /** | |
| 479 * Android app has no "relation" in the asset statement. | |
| 480 * | |
| 481 * Currently, the relation string (in the Android package's asset statement) is ignored, so the | |
| 482 * app is still returned as "installed". | |
| 483 */ | |
| 484 @Test | |
| 485 @Feature({"InstalledApp"}) | |
| 486 public void testAssetStatementNoRelation() { | |
| 487 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 488 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 489 | |
| 490 String statements = "[{\"target\": {\"namespace\": \"" + NAMESPACE_WEB + "\", \"site\": \"" | |
|
boliu
2017/03/17 18:02:56
ditto String.format
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 491 + ORIGIN + "\"}}]"; | |
| 492 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 493 | |
| 494 // TODO(mgiuca): [Spec issue] Should we require a specific relation stri ng, rather than any | |
| 495 // or no relation? | |
| 496 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 497 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 498 } | |
| 499 | |
| 500 /** | |
| 501 * Android app is related with a non-standard relation. | |
| 502 * | |
| 503 * Currently, the relation string (in the Android package's asset statement) is ignored, so any | |
| 504 * will do. Is this desirable, or do we want to require a specific relation string? | |
| 505 */ | |
| 506 @Test | |
| 507 @Feature({"InstalledApp"}) | |
| 508 public void testAssetStatementNonStandardRelation() { | |
| 509 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 510 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 511 | |
| 512 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, "nonstandard/relation", ORIGIN); | |
| 513 | |
| 514 // TODO(mgiuca): [Spec issue] Should we require a specific relation stri ng, rather than any | |
| 515 // or no relation? | |
| 516 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 517 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 518 } | |
| 519 | |
| 520 /** | |
| 521 * Android app has no "target" in the asset statement. | |
| 522 */ | |
| 523 @Test | |
| 524 @Feature({"InstalledApp"}) | |
| 525 public void testAssetStatementNoTarget() { | |
| 526 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 527 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 528 | |
| 529 String statements = "[{\"relation\": [\"" + RELATION_HANDLE_ALL_URLS + " \"]}]"; | |
|
boliu
2017/03/17 18:02:56
ditto String.format
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 530 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 531 | |
| 532 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 533 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 534 } | |
| 535 | |
| 536 /** | |
| 537 * Android app has no "namespace" in the asset statement. | |
| 538 */ | |
| 539 @Test | |
| 540 @Feature({"InstalledApp"}) | |
| 541 public void testAssetStatementNoNamespace() { | |
| 542 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 543 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 544 | |
| 545 String statements = "[{\"relation\": [\"" + RELATION_HANDLE_ALL_URLS + " \"]," | |
|
boliu
2017/03/17 18:02:56
ditto String.format
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 546 + "\"target\": {\"site\": \"" + ORIGIN + "\"}}]"; | |
| 547 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 548 | |
| 549 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 550 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 551 } | |
| 552 | |
| 553 /** | |
| 554 * Android app is related, but not to the web namespace. | |
| 555 */ | |
| 556 @Test | |
| 557 @Feature({"InstalledApp"}) | |
| 558 public void testNonWebAssetStatement() { | |
| 559 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 560 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 561 | |
| 562 setAssetStatement(PACKAGE_NAME_1, "play", RELATION_HANDLE_ALL_URLS, ORIG IN); | |
| 563 | |
| 564 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 565 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 566 } | |
| 567 | |
| 568 /** | |
| 569 * Android app has no "site" in the asset statement. | |
| 570 */ | |
| 571 @Test | |
| 572 @Feature({"InstalledApp"}) | |
| 573 public void testAssetStatementNoSite() { | |
| 574 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 575 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 576 | |
| 577 String statements = "[{\"relation\": [\"" + RELATION_HANDLE_ALL_URLS + " \"]," | |
|
boliu
2017/03/17 18:02:56
ditto String.format
Matt Giuca
2017/03/20 06:31:56
Done.
| |
| 578 + "\"target\": {\"namespace\": \"" + NAMESPACE_WEB + "\"}}]"; | |
| 579 setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements); | |
| 580 | |
| 581 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 582 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 583 } | |
| 584 | |
| 585 /** | |
| 586 * Android app has a syntax error in the "site" field of the asset statement . | |
| 587 */ | |
| 588 @Test | |
| 589 @Feature({"InstalledApp"}) | |
| 590 public void testAssetStatementSiteSyntaxError() { | |
| 591 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 592 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 593 | |
| 594 setAssetStatement( | |
| 595 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ SYNTAX_ERROR); | |
| 596 | |
| 597 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 598 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 599 } | |
| 600 | |
| 601 /** | |
| 602 * Android app has a "site" field missing certain parts of the URI (scheme, host, port). | |
| 603 */ | |
| 604 @Test | |
| 605 @Feature({"InstalledApp"}) | |
| 606 public void testAssetStatementSiteMissingParts() { | |
| 607 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 608 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 609 | |
| 610 setAssetStatement( | |
| 611 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ MISSING_SCHEME); | |
| 612 RelatedApplication[] expectedInstalledRelatedApps = new RelatedApplicati on[] {}; | |
| 613 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 614 | |
| 615 setAssetStatement( | |
| 616 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ MISSING_HOST); | |
| 617 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 618 | |
| 619 setAssetStatement( | |
| 620 PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_ MISSING_PORT); | |
| 621 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 622 } | |
| 623 | |
| 624 /** | |
| 625 * One related Android app; Android app is related with a path part in the " site" field. | |
| 626 * | |
| 627 * The path part shouldn't really be there (according to the Digital Asset L inks spec), but if | |
| 628 * it is, we are lenient and just ignore it (matching only the origin). | |
| 629 */ | |
| 630 @Test | |
| 631 @Feature({"InstalledApp"}) | |
| 632 public void testAssetStatementSiteHasPath() { | |
| 633 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 634 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 635 | |
| 636 String site = ORIGIN + "/path"; | |
| 637 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, site); | |
| 638 | |
| 639 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 640 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 641 } | |
| 642 | |
| 643 /** | |
| 644 * One related Android app; Android app is installed and mutually related. | |
| 645 * | |
| 646 * Another Android app relates to the web app, but not mutual. | |
| 647 */ | |
| 648 @Test | |
| 649 @Feature({"InstalledApp"}) | |
| 650 public void testExtraInstalledApp() { | |
| 651 RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { | |
| 652 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) }; | |
| 653 | |
| 654 setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 655 setAssetStatement(PACKAGE_NAME_2, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 656 | |
| 657 RelatedApplication[] expectedInstalledRelatedApps = manifestRelatedApps; | |
| 658 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 659 } | |
| 660 | |
| 661 /** | |
| 662 * Two related Android apps; Android apps both installed and mutually relate d. | |
| 663 * | |
| 664 * Web app also related to an app with the same name on another platform, an d another Android | |
| 665 * app which is not installed. | |
| 666 */ | |
| 667 @Test | |
| 668 @Feature({"InstalledApp"}) | |
| 669 public void testMultipleInstalledRelatedApps() { | |
| 670 RelatedApplication[] manifestRelatedApps = new RelatedApplication[] { | |
| 671 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null) , | |
| 672 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_2, null) , | |
| 673 createRelatedApplication(PLATFORM_OTHER, PACKAGE_NAME_2, null), | |
| 674 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_3, null) }; | |
| 675 | |
| 676 setAssetStatement(PACKAGE_NAME_2, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 677 setAssetStatement(PACKAGE_NAME_3, NAMESPACE_WEB, RELATION_HANDLE_ALL_URL S, ORIGIN); | |
| 678 | |
| 679 RelatedApplication[] expectedInstalledRelatedApps = | |
| 680 new RelatedApplication[] {manifestRelatedApps[1], manifestRelate dApps[3]}; | |
| 681 verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps); | |
| 682 } | |
| 683 } | |
| OLD | NEW |