Commit 320fc7a4 authored by Ted Choc's avatar Ted Choc Committed by Commit Bot

Remove unnecessarily complicated OmniboxTest with more focused tests.

UrlBarTest#testUrlTextChangeListener ensures we actually get updates
about text changes.

AutocompleteMediatorUnitTest#onTextChanged_* ensure that given signals
about text changes, it starts the correct autocomplete request.

AutocompleteMediatorUnitTest#onSuggestionsReceived_sendsOnSuggestionsChanged
ensures that we broadcast updates for inline autocomplete text.

BUG=1062563

Change-Id: I518d308d6ae8f37f6351cda83e5c9c199e559bf9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2111765Reviewed-by: default avatarBrandon Wylie <wylieb@chromium.org>
Commit-Queue: Ted Choc <tedchoc@chromium.org>
Cr-Commit-Position: refs/heads/master@{#752255}
parent 995f9ffd
......@@ -6,6 +6,7 @@ package org.chromium.chrome.browser.omnibox.suggestions;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
......@@ -35,7 +36,7 @@ public class AutocompleteController {
private long mNativeAutocompleteControllerAndroid;
private long mCurrentNativeAutocompleteResult;
private final OnSuggestionsReceivedListener mListener;
private OnSuggestionsReceivedListener mListener;
private final VoiceSuggestionProvider mVoiceSuggestionProvider = new VoiceSuggestionProvider();
private boolean mUseCachedZeroSuggestResults;
......@@ -49,15 +50,10 @@ public class AutocompleteController {
List<OmniboxSuggestion> suggestions, String inlineAutocompleteText);
}
public AutocompleteController(OnSuggestionsReceivedListener listener) {
this(null, listener);
}
public AutocompleteController(Profile profile, OnSuggestionsReceivedListener listener) {
if (profile != null) {
mNativeAutocompleteControllerAndroid =
AutocompleteControllerJni.get().init(AutocompleteController.this, profile);
}
/**
* @param listener The listener to be notified when new suggestions are available.
*/
public void setOnSuggestionsReceivedListener(@NonNull OnSuggestionsReceivedListener listener) {
mListener = listener;
}
......@@ -72,6 +68,7 @@ public class AutocompleteController {
* @param profile The profile to reset the AutocompleteController with.
*/
public void setProfile(Profile profile) {
assert mListener != null : "Ensure a listener is set prior to calling.";
stop(true);
if (profile == null) {
mNativeAutocompleteControllerAndroid = 0;
......@@ -87,6 +84,7 @@ public class AutocompleteController {
* for all zero suggest updates.
*/
void startCachedZeroSuggest() {
assert mListener != null : "Ensure a listener is set prior to calling.";
mUseCachedZeroSuggestResults = true;
List<OmniboxSuggestion> suggestions =
OmniboxSuggestion.getCachedOmniboxSuggestionsForZeroSuggest();
......@@ -106,6 +104,7 @@ public class AutocompleteController {
*/
public void start(Profile profile, String url, int pageClassification, String text,
int cursorPosition, boolean preventInlineAutocomplete) {
assert mListener != null : "Ensure a listener is set prior to calling.";
// crbug.com/764749
Log.w(TAG, "starting autocomplete controller..[%b][%b]", profile == null,
TextUtils.isEmpty(url));
......@@ -156,6 +155,7 @@ public class AutocompleteController {
*/
public void startZeroSuggest(
Profile profile, String omniboxText, String url, int pageClassification, String title) {
assert mListener != null : "Ensure a listener is set prior to calling.";
if (profile == null || TextUtils.isEmpty(url)) return;
if (!NewTabPage.isNTPUrl(url)) {
......@@ -184,6 +184,7 @@ public class AutocompleteController {
* @param clear Whether to clear the most recent autocomplete results.
*/
public void stop(boolean clear) {
assert mListener != null : "Ensure a listener is set prior to calling.";
if (clear) mVoiceSuggestionProvider.clearVoiceSearchResults();
mCurrentNativeAutocompleteResult = 0;
mWaitingForSuggestionsToCache = false;
......@@ -228,7 +229,7 @@ public class AutocompleteController {
@CalledByNative
protected void onSuggestionsReceived(List<OmniboxSuggestion> suggestions,
String inlineAutocompleteText, long currentNativeAutocompleteResult) {
assert mListener != null : "Ensure a listener is set prior generating suggestions.";
// Run through new providers to get an updated list of suggestions.
suggestions = mVoiceSuggestionProvider.addVoiceSuggestions(
suggestions, MAX_VOICE_SUGGESTION_COUNT);
......
......@@ -68,8 +68,8 @@ public class AutocompleteCoordinatorImpl implements AutocompleteCoordinator {
PropertyModel listModel = new PropertyModel(SuggestionListProperties.ALL_KEYS);
ModelList listItems = new ModelList();
mMediator =
new AutocompleteMediator(context, delegate, urlBarEditingTextProvider, listModel);
mMediator = new AutocompleteMediator(context, delegate, urlBarEditingTextProvider,
new AutocompleteController(), listModel);
mMediator.initDefaultProcessors();
listModel.set(SuggestionListProperties.EMBEDDER, listEmbedder);
......
......@@ -189,12 +189,14 @@ class AutocompleteMediator implements OnSuggestionsReceivedListener, StartStopWi
private LargeIconBridge mIconBridge;
public AutocompleteMediator(Context context, AutocompleteDelegate delegate,
UrlBarEditingTextStateProvider textProvider, PropertyModel listPropertyModel) {
UrlBarEditingTextStateProvider textProvider,
AutocompleteController autocompleteController, PropertyModel listPropertyModel) {
mContext = context;
mDelegate = delegate;
mUrlBarEditingTextProvider = textProvider;
mListPropertyModel = listPropertyModel;
mAutocomplete = new AutocompleteController(this);
mAutocomplete = autocompleteController;
mAutocomplete.setOnSuggestionsReceivedListener(this);
mHandler = new Handler();
mSuggestionProcessors = new ArrayList<>();
mAvailableSuggestions = new ArrayList<>();
......
......@@ -7,7 +7,6 @@ package org.chromium.chrome.browser.omnibox;
import static org.chromium.chrome.test.util.OmniboxTestUtils.buildSuggestionMap;
import android.annotation.SuppressLint;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.SystemClock;
import android.support.test.InstrumentationRegistry;
......@@ -326,83 +325,6 @@ public class OmniboxTest {
Assert.assertEquals("Location bar should have text.", "G", urlBar.getText().toString());
}
@Test
@DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O, message = "crbug.com/1027549")
@MediumTest
@Feature({"Omnibox", "Main"})
@RetryOnFailure
public void testAutoCompleteAndCorrectionLandscape()
throws ExecutionException, InterruptedException {
// Default orientation for tablets is landscape. Default for phones is portrait.
int requestedOrientation = 1;
if (mActivityTestRule.getActivity().isTablet()) {
requestedOrientation = 0;
}
doTestAutoCompleteAndCorrectionForOrientation(requestedOrientation);
// Reset orientation.
mActivityTestRule.getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
@Test
@DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O, message = "crbug.com/1027549")
@MediumTest
@Feature({"Omnibox", "Main"})
@RetryOnFailure
public void testAutoCompleteAndCorrectionPortrait()
throws ExecutionException, InterruptedException {
// Default orientation for tablets is landscape. Default for phones is portrait.
int requestedOrientation = 0;
if (mActivityTestRule.getActivity().isTablet()) {
requestedOrientation = 1;
}
doTestAutoCompleteAndCorrectionForOrientation(requestedOrientation);
// Reset device orientation.
mActivityTestRule.getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
private void doTestAutoCompleteAndCorrectionForOrientation(
int orientation) throws ExecutionException, InterruptedException {
mActivityTestRule.getActivity().setRequestedOrientation(orientation);
UiUtils.settleDownUI(InstrumentationRegistry.getInstrumentation());
Map<String, List<SuggestionsResult>> suggestionsMap = buildSuggestionMap(
new TestSuggestionResultsBuilder()
.setTextShownFor("wiki")
.addSuggestions(new SuggestionsResultBuilder()
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"wikipedia", null)
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"wiki", null)
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"wikileaks", null)
.setAutocompleteText("pedia")),
new TestSuggestionResultsBuilder()
.setTextShownFor("onomatop")
.addSuggestions(new SuggestionsResultBuilder()
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"onomatopoeia", null)
.addGeneratedSuggestion(
OmniboxSuggestionType.SEARCH_SUGGEST,
"onomatopoeia foo", null)
.setAutocompleteText("oeia")),
new TestSuggestionResultsBuilder()
.setTextShownFor("mispellled")
.addSuggestions(new SuggestionsResultBuilder()
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"misspelled", null)
.addGeneratedSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST,
"misspelled words", null)
.setAutocompleteText(""))
);
checkAutocompleteText(suggestionsMap, "wiki", "wikipedia", 4, 9);
checkAutocompleteText(suggestionsMap, "onomatop", "onomatopoeia", 8, 12);
checkAutocompleteText(suggestionsMap, "mispellled", "mispellled", 10, 10);
}
@Test
@DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O, message = "crbug.com/1027549")
@MediumTest
......
......@@ -24,6 +24,7 @@ import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
......@@ -837,4 +838,24 @@ public class UrlBarTest extends DummyUiActivityTestCase {
Assert.assertEquals(BaseInputConnection.getComposingSpanStart(urlText), 10);
Assert.assertEquals(BaseInputConnection.getComposingSpanEnd(urlText), 22);
}
@Test
@SmallTest
@Feature({"Omnibox"})
@RetryOnFailure
public void testUrlTextChangeListener() {
toggleFocusAndIgnoreImeOperations(mUrlBar, true);
UrlBar.UrlTextChangeListener listener = Mockito.mock(UrlBar.UrlTextChangeListener.class);
mUrlBar.setUrlTextChangeListener(listener);
setTextAndVerifyNoAutocomplete("onomatop");
Mockito.verify(listener).onTextChanged("onomatop", "onomatop");
// Setting autocomplete does not send a change update.
setAutocomplete("onomatop", "oeia");
setTextAndVerifyNoAutocomplete("");
Mockito.verify(listener).onTextChanged("", "");
}
}
......@@ -5,7 +5,7 @@ include_rules = [
"+chrome/browser/image_fetcher",
"+chrome/browser/preferences/android/java",
"+chrome/android/java/src/org/chromium/chrome/browser/ssl/ChromeSecurityStateModelDelegate.java",
"+components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java",
"+chrome/browser/profiles/android",
"+chrome/browser/thumbnail/generator/android/java",
"+chrome/browser/ui/messages/android/java",
"+chrome/browser/util",
......@@ -17,6 +17,7 @@ include_rules = [
"+components/omnibox/browser/android/java/src/org/chromium/components/omnibox",
"+components/payments/content/android/java/src/org/chromium/components/payments",
"+components/search_engines/android/java/src/org/chromium/components/search_engines",
"+components/security_state/content/android/java/src/org/chromium/components/security_state/SecurityStateModel.java",
"+components/sync/android/java/src/org/chromium/components/sync",
"+components/sync/test/android/javatests/src/org/chromium/components/sync/test/util",
......
......@@ -11,6 +11,7 @@ import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.app.Activity;
......@@ -22,13 +23,17 @@ import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.toolbar.ToolbarDataProvider;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
......@@ -58,6 +63,12 @@ public class AutocompleteMediatorUnitTest {
@Mock
SuggestionProcessor mMockProcessor;
@Mock
AutocompleteController mAutocompleteController;
@Mock
ToolbarDataProvider mToolbarDataProvider;
private Activity mActivity;
private PropertyModel mListModel;
private AutocompleteMediator mMediator;
......@@ -76,8 +87,9 @@ public class AutocompleteMediatorUnitTest {
mListModel.set(SuggestionListProperties.SUGGESTION_MODELS, mSuggestionModels);
mMediator = new AutocompleteMediator(
mActivity, mAutocompleteDelegate, mTextStateProvider, mListModel);
mMediator = new AutocompleteMediator(mActivity, mAutocompleteDelegate, mTextStateProvider,
mAutocompleteController, mListModel);
mMediator.setToolbarDataProvider(mToolbarDataProvider);
mMediator.registerSuggestionProcessor(mMockProcessor);
mMediator.setSuggestionVisibilityState(
AutocompleteMediator.SuggestionVisibilityState.ALLOWED);
......@@ -338,4 +350,90 @@ public class AutocompleteMediatorUnitTest {
verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(false));
}
@Test
@Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT,
ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP})
public void onTextChanged_emptyTextTriggersZeroSuggest() {
when(mAutocompleteDelegate.isUrlBarFocused()).thenReturn(true);
when(mAutocompleteDelegate.didFocusUrlFromFakebox()).thenReturn(false);
Profile profile = Mockito.mock(Profile.class);
String url = "http://www.example.com";
String title = "Title";
int pageClassification = 2;
when(mToolbarDataProvider.getProfile()).thenReturn(profile);
when(mToolbarDataProvider.getCurrentUrl()).thenReturn(url);
when(mToolbarDataProvider.getTitle()).thenReturn(title);
when(mToolbarDataProvider.hasTab()).thenReturn(true);
when(mToolbarDataProvider.getPageClassification(false)).thenReturn(pageClassification);
when(mTextStateProvider.getTextWithAutocomplete()).thenReturn("");
mMediator.onNativeInitialized();
mMediator.onTextChanged("", "");
verify(mAutocompleteController)
.startZeroSuggest(profile, "", url, pageClassification, title);
}
@Test
@Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT,
ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP})
public void onTextChanged_nonEmptyTextTriggersSuggestions() {
Profile profile = Mockito.mock(Profile.class);
String url = "http://www.example.com";
int pageClassification = 2;
when(mToolbarDataProvider.getProfile()).thenReturn(profile);
when(mToolbarDataProvider.getCurrentUrl()).thenReturn(url);
when(mToolbarDataProvider.hasTab()).thenReturn(true);
when(mToolbarDataProvider.getPageClassification(false)).thenReturn(pageClassification);
when(mTextStateProvider.shouldAutocomplete()).thenReturn(true);
when(mTextStateProvider.getSelectionStart()).thenReturn(4);
when(mTextStateProvider.getSelectionEnd()).thenReturn(4);
mMediator.onNativeInitialized();
mMediator.onTextChanged("test", "testing");
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
verify(mAutocompleteController).start(profile, url, pageClassification, "test", 4, false);
}
@Test
@Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT,
ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP})
public void onTextChanged_cancelsPendingRequests() {
Profile profile = Mockito.mock(Profile.class);
String url = "http://www.example.com";
int pageClassification = 2;
when(mToolbarDataProvider.getProfile()).thenReturn(profile);
when(mToolbarDataProvider.getCurrentUrl()).thenReturn(url);
when(mToolbarDataProvider.hasTab()).thenReturn(true);
when(mToolbarDataProvider.getPageClassification(false)).thenReturn(pageClassification);
when(mTextStateProvider.shouldAutocomplete()).thenReturn(true);
when(mTextStateProvider.getSelectionStart()).thenReturn(4);
when(mTextStateProvider.getSelectionEnd()).thenReturn(4);
mMediator.onNativeInitialized();
mMediator.onTextChanged("test", "testing");
mMediator.onTextChanged("nottest", "nottesting");
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
verify(mAutocompleteController)
.start(profile, url, pageClassification, "nottest", 4, false);
}
@Test
@Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT,
ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP})
public void onSuggestionsReceived_sendsOnSuggestionsChanged() {
mMediator.onNativeInitialized();
mMediator.onSuggestionsReceived(mSuggestionsList, "inline_autocomplete");
verify(mAutocompleteDelegate).onSuggestionsChanged("inline_autocomplete");
// Ensure duplicate requests are suppressed.
mMediator.onSuggestionsReceived(mSuggestionsList, "inline_autocomplete2");
verifyNoMoreInteractions(mAutocompleteDelegate);
}
}
......@@ -138,9 +138,9 @@ public class OmniboxTestUtils {
View view,
OnSuggestionsReceivedListener listener,
Map<String, List<SuggestionsResult>> suggestions) {
super(listener);
mView = view;
mSuggestions = suggestions;
setOnSuggestionsReceivedListener(listener);
}
@Override
......@@ -194,7 +194,8 @@ public class OmniboxTestUtils {
*/
public static class StubAutocompleteController extends AutocompleteController {
public StubAutocompleteController() {
super(new OnSuggestionsReceivedListener() {
super();
setOnSuggestionsReceivedListener(new OnSuggestionsReceivedListener() {
@Override
public void onSuggestionsReceived(List<OmniboxSuggestion> suggestions,
String inlineAutocompleteText) {
......
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