Commit b888c915 authored by Brandon Wylie's avatar Brandon Wylie Committed by Commit Bot

Add unittests for activity attachment changes in TabModelSelectorImpl

Bug: 1066256
Change-Id: I0f8233fd451fd39fea60d07d4e9e8a3e5e311511
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2148122
Commit-Queue: Brandon Wylie <wylieb@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#759512}
parent 555fd40a
......@@ -216,6 +216,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelperTest.java",
"junit/src/org/chromium/chrome/browser/tab/TabUnitTest.java",
"junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java",
"junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImplTest.java",
"junit/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorProfileSupplierTest.java",
"junit/src/org/chromium/chrome/browser/tabstate/TabStateUnitTest.java",
"junit/src/org/chromium/chrome/browser/tasks/EngagementTimeUtilTest.java",
......
......@@ -121,7 +121,6 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
*/
public void onNativeLibraryReady(TabContentManager tabContentProvider) {
assert mTabContentManager == null : "onNativeLibraryReady called twice!";
mTabContentManager = tabContentProvider;
ChromeTabCreator regularTabCreator =
(ChromeTabCreator) getTabCreatorManager().getTabCreator(false);
......@@ -133,9 +132,16 @@ public class TabModelSelectorImpl extends TabModelSelectorBase implements TabMod
TabModel incognitoModel = new IncognitoTabModel(new IncognitoTabModelImplCreator(
regularTabCreator, incognitoTabCreator, mUma, mOrderController,
mTabContentManager, mTabSaver, this));
initialize(normalModel, incognitoModel);
regularTabCreator.setTabModel(normalModel, mOrderController);
incognitoTabCreator.setTabModel(incognitoModel, mOrderController);
onNativeLibraryReadyInternal(tabContentProvider, normalModel, incognitoModel);
}
@VisibleForTesting
void onNativeLibraryReadyInternal(
TabContentManager tabContentProvider, TabModel normalModel, TabModel incognitoModel) {
mTabContentManager = tabContentProvider;
initialize(normalModel, incognitoModel);
mTabSaver.setTabContentManager(mTabContentManager);
addObserver(new EmptyTabModelSelectorObserver() {
......
......@@ -8,7 +8,6 @@ import android.app.Activity;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.util.Pair;
import android.util.SparseArray;
import org.junit.After;
import org.junit.Assert;
......@@ -34,21 +33,17 @@ import org.chromium.chrome.browser.flags.ActivityType;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tab.TabTestUtils;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabModelSelectorMetadata;
import org.chromium.chrome.browser.tabmodel.TabPersistentStore.TabPersistentStoreObserver;
import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory.TabModelMetaDataInfo;
import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabCreator;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabCreatorManager;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.util.ArrayList;
......@@ -83,87 +78,6 @@ public class TabPersistentStoreTest {
}
}
private static class MockTabCreator extends TabCreator {
public final SparseArray<TabState> created;
public final CallbackHelper callback;
private final boolean mIsIncognito;
private final TabModelSelector mSelector;
public int idOfFirstCreatedTab = Tab.INVALID_TAB_ID;
public MockTabCreator(boolean incognito, TabModelSelector selector) {
created = new SparseArray<>();
callback = new CallbackHelper();
mIsIncognito = incognito;
mSelector = selector;
}
@Override
public boolean createsTabsAsynchronously() {
return false;
}
@Override
public Tab createNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent) {
Tab tab = new MockTab(0, mIsIncognito, TabLaunchType.FROM_LINK);
mSelector.getModel(mIsIncognito)
.addTab(tab, TabModel.INVALID_TAB_INDEX, type,
TabCreationState.LIVE_IN_FOREGROUND);
storeTabInfo(null, tab.getId());
return tab;
}
@Override
public Tab createFrozenTab(TabState state, int id, int index) {
Tab tab = new MockTab(id, state.isIncognito(), TabLaunchType.FROM_RESTORE);
TabTestUtils.restoreFieldsFromState(tab, state);
mSelector.getModel(mIsIncognito)
.addTab(tab, index, TabLaunchType.FROM_RESTORE,
TabCreationState.FROZEN_ON_RESTORE);
storeTabInfo(state, id);
return tab;
}
@Override
public boolean createTabWithWebContents(
Tab parent, WebContents webContents, @TabLaunchType int type, String url) {
return false;
}
@Override
public Tab launchUrl(String url, @TabLaunchType int type) {
return null;
}
private void storeTabInfo(TabState state, int id) {
if (created.size() == 0) idOfFirstCreatedTab = id;
created.put(id, state);
callback.notifyCalled();
}
}
private static class MockTabCreatorManager implements TabCreatorManager {
private MockTabCreator mRegularCreator;
private MockTabCreator mIncognitoCreator;
public MockTabCreatorManager() {}
public MockTabCreatorManager(TabModelSelector selector) {
initialize(selector);
}
public void initialize(TabModelSelector selector) {
mRegularCreator = new MockTabCreator(false, selector);
mIncognitoCreator = new MockTabCreator(true, selector);
}
@Override
public MockTabCreator getTabCreator(boolean incognito) {
return incognito ? mIncognitoCreator : mRegularCreator;
}
}
/**
* Used when testing interactions of TabPersistentStore with real {@link TabModelImpl}s.
*/
......
include_rules = [
"+chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java",
"+chrome/browser/profiles/android/java/src/org/chromium/chrome/browser/profiles/Profile.java",
"+chrome/browser/tab",
]
\ No newline at end of file
// Copyright 2020 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 static org.mockito.Mockito.doReturn;
import android.app.Activity;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.TabCreationState;
import org.chromium.chrome.browser.tab.TabDelegateFactory;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabCreatorManager;
import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel;
import org.chromium.ui.base.WindowAndroid;
/**
* Unit tests for {@link TabModelSelectorImpl}.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TabModelSelectorImplTest {
@Mock
TabPersistencePolicy mMockTabPersistencePolicy;
@Mock
TabContentManager mMockTabContentManager;
@Mock
TabDelegateFactory mTabDelegateFactory;
TabModelSelectorImpl mTabModelSelector;
MockTabCreatorManager mTabCreatorManager;
Activity mActivity;
@Before
public void setUp() {
mActivity = Robolectric.buildActivity(Activity.class).setup().get();
MockitoAnnotations.initMocks(this);
doReturn(TabPersistencePolicy.SAVED_STATE_FILE_PREFIX)
.when(mMockTabPersistencePolicy)
.getStateFileName();
mTabCreatorManager = new MockTabCreatorManager();
mTabModelSelector = new TabModelSelectorImpl(mActivity, mTabCreatorManager,
mMockTabPersistencePolicy,
/*supportUndo=*/false, /*isTabbedActivity=*/false, /*startIncognito=*/false);
mTabCreatorManager.initialize(mTabModelSelector);
mTabModelSelector.onNativeLibraryReadyInternal(mMockTabContentManager,
new MockTabModel(false, null), new MockTabModel(true, null));
}
@Test
public void testTabActivityAttachmentChanged_detaching() {
MockTab tab = new MockTab(1, false);
mTabModelSelector.getModel(false).addTab(
tab, 0, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND);
tab.updateAttachment(null, null);
Assert.assertEquals("detaching a tab should result in it being removed from the model", 0,
mTabModelSelector.getModel(false).getCount());
}
@Test
public void testTabActivityAttachmentChanged_movingWindows() {
MockTab tab = new MockTab(1, false);
mTabModelSelector.getModel(false).addTab(
tab, 0, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND);
tab.updateAttachment(Mockito.mock(WindowAndroid.class), mTabDelegateFactory);
Assert.assertEquals("moving a tab between windows shouldn't remove it from the model", 1,
mTabModelSelector.getModel(false).getCount());
}
@Test
public void testTabActivityAttachmentChanged_detachingWhileReparentingInProgress() {
MockTab tab = new MockTab(1, false);
mTabModelSelector.getModel(false).addTab(
tab, 0, TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND);
mTabModelSelector.enterReparentingMode();
tab.updateAttachment(null, null);
Assert.assertEquals("tab shouldn't be removed while reparenting is in progress", 1,
mTabModelSelector.getModel(false).getCount());
}
}
\ No newline at end of file
......@@ -193,6 +193,8 @@ android_library("chrome_java_test_support") {
"javatests/src/org/chromium/chrome/test/util/browser/suggestions/SuggestionsDependenciesRule.java",
"javatests/src/org/chromium/chrome/test/util/browser/suggestions/mostvisited/FakeMostVisitedSites.java",
"javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java",
"javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreator.java",
"javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabCreatorManager.java",
"javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java",
"javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java",
"javatests/src/org/chromium/chrome/test/util/browser/webapps/WebApkInfoBuilder.java",
......
// Copyright 2020 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.test.util.browser.tabmodel;
import android.util.SparseArray;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabState;
import org.chromium.chrome.browser.tab.TabTestUtils;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.WebContents;
/** MockTabCreator for use in tests. */
public class MockTabCreator extends TabCreatorManager.TabCreator {
public final SparseArray<TabState> created;
public final CallbackHelper callback;
private final boolean mIsIncognito;
private final TabModelSelector mSelector;
public int idOfFirstCreatedTab = Tab.INVALID_TAB_ID;
public MockTabCreator(boolean incognito, TabModelSelector selector) {
created = new SparseArray<>();
callback = new CallbackHelper();
mIsIncognito = incognito;
mSelector = selector;
}
@Override
public boolean createsTabsAsynchronously() {
return false;
}
@Override
public Tab createNewTab(LoadUrlParams loadUrlParams, @TabLaunchType int type, Tab parent) {
Tab tab = new MockTab(0, mIsIncognito, TabLaunchType.FROM_LINK);
mSelector.getModel(mIsIncognito)
.addTab(tab, TabModel.INVALID_TAB_INDEX, type, TabCreationState.LIVE_IN_FOREGROUND);
storeTabInfo(null, tab.getId());
return tab;
}
@Override
public Tab createFrozenTab(TabState state, int id, int index) {
Tab tab = new MockTab(id, state.isIncognito(), TabLaunchType.FROM_RESTORE);
TabTestUtils.restoreFieldsFromState(tab, state);
mSelector.getModel(mIsIncognito)
.addTab(tab, index, TabLaunchType.FROM_RESTORE, TabCreationState.FROZEN_ON_RESTORE);
storeTabInfo(state, id);
return tab;
}
@Override
public boolean createTabWithWebContents(
Tab parent, WebContents webContents, @TabLaunchType int type, String url) {
return false;
}
@Override
public Tab launchUrl(String url, @TabLaunchType int type) {
return null;
}
private void storeTabInfo(TabState state, int id) {
if (created.size() == 0) idOfFirstCreatedTab = id;
created.put(id, state);
callback.notifyCalled();
}
}
\ No newline at end of file
// Copyright 2020 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.test.util.browser.tabmodel;
import org.chromium.chrome.browser.tabmodel.TabCreatorManager;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
/** MockTabCreatorManager for use in tests. */
public class MockTabCreatorManager implements TabCreatorManager {
private MockTabCreator mRegularCreator;
private MockTabCreator mIncognitoCreator;
public MockTabCreatorManager() {}
public MockTabCreatorManager(TabModelSelector selector) {
initialize(selector);
}
public void initialize(TabModelSelector selector) {
mRegularCreator = new MockTabCreator(false, selector);
mIncognitoCreator = new MockTabCreator(true, selector);
}
@Override
public MockTabCreator getTabCreator(boolean incognito) {
return incognito ? mIncognitoCreator : mRegularCreator;
}
}
\ No newline at end of file
......@@ -4,6 +4,7 @@
package org.chromium.chrome.test.util.browser.tabmodel;
import org.chromium.base.ObserverList;
import org.chromium.chrome.browser.tab.MockTab;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabCreationState;
......@@ -11,6 +12,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.browser.tabmodel.EmptyTabModel;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelObserver;
import java.util.ArrayList;
......@@ -34,6 +36,7 @@ public class MockTabModel extends EmptyTabModel {
private int mIndex = TabModel.INVALID_TAB_INDEX;
private final ObserverList<TabModelObserver> mObservers = new ObserverList<>();
private final ArrayList<Tab> mTabs = new ArrayList<Tab>();
private final boolean mIncognito;
private final MockTabModelDelegate mDelegate;
......@@ -61,6 +64,15 @@ public class MockTabModel extends EmptyTabModel {
mIndex++;
}
}
for (TabModelObserver observer : mObservers) observer.didAddTab(tab, type, creationState);
}
@Override
public void removeTab(Tab tab) {
if (mTabs.remove(tab)) {
for (TabModelObserver observer : mObservers) observer.tabRemoved(tab);
}
}
@Override
......@@ -92,4 +104,14 @@ public class MockTabModel extends EmptyTabModel {
public void setIndex(int i, @TabSelectionType int type) {
mIndex = i;
}
@Override
public void addObserver(TabModelObserver observer) {
mObservers.addObserver(observer);
}
@Override
public void removeObserver(TabModelObserver observer) {
mObservers.removeObserver(observer);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment