@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));
  }