Commit 522ce027 authored by Wei-Yin Chen (陳威尹)'s avatar Wei-Yin Chen (陳威尹) Committed by Commit Bot

Move test helpers for easier reuse

Move common test helpers to TabUiTestHelper for easier reuse. This is a
rather mechanical moving without functional changes.

Bug: 983170
Change-Id: I7aaace040a1a93f653761cc73661c46ec92dd591
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1903691Reviewed-by: default avatarMei Liang <meiliang@chromium.org>
Commit-Queue: Wei-Yin Chen (陳威尹) <wychen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#713952}
parent a3e045f8
...@@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals; ...@@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.chromium.base.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS;
import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.areAnimatorsEnabled; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.areAnimatorsEnabled;
import static org.chromium.chrome.browser.util.UrlConstants.NTP_URL; import static org.chromium.chrome.browser.util.UrlConstants.NTP_URL;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL; import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL;
...@@ -49,12 +48,9 @@ import org.chromium.base.test.util.Restriction; ...@@ -49,12 +48,9 @@ import org.chromium.base.test.util.Restriction;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.flags.FeatureUtilities; import org.chromium.chrome.browser.flags.FeatureUtilities;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities; import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.tab_ui.R;
...@@ -72,7 +68,6 @@ import org.chromium.content_public.browser.test.util.WebContentsUtils; ...@@ -72,7 +68,6 @@ import org.chromium.content_public.browser.test.util.WebContentsUtils;
import org.chromium.net.test.EmbeddedTestServer; import org.chromium.net.test.EmbeddedTestServer;
import org.chromium.ui.test.util.UiRestriction; import org.chromium.ui.test.util.UiRestriction;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.LinkedList; import java.util.LinkedList;
...@@ -319,113 +314,10 @@ public class StartSurfaceLayoutTest { ...@@ -319,113 +314,10 @@ public class StartSurfaceLayoutTest {
*/ */
private void prepareTabs(int numTabs, int numIncognitoTabs, @Nullable String url) { private void prepareTabs(int numTabs, int numIncognitoTabs, @Nullable String url) {
int oldCount = mTabListDelegate.getBitmapFetchCountForTesting(); int oldCount = mTabListDelegate.getBitmapFetchCountForTesting();
prepareTabsWithThumbnail(mActivityTestRule, numTabs, numIncognitoTabs, url); TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, numTabs, numIncognitoTabs, url);
assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount); assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount);
} }
/**
* Make Chrome have {@code numTabs} of regular Tabs and {@code numIncognitoTabs} of incognito
* tabs with {@code url} loaded.
* @param rule The {@link ChromeTabbedActivityTestRule}.
* @param numTabs The number of regular tabs.
* @param numIncognitoTabs The number of incognito tabs.
* @param url The URL to load.
*/
private static void prepareTabsWithThumbnail(ChromeTabbedActivityTestRule rule, int numTabs,
int numIncognitoTabs, @Nullable String url) {
assertTrue(numTabs >= 1);
assertTrue(numIncognitoTabs >= 0);
assertEquals(1, rule.getActivity().getTabModelSelector().getModel(false).getCount());
assertEquals(0, rule.getActivity().getTabModelSelector().getModel(true).getCount());
if (url != null) rule.loadUrl(url);
if (numTabs > 1) {
// When Chrome started, there is already one Tab created by default.
createTabsWithThumbnail(rule, numTabs - 1, url, false);
}
if (numIncognitoTabs > 0) createTabsWithThumbnail(rule, numIncognitoTabs, url, true);
assertEquals(numTabs, rule.getActivity().getTabModelSelector().getModel(false).getCount());
assertEquals(numIncognitoTabs,
rule.getActivity().getTabModelSelector().getModel(true).getCount());
if (url != null) {
verifyAllTabsHaveUrl(rule.getActivity().getTabModelSelector().getModel(false), url);
verifyAllTabsHaveUrl(rule.getActivity().getTabModelSelector().getModel(true), url);
}
}
private static void verifyAllTabsHaveUrl(TabModel tabModel, String url) {
for (int i = 0; i < tabModel.getCount(); i++) {
assertEquals(url, tabModel.getTabAt(i).getUrl());
}
}
/**
* Create {@code numTabs} of {@link Tab}s with {@code url} loaded to Chrome.
* Note that if the test doesn't care about thumbnail, use {@link TabUiTestHelper#createTabs}
* instead since it's faster.
*
* @param rule The {@link ChromeTabbedActivityTestRule}.
* @param numTabs The number of tabs to create.
* @param url The URL to load. Skip loading when null, but the thumbnail for the NTP might not
* be saved.
* @param isIncognito Whether the tab is incognito tab.
*/
private static void createTabsWithThumbnail(ChromeTabbedActivityTestRule rule, int numTabs,
@Nullable String url, boolean isIncognito) {
assertTrue(numTabs >= 1);
int previousTabCount =
rule.getActivity().getTabModelSelector().getModel(isIncognito).getCount();
for (int i = 0; i < numTabs; i++) {
TabModel previousTabModel = rule.getActivity().getTabModelSelector().getCurrentModel();
int previousTabIndex = previousTabModel.index();
Tab previousTab = previousTabModel.getTabAt(previousTabIndex);
ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(),
rule.getActivity(), isIncognito, true);
if (url != null) rule.loadUrl(url);
TabModel currentTabModel = rule.getActivity().getTabModelSelector().getCurrentModel();
int currentTabIndex = currentTabModel.index();
boolean fixPendingReadbacks =
rule.getActivity().getTabContentManager().getPendingReadbacksForTesting() != 0;
// When there are pending readbacks due to detached Tabs, try to fix it by switching
// back to that tab.
if (fixPendingReadbacks && previousTabIndex != TabModel.INVALID_TAB_INDEX) {
// clang-format off
TestThreadUtils.runOnUiThreadBlocking(() ->
previousTabModel.setIndex(previousTabIndex, TabSelectionType.FROM_USER)
);
// clang-format on
}
checkThumbnailsExist(previousTab);
if (fixPendingReadbacks) {
// clang-format off
TestThreadUtils.runOnUiThreadBlocking(() -> currentTabModel.setIndex(
currentTabIndex, TabSelectionType.FROM_USER)
);
// clang-format on
}
}
ChromeTabUtils.waitForTabPageLoaded(
rule.getActivity().getActivityTab(), null, null, WAIT_TIMEOUT_SECONDS * 10);
assertEquals(numTabs + previousTabCount,
rule.getActivity().getTabModelSelector().getModel(isIncognito).getCount());
CriteriaHelper.pollUiThread(Criteria.equals(0,
() -> rule.getActivity().getTabContentManager().getPendingReadbacksForTesting()));
}
private void testTabToGrid(String fromUrl) throws InterruptedException { private void testTabToGrid(String fromUrl) throws InterruptedException {
mActivityTestRule.loadUrl(fromUrl); mActivityTestRule.loadUrl(fromUrl);
...@@ -823,7 +715,7 @@ public class StartSurfaceLayoutTest { ...@@ -823,7 +715,7 @@ public class StartSurfaceLayoutTest {
} }
} }
checkCaptureCount(delta, count); checkCaptureCount(delta, count);
if (checkThumbnail) checkThumbnailsExist(currentTab); if (checkThumbnail) TabUiTestHelper.checkThumbnailsExist(currentTab);
} }
private void leaveGTS() { private void leaveGTS() {
...@@ -863,18 +755,6 @@ public class StartSurfaceLayoutTest { ...@@ -863,18 +755,6 @@ public class StartSurfaceLayoutTest {
Criteria.equals(expectedDelta, () -> getCaptureCount() - initCount)); Criteria.equals(expectedDelta, () -> getCaptureCount() - initCount));
} }
private static void checkThumbnailsExist(Tab tab) {
File etc1File = TabContentManager.getTabThumbnailFileEtc1(tab);
CriteriaHelper.pollInstrumentationThread(etc1File::exists,
"The thumbnail " + etc1File.getName() + " is not found",
DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL);
File jpegFile = TabContentManager.getTabThumbnailFileJpeg(tab);
CriteriaHelper.pollInstrumentationThread(jpegFile::exists,
"The thumbnail " + jpegFile.getName() + " is not found",
DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL);
}
private int getCaptureCount() { private int getCaptureCount() {
return RecordHistogram.getHistogramTotalCountForTesting("Compositing.CopyFromSurfaceTime"); return RecordHistogram.getHistogramTotalCountForTesting("Compositing.CopyFromSurfaceTime");
} }
......
...@@ -14,10 +14,15 @@ import static org.junit.Assert.assertEquals; ...@@ -14,10 +14,15 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.chromium.base.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Build; import android.os.Build;
import android.provider.Settings; import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.NoMatchingViewException; import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.ViewAssertion; import android.support.test.espresso.ViewAssertion;
...@@ -27,15 +32,20 @@ import android.view.View; ...@@ -27,15 +32,20 @@ import android.view.View;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.chrome.test.util.OverviewModeBehaviorWatcher; import org.chromium.chrome.test.util.OverviewModeBehaviorWatcher;
import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils;
import java.io.File;
import java.util.List; import java.util.List;
/** /**
...@@ -193,6 +203,121 @@ public class TabUiTestHelper { ...@@ -193,6 +203,121 @@ public class TabUiTestHelper {
return !(durationScale == 0.0); return !(durationScale == 0.0);
} }
/**
* Make Chrome have {@code numTabs} of regular Tabs and {@code numIncognitoTabs} of incognito
* tabs with {@code url} loaded.
* @param rule The {@link ChromeTabbedActivityTestRule}.
* @param numTabs The number of regular tabs.
* @param numIncognitoTabs The number of incognito tabs.
* @param url The URL to load.
*/
public static void prepareTabsWithThumbnail(ChromeTabbedActivityTestRule rule, int numTabs,
int numIncognitoTabs, @Nullable String url) {
assertTrue(numTabs >= 1);
assertTrue(numIncognitoTabs >= 0);
assertEquals(1, rule.getActivity().getTabModelSelector().getModel(false).getCount());
assertEquals(0, rule.getActivity().getTabModelSelector().getModel(true).getCount());
if (url != null) rule.loadUrl(url);
if (numTabs > 1) {
// When Chrome started, there is already one Tab created by default.
createTabsWithThumbnail(rule, numTabs - 1, url, false);
}
if (numIncognitoTabs > 0) createTabsWithThumbnail(rule, numIncognitoTabs, url, true);
assertEquals(numTabs, rule.getActivity().getTabModelSelector().getModel(false).getCount());
assertEquals(numIncognitoTabs,
rule.getActivity().getTabModelSelector().getModel(true).getCount());
if (url != null) {
verifyAllTabsHaveUrl(rule.getActivity().getTabModelSelector().getModel(false), url);
verifyAllTabsHaveUrl(rule.getActivity().getTabModelSelector().getModel(true), url);
}
}
private static void verifyAllTabsHaveUrl(TabModel tabModel, String url) {
for (int i = 0; i < tabModel.getCount(); i++) {
assertEquals(url, tabModel.getTabAt(i).getUrl());
}
}
/**
* Create {@code numTabs} of {@link Tab}s with {@code url} loaded to Chrome.
* Note that if the test doesn't care about thumbnail, use {@link TabUiTestHelper#createTabs}
* instead since it's faster.
*
* @param rule The {@link ChromeTabbedActivityTestRule}.
* @param numTabs The number of tabs to create.
* @param url The URL to load. Skip loading when null, but the thumbnail for the NTP might not
* be saved.
* @param isIncognito Whether the tab is incognito tab.
*/
private static void createTabsWithThumbnail(ChromeTabbedActivityTestRule rule, int numTabs,
@Nullable String url, boolean isIncognito) {
assertTrue(numTabs >= 1);
int previousTabCount =
rule.getActivity().getTabModelSelector().getModel(isIncognito).getCount();
for (int i = 0; i < numTabs; i++) {
TabModel previousTabModel = rule.getActivity().getTabModelSelector().getCurrentModel();
int previousTabIndex = previousTabModel.index();
Tab previousTab = previousTabModel.getTabAt(previousTabIndex);
ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(),
rule.getActivity(), isIncognito, true);
if (url != null) rule.loadUrl(url);
TabModel currentTabModel = rule.getActivity().getTabModelSelector().getCurrentModel();
int currentTabIndex = currentTabModel.index();
boolean fixPendingReadbacks =
rule.getActivity().getTabContentManager().getPendingReadbacksForTesting() != 0;
// When there are pending readbacks due to detached Tabs, try to fix it by switching
// back to that tab.
if (fixPendingReadbacks && previousTabIndex != TabModel.INVALID_TAB_INDEX) {
// clang-format off
TestThreadUtils.runOnUiThreadBlocking(() ->
previousTabModel.setIndex(previousTabIndex, TabSelectionType.FROM_USER)
);
// clang-format on
}
checkThumbnailsExist(previousTab);
if (fixPendingReadbacks) {
// clang-format off
TestThreadUtils.runOnUiThreadBlocking(() -> currentTabModel.setIndex(
currentTabIndex, TabSelectionType.FROM_USER)
);
// clang-format on
}
}
ChromeTabUtils.waitForTabPageLoaded(
rule.getActivity().getActivityTab(), null, null, WAIT_TIMEOUT_SECONDS * 10);
assertEquals(numTabs + previousTabCount,
rule.getActivity().getTabModelSelector().getModel(isIncognito).getCount());
CriteriaHelper.pollUiThread(Criteria.equals(0,
() -> rule.getActivity().getTabContentManager().getPendingReadbacksForTesting()));
}
public static void checkThumbnailsExist(Tab tab) {
File etc1File = TabContentManager.getTabThumbnailFileEtc1(tab);
CriteriaHelper.pollInstrumentationThread(etc1File::exists,
"The thumbnail " + etc1File.getName() + " is not found",
DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL);
File jpegFile = TabContentManager.getTabThumbnailFileJpeg(tab);
CriteriaHelper.pollInstrumentationThread(jpegFile::exists,
"The thumbnail " + jpegFile.getName() + " is not found",
DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL);
}
/** /**
* Implementation of {@link ViewAssertion} to verify the {@link RecyclerView} has correct number * Implementation of {@link ViewAssertion} to verify the {@link RecyclerView} has correct number
* of children, and children are showing correctly. * of children, and children are showing correctly.
......
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