Index: chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f50d0932d843613305bd3ccdb8235df4e185b9d1 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java |
@@ -0,0 +1,145 @@ |
+// 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.ntp; |
+ |
+import android.support.test.filters.MediumTest; |
+import android.view.View; |
+ |
+import org.chromium.base.ThreadUtils; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.base.test.util.RetryOnFailure; |
+import org.chromium.chrome.browser.UrlConstants; |
+import org.chromium.chrome.browser.tab.Tab; |
+import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
+import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content.browser.test.util.TestTouchUtils; |
+ |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
+/** |
+ * Instrumentation tests for {@link RecentTabsPage}. |
+ */ |
+@RetryOnFailure |
+public class RecentTabsPageTest extends ChromeTabbedActivityTestBase { |
+ private FakeRecentlyClosedTabManager mManager; |
+ private Tab mTab; |
+ private RecentTabsPage mPage; |
+ |
+ @Override |
+ protected void setUp() throws Exception { |
+ mManager = new FakeRecentlyClosedTabManager(); |
+ RecentTabsManager.setRecentlyClosedTabManagerForTests(mManager); |
+ super.setUp(); |
+ } |
+ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ leaveRecentTabsPage(); |
+ RecentTabsManager.setRecentlyClosedTabManagerForTests(null); |
+ super.tearDown(); |
+ } |
+ |
+ @Override |
+ public void startMainActivity() throws InterruptedException { |
+ startMainActivityOnBlankPage(); |
+ mTab = getActivity().getActivityTab(); |
+ mPage = loadRecentTabsPage(); |
+ } |
+ |
+ @MediumTest |
+ @Feature({"RecentTabsPage"}) |
+ public void testRecentlyClosedTabs() throws InterruptedException { |
+ // Set a recently closed tab and confirm a view is rendered for it. |
+ List<RecentlyClosedTab> tabs = setRecentlyClosedTabs(1); |
+ assertEquals(1, mManager.getRecentlyClosedTabs(1).size()); |
+ String title = tabs.get(0).title; |
+ View view = waitForView(title); |
+ |
+ // Clear the recently closed tabs with the context menu and confirm the view is gone. |
+ invokeContextMenu(view, RecentTabsRowAdapter.RecentlyClosedTabsGroup.ID_REMOVE_ALL); |
+ assertEquals(0, mManager.getRecentlyClosedTabs(1).size()); |
+ waitForViewToDisappear(title); |
+ } |
+ |
+ /** |
+ * Generates the specified number of {@link RecentlyClosedTab} instances and sets them on the |
+ * manager. |
+ */ |
+ private List<RecentlyClosedTab> setRecentlyClosedTabs(final int tabCount) { |
+ final List<RecentlyClosedTab> tabs = new ArrayList<>(); |
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
+ @Override |
+ public void run() { |
+ for (int i = 0; i < tabCount; i++) { |
+ tabs.add(new RecentlyClosedTab(i, "RecentlyClosedTab title " + i, "url " + i)); |
+ } |
+ mManager.setRecentlyClosedTabs(tabs); |
+ } |
+ }); |
+ return tabs; |
+ } |
+ |
+ private RecentTabsPage loadRecentTabsPage() throws InterruptedException { |
+ loadUrl(UrlConstants.RECENT_TABS_URL); |
+ CriteriaHelper.pollUiThread(new Criteria("RecentTabsPage never fully loaded") { |
+ @Override |
+ public boolean isSatisfied() { |
+ return mTab.getNativePage() instanceof RecentTabsPage; |
+ } |
+ }); |
+ assertTrue(mTab.getNativePage() instanceof RecentTabsPage); |
+ return (RecentTabsPage) mTab.getNativePage(); |
+ } |
+ |
+ /** |
+ * Leaves and destroys the {@link RecentTabsPage} by navigating the tab to {@code about:blank}. |
+ */ |
+ private void leaveRecentTabsPage() throws InterruptedException { |
+ loadUrl(UrlConstants.ABOUT_BLANK); |
+ CriteriaHelper.pollUiThread(new Criteria("RecentTabsPage is still there") { |
+ @Override |
+ public boolean isSatisfied() { |
+ return !(mTab.getNativePage() instanceof RecentTabsPage); |
+ } |
+ }); |
+ } |
+ |
+ /** |
+ * Waits for the view with the specified text to appear. |
+ */ |
+ private View waitForView(final String text) { |
+ final ArrayList<View> views = new ArrayList<>(); |
+ CriteriaHelper.pollUiThread(new Criteria("Could not find view with this text: " + text) { |
+ @Override |
+ public boolean isSatisfied() { |
+ mPage.getView().findViewsWithText(views, text, View.FIND_VIEWS_WITH_TEXT); |
+ return views.size() == 1; |
+ } |
+ }); |
+ return views.get(0); |
+ } |
+ |
+ /** |
+ * Waits for the view with the specified text to disappear. |
+ */ |
+ private void waitForViewToDisappear(final String text) { |
+ CriteriaHelper.pollUiThread(new Criteria("View with this text is still present: " + text) { |
+ @Override |
+ public boolean isSatisfied() { |
+ ArrayList<View> views = new ArrayList<>(); |
+ mPage.getView().findViewsWithText(views, text, View.FIND_VIEWS_WITH_TEXT); |
+ return views.isEmpty(); |
+ } |
+ }); |
+ } |
+ |
+ private void invokeContextMenu(View view, int contextMenuItemId) { |
+ TestTouchUtils.longClickView(getInstrumentation(), view); |
+ assertTrue( |
+ getInstrumentation().invokeContextMenuAction(getActivity(), contextMenuItemId, 0)); |
+ } |
+} |