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

Side by Side Diff: chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java

Issue 2929133003: Fix crashing TabPersistentStoreTest. (Closed)
Patch Set: Maybe now? Created 3 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.tabmodel; 5 package org.chromium.chrome.browser.tabmodel;
6 6
7 import android.app.Activity; 7 import android.app.Activity;
8 import android.content.SharedPreferences; 8 import android.content.SharedPreferences;
9 import android.os.AsyncTask; 9 import android.os.AsyncTask;
10 import android.support.test.InstrumentationRegistry;
10 import android.support.test.filters.SmallTest; 11 import android.support.test.filters.SmallTest;
11 import android.util.Pair; 12 import android.util.Pair;
12 import android.util.SparseArray; 13 import android.util.SparseArray;
13 14
15 import org.junit.After;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Rule;
19 import org.junit.Test;
20 import org.junit.runner.RunWith;
21
14 import org.chromium.base.ActivityState; 22 import org.chromium.base.ActivityState;
15 import org.chromium.base.ContextUtils; 23 import org.chromium.base.ContextUtils;
16 import org.chromium.base.ThreadUtils; 24 import org.chromium.base.ThreadUtils;
25 import org.chromium.base.test.BaseJUnit4ClassRunner;
17 import org.chromium.base.test.util.AdvancedMockContext; 26 import org.chromium.base.test.util.AdvancedMockContext;
18 import org.chromium.base.test.util.CallbackHelper; 27 import org.chromium.base.test.util.CallbackHelper;
19 import org.chromium.base.test.util.Feature; 28 import org.chromium.base.test.util.Feature;
20 import org.chromium.base.test.util.MinAndroidSdkLevel; 29 import org.chromium.base.test.util.MinAndroidSdkLevel;
21 import org.chromium.base.test.util.RetryOnFailure; 30 import org.chromium.base.test.util.RetryOnFailure;
22 import org.chromium.chrome.browser.ChromeActivity; 31 import org.chromium.chrome.browser.ChromeActivity;
23 import org.chromium.chrome.browser.TabState; 32 import org.chromium.chrome.browser.TabState;
24 import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper; 33 import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelper;
25 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; 34 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
26 import org.chromium.chrome.browser.snackbar.undo.UndoBarController; 35 import org.chromium.chrome.browser.snackbar.undo.UndoBarController;
27 import org.chromium.chrome.browser.tab.Tab; 36 import org.chromium.chrome.browser.tab.Tab;
28 import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; 37 import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator;
29 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; 38 import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
30 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; 39 import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
31 import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStor eObserver; 40 import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStor eObserver;
32 import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabModelMetaDa taInfo; 41 import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabModelMetaDa taInfo;
42 import org.chromium.chrome.browser.test.ChromeBrowserTestRule;
33 import org.chromium.chrome.browser.widget.OverviewListLayout; 43 import org.chromium.chrome.browser.widget.OverviewListLayout;
34 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; 44 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
35 import org.chromium.content.browser.test.NativeLibraryTestBase;
36 import org.chromium.content_public.browser.LoadUrlParams; 45 import org.chromium.content_public.browser.LoadUrlParams;
37 import org.chromium.content_public.browser.WebContents; 46 import org.chromium.content_public.browser.WebContents;
38 47
39 import java.util.ArrayList; 48 import java.util.ArrayList;
40 import java.util.List; 49 import java.util.List;
41 import java.util.concurrent.Callable; 50 import java.util.concurrent.Callable;
42 51
43 /** Tests for the TabPersistentStore. */ 52 /** Tests for the TabPersistentStore. */
44 public class TabPersistentStoreTest extends NativeLibraryTestBase { 53 @RunWith(BaseJUnit4ClassRunner.class)
54 public class TabPersistentStoreTest {
55 @Rule
56 public final ChromeBrowserTestRule mBrowserTestRule =
57 new ChromeBrowserTestRule(true /* initBrowserProcess */);
58
59 private ChromeActivity mChromeActivity;
60
45 private static final int SELECTOR_INDEX = 0; 61 private static final int SELECTOR_INDEX = 0;
46 62
47 private static class TabRestoredDetails { 63 private static class TabRestoredDetails {
48 public int index; 64 public int index;
49 public int id; 65 public int id;
50 public String url; 66 public String url;
51 public boolean isStandardActiveIndex; 67 public boolean isStandardActiveIndex;
52 public boolean isIncognitoActiveIndex; 68 public boolean isIncognitoActiveIndex;
53 69
54 /** Store information about a Tab that's been restored. */ 70 /** Store information about a Tab that's been restored. */
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 public void onStateMerged() { 258 public void onStateMerged() {
243 stateMergedCallback.notifyCalled(); 259 stateMergedCallback.notifyCalled();
244 } 260 }
245 261
246 @Override 262 @Override
247 public void onMetadataSavedAsynchronously() { 263 public void onMetadataSavedAsynchronously() {
248 listWrittenCallback.notifyCalled(); 264 listWrittenCallback.notifyCalled();
249 } 265 }
250 } 266 }
251 267
252 private final ChromeActivity mFakeChromeActivity = new ChromeActivity() {
253 @Override
254 protected boolean handleBackPressed() {
255 return false;
256 }
257
258 @Override
259 protected Pair<? extends TabCreator, ? extends TabCreator> createTabCrea tors() {
260 return null;
261 }
262
263 @Override
264 protected TabModelSelector createTabModelSelector() {
265 return null;
266 }
267
268 @Override
269 protected ChromeFullscreenManager createFullscreenManager() {
270 return null;
271 }
272 };
273
274 private final TabWindowManager.TabModelSelectorFactory mMockTabModelSelector Factory = 268 private final TabWindowManager.TabModelSelectorFactory mMockTabModelSelector Factory =
275 new TabWindowManager.TabModelSelectorFactory() { 269 new TabWindowManager.TabModelSelectorFactory() {
276 @Override 270 @Override
277 public TabModelSelector buildSelector(Activity activity, 271 public TabModelSelector buildSelector(Activity activity,
278 TabCreatorManager tabCreatorManager, int selectorIndex) { 272 TabCreatorManager tabCreatorManager, int selectorIndex) {
279 try { 273 try {
280 return new TestTabModelSelector(); 274 return new TestTabModelSelector();
281 } catch (Exception e) { 275 } catch (Exception e) {
282 throw new RuntimeException(e); 276 throw new RuntimeException(e);
283 } 277 }
284 } 278 }
285 }; 279 };
286 280
287 /** Class for mocking out the directory containing all of the TabState files . */ 281 /** Class for mocking out the directory containing all of the TabState files . */
288 private TestTabModelDirectory mMockDirectory; 282 private TestTabModelDirectory mMockDirectory;
289 private AdvancedMockContext mAppContext; 283 private AdvancedMockContext mAppContext;
290 private SharedPreferences mPreferences; 284 private SharedPreferences mPreferences;
291 285
292 @Override 286 @Before
293 public void setUp() throws Exception { 287 public void setUp() throws Exception {
294 super.setUp(); 288 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
295 loadNativeLibraryAndInitBrowserProcess(); 289 @Override
290 public void run() {
291 mChromeActivity = new ChromeActivity() {
292 @Override
293 protected boolean handleBackPressed() {
294 return false;
295 }
296
297 @Override
298 protected Pair<? extends TabCreator, ? extends TabCreator> c reateTabCreators() {
299 return null;
300 }
301
302 @Override
303 protected TabModelSelector createTabModelSelector() {
304 return null;
305 }
306
307 @Override
308 protected ChromeFullscreenManager createFullscreenManager() {
309 return null;
310 }
311 };
312 }
313 });
314
296 // Using an AdvancedMockContext allows us to use a fresh in-memory Share dPreference. 315 // Using an AdvancedMockContext allows us to use a fresh in-memory Share dPreference.
297 mAppContext = new AdvancedMockContext( 316 mAppContext = new AdvancedMockContext(InstrumentationRegistry.getInstrum entation()
298 getInstrumentation().getTargetContext().getApplicationContext()) ; 317 .getTargetContext()
318 .getApplicationContext());
299 ContextUtils.initApplicationContextForTests(mAppContext); 319 ContextUtils.initApplicationContextForTests(mAppContext);
300 mPreferences = ContextUtils.getAppSharedPreferences(); 320 mPreferences = ContextUtils.getAppSharedPreferences();
301 mMockDirectory = new TestTabModelDirectory( 321 mMockDirectory = new TestTabModelDirectory(
302 mAppContext, "TabPersistentStoreTest", Integer.toString(SELECTOR _INDEX)); 322 mAppContext, "TabPersistentStoreTest", Integer.toString(SELECTOR _INDEX));
303 TabPersistentStore.setBaseStateDirectoryForTests(mMockDirectory.getBaseD irectory()); 323 TabPersistentStore.setBaseStateDirectoryForTests(mMockDirectory.getBaseD irectory());
304 } 324 }
305 325
306 @Override 326 @After
307 public void tearDown() throws Exception { 327 public void tearDown() throws Exception {
308 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 328 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
309 @Override 329 @Override
310 public void run() { 330 public void run() {
311 TabWindowManager.getInstance().onActivityStateChange( 331 TabWindowManager.getInstance().onActivityStateChange(
312 mFakeChromeActivity, ActivityState.DESTROYED); 332 mChromeActivity, ActivityState.DESTROYED);
313 } 333 }
314 }); 334 });
315 mMockDirectory.tearDown(); 335 mMockDirectory.tearDown();
316 super.tearDown();
317 } 336 }
318 337
319 private TabPersistentStore buildTabPersistentStore(final TabPersistencePolic y persistencePolicy, 338 private TabPersistentStore buildTabPersistentStore(final TabPersistencePolic y persistencePolicy,
320 final TabModelSelector modelSelector, final TabCreatorManager creato rManager, 339 final TabModelSelector modelSelector, final TabCreatorManager creato rManager,
321 final TabPersistentStoreObserver observer) { 340 final TabPersistentStoreObserver observer) {
322 return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<TabPers istentStore>() { 341 return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<TabPers istentStore>() {
323 @Override 342 @Override
324 public TabPersistentStore call() throws Exception { 343 public TabPersistentStore call() throws Exception {
325 return new TabPersistentStore(persistencePolicy, modelSelector, creatorManager, 344 return new TabPersistentStore(persistencePolicy, modelSelector, creatorManager,
326 observer); 345 observer);
327 } 346 }
328 }); 347 });
329 } 348 }
330 349
350 @Test
331 @SmallTest 351 @SmallTest
332 @Feature({"TabPersistentStore"}) 352 @Feature("TabPersistentStore")
333 public void testBasic() throws Exception { 353 public void testBasic() throws Exception {
334 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4; 354 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4;
335 int numExpectedTabs = info.contents.length; 355 int numExpectedTabs = info.contents.length;
336 356
337 mMockDirectory.writeTabModelFiles(info, true); 357 mMockDirectory.writeTabModelFiles(info, true);
338 358
339 // Set up the TabPersistentStore. 359 // Set up the TabPersistentStore.
340 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ; 360 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ;
341 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or); 361 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or);
342 MockTabCreator regularCreator = mockManager.getTabCreator(false); 362 MockTabCreator regularCreator = mockManager.getTabCreator(false);
343 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer(); 363 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer();
344 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false); 364 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false);
345 TabPersistentStore store = buildTabPersistentStore( 365 final TabPersistentStore store =
346 persistencePolicy, mockSelector, mockManager, mockObserver); 366 buildTabPersistentStore(persistencePolicy, mockSelector, mockMan ager, mockObserver);
347 367
348 // Should not prefetch with no prior active tab preference stored. 368 // Should not prefetch with no prior active tab preference stored.
349 assertNull(store.mPrefetchActiveTabTask); 369 Assert.assertNull(store.mPrefetchActiveTabTask);
350 370
351 // Make sure the metadata file loads properly and in order. 371 // Make sure the metadata file loads properly and in order.
352 store.loadState(false /* ignoreIncognitoFiles */); 372 store.loadState(false /* ignoreIncognitoFiles */);
353 mockObserver.initializedCallback.waitForCallback(0, 1); 373 mockObserver.initializedCallback.waitForCallback(0, 1);
354 assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); 374 Assert.assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup);
355 375
356 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); 376 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs);
357 assertEquals(numExpectedTabs, mockObserver.details.size()); 377 Assert.assertEquals(numExpectedTabs, mockObserver.details.size());
358 for (int i = 0; i < numExpectedTabs; i++) { 378 for (int i = 0; i < numExpectedTabs; i++) {
359 TabRestoredDetails details = mockObserver.details.get(i); 379 TabRestoredDetails details = mockObserver.details.get(i);
360 assertEquals(i, details.index); 380 Assert.assertEquals(i, details.index);
361 assertEquals(info.contents[i].tabId, details.id); 381 Assert.assertEquals(info.contents[i].tabId, details.id);
362 assertEquals(info.contents[i].url, details.url); 382 Assert.assertEquals(info.contents[i].url, details.url);
363 assertEquals(details.id == info.selectedTabId, details.isStandardAct iveIndex); 383 Assert.assertEquals(details.id == info.selectedTabId, details.isStan dardActiveIndex);
364 assertEquals(false, details.isIncognitoActiveIndex); 384 Assert.assertEquals(false, details.isIncognitoActiveIndex);
365 } 385 }
366 386
367 // Restore the TabStates. The first Tab added should be the most recent ly selected tab. 387 // Restore the TabStates. The first Tab added should be the most recent ly selected tab.
368 store.restoreTabs(true); 388 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
389 @Override
390 public void run() {
391 store.restoreTabs(true);
392 }
393 });
369 regularCreator.callback.waitForCallback(0, 1); 394 regularCreator.callback.waitForCallback(0, 1);
370 assertEquals(info.selectedTabId, regularCreator.idOfFirstCreatedTab); 395 Assert.assertEquals(info.selectedTabId, regularCreator.idOfFirstCreatedT ab);
371 396
372 // Confirm that all the TabStates were read from storage (i.e. non-null) . 397 // Confirm that all the TabStates were read from storage (i.e. non-null) .
373 mockObserver.stateLoadedCallback.waitForCallback(0, 1); 398 mockObserver.stateLoadedCallback.waitForCallback(0, 1);
374 for (int i = 0; i < info.contents.length; i++) { 399 for (int i = 0; i < info.contents.length; i++) {
375 int tabId = info.contents[i].tabId; 400 int tabId = info.contents[i].tabId;
376 assertNotNull(regularCreator.created.get(tabId)); 401 Assert.assertNotNull(regularCreator.created.get(tabId));
377 } 402 }
378 } 403 }
379 404
405 @Test
380 @SmallTest 406 @SmallTest
381 @Feature({"TabPersistentStore"}) 407 @Feature({"TabPersistentStore"})
382 public void testInterruptedButStillRestoresAllTabs() throws Exception { 408 public void testInterruptedButStillRestoresAllTabs() throws Exception {
383 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4; 409 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V4;
384 int numExpectedTabs = info.contents.length; 410 int numExpectedTabs = info.contents.length;
385 411
386 mMockDirectory.writeTabModelFiles(info, true); 412 mMockDirectory.writeTabModelFiles(info, true);
387 413
388 // Load up one TabPersistentStore, but don't load up the TabState files. This prevents the 414 // Load up one TabPersistentStore, but don't load up the TabState files. This prevents the
389 // Tabs from being added to the TabModel. 415 // Tabs from being added to the TabModel.
390 MockTabModelSelector firstSelector = new MockTabModelSelector(0, 0, null ); 416 MockTabModelSelector firstSelector = new MockTabModelSelector(0, 0, null );
391 MockTabCreatorManager firstManager = new MockTabCreatorManager(firstSele ctor); 417 MockTabCreatorManager firstManager = new MockTabCreatorManager(firstSele ctor);
392 MockTabPersistentStoreObserver firstObserver = new MockTabPersistentStor eObserver(); 418 MockTabPersistentStoreObserver firstObserver = new MockTabPersistentStor eObserver();
393 TabPersistencePolicy firstPersistencePolicy = new TabbedModeTabPersisten cePolicy(0, false); 419 TabPersistencePolicy firstPersistencePolicy = new TabbedModeTabPersisten cePolicy(0, false);
394 final TabPersistentStore firstStore = buildTabPersistentStore( 420 final TabPersistentStore firstStore = buildTabPersistentStore(
395 firstPersistencePolicy, firstSelector, firstManager, firstObserv er); 421 firstPersistencePolicy, firstSelector, firstManager, firstObserv er);
396 firstStore.loadState(false /* ignoreIncognitoFiles */); 422 firstStore.loadState(false /* ignoreIncognitoFiles */);
397 firstObserver.initializedCallback.waitForCallback(0, 1); 423 firstObserver.initializedCallback.waitForCallback(0, 1);
398 assertEquals(numExpectedTabs, firstObserver.mTabCountAtStartup); 424 Assert.assertEquals(numExpectedTabs, firstObserver.mTabCountAtStartup);
399 firstObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); 425 firstObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs);
400 426
401 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 427 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
402 @Override 428 @Override
403 public void run() { 429 public void run() {
404 firstStore.saveState(); 430 firstStore.saveState();
405 } 431 }
406 }); 432 });
407 433
408 // Prepare a second TabPersistentStore. 434 // Prepare a second TabPersistentStore.
409 MockTabModelSelector secondSelector = new MockTabModelSelector(0, 0, nul l); 435 MockTabModelSelector secondSelector = new MockTabModelSelector(0, 0, nul l);
410 MockTabCreatorManager secondManager = new MockTabCreatorManager(secondSe lector); 436 MockTabCreatorManager secondManager = new MockTabCreatorManager(secondSe lector);
411 MockTabCreator secondCreator = secondManager.getTabCreator(false); 437 MockTabCreator secondCreator = secondManager.getTabCreator(false);
412 MockTabPersistentStoreObserver secondObserver = new MockTabPersistentSto reObserver(); 438 MockTabPersistentStoreObserver secondObserver = new MockTabPersistentSto reObserver();
413 TabPersistencePolicy secondPersistencePolicy = new TabbedModeTabPersiste ncePolicy(0, false); 439 TabPersistencePolicy secondPersistencePolicy = new TabbedModeTabPersiste ncePolicy(0, false);
414 440
415 TabPersistentStore secondStore = buildTabPersistentStore( 441 final TabPersistentStore secondStore = buildTabPersistentStore(
416 secondPersistencePolicy, secondSelector, secondManager, secondOb server); 442 secondPersistencePolicy, secondSelector, secondManager, secondOb server);
417 443
418 // The second TabPersistentStore reads the file written by the first Tab PersistentStore. 444 // The second TabPersistentStore reads the file written by the first Tab PersistentStore.
419 // Make sure that all of the Tabs appear in the new one -- even though t he new file was 445 // Make sure that all of the Tabs appear in the new one -- even though t he new file was
420 // written before the first TabPersistentStore loaded any TabState files and added them to 446 // written before the first TabPersistentStore loaded any TabState files and added them to
421 // the TabModels. 447 // the TabModels.
422 secondStore.loadState(false /* ignoreIncognitoFiles */); 448 secondStore.loadState(false /* ignoreIncognitoFiles */);
423 secondObserver.initializedCallback.waitForCallback(0, 1); 449 secondObserver.initializedCallback.waitForCallback(0, 1);
424 assertEquals(numExpectedTabs, secondObserver.mTabCountAtStartup); 450 Assert.assertEquals(numExpectedTabs, secondObserver.mTabCountAtStartup);
425 451
426 secondObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); 452 secondObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs);
427 assertEquals(numExpectedTabs, secondObserver.details.size()); 453 Assert.assertEquals(numExpectedTabs, secondObserver.details.size());
428 for (int i = 0; i < numExpectedTabs; i++) { 454 for (int i = 0; i < numExpectedTabs; i++) {
429 TabRestoredDetails details = secondObserver.details.get(i); 455 TabRestoredDetails details = secondObserver.details.get(i);
430 456
431 // Find the details for the current Tab ID. 457 // Find the details for the current Tab ID.
432 // TODO(dfalcantara): Revisit this bit when tab ordering is correctl y preserved. 458 // TODO(dfalcantara): Revisit this bit when tab ordering is correctl y preserved.
433 TestTabModelDirectory.TabStateInfo currentInfo = null; 459 TestTabModelDirectory.TabStateInfo currentInfo = null;
434 for (int j = 0; j < numExpectedTabs && currentInfo == null; j++) { 460 for (int j = 0; j < numExpectedTabs && currentInfo == null; j++) {
435 if (TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[j].tabI d == details.id) { 461 if (TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[j].tabI d == details.id) {
436 currentInfo = TestTabModelDirectory.TAB_MODEL_METADATA_V4.co ntents[j]; 462 currentInfo = TestTabModelDirectory.TAB_MODEL_METADATA_V4.co ntents[j];
437 } 463 }
438 } 464 }
439 465
440 // TODO(dfalcantara): This won't be properly set until we have tab o rdering preserved. 466 // TODO(dfalcantara): This won't be properly set until we have tab o rdering preserved.
441 // assertEquals(details.id == TestTabModelDirectory.TAB_MODEL_METADA TA_V4_SELECTED_ID, 467 // Assert.assertEquals(details.id ==
468 // TestTabModelDirectory.TAB_MODEL_METADATA_V4_SELECTED_ID,
442 // details.isStandardActiveIndex); 469 // details.isStandardActiveIndex);
443 470
444 assertEquals(currentInfo.url, details.url); 471 Assert.assertEquals(currentInfo.url, details.url);
445 assertEquals(false, details.isIncognitoActiveIndex); 472 Assert.assertEquals(false, details.isIncognitoActiveIndex);
446 } 473 }
447 474
448 // Restore all of the TabStates. Confirm that all the TabStates were re ad (i.e. non-null). 475 // Restore all of the TabStates. Confirm that all the TabStates were re ad (i.e. non-null).
449 secondStore.restoreTabs(true); 476 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
477 @Override
478 public void run() {
479 secondStore.restoreTabs(true);
480 }
481 });
482
450 secondObserver.stateLoadedCallback.waitForCallback(0, 1); 483 secondObserver.stateLoadedCallback.waitForCallback(0, 1);
451 for (int i = 0; i < numExpectedTabs; i++) { 484 for (int i = 0; i < numExpectedTabs; i++) {
452 int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i]. tabId; 485 int tabId = TestTabModelDirectory.TAB_MODEL_METADATA_V4.contents[i]. tabId;
453 assertNotNull(secondCreator.created.get(tabId)); 486 Assert.assertNotNull(secondCreator.created.get(tabId));
454 } 487 }
455 } 488 }
456 489
490 @Test
457 @SmallTest 491 @SmallTest
458 @Feature({"TabPersistentStore"}) 492 @Feature({"TabPersistentStore"})
459 public void testMissingTabStateButStillRestoresTab() throws Exception { 493 public void testMissingTabStateButStillRestoresTab() throws Exception {
460 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5; 494 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5;
461 int numExpectedTabs = info.contents.length; 495 int numExpectedTabs = info.contents.length;
462 496
463 // Write out info for all but the third tab (arbitrarily chosen). 497 // Write out info for all but the third tab (arbitrarily chosen).
464 mMockDirectory.writeTabModelFiles(info, false); 498 mMockDirectory.writeTabModelFiles(info, false);
465 for (int i = 0; i < info.contents.length; i++) { 499 for (int i = 0; i < info.contents.length; i++) {
466 if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]); 500 if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]);
467 } 501 }
468 502
469 // Initialize the classes. 503 // Initialize the classes.
470 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ; 504 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ;
471 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or); 505 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or);
472 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer(); 506 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer();
473 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false); 507 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false);
474 TabPersistentStore store = buildTabPersistentStore( 508 final TabPersistentStore store =
475 persistencePolicy, mockSelector, mockManager, mockObserver); 509 buildTabPersistentStore(persistencePolicy, mockSelector, mockMan ager, mockObserver);
476 510
477 // Make sure the metadata file loads properly and in order. 511 // Make sure the metadata file loads properly and in order.
478 store.loadState(false /* ignoreIncognitoFiles */); 512 store.loadState(false /* ignoreIncognitoFiles */);
479 mockObserver.initializedCallback.waitForCallback(0, 1); 513 mockObserver.initializedCallback.waitForCallback(0, 1);
480 assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); 514 Assert.assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup);
481 515
482 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); 516 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs);
483 assertEquals(numExpectedTabs, mockObserver.details.size()); 517 Assert.assertEquals(numExpectedTabs, mockObserver.details.size());
484 for (int i = 0; i < numExpectedTabs; i++) { 518 for (int i = 0; i < numExpectedTabs; i++) {
485 TabRestoredDetails details = mockObserver.details.get(i); 519 TabRestoredDetails details = mockObserver.details.get(i);
486 assertEquals(i, details.index); 520 Assert.assertEquals(i, details.index);
487 assertEquals(info.contents[i].tabId, details.id); 521 Assert.assertEquals(info.contents[i].tabId, details.id);
488 assertEquals(info.contents[i].url, details.url); 522 Assert.assertEquals(info.contents[i].url, details.url);
489 assertEquals(details.id == info.selectedTabId, details.isStandardAct iveIndex); 523 Assert.assertEquals(details.id == info.selectedTabId, details.isStan dardActiveIndex);
490 assertEquals(false, details.isIncognitoActiveIndex); 524 Assert.assertEquals(false, details.isIncognitoActiveIndex);
491 } 525 }
492 526
493 // Restore the TabStates, and confirm that the correct number of tabs is created even with 527 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
494 // one missing. 528 @Override
495 store.restoreTabs(true); 529 public void run() {
530 // Restore the TabStates, and confirm that the correct number of tabs is created
531 // even with one missing.
532 store.restoreTabs(true);
533 }
534 });
496 mockObserver.stateLoadedCallback.waitForCallback(0, 1); 535 mockObserver.stateLoadedCallback.waitForCallback(0, 1);
497 assertEquals(numExpectedTabs, mockSelector.getModel(false).getCount()); 536 Assert.assertEquals(numExpectedTabs, mockSelector.getModel(false).getCou nt());
498 assertEquals(0, mockSelector.getModel(true).getCount()); 537 Assert.assertEquals(0, mockSelector.getModel(true).getCount());
499 } 538 }
500 539
540 @Test
501 @SmallTest 541 @SmallTest
502 @Feature({"TabPersistentStore"}) 542 @Feature({"TabPersistentStore"})
503 public void testRestoresTabWithMissingTabStateWhileIgnoringIncognitoTab() th rows Exception { 543 public void testRestoresTabWithMissingTabStateWhileIgnoringIncognitoTab() th rows Exception {
504 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_ WITH_INCOGNITO; 544 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_ WITH_INCOGNITO;
505 int numExpectedTabs = info.contents.length; 545 int numExpectedTabs = info.contents.length;
506 546
507 // Write out info for all but the third tab (arbitrarily chosen). 547 // Write out info for all but the third tab (arbitrarily chosen).
508 mMockDirectory.writeTabModelFiles(info, false); 548 mMockDirectory.writeTabModelFiles(info, false);
509 for (int i = 0; i < info.contents.length; i++) { 549 for (int i = 0; i < info.contents.length; i++) {
510 if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]); 550 if (i != 2) mMockDirectory.writeTabStateFile(info.contents[i]);
511 } 551 }
512 552
513 // Initialize the classes. 553 // Initialize the classes.
514 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ; 554 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ;
515 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or); 555 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or);
516 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer(); 556 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer();
517 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false); 557 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false);
518 TabPersistentStore store = buildTabPersistentStore( 558 final TabPersistentStore store =
519 persistencePolicy, mockSelector, mockManager, mockObserver); 559 buildTabPersistentStore(persistencePolicy, mockSelector, mockMan ager, mockObserver);
520 560
521 // Load the TabModel metadata. 561 // Load the TabModel metadata.
522 store.loadState(false /* ignoreIncognitoFiles */); 562 store.loadState(false /* ignoreIncognitoFiles */);
523 mockObserver.initializedCallback.waitForCallback(0, 1); 563 mockObserver.initializedCallback.waitForCallback(0, 1);
524 assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); 564 Assert.assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup);
525 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); 565 mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs);
526 assertEquals(numExpectedTabs, mockObserver.details.size()); 566 Assert.assertEquals(numExpectedTabs, mockObserver.details.size());
527 567
528 // TODO(dfalcantara): Expand MockTabModel* to support Incognito Tab decr yption. 568 // TODO(dfalcantara): Expand MockTabModel* to support Incognito Tab decr yption.
529 569
530 // Restore the TabStates, and confirm that the correct number of tabs is created even with 570 // Restore the TabStates, and confirm that the correct number of tabs is created even with
531 // one missing. No Incognito tabs should be created because the TabStat e is missing. 571 // one missing. No Incognito tabs should be created because the TabStat e is missing.
532 store.restoreTabs(true); 572 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
573 @Override
574 public void run() {
575 store.restoreTabs(true);
576 }
577 });
533 mockObserver.stateLoadedCallback.waitForCallback(0, 1); 578 mockObserver.stateLoadedCallback.waitForCallback(0, 1);
534 assertEquals(info.numRegularTabs, mockSelector.getModel(false).getCount( )); 579 Assert.assertEquals(info.numRegularTabs, mockSelector.getModel(false).ge tCount());
535 assertEquals(0, mockSelector.getModel(true).getCount()); 580 Assert.assertEquals(0, mockSelector.getModel(true).getCount());
536 } 581 }
537 582
583 @Test
538 @SmallTest 584 @SmallTest
539 @Feature({"TabPersistentStore"}) 585 @Feature({"TabPersistentStore"})
540 public void testPrefetchActiveTab() throws Exception { 586 public void testPrefetchActiveTab() throws Exception {
541 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18; 587 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18;
542 mMockDirectory.writeTabModelFiles(info, true); 588 mMockDirectory.writeTabModelFiles(info, true);
543 589
544 // Set to pre-fetch 590 // Set to pre-fetch
545 mPreferences.edit().putInt( 591 mPreferences.edit().putInt(
546 TabPersistentStore.PREF_ACTIVE_TAB_ID, info.selectedTabId).apply (); 592 TabPersistentStore.PREF_ACTIVE_TAB_ID, info.selectedTabId).apply ();
547 593
548 // Initialize the classes. 594 // Initialize the classes.
549 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ; 595 MockTabModelSelector mockSelector = new MockTabModelSelector(0, 0, null) ;
550 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or); 596 MockTabCreatorManager mockManager = new MockTabCreatorManager(mockSelect or);
551 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer(); 597 MockTabPersistentStoreObserver mockObserver = new MockTabPersistentStore Observer();
552 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false); 598 TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePol icy(0, false);
553 final TabPersistentStore store = buildTabPersistentStore( 599 final TabPersistentStore store = buildTabPersistentStore(
554 persistencePolicy, mockSelector, mockManager, mockObserver); 600 persistencePolicy, mockSelector, mockManager, mockObserver);
555 store.waitForMigrationToFinish(); 601 store.waitForMigrationToFinish();
556 602
557 assertNotNull(store.mPrefetchActiveTabTask); 603 Assert.assertNotNull(store.mPrefetchActiveTabTask);
558 604
559 store.loadState(false /* ignoreIncognitoFiles */); 605 store.loadState(false /* ignoreIncognitoFiles */);
560 store.restoreTabs(true); 606 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
607 @Override
608 public void run() {
609 store.restoreTabs(true);
610 }
611 });
561 612
562 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 613 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
563 @Override 614 @Override
564 public void run() { 615 public void run() {
565 // Confirm that the pre-fetched active tab state was used, must be done here on the 616 // Confirm that the pre-fetched active tab state was used, must be done here on the
566 // UI thread as the message to finish the task is posted here. 617 // UI thread as the message to finish the task is posted here.
567 assertEquals(AsyncTask.Status.FINISHED, store.mPrefetchActiveTab Task.getStatus()); 618 Assert.assertEquals(
619 AsyncTask.Status.FINISHED, store.mPrefetchActiveTabTask. getStatus());
568 620
569 // Confirm that the correct active tab ID is updated when saving state. 621 // Confirm that the correct active tab ID is updated when saving state.
570 mPreferences.edit().putInt(TabPersistentStore.PREF_ACTIVE_TAB_ID , -1).apply(); 622 mPreferences.edit().putInt(TabPersistentStore.PREF_ACTIVE_TAB_ID , -1).apply();
623
571 store.saveState(); 624 store.saveState();
572 assertEquals(info.selectedTabId,
573 mPreferences.getInt(TabPersistentStore.PREF_ACTIVE_TAB_I D, -1));
574 } 625 }
575 }); 626 });
627
628 Assert.assertEquals(
629 info.selectedTabId, mPreferences.getInt(TabPersistentStore.PREF_ ACTIVE_TAB_ID, -1));
576 } 630 }
577 631
578 /** 632 /**
579 * Tests that a real {@link TabModelImpl} will use the {@link TabPersistentS tore} to write out 633 * Tests that a real {@link TabModelImpl} will use the {@link TabPersistentS tore} to write out
580 * an updated metadata file when a closure is undone. 634 * an updated metadata file when a closure is undone.
581 */ 635 */
636 @Test
582 @SmallTest 637 @SmallTest
583 @Feature({"TabPersistentStore"}) 638 @Feature({"TabPersistentStore"})
584 public void testUndoSingleTabClosureWritesTabListFile() throws Exception { 639 public void testUndoSingleTabClosureWritesTabListFile() throws Exception {
585 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_ NO_M18; 640 TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_ NO_M18;
586 mMockDirectory.writeTabModelFiles(info, true); 641 mMockDirectory.writeTabModelFiles(info, true);
587 642
588 // Start closing one tab, then undo it. Make sure the tab list metadata is saved out. 643 // Start closing one tab, then undo it. Make sure the tab list metadata is saved out.
589 TestTabModelSelector selector = createAndRestoreRealTabModelImpls(info); 644 TestTabModelSelector selector = createAndRestoreRealTabModelImpls(info);
590 MockTabPersistentStoreObserver mockObserver = selector.mTabPersistentSto reObserver; 645 MockTabPersistentStoreObserver mockObserver = selector.mTabPersistentSto reObserver;
591 final TabModel regularModel = selector.getModel(false); 646 final TabModel regularModel = selector.getModel(false);
592 int currentWrittenCallbackCount = mockObserver.listWrittenCallback.getCa llCount(); 647 int currentWrittenCallbackCount = mockObserver.listWrittenCallback.getCa llCount();
593 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 648 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
594 @Override 649 @Override
595 public void run() { 650 public void run() {
596 Tab tabToClose = regularModel.getTabAt(2); 651 Tab tabToClose = regularModel.getTabAt(2);
597 regularModel.closeTab(tabToClose, false, false, true); 652 regularModel.closeTab(tabToClose, false, false, true);
598 regularModel.cancelTabClosure(tabToClose.getId()); 653 regularModel.cancelTabClosure(tabToClose.getId());
599 } 654 }
600 }); 655 });
601 mockObserver.listWrittenCallback.waitForCallback(currentWrittenCallbackC ount, 1); 656 mockObserver.listWrittenCallback.waitForCallback(currentWrittenCallbackC ount, 1);
602 } 657 }
603 658
604 /** 659 /**
605 * Tests that a real {@link TabModelImpl} will use the {@link TabPersistentS tore} to write out 660 * Tests that a real {@link TabModelImpl} will use the {@link TabPersistentS tore} to write out
606 * valid a valid metadata file and the TabModel's associated TabStates after closing and 661 * valid a valid metadata file and the TabModel's associated TabStates after closing and
607 * canceling the closure of all the tabs simultaneously. 662 * canceling the closure of all the tabs simultaneously.
608 */ 663 */
664 @Test
609 @SmallTest 665 @SmallTest
610 @Feature({"TabPersistentStore"}) 666 @Feature({"TabPersistentStore"})
611 @RetryOnFailure 667 @RetryOnFailure
612 public void testUndoCloseAllTabsWritesTabListFile() throws Exception { 668 public void testUndoCloseAllTabsWritesTabListFile() throws Exception {
613 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18; 669 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18;
614 mMockDirectory.writeTabModelFiles(info, true); 670 mMockDirectory.writeTabModelFiles(info, true);
615 671
616 for (int i = 0; i < 2; i++) { 672 for (int i = 0; i < 2; i++) {
617 final TestTabModelSelector selector = createAndRestoreRealTabModelIm pls(info); 673 final TestTabModelSelector selector = createAndRestoreRealTabModelIm pls(info);
618 674
619 // Undoing tab closures one-by-one results in the first tab always b eing selected after 675 // Undoing tab closures one-by-one results in the first tab always b eing selected after
620 // the initial restoration. 676 // the initial restoration.
621 if (i == 0) { 677 if (i == 0) {
622 assertEquals(info.selectedTabId, selector.getCurrentTab().getId( )); 678 Assert.assertEquals(info.selectedTabId, selector.getCurrentTab() .getId());
623 } else { 679 } else {
624 assertEquals(info.contents[0].tabId, selector.getCurrentTab().ge tId()); 680 Assert.assertEquals(info.contents[0].tabId, selector.getCurrentT ab().getId());
625 } 681 }
626 682
627 ThreadUtils.runOnUiThreadBlocking(new Runnable() { 683 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
628 @Override 684 @Override
629 public void run() { 685 public void run() {
630 closeAllTabsThenUndo(selector, info); 686 closeAllTabsThenUndo(selector, info);
631 687
632 // Synchronously save the data out to simulate minimizing Ch rome. 688 // Synchronously save the data out to simulate minimizing Ch rome.
633 selector.mTabPersistentStore.saveState(); 689 selector.mTabPersistentStore.saveState();
634 } 690 }
635 }); 691 });
636 692
637 // Load up each TabState and confirm that values are still correct. 693 // Load up each TabState and confirm that values are still correct.
638 for (int j = 0; j < info.numRegularTabs; j++) { 694 for (int j = 0; j < info.numRegularTabs; j++) {
639 TabState currentState = TabState.restoreTabState( 695 TabState currentState = TabState.restoreTabState(
640 mMockDirectory.getDataDirectory(), info.contents[j].tabI d); 696 mMockDirectory.getDataDirectory(), info.contents[j].tabI d);
641 assertEquals(info.contents[j].title, currentState.getDisplayTitl eFromState()); 697 Assert.assertEquals(
642 assertEquals(info.contents[j].url, currentState.getVirtualUrlFro mState()); 698 info.contents[j].title, currentState.getDisplayTitleFrom State());
699 Assert.assertEquals(info.contents[j].url, currentState.getVirtua lUrlFromState());
643 } 700 }
644 } 701 }
645 } 702 }
646 703
704 @Test
647 @SmallTest 705 @SmallTest
648 @Feature({"TabPersistentStore", "MultiWindow"}) 706 @Feature({"TabPersistentStore", "MultiWindow"})
649 @MinAndroidSdkLevel(24) 707 @MinAndroidSdkLevel(24)
650 public void testDuplicateTabIdsOnColdStart() throws Exception { 708 public void testDuplicateTabIdsOnColdStart() throws Exception {
651 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18; 709 final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADA TA_V5_NO_M18;
652 710
653 // Write the same data to tab_state0 and tab_state1. 711 // Write the same data to tab_state0 and tab_state1.
654 mMockDirectory.writeTabModelFiles(info, true, 0); 712 mMockDirectory.writeTabModelFiles(info, true, 0);
655 mMockDirectory.writeTabModelFiles(info, true, 1); 713 mMockDirectory.writeTabModelFiles(info, true, 1);
656 714
657 // This method will check that the correct number of tabs are created. 715 // This method will check that the correct number of tabs are created.
658 createAndRestoreRealTabModelImpls(info); 716 createAndRestoreRealTabModelImpls(info);
659 } 717 }
660 718
661 private TestTabModelSelector createAndRestoreRealTabModelImpls(TabModelMetaD ataInfo info) 719 private TestTabModelSelector createAndRestoreRealTabModelImpls(TabModelMetaD ataInfo info)
662 throws Exception { 720 throws Exception {
663 TestTabModelSelector selector = 721 TestTabModelSelector selector =
664 ThreadUtils.runOnUiThreadBlocking(new Callable<TestTabModelSelec tor>() { 722 ThreadUtils.runOnUiThreadBlocking(new Callable<TestTabModelSelec tor>() {
665 @Override 723 @Override
666 public TestTabModelSelector call() { 724 public TestTabModelSelector call() {
667 TabWindowManager tabWindowManager = TabWindowManager.get Instance(); 725 TabWindowManager tabWindowManager = TabWindowManager.get Instance();
668 tabWindowManager.setTabModelSelectorFactory(mMockTabMode lSelectorFactory); 726 tabWindowManager.setTabModelSelectorFactory(mMockTabMode lSelectorFactory);
669 // Clear any existing TestTabModelSelector (required whe n 727 // Clear any existing TestTabModelSelector (required whe n
670 // createAndRestoreRealTabModelImpls is called multiple times in one test). 728 // createAndRestoreRealTabModelImpls is called multiple times in one test).
671 tabWindowManager.onActivityStateChange( 729 tabWindowManager.onActivityStateChange(
672 mFakeChromeActivity, ActivityState.DESTROYED); 730 mChromeActivity, ActivityState.DESTROYED);
673 return (TestTabModelSelector) tabWindowManager.requestSe lector( 731 return (TestTabModelSelector) tabWindowManager.requestSe lector(
674 mFakeChromeActivity, mFakeChromeActivity, 0); 732 mChromeActivity, mChromeActivity, 0);
675 } 733 }
676 }); 734 });
677 735
678 TabPersistentStore store = selector.mTabPersistentStore; 736 final TabPersistentStore store = selector.mTabPersistentStore;
679 MockTabPersistentStoreObserver mockObserver = selector.mTabPersistentSto reObserver; 737 MockTabPersistentStoreObserver mockObserver = selector.mTabPersistentSto reObserver;
680 738
681 // Load up the TabModel metadata. 739 // Load up the TabModel metadata.
682 int numExpectedTabs = info.numRegularTabs + info.numIncognitoTabs; 740 int numExpectedTabs = info.numRegularTabs + info.numIncognitoTabs;
683 store.loadState(false /* ignoreIncognitoFiles */); 741 store.loadState(false /* ignoreIncognitoFiles */);
684 mockObserver.initializedCallback.waitForCallback(0, 1); 742 mockObserver.initializedCallback.waitForCallback(0, 1);
685 assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); 743 Assert.assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup);
686 mockObserver.detailsReadCallback.waitForCallback(0, info.contents.length ); 744 mockObserver.detailsReadCallback.waitForCallback(0, info.contents.length );
687 assertEquals(numExpectedTabs, mockObserver.details.size()); 745 Assert.assertEquals(numExpectedTabs, mockObserver.details.size());
688 746
689 // Restore the TabStates, check that things were restored correctly, in the right tab order. 747 // Restore the TabStates, check that things were restored correctly, in the right tab order.
690 store.restoreTabs(true); 748 ThreadUtils.runOnUiThreadBlocking(new Runnable() {
749 @Override
750 public void run() {
751 store.restoreTabs(true);
752 }
753 });
691 mockObserver.stateLoadedCallback.waitForCallback(0, 1); 754 mockObserver.stateLoadedCallback.waitForCallback(0, 1);
692 assertEquals(info.numRegularTabs, selector.getModel(false).getCount()); 755 Assert.assertEquals(info.numRegularTabs, selector.getModel(false).getCou nt());
693 assertEquals(info.numIncognitoTabs, selector.getModel(true).getCount()); 756 Assert.assertEquals(info.numIncognitoTabs, selector.getModel(true).getCo unt());
694 for (int i = 0; i < numExpectedTabs; i++) { 757 for (int i = 0; i < numExpectedTabs; i++) {
695 assertEquals(info.contents[i].tabId, selector.getModel(false).getTab At(i).getId()); 758 Assert.assertEquals(
759 info.contents[i].tabId, selector.getModel(false).getTabAt(i) .getId());
696 } 760 }
697 761
698 return selector; 762 return selector;
699 } 763 }
700 764
701 /** 765 /**
702 * Close all Tabs in the regular TabModel, then undo the operation to restor e the Tabs. 766 * Close all Tabs in the regular TabModel, then undo the operation to restor e the Tabs.
703 * This simulates how {@link StripLayoutHelper} and {@link UndoBarController } would close 767 * This simulates how {@link StripLayoutHelper} and {@link UndoBarController } would close
704 * all of a {@link TabModel}'s tabs on tablets, which is different from how the 768 * all of a {@link TabModel}'s tabs on tablets, which is different from how the
705 * {@link OverviewListLayout} would do it on phones. 769 * {@link OverviewListLayout} would do it on phones.
706 */ 770 */
707 private void closeAllTabsThenUndo(TabModelSelector selector, TabModelMetaDat aInfo info) { 771 private void closeAllTabsThenUndo(TabModelSelector selector, TabModelMetaDat aInfo info) {
708 // Close all the tabs, using an Observer to determine what is actually b eing closed. 772 // Close all the tabs, using an Observer to determine what is actually b eing closed.
709 TabModel regularModel = selector.getModel(false); 773 TabModel regularModel = selector.getModel(false);
710 final List<Integer> closedTabIds = new ArrayList<>(); 774 final List<Integer> closedTabIds = new ArrayList<>();
711 TabModelObserver closeObserver = new EmptyTabModelObserver() { 775 TabModelObserver closeObserver = new EmptyTabModelObserver() {
712 @Override 776 @Override
713 public void allTabsPendingClosure(List<Tab> tabs) { 777 public void allTabsPendingClosure(List<Tab> tabs) {
714 for (Tab tab : tabs) closedTabIds.add(tab.getId()); 778 for (Tab tab : tabs) closedTabIds.add(tab.getId());
715 } 779 }
716 }; 780 };
717 regularModel.addObserver(closeObserver); 781 regularModel.addObserver(closeObserver);
718 regularModel.closeAllTabs(false, false); 782 regularModel.closeAllTabs(false, false);
719 assertEquals(info.numRegularTabs, closedTabIds.size()); 783 Assert.assertEquals(info.numRegularTabs, closedTabIds.size());
720 784
721 // Cancel closing each tab. 785 // Cancel closing each tab.
722 for (Integer id : closedTabIds) regularModel.cancelTabClosure(id); 786 for (Integer id : closedTabIds) regularModel.cancelTabClosure(id);
723 assertEquals(info.numRegularTabs, regularModel.getCount()); 787 Assert.assertEquals(info.numRegularTabs, regularModel.getCount());
724 } 788 }
725 } 789 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698