Commit 0d2c7dd9 authored by dfalcantara's avatar dfalcantara Committed by Commit bot

🔍 Add basic SearchActivityTests

Add a basic set of tests that start up the SearchActivity, confirming
that it starts up the browser for URLs and shows the suggestions
container when something is typed in the omnibox.

BUG=708844

Review-Url: https://codereview.chromium.org/2855543005
Cr-Commit-Position: refs/heads/master@{#469049}
parent dba5cb7d
......@@ -37,11 +37,26 @@ import org.chromium.ui.base.ActivityWindowAndroid;
/** Queries the user's default search engine and shows autocomplete suggestions. */
public class SearchActivity extends AsyncInitializationActivity
implements SnackbarManageable, SearchActivityLocationBarLayout.Delegate {
/** Notified about events happening inside a SearchActivity. */
public interface SearchActivityObserver {
/** Called when {@link SearchActivity#setContentView} is done. */
void onSetContentView();
/** Called when {@link SearchActivity#finishNativeInitialization} is done. */
void onFinishNativeInitialization();
/** Called when {@link SearchActivity#finishDeferredInitialization} is done. */
void onFinishDeferredInitialization();
}
private static final String TAG = "searchwidget";
/** Setting this field causes the Activity to finish itself immediately for tests. */
private static boolean sIsDisabledForTest;
/** Notified about events happening for the SearchActivity. */
private static SearchActivityObserver sObserver;
/** Main content view. */
private ViewGroup mContentView;
......@@ -84,14 +99,15 @@ public class SearchActivity extends AsyncInitializationActivity
mSnackbarManager = new SnackbarManager(this, null);
mSearchBoxDataProvider = new SearchBoxDataProvider();
// Build the search box.
mContentView = createContentView();
setContentView(mContentView);
// Build the search box.
mSearchBox = (SearchActivityLocationBarLayout) mContentView.findViewById(
R.id.search_location_bar);
mSearchBox.setDelegate(this);
mSearchBox.setToolbarDataProvider(mSearchBoxDataProvider);
mSearchBox.initializeControls(new WindowDelegate(getWindow()), getWindowAndroid());
setContentView(mContentView);
// Kick off everything needed for the user to type into the box.
// TODO(dfalcantara): We should prevent the user from doing anything while we're running the
......@@ -108,6 +124,8 @@ public class SearchActivity extends AsyncInitializationActivity
beginLoadingLibrary();
}
});
if (sObserver != null) sObserver.onSetContentView();
}
@Override
......@@ -139,6 +157,8 @@ public class SearchActivity extends AsyncInitializationActivity
}
});
}
if (sObserver != null) sObserver.onFinishNativeInitialization();
}
private void finishDeferredInitialization(Boolean result) {
......@@ -154,6 +174,8 @@ public class SearchActivity extends AsyncInitializationActivity
AutocompleteController.nativePrefetchZeroSuggestResults();
CustomTabsConnection.getInstance(getApplication()).warmup(0);
mSearchBox.onDeferredStartup(isVoiceSearchIntent());
if (sObserver != null) sObserver.onFinishDeferredInitialization();
}
@Override
......@@ -242,4 +264,10 @@ public class SearchActivity extends AsyncInitializationActivity
static void disableForTests() {
sIsDisabledForTest = true;
}
/** See {@link #sObserver}. */
@VisibleForTesting
static void setObserverForTests(SearchActivityObserver observer) {
sObserver = observer;
}
}
......@@ -201,7 +201,8 @@ public class SearchWidgetProvider extends AppWidgetProvider {
}
}
private static void startSearchActivity(Intent intent, boolean startVoiceSearch) {
@VisibleForTesting
static void startSearchActivity(Intent intent, boolean startVoiceSearch) {
Log.d(TAG, "Launching SearchActivity: VOICE=" + startVoiceSearch);
Context context = getDelegate().getContext();
......
......@@ -1558,6 +1558,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/provider/ProviderTestBase.java",
"javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java",
"javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java",
"javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java",
"javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java",
"javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java",
"javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
......
// Copyright 2017 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.searchwidget;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
import android.content.Intent;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.text.TextUtils;
import android.view.KeyEvent;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.ChromeTabbedActivity;
import org.chromium.chrome.browser.omnibox.UrlBar;
import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.MultiActivityTestRule;
import org.chromium.chrome.test.util.OmniboxTestUtils;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
import org.chromium.content.browser.test.util.KeyUtils;
/**
* Tests the {@link SearchActivity}.
*
* TODO(dfalcantara): Add tests for:
* + Checking that user can type in the box before native has loaded and still
* have suggestions appear.
*
* + Performing a search query.
* + Performing a search query while the SearchActivity is alive and the
* default search engine is changed outside the SearchActivity.
*
* + Handling the promo dialog.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public class SearchActivityTest {
private static class TestObserver implements SearchActivityObserver {
public final CallbackHelper onSetContentViewCallback = new CallbackHelper();
public final CallbackHelper onFinishNativeInitializationCallback = new CallbackHelper();
public final CallbackHelper onFinishDeferredInitializationCallback = new CallbackHelper();
@Override
public void onSetContentView() {
onSetContentViewCallback.notifyCalled();
}
@Override
public void onFinishNativeInitialization() {
onFinishNativeInitializationCallback.notifyCalled();
}
@Override
public void onFinishDeferredInitialization() {
onFinishDeferredInitializationCallback.notifyCalled();
}
}
@Rule
@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
public MultiActivityTestRule mTestRule = new MultiActivityTestRule();
private TestObserver mTestObserver;
@Before
public void setUp() {
mTestObserver = new TestObserver();
SearchActivity.setObserverForTests(mTestObserver);
}
@After
public void tearDown() {
SearchActivity.setObserverForTests(null);
}
@Test
@SmallTest
public void testOmniboxSuggestionContainerAppears() throws Exception {
Activity searchActivity = fullyStartSearchActivity();
// Type in anything. It should force the suggestions to appear.
setUrlBarText(searchActivity, "anything.");
final SearchActivityLocationBarLayout locationBar =
(SearchActivityLocationBarLayout) searchActivity.findViewById(
R.id.search_location_bar);
OmniboxTestUtils.waitForOmniboxSuggestions(locationBar);
}
@Test
@SmallTest
public void testStartsBrowserAfterUrlSubmitted() throws Exception {
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
Activity searchActivity = fullyStartSearchActivity();
// Monitor for ChromeTabbedActivity.
ActivityMonitor browserMonitor =
new ActivityMonitor(ChromeTabbedActivity.class.getName(), null, false);
instrumentation.addMonitor(browserMonitor);
// Type in a URL that should get kicked to ChromeTabbedActivity.
setUrlBarText(searchActivity, "about:blank");
final UrlBar urlBar = (UrlBar) searchActivity.findViewById(R.id.url_bar);
KeyUtils.singleKeyEventView(instrumentation, urlBar, KeyEvent.KEYCODE_ENTER);
// Wait for ChromeTabbedActivity to start.
final Activity browserActivity = instrumentation.waitForMonitorWithTimeout(
browserMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
Assert.assertNotNull("Activity didn't start", browserActivity);
Assert.assertTrue(
"Wrong activity started", browserActivity instanceof ChromeTabbedActivity);
CriteriaHelper.pollUiThread(new Criteria() {
@Override
public boolean isSatisfied() {
ChromeTabbedActivity chromeActivity = (ChromeTabbedActivity) browserActivity;
Tab tab = chromeActivity.getActivityTab();
if (tab == null) return false;
return TextUtils.equals("about:blank", tab.getUrl());
}
});
}
private Activity fullyStartSearchActivity() throws Exception {
final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
ActivityMonitor searchMonitor =
new ActivityMonitor(SearchActivity.class.getName(), null, false);
instrumentation.addMonitor(searchMonitor);
// The SearchActivity shouldn't have started yet.
Assert.assertEquals(0, mTestObserver.onSetContentViewCallback.getCallCount());
Assert.assertEquals(0, mTestObserver.onFinishNativeInitializationCallback.getCallCount());
Assert.assertEquals(0, mTestObserver.onFinishDeferredInitializationCallback.getCallCount());
// Fire the Intent to start up the SearchActivity.
Intent intent = new Intent();
SearchWidgetProvider.startSearchActivity(intent, false);
Activity searchActivity = instrumentation.waitForMonitorWithTimeout(
searchMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
Assert.assertNotNull("Activity didn't start", searchActivity);
Assert.assertTrue("Wrong activity started", searchActivity instanceof SearchActivity);
// Wait for the Activity fully load.
mTestObserver.onSetContentViewCallback.waitForCallback(0);
mTestObserver.onFinishNativeInitializationCallback.waitForCallback(0);
mTestObserver.onFinishDeferredInitializationCallback.waitForCallback(0);
instrumentation.removeMonitor(searchMonitor);
return searchActivity;
}
@SuppressLint("SetTextI18n")
private void setUrlBarText(final Activity activity, final String url) {
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
UrlBar urlBar = (UrlBar) activity.findViewById(R.id.url_bar);
urlBar.setText(url);
}
});
}
}
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