blob: d64a96261676698032d81cc8ba2d1b068e7f119a [file] [log] [blame]
// 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.autofill_assistant;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.pressImeActionButton;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.Matchers.containsString;
import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil;
import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewAssertionTrue;
import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL;
import android.support.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.DisabledTest;
import org.chromium.chrome.autofill_assistant.R;
import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
import org.chromium.chrome.browser.autofill_assistant.proto.ClickProto;
import org.chromium.chrome.browser.autofill_assistant.proto.NavigateProto;
import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto.Choice;
import org.chromium.chrome.browser.autofill_assistant.proto.SelectorProto;
import org.chromium.chrome.browser.autofill_assistant.proto.StopProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto;
import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
import org.chromium.chrome.browser.autofill_assistant.proto.TellProto;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.net.test.EmbeddedTestServer;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Tests autofill assistant in a normal Chrome tab.
*/
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@RunWith(ChromeJUnit4ClassRunner.class)
public class AutofillAssistantNavigationIntegrationTest {
@Rule
public ChromeTabbedActivityTestRule mTestRule = new ChromeTabbedActivityTestRule();
private static final String HTML_DIRECTORY = "/components/test/data/autofill_assistant/html/";
private static final String TEST_PAGE_A = "autofill_assistant_target_website.html";
private static final String TEST_PAGE_B = "form_target_website.html";
private EmbeddedTestServer mTestServer;
private String getURL(String page) {
return mTestServer.getURL(HTML_DIRECTORY + page);
}
private void setupScripts(AutofillAssistantTestScript... scripts) {
AutofillAssistantTestService testService =
new AutofillAssistantTestService(Arrays.asList(scripts));
testService.scheduleForInjection();
}
private void startAutofillAssistantOnTab(String pageToLoad) {
TestThreadUtils.runOnUiThreadBlocking(
()
-> AutofillAssistantFacade.start(mTestRule.getActivity(),
/* bundleExtras= */ null, getURL(pageToLoad)));
}
@Before
public void setUp() throws Exception {
AutofillAssistantPreferencesUtil.setInitialPreferences(true);
mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
mTestRule.startMainActivityWithURL(getURL(TEST_PAGE_A));
}
@After
public void tearDown() throws Exception {
mTestServer.stopAndDestroyServer();
}
@Test
@MediumTest
public void navigatingWithLocationBarShowsError() {
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Prompt").addChoices(
PromptProto.Choice.newBuilder()))
.build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath(TEST_PAGE_A)
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Done")))
.build(),
list);
setupScripts(script);
startAutofillAssistantOnTab(TEST_PAGE_A);
waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
// Committing URL shows error.
onView(withId(org.chromium.chrome.R.id.url_bar))
.perform(click(), typeText(getURL(TEST_PAGE_B)), pressImeActionButton());
waitUntilViewMatchesCondition(withText(containsString("Sorry")), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_B)));
}
@Test
@MediumTest
public void clickingLinkDoesNotCauseError() {
SelectorProto linkElement =
(SelectorProto) SelectorProto.newBuilder()
.addFilters(SelectorProto.Filter.newBuilder().setCssSelector(
"#form_target_website_link"))
.build();
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setClick(ClickProto.newBuilder().setElementToClick(linkElement))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Prompt").addChoices(
PromptProto.Choice.newBuilder()))
.build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath(TEST_PAGE_A)
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Done")))
.build(),
list);
setupScripts(script);
startAutofillAssistantOnTab(TEST_PAGE_A);
waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_B)));
}
@Test
@MediumTest
public void javaScriptNavigationDoesNotCauseError() {
SelectorProto navigationActionElement =
(SelectorProto) SelectorProto.newBuilder()
.addFilters(SelectorProto.Filter.newBuilder().setCssSelector(
"#form_target_navigation_action"))
.build();
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setClick(
ClickProto.newBuilder().setElementToClick(navigationActionElement))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Prompt").addChoices(
PromptProto.Choice.newBuilder()))
.build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath(TEST_PAGE_A)
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Done")))
.build(),
list);
setupScripts(script);
startAutofillAssistantOnTab(TEST_PAGE_A);
waitUntilViewMatchesCondition(withText("Prompt"), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_B)));
}
@Test
@MediumTest
@DisabledTest(message = "Flaky - https://crbug.com/1104900")
public void navigateActionDoesNotCauseError() {
// Push something to navigation stack so we can use back and forth.
ChromeTabUtils.loadUrlOnUiThread(
mTestRule.getActivity().getActivityTab(), getURL(TEST_PAGE_B));
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setNavigate(NavigateProto.newBuilder().setUrl(getURL(TEST_PAGE_A)))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Page A").addChoices(
Choice.newBuilder().setChip(
ChipProto.newBuilder().setText("Next"))))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setNavigate(NavigateProto.newBuilder().setGoBackward(true))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Page B").addChoices(
Choice.newBuilder().setChip(
ChipProto.newBuilder().setText("Next"))))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setNavigate(NavigateProto.newBuilder().setGoForward(true))
.build());
list.add((ActionProto) ActionProto.newBuilder()
.setPrompt(PromptProto.newBuilder().setMessage("Page A").addChoices(
PromptProto.Choice.newBuilder()))
.build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath(TEST_PAGE_B)
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Done")))
.build(),
list);
setupScripts(script);
startAutofillAssistantOnTab(TEST_PAGE_B);
waitUntilViewMatchesCondition(withText("Page A"), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_A)));
onView(withText("Next")).perform(click());
waitUntilViewMatchesCondition(withText("Page B"), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_B)));
onView(withText("Next")).perform(click());
waitUntilViewMatchesCondition(withText("Page A"), isCompletelyDisplayed());
waitUntil(()
-> mTestRule.getActivity().getActivityTab().getUrl().getSpec().equals(
getURL(TEST_PAGE_A)));
}
@Test
@MediumTest
public void navigatingInStoppedAutofillAssistantStateRemovesUI() {
ArrayList<ActionProto> list = new ArrayList<>();
list.add((ActionProto) ActionProto.newBuilder()
.setTell(TellProto.newBuilder().setMessage("Shutdown"))
.build());
list.add((ActionProto) ActionProto.newBuilder().setStop(StopProto.newBuilder()).build());
AutofillAssistantTestScript script = new AutofillAssistantTestScript(
(SupportedScriptProto) SupportedScriptProto.newBuilder()
.setPath(TEST_PAGE_A)
.setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip(
ChipProto.newBuilder().setText("Done")))
.build(),
list);
setupScripts(script);
startAutofillAssistantOnTab(TEST_PAGE_A);
waitUntilViewMatchesCondition(withText("Shutdown"), isCompletelyDisplayed());
onView(withId(org.chromium.chrome.R.id.url_bar))
.perform(click(), typeText(getURL(TEST_PAGE_B)));
onView(withId(org.chromium.chrome.R.id.url_bar)).perform(pressImeActionButton());
waitUntilViewAssertionTrue(
withId(R.id.autofill_assistant), doesNotExist(), DEFAULT_MAX_TIME_TO_POLL);
}
}