| 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
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8002714ff228fccb542ac325e300427d0a46e211
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
|
| @@ -0,0 +1,256 @@
|
| +// Copyright 2015 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.banners;
|
| +
|
| +import android.test.suitebuilder.annotation.MediumTest;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +import android.text.TextUtils;
|
| +import android.view.View;
|
| +import android.widget.TextView;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.Tab;
|
| +import org.chromium.chrome.browser.infobar.AnimationHelper;
|
| +import org.chromium.chrome.browser.infobar.AppBannerInfoBar;
|
| +import org.chromium.chrome.browser.infobar.InfoBar;
|
| +import org.chromium.chrome.browser.infobar.InfoBarContainer;
|
| +import org.chromium.chrome.shell.ChromeShellTestBase;
|
| +import org.chromium.chrome.test.util.TestHttpServerClient;
|
| +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.browser.test.util.TouchCommon;
|
| +
|
| +import java.util.ArrayList;
|
| +
|
| +/**
|
| + * Tests the app banners.
|
| + */
|
| +public class AppBannerManagerTest extends ChromeShellTestBase {
|
| + private static final String NATIVE_APP_URL =
|
| + TestHttpServerClient.getUrl("chrome/test/data/android/banners/native_app_test.html");
|
| +
|
| + private static final String APP_ICON_URL =
|
| + TestHttpServerClient.getUrl("chrome/test/data/android/banners/native_app_test.png");
|
| +
|
| + private static final String APP_TITLE = "Mock app title";
|
| +
|
| + private static class MockAppDetailsDelegate extends AppDetailsDelegate {
|
| + private Observer mObserver;
|
| + private AppData mAppData;
|
| + private int mNumRetrieved;
|
| +
|
| + @Override
|
| + protected void getAppDetailsAsynchronously(
|
| + Observer observer, String url, String packageName, int iconSize) {
|
| + mNumRetrieved += 1;
|
| + mObserver = observer;
|
| + mAppData = new AppData(url, packageName);
|
| + mAppData.setPackageInfo(APP_TITLE, APP_ICON_URL, 4.5f,
|
| + "Install this", null, null);
|
| + ThreadUtils.runOnUiThread(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mObserver.onAppDetailsRetrieved(mAppData);
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Override
|
| + public void destroy() {
|
| + }
|
| + }
|
| +
|
| + private static class InfobarListener implements InfoBarContainer.InfoBarAnimationListener {
|
| + private boolean mDoneAnimating;
|
| +
|
| + @Override
|
| + public void notifyAnimationFinished(int animationType) {
|
| + if (animationType == AnimationHelper.ANIMATION_TYPE_SHOW) mDoneAnimating = true;
|
| + }
|
| + }
|
| +
|
| + private MockAppDetailsDelegate mDetailsDelegate;
|
| + private InfoBarContainer mInfoBarContainer;
|
| + private AppBannerManager mAppBannerManager;
|
| + private Tab mActivityTab;
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + mDetailsDelegate = new MockAppDetailsDelegate();
|
| + AppBannerManager.setAppDetailsDelegate(mDetailsDelegate);
|
| + AppBannerManager.setIsEnabledForTesting();
|
| + clearAppData();
|
| +
|
| + super.setUp();
|
| +
|
| + launchChromeShellWithUrl("about:blank");
|
| + assertTrue(waitForActiveShellToBeDoneLoading());
|
| + mActivityTab = getActivity().getActiveTab();
|
| + mInfoBarContainer = mActivityTab.getInfoBarContainer();
|
| + mAppBannerManager = mActivityTab.getAppBannerManagerForTesting();
|
| + }
|
| +
|
| + private boolean waitUntilNoInfoBarsExist() throws Exception {
|
| + return CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return mInfoBarContainer.getInfoBars().size() == 0;
|
| + }
|
| + });
|
| + }
|
| +
|
| + private boolean waitUntilAppDetailsRetrieved(final int numExpected) throws Exception {
|
| + return CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return mDetailsDelegate.mNumRetrieved == numExpected
|
| + && mAppBannerManager.getNumActiveFetchersForTesting() == 0;
|
| + }
|
| + });
|
| + }
|
| +
|
| + private boolean waitUntilAppBannerInfoBarAppears() throws Exception {
|
| + return CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + ArrayList<InfoBar> infobars = mInfoBarContainer.getInfoBars();
|
| + if (infobars.size() != 1) return false;
|
| + if (!(infobars.get(0) instanceof AppBannerInfoBar)) return false;
|
| +
|
| + TextView textView =
|
| + (TextView) infobars.get(0).getContentWrapper().findViewById(R.id.app_name);
|
| + if (textView == null) return false;
|
| + return TextUtils.equals(textView.getText(), APP_TITLE);
|
| + }
|
| + });
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"AppBanners"})
|
| + public void testBannerAppears() throws Exception {
|
| + // Visit a site that requests a banner.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(1));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Indicate a day has passed, then revisit the page.
|
| + AppBannerManager.setTimeDeltaForTesting(1);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(2));
|
| + assertTrue(waitUntilAppBannerInfoBarAppears());
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"AppBanners"})
|
| + public void testBannerAppearsThenDoesNotAppearAgainForMonths() throws Exception {
|
| + // Visit a site that requests a banner.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(1));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Indicate a day has passed, then revisit the page.
|
| + AppBannerManager.setTimeDeltaForTesting(1);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(2));
|
| + assertTrue(waitUntilAppBannerInfoBarAppears());
|
| +
|
| + // Revisit the page to make the banner go away, but don't explicitly dismiss it.
|
| + // This hides the banner for a few months.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(3));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Wait a month until revisiting the page.
|
| + AppBannerManager.setTimeDeltaForTesting(31);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(4));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + AppBannerManager.setTimeDeltaForTesting(32);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(5));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Wait two months until revisiting the page, which should pop up the banner.
|
| + AppBannerManager.setTimeDeltaForTesting(61);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(6));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + AppBannerManager.setTimeDeltaForTesting(62);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(7));
|
| + assertTrue(waitUntilAppBannerInfoBarAppears());
|
| + }
|
| +
|
| + @MediumTest
|
| + @Feature({"AppBanners"})
|
| + public void testBlockedBannerDoesNotAppearAgainForMonths() throws Exception {
|
| + // Visit a site that requests a banner.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(1));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Indicate a day has passed, then revisit the page.
|
| + final InfobarListener listener = new InfobarListener();
|
| + mInfoBarContainer.setAnimationListener(listener);
|
| + AppBannerManager.setTimeDeltaForTesting(1);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(2));
|
| + assertTrue(waitUntilAppBannerInfoBarAppears());
|
| +
|
| + // Explicitly dismiss the banner.
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(new Criteria() {
|
| + @Override
|
| + public boolean isSatisfied() {
|
| + return listener.mDoneAnimating;
|
| + }
|
| + }));
|
| + ArrayList<InfoBar> infobars = mInfoBarContainer.getInfoBars();
|
| + View close = infobars.get(0).getContentWrapper().findViewById(R.id.infobar_close_button);
|
| + TouchCommon.singleClickView(close);
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Waiting two months shouldn't be long enough.
|
| + AppBannerManager.setTimeDeltaForTesting(61);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(3));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + AppBannerManager.setTimeDeltaForTesting(62);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(4));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + // Waiting three months should allow banners to reappear.
|
| + AppBannerManager.setTimeDeltaForTesting(91);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(5));
|
| + assertTrue(waitUntilNoInfoBarsExist());
|
| +
|
| + AppBannerManager.setTimeDeltaForTesting(92);
|
| + assertTrue(CriteriaHelper.pollForUIThreadCriteria(
|
| + new TabLoadObserver(getActivity().getActiveTab(), NATIVE_APP_URL)));
|
| + assertTrue(waitUntilAppDetailsRetrieved(6));
|
| + assertTrue(waitUntilAppBannerInfoBarAppears());
|
| + }
|
| +}
|
|
|