[go: nahoru, domu]

blob: fb1dcc092e1183ff09f82fea8c7b2056e002e3fc [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test;
import android.content.ComponentName;
import android.os.Bundle;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.android_webview.ManifestMetadataUtil;
import org.chromium.android_webview.test.util.ManifestMetadataMockApplicationContext;
import org.chromium.base.ContextUtils;
import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.Feature;
import java.util.Collections;
import java.util.Set;
/** Test for {@link ManifestMetadataUtil} */
@RunWith(AwJUnit4ClassRunner.class)
@Batch(Batch.PER_CLASS)
public class ManifestMetadataUtilTest {
/*
* Metadata keys are deliberately not referencing their production declarations to protect
* against accidental changes.
*/
private static final String METRICS_OPT_OUT_METADATA_NAME =
"android.webkit.WebView.MetricsOptOut";
private static final String SAFE_BROWSING_OPT_IN_METADATA_NAME =
"android.webkit.WebView.EnableSafeBrowsing";
private static final String METADATA_HOLDER_SERVICE_NAME =
"android.webkit.MetaDataHolderService";
private static final String XRW_ALLOWLIST_METADATA_NAME =
"REQUESTED_WITH_HEADER_ORIGIN_ALLOW_LIST";
private static final String MULTI_PROFILE_NAME_TAG_KEY_METADATA_NAME =
"android.webkit.WebView.MultiProfileNameTagKey";
private static final int XRW_ALLOWLIST_RESOURCE_ID = 0xcafebabe;
private static final String[] XRW_ALLOWLIST = {"*.example.com", "*.google.com"};
private static final int INVALID_XRW_ALLOWLIST_RESOURCE_ID = 0xdead;
private ManifestMetadataMockApplicationContext mContext;
private ComponentName mMetadataServiceName;
@Before
public void setUp() throws Exception {
mContext =
new ManifestMetadataMockApplicationContext(
InstrumentationRegistry.getInstrumentation()
.getTargetContext()
.getApplicationContext());
ContextUtils.initApplicationContextForTests(mContext);
mMetadataServiceName = new ComponentName(mContext, METADATA_HOLDER_SERVICE_NAME);
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testMetricsCollectionOptOut() throws Exception {
var bundle = new Bundle();
bundle.putBoolean(METRICS_OPT_OUT_METADATA_NAME, true);
mContext.putServiceMetadata(mContext.getPackageName(), bundle);
Bundle appMetadata = ManifestMetadataUtil.getAppMetadata(mContext);
Assert.assertTrue(ManifestMetadataUtil.isAppOptedOutFromMetricsCollection(appMetadata));
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testMetricsCollectionDefault() throws Exception {
Bundle appMetadata = ManifestMetadataUtil.getAppMetadata(mContext);
Assert.assertFalse(ManifestMetadataUtil.isAppOptedOutFromMetricsCollection(appMetadata));
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testSafeBrowsingDefault() throws Exception {
Bundle appMetadata = ManifestMetadataUtil.getAppMetadata(mContext);
Assert.assertNull(ManifestMetadataUtil.getSafeBrowsingAppOptInPreference(appMetadata));
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testSafeBrowsingOptIn() throws Exception {
var bundle = new Bundle();
bundle.putBoolean(SAFE_BROWSING_OPT_IN_METADATA_NAME, true);
mContext.putServiceMetadata(mContext.getPackageName(), bundle);
Bundle appMetadata = ManifestMetadataUtil.getAppMetadata(mContext);
var preference = ManifestMetadataUtil.getSafeBrowsingAppOptInPreference(appMetadata);
Assert.assertNotNull(preference);
Assert.assertTrue(preference);
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testSafeBrowsingOptOut() throws Exception {
var bundle = new Bundle();
bundle.putBoolean(SAFE_BROWSING_OPT_IN_METADATA_NAME, false);
mContext.putServiceMetadata(mContext.getPackageName(), bundle);
Bundle appMetadata = ManifestMetadataUtil.getAppMetadata(mContext);
var preference = ManifestMetadataUtil.getSafeBrowsingAppOptInPreference(appMetadata);
Assert.assertNotNull(preference);
Assert.assertFalse(preference);
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testMultiProfileProfileNameTagKeyRetrieval() throws Exception {
var bundle = new Bundle();
bundle.putInt(MULTI_PROFILE_NAME_TAG_KEY_METADATA_NAME, 12345);
mContext.putServiceMetadata(mMetadataServiceName, bundle);
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
Integer profileNameTagKey =
ManifestMetadataUtil.getAppMultiProfileProfileNameTagKey(holderServiceMetadata);
Assert.assertNotNull(profileNameTagKey);
Assert.assertEquals(12345, profileNameTagKey.intValue());
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testNullMultiProfileProfileNameTagDefault() throws Exception {
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
Assert.assertNull(
ManifestMetadataUtil.getAppMultiProfileProfileNameTagKey(holderServiceMetadata));
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testGetStringListFromServiceBundle() throws Exception {
var bundle = new Bundle();
bundle.putInt(XRW_ALLOWLIST_METADATA_NAME, XRW_ALLOWLIST_RESOURCE_ID);
mContext.putServiceMetadata(mMetadataServiceName, bundle);
mContext.putStringArrayResource(XRW_ALLOWLIST_RESOURCE_ID, XRW_ALLOWLIST);
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
Set<String> allowList =
ManifestMetadataUtil.getXRequestedWithAllowList(mContext, holderServiceMetadata);
Assert.assertEquals(Set.of(XRW_ALLOWLIST), allowList);
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testEmptySetIfServiceMetadataNotFound() throws Exception {
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
Assert.assertEquals(
Collections.emptySet(),
ManifestMetadataUtil.getXRequestedWithAllowList(mContext, holderServiceMetadata));
}
@Test
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testNoErrorsIfXrwAllowListKeyNotSet() throws Exception {
mContext.putServiceMetadata(mMetadataServiceName, new Bundle());
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
Assert.assertEquals(
Collections.emptySet(),
ManifestMetadataUtil.getXRequestedWithAllowList(mContext, holderServiceMetadata));
}
/** @noinspection ResultOfMethodCallIgnored */
@Test(expected = IllegalArgumentException.class)
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testExceptionIfInvalidXrwAllowListResourceId() throws Exception {
var bundle = new Bundle();
bundle.putInt(XRW_ALLOWLIST_METADATA_NAME, INVALID_XRW_ALLOWLIST_RESOURCE_ID);
mContext.putServiceMetadata(mMetadataServiceName, bundle);
mContext.putStringArrayResource(XRW_ALLOWLIST_RESOURCE_ID, XRW_ALLOWLIST);
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
ManifestMetadataUtil.getXRequestedWithAllowList(mContext, holderServiceMetadata);
Assert.fail("An IllegalArgumentException should have been thrown");
}
/** @noinspection ResultOfMethodCallIgnored */
@Test(expected = IllegalArgumentException.class)
@SmallTest
@Feature({"AndroidWebView", "Manifest"})
public void testNoErrorsIfMetadataValueIsNotInt() throws Exception {
var bundle = new Bundle();
bundle.putString(XRW_ALLOWLIST_METADATA_NAME, "not an int");
mContext.putServiceMetadata(mMetadataServiceName, bundle);
Bundle holderServiceMetadata =
ManifestMetadataUtil.getMetadataHolderServiceMetadata(mContext);
ManifestMetadataUtil.getXRequestedWithAllowList(mContext, holderServiceMetadata);
Assert.fail("An IllegalArgumentException should have been thrown");
}
}