Commit c45fdfa7 authored by Xing Liu's avatar Xing Liu Committed by Commit Bot

Download location: Add a test to open the spinner in location dialog.

Recently there is an icon id change in modern_list_item_view.xml, which
triggers a crash when opening the download location spinner.

This CL adds a test to open the spinner.

Bug: 1048216
Change-Id: Id6accd7ce72737e8e0ab36ffdd5e4fd2a1af1c81
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2036938Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Xing Liu <xingliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#738596}
parent 5b2ff215
...@@ -4,13 +4,19 @@ ...@@ -4,13 +4,19 @@
package org.chromium.chrome.browser.download; package org.chromium.chrome.browser.download;
import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static org.hamcrest.Matchers.equalTo;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso; import android.support.test.espresso.Espresso;
import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import org.junit.After; import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
...@@ -25,6 +31,7 @@ import org.chromium.base.test.util.Feature; ...@@ -25,6 +31,7 @@ import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
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.settings.download.DownloadDirectoryAdapter;
import org.chromium.chrome.download.R; import org.chromium.chrome.download.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features;
...@@ -77,17 +84,7 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart { ...@@ -77,17 +84,7 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart {
@Feature({"Downloads"}) @Feature({"Downloads"})
@Features.EnableFeatures(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE) @Features.EnableFeatures(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE)
public void testDefaultDialogPositiveButtonClickThrough() { public void testDefaultDialogPositiveButtonClickThrough() {
TestThreadUtils.runOnUiThreadBlocking(() -> { startDownload(/*hasSDCard=*/true);
Assert.assertEquals(
DownloadPromptStatus.SHOW_INITIAL, DownloadUtils.getPromptForDownloadAndroid());
simulateDownloadDirectories(true /* hasSDCard */);
// Trigger the download through navigation.
LoadUrlParams params =
new LoadUrlParams(mTestServer.getURL(TEST_DATA_DIRECTORY + TEST_FILE));
mDownloadTestRule.getActivity().getActivityTab().loadUrl(params);
});
// Ensure the dialog is being shown. // Ensure the dialog is being shown.
CriteriaHelper.pollUiThread(Criteria.equals( CriteriaHelper.pollUiThread(Criteria.equals(
...@@ -104,6 +101,55 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart { ...@@ -104,6 +101,55 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart {
mDownloadTestRule.deleteFilesInDownloadDirectory(new String[] {TEST_FILE}); mDownloadTestRule.deleteFilesInDownloadDirectory(new String[] {TEST_FILE});
} }
/**
* Matches the {@link DirectoryOption} used in the {@link DownloadDirectoryAdapter}.
*/
private static class DirectoryOptionMatcher extends TypeSafeMatcher<DirectoryOption> {
private Matcher<String> mNameMatcher;
public DirectoryOptionMatcher(Matcher<String> nameMatcher) {
mNameMatcher = nameMatcher;
}
@Override
protected boolean matchesSafely(DirectoryOption directoryOption) {
return mNameMatcher.matches(directoryOption.name);
}
@Override
public void describeTo(Description description) {
description.appendText("has DirectoryOption with name: ");
description.appendDescriptionOf(mNameMatcher);
}
}
/**
* Ensures the default download location dialog has two download location options in the drop
* down spinner.
*/
@Test
@MediumTest
@Feature({"Downloads"})
@Features.EnableFeatures(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE)
public void testDefaultDialogShowSpinner() {
startDownload(/*hasSDCard=*/true);
// Ensure the dialog is being shown.
CriteriaHelper.pollUiThread(Criteria.equals(
true, () -> mDownloadTestRule.getActivity().getModalDialogManager().isShowing()));
// Open the spinner inside the dialog to show download location options.
Espresso.onView(withId(R.id.file_location)).perform(click());
// Wait for data to feed into the DownloadDirectoryAdapter.
String defaultOptionName =
InstrumentationRegistry.getTargetContext().getString(R.string.menu_downloads);
String sdCardOptionName = InstrumentationRegistry.getTargetContext().getString(
R.string.downloads_location_sd_card);
onData(new DirectoryOptionMatcher(equalTo(defaultOptionName))).atPosition(0);
onData(new DirectoryOptionMatcher(equalTo(sdCardOptionName))).atPosition(1);
}
/** /**
* Ensures no default download location dialog is shown to the user without SD card inserted. * Ensures no default download location dialog is shown to the user without SD card inserted.
*/ */
...@@ -113,23 +159,29 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart { ...@@ -113,23 +159,29 @@ public class DownloadLocationChangeTest implements CustomMainActivityStart {
@Features.EnableFeatures(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE) @Features.EnableFeatures(ChromeFeatureList.DOWNLOADS_LOCATION_CHANGE)
public void testNoDialogWithoutSDCard() { public void testNoDialogWithoutSDCard() {
int currentCallCount = mDownloadTestRule.getChromeDownloadCallCount(); int currentCallCount = mDownloadTestRule.getChromeDownloadCallCount();
startDownload(/*hasSDCard=*/false);
// Ensure download is done, no download location dialog should show to interact with user.
Assert.assertTrue(mDownloadTestRule.waitForChromeDownloadToFinish(currentCallCount));
mDownloadTestRule.deleteFilesInDownloadDirectory(new String[] {TEST_FILE});
}
/**
* Starts a download, the download location dialog will show afterward.
* @param hasSDCard Whether the SD card download option is valid.
*/
private void startDownload(boolean hasSDCard) {
TestThreadUtils.runOnUiThreadBlocking(() -> { TestThreadUtils.runOnUiThreadBlocking(() -> {
Assert.assertEquals( Assert.assertEquals(
DownloadPromptStatus.SHOW_INITIAL, DownloadUtils.getPromptForDownloadAndroid()); DownloadPromptStatus.SHOW_INITIAL, DownloadUtils.getPromptForDownloadAndroid());
simulateDownloadDirectories(false /* hasSDCard */); simulateDownloadDirectories(hasSDCard);
// Trigger the download through navigation. // Trigger the download through navigation.
LoadUrlParams params = LoadUrlParams params =
new LoadUrlParams(mTestServer.getURL(TEST_DATA_DIRECTORY + TEST_FILE)); new LoadUrlParams(mTestServer.getURL(TEST_DATA_DIRECTORY + TEST_FILE));
mDownloadTestRule.getActivity().getActivityTab().loadUrl(params); mDownloadTestRule.getActivity().getActivityTab().loadUrl(params);
}); });
// Ensure download is done, no download location dialog should show to interact with user.
Assert.assertTrue(mDownloadTestRule.waitForChromeDownloadToFinish(currentCallCount));
mDownloadTestRule.deleteFilesInDownloadDirectory(new String[] {TEST_FILE});
} }
/** /**
......
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