Chromium Code Reviews| Index: chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java |
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5f8502e6e7faa60091fb61af4b1ab7897e2a8b90 |
| --- /dev/null |
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorTest.java |
| @@ -0,0 +1,280 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.chrome.browser.webapps; |
| + |
| +import android.content.Context; |
| +import android.content.Intent; |
| +import android.net.Uri; |
| +import android.os.Environment; |
| +import android.test.suitebuilder.annotation.MediumTest; |
| + |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.base.test.util.CommandLineFlags; |
| +import org.chromium.blink_public.platform.WebDisplayMode; |
| +import org.chromium.chrome.browser.ShortcutHelper; |
| +import org.chromium.chrome.browser.tab.Tab; |
| +import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
| +import org.chromium.chrome.test.util.browser.TabLoadObserver; |
| +import org.chromium.content.browser.test.util.Criteria; |
| +import org.chromium.content.browser.test.util.CriteriaHelper; |
| +import org.chromium.content_public.common.ScreenOrientationValues; |
| +import org.chromium.net.test.EmbeddedTestServer; |
| +import org.chromium.webapk.lib.common.WebApkConstants; |
| + |
| +/** |
| + * Tests the ManifestUpgradeDetector. |
| + */ |
| +public class ManifestUpgradeDetectorTest extends ChromeTabbedActivityTestBase { |
| + private static final String WEBAPK_ID = WebApkConstants.WEBAPK_ID_PREFIX + "webapp_id"; |
| + private static final String WEBAPK_NAME = "Manifest test app"; |
| + private static final String WEBAPK_SHORT_NAME = "App"; |
| + private static final int WEBAPK_ORIENTATION = ScreenOrientationValues.LANDSCAPE; |
| + private static final String WEBAPK_ICON = |
| + "iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAIAAABoJHXvAAAAA3NCSVQICAjb4U/gAAAIrElEQVR4" |
| + + "nO2d208T3RbA9557p61tqRcwXMJFBSEoETABA4lPEB9Iviclxnf/A/8C/wJfSXz0DRNfvL2JREsg" |
| + + "eIsCNQhELtZaoJ1pO52ZfR5WOunRc/w+vpxzyOKs3wMhZSaZzi9r77XXXjvwmzdvMgIP0mE/AHEw" |
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgy" |
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgySBgy" |
| + + "SBgySBgySBgySBgySBgySBgySBgySBgySBgySBgyjo4wIcRhP8L/AuWwH+A/gBCCcy7LMvxea45z" |
| + + "zjkPLoM/wc/gc1zgFiaEkCRJkqRKpWLbtu/7siwrigKehBC+77uu6/s+51xRFFVVZVmWJMn3fdB8" |
| + + "2N/gwGAVFkRVuVx2HOf48eN9fX0dHR0NDQ3xeNwwDM6567rFYnF3dzebzW5ubn79+nVra2t/f991" |
| + + "XcMwFEXB6AylMHjRnPN8Pt/c3Dw+Pj44OJhIJP70xmw2u7q6+v79+1Qqtbu7C6MoLvAJC8LCsqxr" |
| + + "167duHHDNE3GmO/7nucxxjjnkiTBNb7vw+gnSZIsy8lkMplM9vf3M8YePnwYi8V83z/Ub3Ng8Alj" |
| + + "jHHOLcu6devWxMQEY8zzPNCjqmpwDZiQZbk2jFzX9TxPURSY1TAmlsiEQawUCoWxsbGJiQnXdSGY" |
| + + "JElijK2srCwsLKytreVyuXK5zDkPh8N1dXVNTU3nzp1rb28PhUIwdWFUBSATxjmvVCqnTp2anJz0" |
| + + "fR88SZKUy+Wmpqbm5uYcx4HRD2JOCOF5nu/7qqqePHmyt7d3aGiop6dH0zSkQYZPWKlUGh0djUQi" |
| + + "wUiYz+fv3r27vLwci8UMw2D/vIgOzGWz2cePHz979qy/v79UKum6jm4CY+iECSE0Tbt48WKwBJZl" |
| + + "+dGjR0tLS8lkMlhy/XQL5CmKomiaJoSYm5tTFEXXdUrr/7vA+BaLxerr61m1iuG67vz8fCgUcl2X" |
| + + "/Zv6RfAhBGWQVaKzxXDVEmHKCYVCpmnCu+ac27a9v78vy/JfmY2C4RFjbAH4hDHGINcIfpckCa+A" |
| + + "g4JJGOT0lUqlVCoxxjjnvu+bpnnixAnI79GlfH8DZMJkWd7b2/vx40eQdEiSNDY25jiO67pBNs+O" |
| + + "7m6L3Nvbe9jP8FeBBbJlWa2trR0dHbAOE0K0tLTEYrFPnz7t7+9DKgEl+dpB8siMmZiEseo0lsvl" |
| + + "rl69WvvJ2bNnr1y5kkwmhRDFYtG2bdu2HccJivqg9ghoQyZMCKGq6vb2tq7r3d3dkKbD/lY4HO7s" |
| + + "7BwdHR0ZGenr62tvb08kErDQLhQK5XIZtsqwa8O0DmPVeDJN88GDB6Zpjo2NserqKqjKx+PxeDze" |
| + + "09PDGPN9P5PJpNPphYWFN2/eZLNZ0zQVRQmqJOhAFmGsZusylUplMpmWlpZoNBpsMdfCGJMkKRKJ" |
| + + "NDc3X758eWhoKBqNrq6uFgoFqEthdIZPGIjhnGuatrS09PLly0wmY5pmPB5XFEWqEvhjjEHwRSKR" |
| + + "7u7uwcHBjY2NjY0NpKUpfMJYzQraMIxKpfLx48cXL16kUqm1tbVCoSCE0HVd07Rac7DWhsrW8PDw" |
| + + "+vr6ly9fMDrjqP/xNrxuSDocx6lUKowxwzASiUR9fX1ra2tnZ2dXV1c4HGaMwTLAdV1FUWzbvnPn" |
| + + "zs7ODjg77O9xAFBGWEDQBwDFeF3XdV2H/eitra0PHz7Mzs7Ozs7u7u62tbXBvCXLsuu6uq7HYrGZ" |
| + + "mRmo3yMKMtzCgOB1B/tbkiSpqmoYhqqqlmUtLi4uLCz09vZCEwcMkvX19a9fv4bC8eE9+4HBVJr6" |
| + + "U34qbXieJ4RQFCWRSKyvr9+7d89xnOCvmqZ1dXVBJ8EhPe/f4UgJ+4nAhOu6x44dW1paevv2bVDy" |
| + + "EEI0NTUxbC3AR1lYQLANlk6ng0oH5/zYsWPo2jr+L4SxavG+WCzWdttDro8LZE9cWwk8UGTALdFo" |
| + + "tLYUYlkWrvBi6IRBfNi27XlebS/b7++CC2RZ7uzs5FUYYzs7O7hyeoZOGLz64eHhSCSyt7fnOA7U" |
| + + "FX/z0mGJlsvlLl26dP78eVg+w/XpdFpVVVxBhqxazxhzHOf69euapj158uTVq1ebm5vQJ6qq6k+b" |
| + + "lowx3/fL5XKpVLpw4cLt27eDM0iSJK2tra2srKCrdCATBqOZZVkNDQ2Tk5N//PHHu3fv5ufnl5eX" |
| + + "M5kMHBEL5jlJknRdb2pqGhkZGR8fV1UVVtbw1+np6XK5HA6HcZXtkQkT1cOT0DNqGMbAwMDAwIDr" |
| + + "utvb29++fctms6BN07REInH69Onm5ubaLivf9xVFef78+czMDDpbDJ0wGNPgOB6rHjGCWaqxsbGx" |
| + + "sfFf3uW6LliBXoGnT59OTU2FQiF0GQfDWEsUQmxvbzPGotGoaZrggFXl1QIDoFTDxsbG/fv3p6en" |
| + + "oUaMURiy7RV4xcVi0ff9ZDLZ1tbW1dV15syZhoYG6OD49RbXdb9//55Op1Op1OLiomVZ4XAYb2cH" |
| + + "MmGs2osI544cx/E8T9O0aDSaTCbr6urgAAvse5VKJTjgnM1m8/k8YywUCsmyjPdEOkM3h7Fqwy8s" |
| + + "v6DJXghh23Y+n//8+TPICK6Es2KKokQiEVYz5yG1xTAKY79sgIE8SEN+PWsEP4OowqsKQCks4KcN" |
| + + "MPbbMhV2VQCy0hRBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBB" |
| + + "wpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBB" |
| + + "wpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpBBwpDxD3LrbwdRAEr3" |
| + + "AAAAAElFTkSuQmCC"; |
| + private static final String WEBAPK_START_URL_PATH = |
| + "/chrome/test/data/webapps/manifest_test_page.html"; |
| + private static final String WEBAPK_SCOPE_PATH = "/chrome/test/data/webapps/"; |
| + private static final String WEBAPK_WEB_MANIFEST_URL = |
| + "/chrome/test/data/webapps/manifest.json"; |
| + |
| + private String mStartUrl; |
| + private ManifestUpgradeDetector mDetector; |
| + private EmbeddedTestServer mTestServer; |
| + |
| + private static class TestManifestUpgradeDetector extends ManifestUpgradeDetector { |
| + private boolean mIsUpgraded; |
| + private WebappInfo mInfo; |
| + private String mStartUrl; |
| + private boolean mIsDataAvaliable = false; |
| + public TestManifestUpgradeDetector(Tab tab, WebappInfo info) { |
| + super(tab, info); |
| + } |
| + |
| + public boolean isDataAvaliable() { |
| + return mIsDataAvaliable; |
| + } |
| + |
| + @Override |
| + protected boolean requireUpgrade(WebappInfo newInfo, String startUrl) { |
| + mIsUpgraded = super.requireUpgrade(newInfo, startUrl); |
| + mStartUrl = startUrl; |
| + mIsDataAvaliable = true; |
| + mInfo = newInfo; |
| + return mIsUpgraded; |
| + } |
| + } |
| + |
| + @Override |
| + protected void setUp() throws Exception { |
| + super.setUp(); |
| + final Context context = getInstrumentation().getTargetContext(); |
| + mTestServer = EmbeddedTestServer.createAndStartFileServer( |
| + context, Environment.getExternalStorageDirectory()); |
| + mStartUrl = mTestServer.getURL(WEBAPK_START_URL_PATH); |
| + } |
| + |
| + @Override |
| + protected void tearDown() throws Exception { |
| + mTestServer.stopAndDestroyServer(); |
| + super.tearDown(); |
| + } |
| + |
| + @Override |
| + public void startMainActivity() throws InterruptedException { |
| + startMainActivityOnBlankPage(); |
| + } |
| + |
| + private void registerWebApk(final Intent intent) { |
| + WebappRegistry.registerWebapp(getInstrumentation().getTargetContext(), WEBAPK_ID, |
| + new WebappRegistry.FetchWebappDataStorageCallback() { |
| + @Override |
| + public void onWebappDataStorageRetrieved(WebappDataStorage storage) { |
| + storage.updateFromShortcutIntent(intent, true); |
| + } |
| + } |
| + ); |
| + } |
| + |
| + private Intent createIntent() { |
| + Intent intent = new Intent(); |
| + intent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + WEBAPK_ID)); |
| + intent.putExtra(ShortcutHelper.EXTRA_ID, WEBAPK_ID) |
| + .putExtra(ShortcutHelper.EXTRA_URL, mStartUrl) |
| + .putExtra(ShortcutHelper.EXTRA_SCOPE, mTestServer.getURL(WEBAPK_SCOPE_PATH)) |
| + .putExtra(ShortcutHelper.EXTRA_NAME, WEBAPK_NAME) |
| + .putExtra(ShortcutHelper.EXTRA_SHORT_NAME, WEBAPK_SHORT_NAME) |
| + .putExtra(ShortcutHelper.EXTRA_ICON, WEBAPK_ICON) |
| + .putExtra(ShortcutHelper.EXTRA_ORIENTATION, WEBAPK_ORIENTATION) |
| + .putExtra(ShortcutHelper.EXTRA_WEB_MANIFEST_URL, |
| + mTestServer.getURL(WEBAPK_WEB_MANIFEST_URL)); |
| + return intent; |
| + } |
| + |
| + private void waitUntilManifestDataAvailable(final Intent intent) throws Exception { |
| + registerWebApk(intent); |
| + loadUrlInNewTab("about:blank"); |
| + final Tab tab = getActivity().getActivityTab(); |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + WebappInfo info = WebappInfo.create(intent); |
| + mDetector = new TestManifestUpgradeDetector(tab, info); |
| + mDetector.setStartUrl(mStartUrl); |
| + mDetector.start(); |
| + } |
| + }); |
| + |
| + new TabLoadObserver(tab).fullyLoadUrl(mStartUrl); |
| + CriteriaHelper.pollUiThread(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return ((TestManifestUpgradeDetector) mDetector).mIsDataAvaliable; |
| + } |
| + }); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testManifestDoesNotUpgrade() throws Exception { |
|
pkotwicz
2016/07/19 18:02:38
I think that all of these tests can be done as JUn
Xi Han
2016/07/20 18:55:00
Honestly, I am not sure whether we can write these
pkotwicz
2016/07/20 20:57:04
It is definitely possible to write a JUnit test be
Xi Han
2016/07/22 17:13:11
As discussed offline, we will still keep the Java
|
| + waitUntilManifestDataAvailable(createIntent()); |
| + |
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testStartUrlChangeShouldReturnUpgradeTrue() throws Exception { |
| + String currentStartUrl = |
| + "/chrome/test/data/webapps/manifest_test_page_test_start_url_change.html"; |
| + mStartUrl = mTestServer.getURL(currentStartUrl); |
| + waitUntilManifestDataAvailable(createIntent()); |
| + |
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(mTestServer.getURL(WEBAPK_START_URL_PATH), |
| + ((TestManifestUpgradeDetector) mDetector).mStartUrl); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappShortNameChangeReturnsUpgradeTrue() |
| + throws Exception { |
| + String currentShortName = "New short name"; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_SHORT_NAME, currentShortName); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(WEBAPK_SHORT_NAME, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.shortName()); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappBackgroundColorChangeReturnsUpgradeTrue() throws Exception { |
| + long backgroundColor = 0xFFCCFFFF; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_BACKGROUND_COLOR, backgroundColor); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertTrue(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.backgroundColor()); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappNameChangeShouldReturnUpgradeFalse() throws Exception { |
| + String currentName = "New name"; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_NAME, currentName); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(WEBAPK_NAME, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.name()); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappOrientationChangeReturnsUpgradeFalse() |
| + throws Exception { |
| + int currentOrientation = ScreenOrientationValues.DEFAULT; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_ORIENTATION, currentOrientation); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(WEBAPK_ORIENTATION, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.orientation()); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappThemeColorChangeReturnsUpgradeFalse() |
| + throws Exception { |
| + long currentthemeColor = 0xFFCCFFFF; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, currentthemeColor); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(ShortcutHelper.MANIFEST_COLOR_INVALID_OR_MISSING, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.themeColor()); |
| + } |
| + |
| + @MediumTest |
| + @CommandLineFlags.Add(ManifestUpgradeDetector.SWITCH_USE_START_URL_FOR_TESTING) |
| + public void testWebappDisplayModeChangeReturnsUpgradeFalse() |
| + throws Exception { |
| + int currentdisplayMode = WebDisplayMode.Fullscreen; |
| + Intent intent = createIntent(); |
| + intent.putExtra(ShortcutHelper.EXTRA_DISPLAY_MODE, currentdisplayMode); |
| + waitUntilManifestDataAvailable(intent); |
| + |
| + assertFalse(((TestManifestUpgradeDetector) mDetector).mIsUpgraded); |
| + assertEquals(WebDisplayMode.Standalone, |
| + ((TestManifestUpgradeDetector) mDetector).mInfo.displayMode()); |
| + } |
| +} |