@Override protected void setUp() throws Exception { mPackageManager = new TestPackageManager(); AppBannerManager.setIsEnabledForTesting(true); AppBannerInfoBarDelegateAndroid.setPackageManagerForTesting(mPackageManager); super.setUp(); // Must be set after native has loaded. mDetailsDelegate = new MockAppDetailsDelegate(); ThreadUtils.runOnUiThreadBlocking( new Runnable() { @Override public void run() { AppBannerManager.setAppDetailsDelegate(mDetailsDelegate); } }); AppBannerManager.disableSecureSchemeCheckForTesting(); // 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.forceEngagementWeightsForTesting(1, 1); }
@SmallTest @Feature({"AppBanners"}) public void testWebAppBannerAppears() throws Exception { // Create a Tab that doesn't have the AppBannerManager enabled. This prevents race // conditions between service worker activation and AppBannerManager getting triggered. // This race condition is a known problem, which is why the specs include wiggle room for // how many times a site must be visited. AppBannerManager.setIsEnabledForTesting(false); loadUrlInNewTab("about:blank"); // Visit a site that can have a banner, then wait until the service worker is activated. assertTrue( CriteriaHelper.pollForUIThreadCriteria( new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); assertTrue( CriteriaHelper.pollForUIThreadCriteria( new Criteria() { @Override public boolean isSatisfied() { String url = getActivity().getActivityTab().getUrl(); Uri uri = Uri.parse(url); return TextUtils.equals(uri.getFragment(), "sw_activated"); } })); AppBannerManager.setIsEnabledForTesting(true); // Revisit the site in a new tab, which will have the AppBannerManager enabled. loadUrlInNewTab("about:blank"); assertTrue( CriteriaHelper.pollForUIThreadCriteria( new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); assertTrue( CriteriaHelper.pollForUIThreadCriteria( new Criteria() { @Override public boolean isSatisfied() { AppBannerManager manager = getActivity().getActivityTab().getAppBannerManagerForTesting(); return !manager.isFetcherActiveForTesting(); } })); assertTrue(waitUntilNoInfoBarsExist()); // Indicate a day has passed, then revisit the page to show the banner. AppBannerManager.setTimeDeltaForTesting(1); assertTrue( CriteriaHelper.pollForUIThreadCriteria( new TabLoadObserver(getActivity().getActivityTab(), WEB_APP_URL))); assertTrue( CriteriaHelper.pollForUIThreadCriteria( new Criteria() { @Override public boolean isSatisfied() { AppBannerManager manager = getActivity().getActivityTab().getAppBannerManagerForTesting(); return !manager.isFetcherActiveForTesting(); } })); assertTrue(waitUntilAppBannerInfoBarAppears(WEB_APP_TITLE)); }