| Index: chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
|
| diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
|
| index 01052563699ab69b729b26c17ad22b63af82ab18..aba336d1ca6b21e4b6097e0ffea631d09aefd3c4 100644
|
| --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
|
| +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
|
| @@ -8,7 +8,12 @@ import static org.junit.Assert.assertEquals;
|
| import static org.junit.Assert.assertFalse;
|
| import static org.junit.Assert.assertTrue;
|
|
|
| +import android.content.Intent;
|
| +import android.graphics.Bitmap;
|
| +import android.graphics.Color;
|
| +import android.os.Bundle;
|
| import android.provider.Settings;
|
| +import android.text.TextUtils;
|
|
|
| import org.junit.Before;
|
| import org.junit.Test;
|
| @@ -16,19 +21,22 @@ import org.junit.runner.RunWith;
|
| import org.robolectric.RuntimeEnvironment;
|
| import org.robolectric.annotation.Config;
|
| import org.robolectric.shadows.ShadowApplication;
|
| +import org.robolectric.shadows.ShadowBitmap;
|
|
|
| import org.chromium.base.CommandLine;
|
| import org.chromium.base.ContextUtils;
|
| import org.chromium.blink_public.platform.WebDisplayMode;
|
| import org.chromium.chrome.browser.ShortcutHelper;
|
| -import org.chromium.chrome.browser.ShortcutSource;
|
| import org.chromium.chrome.browser.tab.Tab;
|
| import org.chromium.content_public.common.ScreenOrientationValues;
|
| import org.chromium.testing.local.LocalRobolectricTestRunner;
|
| import org.chromium.webapk.lib.client.WebApkVersion;
|
| +import org.chromium.webapk.lib.common.WebApkConstants;
|
| +import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
|
| import org.chromium.webapk.test.WebApkTestHelper;
|
|
|
| import java.util.HashMap;
|
| +import java.util.Map;
|
|
|
| /**
|
| * Unit tests for WebApkUpdateManager.
|
| @@ -37,13 +45,25 @@ import java.util.HashMap;
|
| @Config(manifest = Config.NONE)
|
| public class WebApkUpdateManagerTest {
|
| /** WebAPK's id in {@link WebAppDataStorage}. */
|
| - private static final String WEBAPK_ID = "id";
|
| -
|
| - /** Value of the "name" <meta-data> tag in the Android Manifest. */
|
| - private static final String ANDROID_MANIFEST_NAME = "Android Manifest name";
|
| -
|
| - /** Value of the "name" property in the Web Manifest. */
|
| - private static final String WEB_MANIFEST_NAME = "Web Manifest name";
|
| + private static final String WEBAPK_ID =
|
| + WebApkConstants.WEBAPK_ID_PREFIX + WebApkTestHelper.WEBAPK_PACKAGE_NAME;
|
| +
|
| + /** Web Manifest URL */
|
| + private static final String WEB_MANIFEST_URL = "manifest.json";
|
| +
|
| + private static final String START_URL = "/start_url.html";
|
| + private static final String SCOPE_URL = "/";
|
| + private static final String NAME = "Long Name";
|
| + private static final String SHORT_NAME = "Short Name";
|
| + private static final String ICON_URL = "/icon.png";
|
| + private static final String ICON_MURMUR2_HASH = "3";
|
| + private static final int DISPLAY_MODE = WebDisplayMode.Undefined;
|
| + private static final int ORIENTATION = ScreenOrientationValues.DEFAULT;
|
| + private static final long THEME_COLOR = 1L;
|
| + private static final long BACKGROUND_COLOR = 2L;
|
| +
|
| + /** Different name than the one used in {@link defaultManifestData()}. */
|
| + private static final String DIFFERENT_NAME = "Different Name";
|
|
|
| /** {@link WebappDataStorage#Clock} subclass which enables time to be manually advanced. */
|
| private static class MockClock extends WebappDataStorage.Clock {
|
| @@ -60,21 +80,16 @@ public class WebApkUpdateManagerTest {
|
| }
|
| }
|
|
|
| - /** Mock {@link ManifestUpgradeDetector}. */
|
| - private static class TestManifestUpgradeDetector extends ManifestUpgradeDetector {
|
| + /** Mock {@link WebApkUpdateDataFetcher}. */
|
| + private static class TestWebApkUpdateDataFetcher extends WebApkUpdateDataFetcher {
|
| private boolean mStarted;
|
|
|
| - public TestManifestUpgradeDetector(
|
| - Tab tab, WebApkInfo info, ManifestUpgradeDetector.Callback callback) {
|
| - super(tab, info, callback);
|
| - }
|
| -
|
| public boolean wasStarted() {
|
| return mStarted;
|
| }
|
|
|
| @Override
|
| - public boolean start() {
|
| + public boolean start(Tab tab, WebApkInfo oldInfo, Observer observer) {
|
| mStarted = true;
|
| return true;
|
| }
|
| @@ -82,10 +97,10 @@ public class WebApkUpdateManagerTest {
|
|
|
| private static class TestWebApkUpdateManager extends WebApkUpdateManager {
|
| private WebappDataStorage.Clock mClock;
|
| - private TestManifestUpgradeDetector mUpgradeDetector;
|
| - private int mNumUpdatesRequested;
|
| + private TestWebApkUpdateDataFetcher mFetcher;
|
| + private boolean mUpdateRequested;
|
| private String mUpdateName;
|
| - private boolean mDestroyedManifestUpgradeDetector;
|
| + private boolean mDestroyedFetcher;
|
|
|
| public TestWebApkUpdateManager(WebappDataStorage.Clock clock) {
|
| mClock = clock;
|
| @@ -95,21 +110,14 @@ public class WebApkUpdateManagerTest {
|
| * Returns whether the is-update-needed check has been triggered.
|
| */
|
| public boolean updateCheckStarted() {
|
| - return mUpgradeDetector != null && mUpgradeDetector.wasStarted();
|
| + return mFetcher != null && mFetcher.wasStarted();
|
| }
|
|
|
| /**
|
| * Returns whether an update has been requested.
|
| */
|
| public boolean updateRequested() {
|
| - return mNumUpdatesRequested > 0;
|
| - }
|
| -
|
| - /**
|
| - * Returns the number of updates which have been requested.
|
| - */
|
| - public int numUpdatesRequested() {
|
| - return mNumUpdatesRequested;
|
| + return mUpdateRequested;
|
| }
|
|
|
| /**
|
| @@ -119,68 +127,165 @@ public class WebApkUpdateManagerTest {
|
| return mUpdateName;
|
| }
|
|
|
| - public boolean destroyedManifestUpgradeDetector() {
|
| - return mDestroyedManifestUpgradeDetector;
|
| + public boolean destroyedFetcher() {
|
| + return mDestroyedFetcher;
|
| }
|
|
|
| @Override
|
| - protected ManifestUpgradeDetector buildManifestUpgradeDetector(Tab tab, WebApkInfo info) {
|
| - mUpgradeDetector = new TestManifestUpgradeDetector(tab, info, this);
|
| - return mUpgradeDetector;
|
| + protected WebApkUpdateDataFetcher buildFetcher() {
|
| + mFetcher = new TestWebApkUpdateDataFetcher();
|
| + return mFetcher;
|
| }
|
|
|
| @Override
|
| protected void updateAsync(WebApkInfo info, String bestIconUrl) {
|
| - ++mNumUpdatesRequested;
|
| + mUpdateRequested = true;
|
| mUpdateName = info.name();
|
| }
|
|
|
| @Override
|
| - protected void destroyUpgradeDetector() {
|
| - mUpgradeDetector = null;
|
| - mDestroyedManifestUpgradeDetector = true;
|
| + protected void destroyFetcher() {
|
| + mFetcher = null;
|
| + mDestroyedFetcher = true;
|
| }
|
|
|
| @Override
|
| protected long currentTimeMillis() {
|
| return mClock.currentTimeMillis();
|
| }
|
| - }
|
|
|
| - private MockClock mClock;
|
| - private int mShellApkVersion;
|
| + // Stubbed out because real implementation uses native.
|
| + @Override
|
| + protected boolean urlsMatchIgnoringFragments(String url1, String url2) {
|
| + return TextUtils.equals(url1, url2);
|
| + }
|
| + }
|
|
|
| - /** Sets the version of the code in //chrome/android/webapk/shell_apk. */
|
| - public void setShellApkVersion(int shellApkVersion) {
|
| - mShellApkVersion = shellApkVersion;
|
| + private static class ManifestData {
|
| + public String startUrl;
|
| + public String scopeUrl;
|
| + public String name;
|
| + public String shortName;
|
| + public Map<String, String> iconUrlToMurmur2HashMap;
|
| + public String bestIconUrl;
|
| + public Bitmap bestIcon;
|
| + public int displayMode;
|
| + public int orientation;
|
| + public long themeColor;
|
| + public long backgroundColor;
|
| }
|
|
|
| + private MockClock mClock;
|
| +
|
| private WebappDataStorage getStorage() {
|
| return WebappRegistry.getInstance().getWebappDataStorage(WEBAPK_ID);
|
| }
|
|
|
| - private WebApkInfo infoWithName(String name) {
|
| - return WebApkInfo.create(WEBAPK_ID, "", "", null, name, "", WebDisplayMode.Standalone,
|
| - ScreenOrientationValues.DEFAULT, ShortcutSource.UNKNOWN,
|
| - ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
|
| - ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING,
|
| - WebApkTestHelper.WEBAPK_PACKAGE_NAME, mShellApkVersion, "", "",
|
| - new HashMap<String, String>());
|
| + /**
|
| + * Registers WebAPK with default package name. Overwrites previous registrations.
|
| + * @param manifestData <meta-data> values for WebAPK's Android Manifest.
|
| + * @param shellApkVersionCode WebAPK's version of the //chrome/android/webapk/shell_apk code.
|
| + */
|
| + private void registerWebApk(ManifestData manifestData, int shellApkVersionCode) {
|
| + Bundle metaData = new Bundle();
|
| + metaData.putInt(
|
| + WebApkMetaDataKeys.SHELL_APK_VERSION, shellApkVersionCode);
|
| + metaData.putString(WebApkMetaDataKeys.START_URL, manifestData.startUrl);
|
| + metaData.putString(WebApkMetaDataKeys.SCOPE, manifestData.scopeUrl);
|
| + metaData.putString(WebApkMetaDataKeys.NAME, manifestData.name);
|
| + metaData.putString(WebApkMetaDataKeys.SHORT_NAME, manifestData.shortName);
|
| + metaData.putString(WebApkMetaDataKeys.THEME_COLOR, manifestData.themeColor + "L");
|
| + metaData.putString(WebApkMetaDataKeys.BACKGROUND_COLOR, manifestData.backgroundColor + "L");
|
| + metaData.putString(WebApkMetaDataKeys.WEB_MANIFEST_URL, WEB_MANIFEST_URL);
|
| +
|
| + String iconUrlsAndIconMurmur2Hashes = "";
|
| + for (Map.Entry<String, String> mapEntry : manifestData.iconUrlToMurmur2HashMap.entrySet()) {
|
| + String murmur2Hash = mapEntry.getValue();
|
| + if (murmur2Hash == null) {
|
| + murmur2Hash = "0";
|
| + }
|
| + iconUrlsAndIconMurmur2Hashes += " " + mapEntry.getKey() + " " + murmur2Hash;
|
| + }
|
| + iconUrlsAndIconMurmur2Hashes = iconUrlsAndIconMurmur2Hashes.trim();
|
| + metaData.putString(WebApkMetaDataKeys.ICON_URLS_AND_ICON_MURMUR2_HASHES,
|
| + iconUrlsAndIconMurmur2Hashes);
|
| +
|
| + WebApkTestHelper.registerWebApkWithMetaData(metaData);
|
| }
|
|
|
| - private WebApkInfo fetchedWebApkInfo() {
|
| - return infoWithName(WEB_MANIFEST_NAME);
|
| + private static ManifestData defaultManifestData() {
|
| + ManifestData manifestData = new ManifestData();
|
| + manifestData.startUrl = START_URL;
|
| + manifestData.scopeUrl = SCOPE_URL;
|
| + manifestData.name = NAME;
|
| + manifestData.shortName = SHORT_NAME;
|
| +
|
| + manifestData.iconUrlToMurmur2HashMap = new HashMap<String, String>();
|
| + manifestData.iconUrlToMurmur2HashMap.put(ICON_URL, ICON_MURMUR2_HASH);
|
| +
|
| + manifestData.bestIconUrl = ICON_URL;
|
| + manifestData.bestIcon = createBitmap(Color.GREEN);
|
| + manifestData.displayMode = DISPLAY_MODE;
|
| + manifestData.orientation = ORIENTATION;
|
| + manifestData.themeColor = THEME_COLOR;
|
| + manifestData.backgroundColor = BACKGROUND_COLOR;
|
| + return manifestData;
|
| }
|
|
|
| - private void updateIfNeeded(WebApkUpdateManager updateManager) {
|
| - WebApkInfo info = infoWithName(ANDROID_MANIFEST_NAME);
|
| + private static WebApkInfo infoFromManifestData(ManifestData manifestData) {
|
| + if (manifestData == null) return null;
|
| +
|
| + return WebApkInfo.create("", "", manifestData.scopeUrl,
|
| + new WebApkInfo.Icon(manifestData.bestIcon), manifestData.name,
|
| + manifestData.shortName, manifestData.displayMode, manifestData.orientation, -1,
|
| + manifestData.themeColor, manifestData.backgroundColor,
|
| + WebApkTestHelper.WEBAPK_PACKAGE_NAME, -1, WEB_MANIFEST_URL,
|
| + manifestData.startUrl, manifestData.iconUrlToMurmur2HashMap);
|
| + }
|
| +
|
| + /**
|
| + * Creates 1x1 bitmap.
|
| + * @param color The bitmap color.
|
| + */
|
| + private static Bitmap createBitmap(int color) {
|
| + int colors[] = { color };
|
| + return ShadowBitmap.createBitmap(colors, 1, 1, Bitmap.Config.ALPHA_8);
|
| + }
|
| +
|
| + private static void updateIfNeeded(WebApkUpdateManager updateManager) {
|
| + // Use the intent version of {@link WebApkInfo#create()} in order to test default values
|
| + // set by the intent version of {@link WebApkInfo#create()}.
|
| + Intent intent = new Intent();
|
| + intent.putExtra(ShortcutHelper.EXTRA_URL, "");
|
| + intent.putExtra(
|
| + ShortcutHelper.EXTRA_WEBAPK_PACKAGE_NAME, WebApkTestHelper.WEBAPK_PACKAGE_NAME);
|
| + WebApkInfo info = WebApkInfo.create(intent);
|
| +
|
| updateManager.updateIfNeeded(null, info);
|
| }
|
|
|
| - private void onGotWebApkCompatibleWebManifestForInitialUrl(
|
| - WebApkUpdateManager updateManager, boolean needsUpdate) {
|
| + private static void onGotUnchangedWebManifestForInitialUrl(WebApkUpdateManager updateManager) {
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, defaultManifestData());
|
| + }
|
| +
|
| + private static void onFinishedFetchingWebManifestForInitialUrl(
|
| + WebApkUpdateManager updateManager, ManifestData fetchedManifestData) {
|
| + String bestIconUrl = randomIconUrl(fetchedManifestData);
|
| updateManager.onFinishedFetchingWebManifestForInitialUrl(
|
| - needsUpdate, fetchedWebApkInfo(), null);
|
| + infoFromManifestData(fetchedManifestData), bestIconUrl);
|
| + }
|
| +
|
| + private static void onGotManifestData(WebApkUpdateManager updateManager,
|
| + ManifestData fetchedManifestData) {
|
| + String bestIconUrl = randomIconUrl(fetchedManifestData);
|
| + updateManager.onGotManifestData(infoFromManifestData(fetchedManifestData), bestIconUrl);
|
| + }
|
| +
|
| + private static String randomIconUrl(ManifestData fetchedManifestData) {
|
| + if (fetchedManifestData == null || fetchedManifestData.iconUrlToMurmur2HashMap.isEmpty()) {
|
| + return null;
|
| + }
|
| + return fetchedManifestData.iconUrlToMurmur2HashMap.keySet().iterator().next();
|
| }
|
|
|
| /**
|
| @@ -193,19 +298,35 @@ public class WebApkUpdateManagerTest {
|
| return updateManager.updateCheckStarted();
|
| }
|
|
|
| + /**
|
| + * Checks whether the WebAPK is updated given data from the WebAPK's Android Manifest and data
|
| + * from the fetched Web Manifest.
|
| + */
|
| + private boolean checkUpdateNeededForFetchedManifest(
|
| + ManifestData androidManifestData, ManifestData fetchedManifestData) {
|
| + registerWebApk(androidManifestData, WebApkVersion.CURRENT_SHELL_APK_VERSION);
|
| + mClock.advance(WebApkUpdateManager.FULL_CHECK_UPDATE_INTERVAL);
|
| +
|
| + TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| + updateIfNeeded(updateManager);
|
| + assertTrue(updateManager.updateCheckStarted());
|
| + updateManager.onFinishedFetchingWebManifestForInitialUrl(
|
| + infoFromManifestData(fetchedManifestData), fetchedManifestData.bestIconUrl);
|
| + return updateManager.updateRequested();
|
| + }
|
| +
|
| @Before
|
| public void setUp() {
|
| ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application);
|
| CommandLine.init(null);
|
|
|
| + registerWebApk(defaultManifestData(), WebApkVersion.CURRENT_SHELL_APK_VERSION);
|
| Settings.Secure.putInt(RuntimeEnvironment.application.getContentResolver(),
|
| Settings.Secure.INSTALL_NON_MARKET_APPS, 1);
|
|
|
| mClock = new MockClock();
|
| WebappDataStorage.setClockForTests(mClock);
|
|
|
| - mShellApkVersion = WebApkVersion.CURRENT_SHELL_APK_VERSION;
|
| -
|
| WebappRegistry.getInstance().register(
|
| WEBAPK_ID, new WebappRegistry.FetchWebappDataStorageCallback() {
|
| @Override
|
| @@ -292,7 +413,7 @@ public class WebApkUpdateManagerTest {
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
| - onGotWebApkCompatibleWebManifestForInitialUrl(updateManager, false);
|
| + onGotUnchangedWebManifestForInitialUrl(updateManager);
|
| }
|
|
|
| {
|
| @@ -317,7 +438,7 @@ public class WebApkUpdateManagerTest {
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
| - onGotWebApkCompatibleWebManifestForInitialUrl(updateManager, false);
|
| + onGotUnchangedWebManifestForInitialUrl(updateManager);
|
| assertFalse(updateManager.updateRequested());
|
|
|
| WebappDataStorage storage = getStorage();
|
| @@ -340,7 +461,7 @@ public class WebApkUpdateManagerTest {
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
| - onGotWebApkCompatibleWebManifestForInitialUrl(updateManager, false);
|
| + onGotUnchangedWebManifestForInitialUrl(updateManager);
|
| assertFalse(updateManager.updateRequested());
|
|
|
| assertTrue(storage.getDidLastWebApkUpdateRequestSucceed());
|
| @@ -359,7 +480,9 @@ public class WebApkUpdateManagerTest {
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
| - onGotWebApkCompatibleWebManifestForInitialUrl(updateManager, true);
|
| + ManifestData manifestData = defaultManifestData();
|
| + manifestData.name = DIFFERENT_NAME;
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, manifestData);
|
| assertTrue(updateManager.updateRequested());
|
|
|
| // Chrome is killed. {@link WebApkUpdateManager#onBuiltWebApk} is never called.
|
| @@ -382,21 +505,21 @@ public class WebApkUpdateManagerTest {
|
| */
|
| @Test
|
| public void testShellApkOutOfDateNoWebManifest() {
|
| - setShellApkVersion(WebApkVersion.CURRENT_SHELL_APK_VERSION - 1);
|
| + registerWebApk(defaultManifestData(), WebApkVersion.CURRENT_SHELL_APK_VERSION - 1);
|
| mClock.advance(WebApkUpdateManager.FULL_CHECK_UPDATE_INTERVAL);
|
|
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
|
|
| - updateManager.onFinishedFetchingWebManifestForInitialUrl(false, null, null);
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, null);
|
| assertTrue(updateManager.updateRequested());
|
| - assertEquals(ANDROID_MANIFEST_NAME, updateManager.requestedUpdateName());
|
| + assertEquals(NAME, updateManager.requestedUpdateName());
|
|
|
| // Check that the {@link ManifestUpgradeDetector} has been destroyed. This prevents
|
| // {@link #onFinishedFetchingWebManifestForInitialUrl()} and {@link #onGotManifestData()}
|
| // from getting called.
|
| - assertTrue(updateManager.destroyedManifestUpgradeDetector());
|
| + assertTrue(updateManager.destroyedFetcher());
|
| }
|
|
|
| /**
|
| @@ -405,18 +528,18 @@ public class WebApkUpdateManagerTest {
|
| */
|
| @Test
|
| public void testShellApkOutOfDateStillHasWebManifest() {
|
| - setShellApkVersion(WebApkVersion.CURRENT_SHELL_APK_VERSION - 1);
|
| + registerWebApk(defaultManifestData(), WebApkVersion.CURRENT_SHELL_APK_VERSION - 1);
|
| mClock.advance(WebApkUpdateManager.FULL_CHECK_UPDATE_INTERVAL);
|
|
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| assertTrue(updateManager.updateCheckStarted());
|
|
|
| - updateManager.onFinishedFetchingWebManifestForInitialUrl(false, fetchedWebApkInfo(), null);
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, defaultManifestData());
|
| assertTrue(updateManager.updateRequested());
|
| - assertEquals(WEB_MANIFEST_NAME, updateManager.requestedUpdateName());
|
| + assertEquals(NAME, updateManager.requestedUpdateName());
|
|
|
| - assertTrue(updateManager.destroyedManifestUpgradeDetector());
|
| + assertTrue(updateManager.destroyedFetcher());
|
| }
|
|
|
| /**
|
| @@ -438,23 +561,25 @@ public class WebApkUpdateManagerTest {
|
| assertTrue(updateManager.updateCheckStarted());
|
|
|
| // start_url does not have a Web Manifest. No update should be requested.
|
| - updateManager.onFinishedFetchingWebManifestForInitialUrl(false, null, null);
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, null);
|
| assertFalse(updateManager.updateRequested());
|
| // {@link ManifestUpgradeDetector} should still be alive so that it can get
|
| // {@link #onGotManifestData} when page with the Web Manifest finishes loading.
|
| - assertFalse(updateManager.destroyedManifestUpgradeDetector());
|
| + assertFalse(updateManager.destroyedFetcher());
|
|
|
| // start_url redirects to page with Web Manifest.
|
|
|
| - updateManager.onGotManifestData(true, fetchedWebApkInfo(), null);
|
| + ManifestData manifestData = defaultManifestData();
|
| + manifestData.name = DIFFERENT_NAME;
|
| + onGotManifestData(updateManager, manifestData);
|
| assertTrue(updateManager.updateRequested());
|
| - assertEquals(WEB_MANIFEST_NAME, updateManager.requestedUpdateName());
|
| + assertEquals(DIFFERENT_NAME, updateManager.requestedUpdateName());
|
|
|
| - assertTrue(updateManager.destroyedManifestUpgradeDetector());
|
| + assertTrue(updateManager.destroyedFetcher());
|
| }
|
|
|
| /**
|
| - * Test than an update is not requested if:
|
| + * Test that an update is not requested if:
|
| * - start_url does not refer to a Web Manifest.
|
| * AND
|
| * - The user eventually navigates to a page pointing to a Web Manifest with the correct URL.
|
| @@ -467,12 +592,123 @@ public class WebApkUpdateManagerTest {
|
|
|
| TestWebApkUpdateManager updateManager = new TestWebApkUpdateManager(mClock);
|
| updateIfNeeded(updateManager);
|
| - updateManager.onFinishedFetchingWebManifestForInitialUrl(false, null, null);
|
| - updateManager.onGotManifestData(false, fetchedWebApkInfo(), null);
|
| + onFinishedFetchingWebManifestForInitialUrl(updateManager, null);
|
| + onGotManifestData(updateManager, defaultManifestData());
|
| assertFalse(updateManager.updateRequested());
|
|
|
| // We got the Web Manifest. The {@link ManifestUpgradeDetector} should be destroyed to stop
|
| // it from fetching the Web Manifest for subsequent page loads.
|
| - assertTrue(updateManager.destroyedManifestUpgradeDetector());
|
| + assertTrue(updateManager.destroyedFetcher());
|
| + }
|
| +
|
| + @Test
|
| + public void testManifestDoesNotUpgrade() {
|
| + assertFalse(
|
| + checkUpdateNeededForFetchedManifest(defaultManifestData(), defaultManifestData()));
|
| + }
|
| +
|
| + /**
|
| + * Test that an upgrade is not requested when the Web Manifest did not change and the Web
|
| + * Manifest scope is empty.
|
| + */
|
| + @Test
|
| + public void testManifestEmptyScopeShouldNotUpgrade() {
|
| + ManifestData oldData = defaultManifestData();
|
| + // webapk_installer.cc sets the scope to the default scope if the scope is empty.
|
| + oldData.scopeUrl = ShortcutHelper.getScopeFromUrl(oldData.startUrl);
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.scopeUrl = "";
|
| + assertTrue(!oldData.scopeUrl.equals(fetchedData.scopeUrl));
|
| + assertFalse(checkUpdateNeededForFetchedManifest(oldData, fetchedData));
|
| + }
|
| +
|
| + /**
|
| + * Test that an upgrade is requested when the Web Manifest is updated from using a non-empty
|
| + * scope to an empty scope.
|
| + */
|
| + @Test
|
| + public void testManifestNonEmptyScopeToEmptyScopeShouldUpgrade() {
|
| + ManifestData oldData = defaultManifestData();
|
| + oldData.startUrl = "/fancy/scope/special/snowflake.html";
|
| + oldData.scopeUrl = "/fancy/scope/";
|
| + assertTrue(
|
| + !oldData.scopeUrl.equals(ShortcutHelper.getScopeFromUrl(oldData.startUrl)));
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.startUrl = "/fancy/scope/special/snowflake.html";
|
| + fetchedData.scopeUrl = "";
|
| +
|
| + assertTrue(checkUpdateNeededForFetchedManifest(oldData, fetchedData));
|
| + }
|
| +
|
| + /**
|
| + * Test that an upgrade is requested when:
|
| + * - WebAPK was generated using icon at {@link ICON_URL} from Web Manifest.
|
| + * - Bitmap at {@link ICON_URL} has changed.
|
| + */
|
| + @Test
|
| + public void testHomescreenIconChangeShouldUpgrade() {
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.iconUrlToMurmur2HashMap.put(fetchedData.bestIconUrl, ICON_MURMUR2_HASH + "1");
|
| + fetchedData.bestIcon = createBitmap(Color.BLUE);
|
| + assertTrue(checkUpdateNeededForFetchedManifest(defaultManifestData(), fetchedData));
|
| + }
|
| +
|
| + /**
|
| + * Test that an upgrade is requested when:
|
| + * - WebAPK is generated using icon at {@link ICON_URL} from Web Manifest.
|
| + * - Web Manifest is updated to refer to different icon.
|
| + */
|
| + @Test
|
| + public void testHomescreenBestIconUrlChangeShouldUpgrade() {
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.iconUrlToMurmur2HashMap.clear();
|
| + fetchedData.iconUrlToMurmur2HashMap.put("/icon2.png", "22");
|
| + fetchedData.bestIconUrl = "/icon2.png";
|
| + assertTrue(checkUpdateNeededForFetchedManifest(defaultManifestData(), fetchedData));
|
| + }
|
| +
|
| + /**
|
| + * Test that an upgrade is not requested if:
|
| + * - icon URL is added to the Web Manifest
|
| + * AND
|
| + * - "best" icon URL for the launcher icon did not change.
|
| + */
|
| + @Test
|
| + public void testIconUrlsChangeShouldNotUpgradeIfTheBestIconUrlDoesNotChange() {
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.iconUrlToMurmur2HashMap.clear();
|
| + fetchedData.iconUrlToMurmur2HashMap.put(ICON_URL, ICON_MURMUR2_HASH);
|
| + fetchedData.iconUrlToMurmur2HashMap.put("/icon2.png", null);
|
| + assertFalse(checkUpdateNeededForFetchedManifest(defaultManifestData(), fetchedData));
|
| + }
|
| +
|
| + /**
|
| + * Test than upgrade is requested if:
|
| + * - the WebAPK's meta data has murmur2 hashes for all of the icons.
|
| + * AND
|
| + * - the Web Manifest has not changed
|
| + * AND
|
| + * - the computed best icon URL is different from the one stored in the WebAPK's meta data.
|
| + */
|
| + @Test
|
| + public void testWebManifestSameButBestIconUrlChangedShouldNotUpgrade() {
|
| + String iconUrl1 = "/icon1.png";
|
| + String iconUrl2 = "/icon2.png";
|
| + String hash1 = "11";
|
| + String hash2 = "22";
|
| +
|
| + ManifestData oldData = defaultManifestData();
|
| + oldData.bestIconUrl = iconUrl1;
|
| + oldData.iconUrlToMurmur2HashMap.clear();
|
| + oldData.iconUrlToMurmur2HashMap.put(iconUrl1, hash1);
|
| + oldData.iconUrlToMurmur2HashMap.put(iconUrl2, hash2);
|
| +
|
| + ManifestData fetchedData = defaultManifestData();
|
| + fetchedData.bestIconUrl = iconUrl2;
|
| + fetchedData.iconUrlToMurmur2HashMap.clear();
|
| + fetchedData.iconUrlToMurmur2HashMap.put(iconUrl1, null);
|
| + fetchedData.iconUrlToMurmur2HashMap.put(iconUrl2, hash2);
|
| +
|
| + assertFalse(checkUpdateNeededForFetchedManifest(oldData, fetchedData));
|
| }
|
| }
|
|
|