Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3255)

Unified Diff: chrome/android/javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java

Issue 914403006: [App banners] Start adding unit tets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698