Index: chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9d9898fad78ec6b5d2aa2448cb849c94c1969b82 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabWindowManagerTest.java |
@@ -0,0 +1,234 @@ |
+// 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.tabmodel; |
+ |
+import android.app.Activity; |
+import android.test.InstrumentationTestCase; |
+import android.test.UiThreadTest; |
+import android.test.suitebuilder.annotation.SmallTest; |
+import android.test.suitebuilder.annotation.Smoke; |
+ |
+import org.chromium.base.ActivityState; |
+import org.chromium.base.ApplicationStatus; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.browser.ChromeActivity; |
+import org.chromium.chrome.browser.EmbedContentViewActivity; |
+import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFactory; |
+import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; |
+import org.chromium.ui.base.WindowAndroid; |
+ |
+/** |
+ * Test for {@link TabWindowManager} APIs. Makes sure the class handles multiple {@link Activity}s |
+ * requesting {@link TabModelSelector}s, {@link Activity}s getting destroyed, etc.. |
+ */ |
+public class TabWindowManagerTest extends InstrumentationTestCase { |
+ private final TabModelSelectorFactory mMockTabModelSelectorFactory = |
+ new TabModelSelectorFactory() { |
+ @Override |
+ public TabModelSelector buildSelector(ChromeActivity activity, |
+ WindowAndroid windowAndroid, int selectorIndex) { |
+ return new MockTabModelSelector(0, 0, null); |
+ } |
+ }; |
+ |
+ private ChromeActivity buildActivity() { |
+ ChromeActivity activity = new EmbedContentViewActivity(); |
+ ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED); |
+ return activity; |
+ } |
+ |
+ private TabModelSelector requestSelector(ChromeActivity activity, int requestedIndex) { |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ manager.setTabModelSelectorFactory(mMockTabModelSelectorFactory); |
+ TabModelSelector selector = manager.requestSelector(activity, null, requestedIndex); |
+ return selector; |
+ } |
+ |
+ /** |
+ * Test that a single {@link Activity} can request a {@link TabModelSelector}. |
+ */ |
+ @Smoke |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testSingleActivity() { |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ } |
+ |
+ /** |
+ * Test that two {@link Activity}s can request different {@link TabModelSelector}s. |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testMultipleActivities() { |
+ assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2); |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ ChromeActivity activity1 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ TabModelSelector selector1 = requestSelector(activity1, 1); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertNotNull("Was not able to build the TabModelSelector", selector1); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ assertEquals("Unexpected model index", 1, manager.getIndexForWindow(activity1)); |
+ } |
+ |
+ /** |
+ * Test that trying to have too many {@link Activity}s requesting {@link TabModelSelector}s is |
+ * properly capped and returns {@code null}. |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testTooManyActivities() { |
+ for (int i = 0; i < TabWindowManager.MAX_SIMULTANEOUS_SELECTORS; i++) { |
+ assertNotNull("Could not build selector", requestSelector(buildActivity(), 0)); |
+ } |
+ |
+ assertNull("Built selectors past the max number supported", |
+ requestSelector(buildActivity(), 0)); |
+ } |
+ |
+ /** |
+ * Test that requesting the same {@link TabModelSelector} index will fall back and return a |
+ * model for a different available index instead. In this case, a higher index (0 -> 1). |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testIndexFallback() { |
+ assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2); |
+ |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ ChromeActivity activity1 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ // Request 0 again, but should get 1 instead. |
+ TabModelSelector selector1 = requestSelector(activity1, 0); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertNotNull("Was not able to build the TabModelSelector", selector1); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ assertEquals("Unexpected model index", 1, manager.getIndexForWindow(activity1)); |
+ } |
+ |
+ /** |
+ * Test that requesting the same {@link TabModelSelector} index will fall back and return a |
+ * model for a different available index instead. In this case, a lower index (2 -> 0). |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testIndexFallback2() { |
+ assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 3); |
+ |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ ChromeActivity activity1 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 2); |
+ // Request 2 again, but should get 0 instead. |
+ TabModelSelector selector1 = requestSelector(activity1, 2); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertNotNull("Was not able to build the TabModelSelector", selector1); |
+ assertEquals("Unexpected model index", 2, manager.getIndexForWindow(activity0)); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity1)); |
+ } |
+ |
+ /** |
+ * Test that a destroyed {@link Activity} properly gets removed from {@link TabWindowManager}. |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testActivityDeathRemovesSingle() { |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ |
+ ApplicationStatus.onStateChangeForTesting(activity0, ActivityState.DESTROYED); |
+ |
+ assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
+ manager.getIndexForWindow(activity0)); |
+ } |
+ |
+ /** |
+ * Test that an {@link Activity} requesting an index that was previously assigned to a destroyed |
+ * {@link Activity} can take that {@link TabModelSelector}. |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testActivityDeathLetsModelReassign() { |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ |
+ ApplicationStatus.onStateChangeForTesting(activity0, ActivityState.DESTROYED); |
+ |
+ assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
+ manager.getIndexForWindow(activity0)); |
+ |
+ ChromeActivity activity1 = buildActivity(); |
+ TabModelSelector selector1 = requestSelector(activity1, 0); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector1); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity1)); |
+ } |
+ |
+ /** |
+ * Test that an {@link Activity} requesting an index that was previously assigned to a destroyed |
+ * {@link Activity} can take that {@link TabModelSelector} when there are other |
+ * {@link Activity}s assigned {@link TabModelSelector}s. |
+ */ |
+ @SmallTest |
+ @Feature({"Multiwindow"}) |
+ @UiThreadTest |
+ public void testActivityDeathWithMultipleActivities() { |
+ assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SELECTORS >= 2); |
+ |
+ final TabWindowManager manager = TabWindowManager.getInstance(); |
+ |
+ ChromeActivity activity0 = buildActivity(); |
+ ChromeActivity activity1 = buildActivity(); |
+ TabModelSelector selector0 = requestSelector(activity0, 0); |
+ TabModelSelector selector1 = requestSelector(activity1, 1); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector0); |
+ assertNotNull("Was not able to build the TabModelSelector", selector1); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ assertEquals("Unexpected model index", 1, manager.getIndexForWindow(activity1)); |
+ |
+ ApplicationStatus.onStateChangeForTesting(activity1, ActivityState.DESTROYED); |
+ |
+ assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
+ manager.getIndexForWindow(activity1)); |
+ |
+ ChromeActivity activity2 = buildActivity(); |
+ TabModelSelector selector2 = requestSelector(activity2, 1); |
+ |
+ assertNotNull("Was not able to build the TabModelSelector", selector2); |
+ assertEquals("Unexpected model index", 0, manager.getIndexForWindow(activity0)); |
+ assertEquals("Unexpected model index", 1, manager.getIndexForWindow(activity2)); |
+ } |
+} |