Chromium Code Reviews| Index: chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
| index 8c04ebb87fcb7afba65a75fc4b86a598662da12f..8fe094e1baa9ad2545416b55e3e00d9f8bb829db 100644 |
| --- a/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java |
| @@ -25,11 +25,13 @@ import org.chromium.base.test.util.Feature; |
| import org.chromium.base.test.util.RetryOnFailure; |
| import org.chromium.chrome.R; |
| import org.chromium.chrome.browser.ShortcutHelper; |
| +import org.chromium.chrome.browser.engagement.SiteEngagementService; |
| import org.chromium.chrome.browser.infobar.AppBannerInfoBarAndroid; |
| import org.chromium.chrome.browser.infobar.AppBannerInfoBarDelegateAndroid; |
| import org.chromium.chrome.browser.infobar.InfoBar; |
| import org.chromium.chrome.browser.infobar.InfoBarContainer; |
| import org.chromium.chrome.browser.infobar.InfoBarContainer.InfoBarAnimationListener; |
| +import org.chromium.chrome.browser.profiles.Profile; |
| import org.chromium.chrome.browser.webapps.WebappDataStorage; |
| import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
| import org.chromium.chrome.test.util.browser.TabLoadObserver; |
| @@ -38,6 +40,7 @@ import org.chromium.content.browser.test.util.Criteria; |
| import org.chromium.content.browser.test.util.CriteriaHelper; |
| import org.chromium.content.browser.test.util.TouchCommon; |
| import org.chromium.net.test.EmbeddedTestServer; |
| +import org.chromium.ui.base.PageTransition; |
| import java.util.ArrayList; |
| import java.util.List; |
| @@ -193,10 +196,7 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| } |
| }); |
| - // Navigations in this test are all of type ui::PAGE_TRANSITION_LINK, i.e. indirect. |
| - // Force indirect navigations to be worth the same as direct for testing. |
| - AppBannerManager.setEngagementWeights(1, 1); |
| - |
| + AppBannerManager.setTotalEngagementForTesting(10); |
| mTestServer = EmbeddedTestServer.createAndStartServer(getInstrumentation().getContext()); |
| mNativeAppUrl = mTestServer.getURL(NATIVE_APP_PATH); |
| mWebAppUrl = mTestServer.getURL(WEB_APP_PATH); |
| @@ -208,6 +208,16 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| super.tearDown(); |
| } |
| + private void resetEngagementForUrl(final String url, final double engagement) { |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + SiteEngagementService.getForProfile(Profile.getLastUsedProfile()) |
| + .resetScoreForUrl(url, engagement); |
| + } |
| + }); |
| + } |
| + |
| private void waitUntilNoInfoBarsExist() throws Exception { |
| CriteriaHelper.pollUiThread(new Criteria() { |
| @Override |
| @@ -246,18 +256,18 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| private void runFullNativeInstallPathway(String url, String expectedReferrer) throws Exception { |
| // Visit a site that requests a banner. |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); |
| - waitUntilAppDetailsRetrieved(1); |
| - assertEquals(mDetailsDelegate.mReferrer, expectedReferrer); |
| + resetEngagementForUrl(url, 0); |
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED); |
| waitUntilNoInfoBarsExist(); |
| - // Indicate a day has passed, then revisit the page to get the banner to appear. |
| + // Update engagement, then revisit the page to get the banner to appear. |
| + resetEngagementForUrl(url, 10); |
| InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer(); |
| final InfobarListener listener = new InfobarListener(); |
| container.setAnimationListener(listener); |
| - AppBannerManager.setTimeDeltaForTesting(1); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); |
| - waitUntilAppDetailsRetrieved(2); |
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(1); |
| + assertEquals(mDetailsDelegate.mReferrer, expectedReferrer); |
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| CriteriaHelper.pollUiThread(new Criteria() { |
| @Override |
| @@ -305,8 +315,9 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| public void triggerWebAppBanner(String url, String expectedTitle, boolean installApp) |
| throws Exception { |
| // Visit the site in a new tab. |
| + resetEngagementForUrl(url, 0); |
| loadUrlInNewTab("about:blank"); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); |
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED); |
| CriteriaHelper.pollUiThread(new Criteria() { |
| @Override |
| @@ -322,9 +333,9 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| final InfobarListener listener = new InfobarListener(); |
| container.setAnimationListener(listener); |
| - // Indicate a day has passed, then revisit the page to show the banner. |
| - AppBannerManager.setTimeDeltaForTesting(1); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url); |
| + // Update engagement, then revisit the page to get the banner to appear. |
| + resetEngagementForUrl(url, 10); |
| + new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(url, PageTransition.TYPED); |
| CriteriaHelper.pollUiThread(new Criteria() { |
| @Override |
| public boolean isSatisfied() { |
| @@ -368,60 +379,83 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| @RetryOnFailure |
| public void testBannerAppearsThenDoesNotAppearAgainForWeeks() throws Exception { |
| // Visit a site that requests a banner. |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(1); |
| + resetEngagementForUrl(mNativeAppUrl, 0); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| waitUntilNoInfoBarsExist(); |
| - // Indicate a day has passed, then revisit the page. |
| - AppBannerManager.setTimeDeltaForTesting(1); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(2); |
| + // Update engagement, then revisit the page. |
| + resetEngagementForUrl(mNativeAppUrl, 10); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(1); |
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| // Revisit the page to make the banner go away, but don't explicitly dismiss it. |
| // This hides the banner for two weeks. |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(3); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(2); |
| waitUntilNoInfoBarsExist(); |
| // Wait a week until revisiting the page. |
| AppBannerManager.setTimeDeltaForTesting(7); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(4); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(3); |
| waitUntilNoInfoBarsExist(); |
| AppBannerManager.setTimeDeltaForTesting(8); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(5); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(4); |
| waitUntilNoInfoBarsExist(); |
| // Wait two weeks until revisiting the page, which should pop up the banner. |
| - AppBannerManager.setTimeDeltaForTesting(14); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(6); |
| - waitUntilNoInfoBarsExist(); |
| - |
| AppBannerManager.setTimeDeltaForTesting(15); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(7); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(5); |
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| } |
| @MediumTest |
| @Feature({"AppBanners"}) |
| + @RetryOnFailure |
|
gone
2016/12/08 19:51:21
Don't know if new tests are supposed to automatica
dominickn
2016/12/09 05:27:27
Removed.
|
| + public void testBannerAppearsThenDoesNotAppearAgainForCustomTime() throws Exception { |
| + AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7); |
| + triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, false); |
| + |
| + // Revisit the page to make the banner go away, but don't explicitly dismiss it. |
| + // This hides the banner for two weeks. |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| + waitUntilNoInfoBarsExist(); |
| + |
| + // Wait a week until revisiting the page. This should allow the banner. |
| + AppBannerManager.setTimeDeltaForTesting(7); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| + } |
| + |
| + @MediumTest |
| + @Feature({"AppBanners"}) |
| public void testBlockedBannerDoesNotAppearAgainForMonths() throws Exception { |
| // Visit a site that requests a banner. |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(1); |
| + resetEngagementForUrl(mNativeAppUrl, 0); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| waitUntilNoInfoBarsExist(); |
| - // Indicate a day has passed, then revisit the page. |
| + // Update engagement, then revisit the page. |
| + resetEngagementForUrl(mNativeAppUrl, 10); |
| InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer(); |
| final InfobarListener listener = new InfobarListener(); |
| container.setAnimationListener(listener); |
| - AppBannerManager.setTimeDeltaForTesting(1); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(2); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(1); |
| waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| // Explicitly dismiss the banner. |
| @@ -438,25 +472,56 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| // Waiting two months shouldn't be long enough. |
| AppBannerManager.setTimeDeltaForTesting(61); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(3); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(2); |
| waitUntilNoInfoBarsExist(); |
| AppBannerManager.setTimeDeltaForTesting(62); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(4); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(3); |
| waitUntilNoInfoBarsExist(); |
| // Waiting three months should allow banners to reappear. |
| AppBannerManager.setTimeDeltaForTesting(91); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(5); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| + waitUntilAppDetailsRetrieved(4); |
| + waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| + } |
| + |
| + @MediumTest |
| + @Feature({"AppBanners"}) |
| + public void testBlockedBannerDoesNotAppearAgainForCustomTime() throws Exception { |
| + AppBannerManager.setDaysAfterDismissAndIgnoreForTesting(7, 7); |
| + |
| + // Update engagement, then visit a page which triggers a banner. |
| + resetEngagementForUrl(mWebAppUrl, 10); |
| + InfoBarContainer container = getActivity().getActivityTab().getInfoBarContainer(); |
| + final InfobarListener listener = new InfobarListener(); |
| + container.setAnimationListener(listener); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| + |
| + // Explicitly dismiss the banner. |
| + CriteriaHelper.pollUiThread(new Criteria() { |
| + @Override |
| + public boolean isSatisfied() { |
| + return listener.mDoneAnimating; |
| + } |
| + }); |
| + ArrayList<InfoBar> infobars = container.getInfoBarsForTesting(); |
| + View close = infobars.get(0).getView().findViewById(R.id.infobar_close_button); |
| + TouchCommon.singleClickView(close); |
| waitUntilNoInfoBarsExist(); |
| - AppBannerManager.setTimeDeltaForTesting(92); |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| - waitUntilAppDetailsRetrieved(6); |
| - waitUntilAppBannerInfoBarAppears(NATIVE_APP_TITLE); |
| + // Waiting seven days should be long enough. |
| + AppBannerManager.setTimeDeltaForTesting(7); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| + waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE); |
| } |
| @MediumTest |
| @@ -464,17 +529,18 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| @RetryOnFailure |
| public void testBitmapFetchersCanOverlapWithoutCrashing() throws Exception { |
| // Visit a site that requests a banner rapidly and repeatedly. |
| + resetEngagementForUrl(mNativeAppUrl, 10); |
| for (int i = 1; i <= 10; i++) { |
| - new TabLoadObserver(getActivity().getActivityTab()).fullyLoadUrl(mNativeAppUrl); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mNativeAppUrl, PageTransition.TYPED); |
| final Integer iteration = Integer.valueOf(i); |
| - CriteriaHelper.pollUiThread( |
| - Criteria.equals(iteration, new Callable<Integer>() { |
| - @Override |
| - public Integer call() { |
| - return mDetailsDelegate.mNumRetrieved; |
| - } |
| - })); |
| + CriteriaHelper.pollUiThread(Criteria.equals(iteration, new Callable<Integer>() { |
| + @Override |
| + public Integer call() { |
| + return mDetailsDelegate.mNumRetrieved; |
| + } |
| + })); |
| } |
| } |
| @@ -488,6 +554,19 @@ public class AppBannerManagerTest extends ChromeTabbedActivityTestBase { |
| @SmallTest |
| @Feature({"AppBanners"}) |
| @RetryOnFailure |
| + public void testWebAppBannerDoesNotAppearAfterInstall() throws Exception { |
| + triggerWebAppBanner(mWebAppUrl, WEB_APP_TITLE, true); |
| + |
| + // The banner should not reshow after the site has been installed. |
| + AppBannerManager.setTimeDeltaForTesting(100); |
| + new TabLoadObserver(getActivity().getActivityTab()) |
| + .fullyLoadUrl(mWebAppUrl, PageTransition.TYPED); |
| + waitUntilNoInfoBarsExist(); |
| + } |
| + |
| + @SmallTest |
| + @Feature({"AppBanners"}) |
| + @RetryOnFailure |
| public void testBannerFallsBackToShortName() throws Exception { |
| triggerWebAppBanner(WebappTestPage.urlOfPageWithServiceWorkerAndManifest( |
| mTestServer, WEB_APP_SHORT_TITLE_MANIFEST), |