Commit 5dca5ccd authored by David Maunder's avatar David Maunder Committed by Chromium LUCI CQ

Batch UndoTabModelTest

Speedup: 49246ms -> 10061ms (80% improvement)

Bug: 1164552
Change-Id: I85bf73b14b2def7b9c0d5d3d4a1f2505d037a2cc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2617051Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Commit-Queue: David Maunder <davidjm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842834}
parent d2ae250b
......@@ -11,12 +11,13 @@ import androidx.test.filters.MediumTest;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.test.util.Batch;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Criteria;
......@@ -24,6 +25,7 @@ import org.chromium.base.test.util.CriteriaHelper;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.base.test.util.RequiresRestart;
import org.chromium.base.test.util.Restriction;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity2;
......@@ -34,6 +36,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tab.TabSelectionType;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
......@@ -46,19 +49,20 @@ import java.util.concurrent.TimeoutException;
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@Batch(Batch.PER_CLASS)
public class UndoTabModelTest {
@ClassRule
public static ChromeTabbedActivityTestRule sActivityTestRule =
new ChromeTabbedActivityTestRule();
@Rule
public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
public BlankCTATabInitialStateRule mInitialStateRule =
new BlankCTATabInitialStateRule(sActivityTestRule, true);
private static final Tab[] EMPTY = new Tab[] { };
private static final String TEST_URL_0 = UrlUtils.encodeHtmlDataUri("<html>test_url_0.</html>");
private static final String TEST_URL_1 = UrlUtils.encodeHtmlDataUri("<html>test_url_1.</html>");
@Before
public void setUp() throws InterruptedException {
mActivityTestRule.startMainActivityOnBlankPage();
}
private void checkState(
final TabModel model, final Tab[] tabsList, final Tab selectedTab,
final Tab[] closingTabs, final Tab[] fullTabsList,
......@@ -329,8 +333,8 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testSingleTab() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
Tab tab0 = model.getTabAt(0);
......@@ -421,8 +425,8 @@ public class UndoTabModelTest {
message = "Flaky on all Android configurations except Swarming. See crbug.com/620014.")
public void
testTwoTabs() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
Tab tab0 = model.getTabAt(0);
......@@ -568,8 +572,8 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testInOrderRestore() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -727,8 +731,8 @@ public class UndoTabModelTest {
@MediumTest
@Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) // See crbug.com/633607
public void testReverseOrderRestore() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -878,8 +882,8 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testOutOfOrder1() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -994,8 +998,8 @@ public class UndoTabModelTest {
@MediumTest
@FlakyTest(message = "crbug.com/592969")
public void testOutOfOrder2() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1091,8 +1095,8 @@ public class UndoTabModelTest {
@MediumTest
@DisabledTest(message = "crbug.com/633607")
public void testCloseAll() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1161,12 +1165,16 @@ public class UndoTabModelTest {
* 3. CloseTab(2, allow undo) [ 0 3s ] [ 2 1 ] [ 0 1 2 3s ]
* 4. CloseTab(3, disallow undo) [ 0s ] - [ 0s ]
*
*
* TODO(crbug.com/1165954) Investigate and resolve failure on testCloseTab when batching.
* RequiresRestart is used as a workaround.
*/
@Test
@MediumTest
@RequiresRestart
public void testCloseTab() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1211,8 +1219,8 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testMoveTab() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1263,8 +1271,8 @@ public class UndoTabModelTest {
@Test
@DisabledTest
public void testAddTab() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1336,8 +1344,8 @@ public class UndoTabModelTest {
@MediumTest
@DisabledTest(message = "crbug.com/1042168")
public void testUndoNotSupported() throws TimeoutException {
TabModel model = mActivityTestRule.getActivity().getTabModelSelector().getModel(true);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(true);
TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(true);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(true);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
createTabOnUiThread(tabCreator);
......@@ -1383,9 +1391,9 @@ public class UndoTabModelTest {
@MediumTest
@Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) // See crbug.com/633607
public void testSaveStateCommitsUndos() throws TimeoutException {
TabModelSelector selector = mActivityTestRule.getActivity().getTabModelSelector();
TabModelSelector selector = sActivityTestRule.getActivity().getTabModelSelector();
TabModel model = selector.getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
Tab tab0 = model.getTabAt(0);
......@@ -1414,9 +1422,9 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testOpenRecentlyClosedTab() throws TimeoutException {
TabModelSelector selector = mActivityTestRule.getActivity().getTabModelSelector();
TabModelSelector selector = sActivityTestRule.getActivity().getTabModelSelector();
TabModel model = selector.getModel(false);
ChromeTabCreator tabCreator = mActivityTestRule.getActivity().getTabCreator(false);
ChromeTabCreator tabCreator = sActivityTestRule.getActivity().getTabCreator(false);
createTabOnUiThread(tabCreator);
......@@ -1438,14 +1446,14 @@ public class UndoTabModelTest {
@Test
@MediumTest
public void testOpenRecentlyClosedTabNative() throws TimeoutException {
final TabModelSelector selector = mActivityTestRule.getActivity().getTabModelSelector();
final TabModelSelector selector = sActivityTestRule.getActivity().getTabModelSelector();
final TabModel model = selector.getModel(false);
// Create new tab and wait until it's loaded.
// Native can only successfully recover the tab after a page load has finished and
// it has navigation history.
ChromeTabUtils.fullyLoadUrlInNewTab(InstrumentationRegistry.getInstrumentation(),
mActivityTestRule.getActivity(), TEST_URL_0, false);
sActivityTestRule.getActivity(), TEST_URL_0, false);
// Close the tab, and commit pending closure.
Assert.assertEquals(model.getCount(), 2);
......@@ -1484,14 +1492,14 @@ public class UndoTabModelTest {
public void testOpenRecentlyClosedTabMultiWindow() throws TimeoutException {
final ChromeTabbedActivity2 secondActivity =
MultiWindowTestHelper.createSecondChromeTabbedActivity(
mActivityTestRule.getActivity());
sActivityTestRule.getActivity());
// Wait for the second window to be fully initialized.
CriteriaHelper.pollUiThread(
() -> secondActivity.getTabModelSelector().isTabStateInitialized());
// First window context.
final TabModelSelector firstSelector =
mActivityTestRule.getActivity().getTabModelSelector();
sActivityTestRule.getActivity().getTabModelSelector();
final TabModel firstModel = firstSelector.getModel(false);
// Second window context.
......@@ -1499,7 +1507,7 @@ public class UndoTabModelTest {
// Create tabs.
ChromeTabUtils.fullyLoadUrlInNewTab(InstrumentationRegistry.getInstrumentation(),
mActivityTestRule.getActivity(), TEST_URL_0, false);
sActivityTestRule.getActivity(), TEST_URL_0, false);
ChromeTabUtils.fullyLoadUrlInNewTab(
InstrumentationRegistry.getInstrumentation(), secondActivity, TEST_URL_1, false);
......@@ -1559,14 +1567,14 @@ public class UndoTabModelTest {
public void testOpenRecentlyClosedTabMultiWindowFallback() throws TimeoutException {
final ChromeTabbedActivity2 secondActivity =
MultiWindowTestHelper.createSecondChromeTabbedActivity(
mActivityTestRule.getActivity());
sActivityTestRule.getActivity());
// Wait for the second window to be fully initialized.
CriteriaHelper.pollUiThread(
() -> secondActivity.getTabModelSelector().isTabStateInitialized());
// First window context.
final TabModelSelector firstSelector =
mActivityTestRule.getActivity().getTabModelSelector();
sActivityTestRule.getActivity().getTabModelSelector();
final TabModel firstModel = firstSelector.getModel(false);
// Second window context.
......
......@@ -54,6 +54,9 @@ public class BlankCTATabInitialStateRule implements TestRule {
() -> { FirstRunStatus.setFirstRunFlowComplete(true); });
mActivityTestRule.startMainActivityOnBlankPage();
sActivity = mActivityTestRule.getActivity();
// Previous tests may have left tabs open and finished the Activity.
if (regularTabCount() > 1) resetTabStateFast();
} else {
mActivityTestRule.setActivity(sActivity);
if (shouldPerformFastReset()) {
......@@ -68,15 +71,22 @@ public class BlankCTATabInitialStateRule implements TestRule {
// If the activity was relaunched during the test, update the reference to use
// the most up to date Activity.
sActivity = mActivityTestRule.getActivity();
if (sActivity.isActivityFinishingOrDestroyed()) {
sActivity = null;
}
}
}
};
}
private int regularTabCount() {
return TestThreadUtils.runOnUiThreadBlockingNoException(
() -> { return sActivity.getTabModelSelector().getModel(false).getCount(); });
}
private boolean shouldPerformFastReset() {
if (mClearAllTabState) return false;
return TestThreadUtils.runOnUiThreadBlockingNoException(
() -> { return sActivity.getTabModelSelector().getModel(false).getCount() > 0; });
return regularTabCount() > 0;
}
// Avoids closing the primary tab (and killing the renderer) in order to reset tab state
......
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