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

Unified Diff: chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java

Issue 2460253002: Update WebAPKs even if the WebAPK start URL has no Web Manifest part 2/3 (Closed)
Patch Set: Merge branch 'master' into update_fail_refactor0 Created 4 years 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 side-by-side diff with in-line comments
Download patch
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));
}
}
« no previous file with comments | « chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java ('k') | chrome/browser/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698