OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.tabmodel; |
| 6 |
| 7 import android.app.Activity; |
| 8 import android.test.InstrumentationTestCase; |
| 9 import android.test.UiThreadTest; |
| 10 import android.test.suitebuilder.annotation.SmallTest; |
| 11 import android.test.suitebuilder.annotation.Smoke; |
| 12 |
| 13 import org.chromium.base.ActivityState; |
| 14 import org.chromium.base.ApplicationStatus; |
| 15 import org.chromium.base.test.util.Feature; |
| 16 import org.chromium.chrome.browser.ChromeActivity; |
| 17 import org.chromium.chrome.browser.EmbedContentViewActivity; |
| 18 import org.chromium.chrome.browser.tabmodel.TabWindowManager.TabModelSelectorFac
tory; |
| 19 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; |
| 20 import org.chromium.ui.base.WindowAndroid; |
| 21 |
| 22 /** |
| 23 * Test for {@link TabWindowManager} APIs. Makes sure the class handles multipl
e {@link Activity}s |
| 24 * requesting {@link TabModelSelector}s, {@link Activity}s getting destroyed, et
c.. |
| 25 */ |
| 26 public class TabWindowManagerTest extends InstrumentationTestCase { |
| 27 private final TabModelSelectorFactory mMockTabModelSelectorFactory = |
| 28 new TabModelSelectorFactory() { |
| 29 @Override |
| 30 public TabModelSelector buildSelector(ChromeActivity activity, |
| 31 WindowAndroid windowAndroid, int selectorIndex) { |
| 32 return new MockTabModelSelector(0, 0, null); |
| 33 } |
| 34 }; |
| 35 |
| 36 private ChromeActivity buildActivity() { |
| 37 ChromeActivity activity = new EmbedContentViewActivity(); |
| 38 ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATE
D); |
| 39 return activity; |
| 40 } |
| 41 |
| 42 private TabModelSelector requestSelector(ChromeActivity activity, int reques
tedIndex) { |
| 43 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 44 manager.setTabModelSelectorFactory(mMockTabModelSelectorFactory); |
| 45 TabModelSelector selector = manager.requestSelector(activity, null, requ
estedIndex); |
| 46 return selector; |
| 47 } |
| 48 |
| 49 /** |
| 50 * Test that a single {@link Activity} can request a {@link TabModelSelector
}. |
| 51 */ |
| 52 @Smoke |
| 53 @Feature({"Multiwindow"}) |
| 54 @UiThreadTest |
| 55 public void testSingleActivity() { |
| 56 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 57 |
| 58 ChromeActivity activity0 = buildActivity(); |
| 59 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 60 |
| 61 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 62 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 63 } |
| 64 |
| 65 /** |
| 66 * Test that two {@link Activity}s can request different {@link TabModelSele
ctor}s. |
| 67 */ |
| 68 @SmallTest |
| 69 @Feature({"Multiwindow"}) |
| 70 @UiThreadTest |
| 71 public void testMultipleActivities() { |
| 72 assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SEL
ECTORS >= 2); |
| 73 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 74 |
| 75 ChromeActivity activity0 = buildActivity(); |
| 76 ChromeActivity activity1 = buildActivity(); |
| 77 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 78 TabModelSelector selector1 = requestSelector(activity1, 1); |
| 79 |
| 80 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 81 assertNotNull("Was not able to build the TabModelSelector", selector1); |
| 82 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 83 assertEquals("Unexpected model index", 1, manager.getIndexForWindow(acti
vity1)); |
| 84 } |
| 85 |
| 86 /** |
| 87 * Test that trying to have too many {@link Activity}s requesting {@link Tab
ModelSelector}s is |
| 88 * properly capped and returns {@code null}. |
| 89 */ |
| 90 @SmallTest |
| 91 @Feature({"Multiwindow"}) |
| 92 @UiThreadTest |
| 93 public void testTooManyActivities() { |
| 94 for (int i = 0; i < TabWindowManager.MAX_SIMULTANEOUS_SELECTORS; i++) { |
| 95 assertNotNull("Could not build selector", requestSelector(buildActiv
ity(), 0)); |
| 96 } |
| 97 |
| 98 assertNull("Built selectors past the max number supported", |
| 99 requestSelector(buildActivity(), 0)); |
| 100 } |
| 101 |
| 102 /** |
| 103 * Test that requesting the same {@link TabModelSelector} index will fall ba
ck and return a |
| 104 * model for a different available index instead. In this case, a higher in
dex (0 -> 1). |
| 105 */ |
| 106 @SmallTest |
| 107 @Feature({"Multiwindow"}) |
| 108 @UiThreadTest |
| 109 public void testIndexFallback() { |
| 110 assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SEL
ECTORS >= 2); |
| 111 |
| 112 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 113 |
| 114 ChromeActivity activity0 = buildActivity(); |
| 115 ChromeActivity activity1 = buildActivity(); |
| 116 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 117 // Request 0 again, but should get 1 instead. |
| 118 TabModelSelector selector1 = requestSelector(activity1, 0); |
| 119 |
| 120 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 121 assertNotNull("Was not able to build the TabModelSelector", selector1); |
| 122 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 123 assertEquals("Unexpected model index", 1, manager.getIndexForWindow(acti
vity1)); |
| 124 } |
| 125 |
| 126 /** |
| 127 * Test that requesting the same {@link TabModelSelector} index will fall ba
ck and return a |
| 128 * model for a different available index instead. In this case, a lower ind
ex (2 -> 0). |
| 129 */ |
| 130 @SmallTest |
| 131 @Feature({"Multiwindow"}) |
| 132 @UiThreadTest |
| 133 public void testIndexFallback2() { |
| 134 assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SEL
ECTORS >= 3); |
| 135 |
| 136 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 137 |
| 138 ChromeActivity activity0 = buildActivity(); |
| 139 ChromeActivity activity1 = buildActivity(); |
| 140 TabModelSelector selector0 = requestSelector(activity0, 2); |
| 141 // Request 2 again, but should get 0 instead. |
| 142 TabModelSelector selector1 = requestSelector(activity1, 2); |
| 143 |
| 144 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 145 assertNotNull("Was not able to build the TabModelSelector", selector1); |
| 146 assertEquals("Unexpected model index", 2, manager.getIndexForWindow(acti
vity0)); |
| 147 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity1)); |
| 148 } |
| 149 |
| 150 /** |
| 151 * Test that a destroyed {@link Activity} properly gets removed from {@link
TabWindowManager}. |
| 152 */ |
| 153 @SmallTest |
| 154 @Feature({"Multiwindow"}) |
| 155 @UiThreadTest |
| 156 public void testActivityDeathRemovesSingle() { |
| 157 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 158 |
| 159 ChromeActivity activity0 = buildActivity(); |
| 160 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 161 |
| 162 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 163 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 164 |
| 165 ApplicationStatus.onStateChangeForTesting(activity0, ActivityState.DESTR
OYED); |
| 166 |
| 167 assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
| 168 manager.getIndexForWindow(activity0)); |
| 169 } |
| 170 |
| 171 /** |
| 172 * Test that an {@link Activity} requesting an index that was previously ass
igned to a destroyed |
| 173 * {@link Activity} can take that {@link TabModelSelector}. |
| 174 */ |
| 175 @SmallTest |
| 176 @Feature({"Multiwindow"}) |
| 177 @UiThreadTest |
| 178 public void testActivityDeathLetsModelReassign() { |
| 179 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 180 |
| 181 ChromeActivity activity0 = buildActivity(); |
| 182 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 183 |
| 184 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 185 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 186 |
| 187 ApplicationStatus.onStateChangeForTesting(activity0, ActivityState.DESTR
OYED); |
| 188 |
| 189 assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
| 190 manager.getIndexForWindow(activity0)); |
| 191 |
| 192 ChromeActivity activity1 = buildActivity(); |
| 193 TabModelSelector selector1 = requestSelector(activity1, 0); |
| 194 |
| 195 assertNotNull("Was not able to build the TabModelSelector", selector1); |
| 196 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity1)); |
| 197 } |
| 198 |
| 199 /** |
| 200 * Test that an {@link Activity} requesting an index that was previously ass
igned to a destroyed |
| 201 * {@link Activity} can take that {@link TabModelSelector} when there are ot
her |
| 202 * {@link Activity}s assigned {@link TabModelSelector}s. |
| 203 */ |
| 204 @SmallTest |
| 205 @Feature({"Multiwindow"}) |
| 206 @UiThreadTest |
| 207 public void testActivityDeathWithMultipleActivities() { |
| 208 assertTrue("Not enough selectors", TabWindowManager.MAX_SIMULTANEOUS_SEL
ECTORS >= 2); |
| 209 |
| 210 final TabWindowManager manager = TabWindowManager.getInstance(); |
| 211 |
| 212 ChromeActivity activity0 = buildActivity(); |
| 213 ChromeActivity activity1 = buildActivity(); |
| 214 TabModelSelector selector0 = requestSelector(activity0, 0); |
| 215 TabModelSelector selector1 = requestSelector(activity1, 1); |
| 216 |
| 217 assertNotNull("Was not able to build the TabModelSelector", selector0); |
| 218 assertNotNull("Was not able to build the TabModelSelector", selector1); |
| 219 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 220 assertEquals("Unexpected model index", 1, manager.getIndexForWindow(acti
vity1)); |
| 221 |
| 222 ApplicationStatus.onStateChangeForTesting(activity1, ActivityState.DESTR
OYED); |
| 223 |
| 224 assertEquals("Still found model", TabWindowManager.INVALID_WINDOW_INDEX, |
| 225 manager.getIndexForWindow(activity1)); |
| 226 |
| 227 ChromeActivity activity2 = buildActivity(); |
| 228 TabModelSelector selector2 = requestSelector(activity2, 1); |
| 229 |
| 230 assertNotNull("Was not able to build the TabModelSelector", selector2); |
| 231 assertEquals("Unexpected model index", 0, manager.getIndexForWindow(acti
vity0)); |
| 232 assertEquals("Unexpected model index", 1, manager.getIndexForWindow(acti
vity2)); |
| 233 } |
| 234 } |
OLD | NEW |