Commit 8c51d550 authored by Min Qin's avatar Min Qin Committed by Commit Bot

Fix a flaky download test

This CL fixes several reasons that cause the test to fail:
1. The test copies a file to sdcard, this will not work on Q and above.
   This CL will download a file first, so that it will always trigger
   the duplicate infobar
2. The new tab creation and going to the last tab are no longer working.
   This CL fixes it.
3. There are many infobars during the test. This Cl searches for the duplicate
   infobar instead of using the first infobar.

BUG=606798

Change-Id: I29edd445231087022664c2ef887c8b2a701c8be0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2454230Reviewed-by: default avatarXing Liu <xingliu@chromium.org>
Commit-Queue: Min Qin <qinmin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#814932}
parent e20d8219
...@@ -29,15 +29,14 @@ import org.chromium.base.test.util.Feature; ...@@ -29,15 +29,14 @@ import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.FlakyTest;
import org.chromium.base.test.util.UrlUtils; import org.chromium.base.test.util.UrlUtils;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.compositor.CompositorViewHolder;
import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.compositor.layouts.StaticLayout;
import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart; import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.infobar.DuplicateDownloadInfoBar; import org.chromium.chrome.browser.infobar.DuplicateDownloadInfoBar;
import org.chromium.chrome.browser.infobar.InfoBarContainer; import org.chromium.chrome.browser.infobar.InfoBarContainer;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabLaunchType;
import org.chromium.chrome.browser.tabmodel.TabCreator;
import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
...@@ -46,6 +45,7 @@ import org.chromium.chrome.test.util.InfoBarUtil; ...@@ -46,6 +45,7 @@ import org.chromium.chrome.test.util.InfoBarUtil;
import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.download.DownloadState; import org.chromium.components.download.DownloadState;
import org.chromium.components.infobars.InfoBar; import org.chromium.components.infobars.InfoBar;
import org.chromium.content_public.browser.LoadUrlParams;
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.DOMUtils; import org.chromium.content_public.browser.test.util.DOMUtils;
...@@ -53,6 +53,7 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils; ...@@ -53,6 +53,7 @@ import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.content_public.browser.test.util.TouchCommon;
import org.chromium.net.test.EmbeddedTestServer; import org.chromium.net.test.EmbeddedTestServer;
import org.chromium.net.test.util.TestWebServer; import org.chromium.net.test.util.TestWebServer;
import org.chromium.ui.base.PageTransition;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -295,12 +296,7 @@ import java.util.List; ...@@ -295,12 +296,7 @@ import java.util.List;
waitForFocus(); waitForFocus();
currentView = mDownloadTestRule.getActivity().getActivityTab().getView(); currentView = mDownloadTestRule.getActivity().getActivityTab().getView();
TouchCommon.singleClickView(currentView); TouchCommon.singleClickView(currentView);
CriteriaHelper.pollUiThread(() -> { waitForDuplicateInfobar();
InfoBar infobar = findDuplicateDownloadInfoBar();
Criteria.checkThat(infobar, Matchers.notNullValue());
Criteria.checkThat(
mDownloadTestRule.getInfoBarContainer().isAnimating(), Matchers.is(false));
});
Assert.assertTrue("CANCEL button wasn't found", Assert.assertTrue("CANCEL button wasn't found",
InfoBarUtil.clickSecondaryButton(findDuplicateDownloadInfoBar())); InfoBarUtil.clickSecondaryButton(findDuplicateDownloadInfoBar()));
...@@ -346,39 +342,37 @@ import java.util.List; ...@@ -346,39 +342,37 @@ import java.util.List;
final int count = model.getCount(); final int count = model.getCount();
InstrumentationRegistry.getInstrumentation().runOnMainSync( InstrumentationRegistry.getInstrumentation().runOnMainSync(
() -> TabModelUtils.setIndex(model, count - 1)); () -> TabModelUtils.setIndex(model, count - 2));
CriteriaHelper.pollUiThread(() -> { CriteriaHelper.pollUiThread(() -> {
Tab tab = mDownloadTestRule.getActivity().getActivityTab(); Tab tab = mDownloadTestRule.getActivity().getActivityTab();
Criteria.checkThat(tab, Matchers.is(model.getTabAt(count - 1))); Criteria.checkThat(tab, Matchers.is(model.getTabAt(count - 2)));
Criteria.checkThat(ChromeTabUtils.isRendererReady(tab), Matchers.is(true)); Criteria.checkThat(ChromeTabUtils.isRendererReady(tab), Matchers.is(true));
}); });
} }
private void waitForNewTabToStabilize(final int numTabsAfterNewTab) { private void openNewTab(String url) {
// Wait until we have a new tab first. This should be called before checking the active Tab oldTab = mDownloadTestRule.getActivity().getActivityTabProvider().get();
// layout because the active layout changes StaticLayout --> SimpleAnimationLayout TabCreator tabCreator = mDownloadTestRule.getActivity().getTabCreator(false);
// --> (tab added) --> StaticLayout. Tab newTab = TestThreadUtils.runOnUiThreadBlockingNoException(() -> {
CriteriaHelper.pollUiThread(() -> { return tabCreator.createNewTab(
Criteria.checkThat(mDownloadTestRule.getActivity().getCurrentTabModel().getCount(), new LoadUrlParams(url, PageTransition.LINK), TabLaunchType.FROM_LINK, oldTab);
Matchers.greaterThanOrEqualTo(numTabsAfterNewTab));
}); });
}
// Now wait until the new tab animation finishes. Something wonky happens private void waitForDuplicateInfobar() {
// if we try to go to the new tab before this.
CriteriaHelper.pollUiThread(() -> { CriteriaHelper.pollUiThread(() -> {
CompositorViewHolder compositorViewHolder = InfoBar infobar = findDuplicateDownloadInfoBar();
mDownloadTestRule.getActivity().findViewById(R.id.compositor_view_holder); Criteria.checkThat(infobar, Matchers.notNullValue());
LayoutManager layoutManager = compositorViewHolder.getLayoutManager(); Criteria.checkThat(
Criteria.checkThat(layoutManager, Matchers.instanceOf(StaticLayout.class)); mDownloadTestRule.getInfoBarContainer().isAnimating(), Matchers.is(false));
}); });
} }
@Test @Test
@DisabledTest(message = "crbug.com/606798")
@MediumTest @MediumTest
@Feature({"Downloads"}) @Feature({"Downloads"})
public void testDuplicateHttpPostDownload_OpenNewTabAndReplace() throws Exception { public void testDuplicateHttpDownload_OpenNewTabAndReplace() throws Exception {
final String url = final String url =
mTestServer.getURL(TEST_DOWNLOAD_DIRECTORY + "get.html"); mTestServer.getURL(TEST_DOWNLOAD_DIRECTORY + "get.html");
...@@ -387,26 +381,27 @@ import java.util.List; ...@@ -387,26 +381,27 @@ import java.util.List;
Assert.assertTrue(dir.isDirectory()); Assert.assertTrue(dir.isDirectory());
final File file = new File(dir, FILENAME_GZIP); final File file = new File(dir, FILENAME_GZIP);
try { try {
if (!file.exists()) { mDownloadTestRule.loadUrl(url);
Assert.assertTrue(file.createNewFile()); waitForFocus();
} View currentView = mDownloadTestRule.getActivity().getActivityTab().getView();
TouchCommon.singleClickView(currentView);
waitForLastDownloadToFinish();
int downloadCount = mDownloadTestRule.getAllDownloads().size();
// Open in a new tab again. // Download a file with the same name.
mDownloadTestRule.loadUrl(url); mDownloadTestRule.loadUrl(url);
currentView = mDownloadTestRule.getActivity().getActivityTab().getView();
TouchCommon.singleClickView(currentView);
waitForFocus(); waitForFocus();
waitForDuplicateInfobar();
View currentView = mDownloadTestRule.getActivity().getActivityTab().getView(); openNewTab(url);
TouchCommon.longPressView(currentView);
InstrumentationRegistry.getInstrumentation().invokeContextMenuAction(
mDownloadTestRule.getActivity(), R.id.contextmenu_open_in_new_tab, 0);
waitForNewTabToStabilize(2);
goToLastTab(); goToLastTab();
assertPollForInfoBarSize(1); waitForDuplicateInfobar();
// Now create two new files by clicking on the infobars. // Now create two new files by clicking on the infobars.
Assert.assertTrue("OVERWRITE button wasn't found", Assert.assertTrue("CANCEL button wasn't found",
InfoBarUtil.clickPrimaryButton(mDownloadTestRule.getInfoBars().get(0))); InfoBarUtil.clickPrimaryButton(findDuplicateDownloadInfoBar()));
} finally { } finally {
if (!file.delete()) { if (!file.delete()) {
Log.d(TAG, "Failed to delete test.gzip"); Log.d(TAG, "Failed to delete test.gzip");
......
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