| Index: chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
|
| diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f981843113087b188eb339c11a9403b6e3e664af
|
| --- /dev/null
|
| +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
|
| @@ -0,0 +1,378 @@
|
| +// 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.test;
|
| +
|
| +import android.app.Instrumentation;
|
| +import android.content.Context;
|
| +import android.content.Intent;
|
| +import android.os.AsyncTask;
|
| +import android.support.test.InstrumentationRegistry;
|
| +import android.support.test.rule.ActivityTestRule;
|
| +
|
| +import org.junit.runner.Description;
|
| +import org.junit.runners.model.Statement;
|
| +
|
| +import org.chromium.chrome.browser.ChromeActivity;
|
| +import org.chromium.chrome.browser.infobar.InfoBar;
|
| +import org.chromium.chrome.browser.omnibox.OmniboxSuggestion;
|
| +import org.chromium.chrome.browser.preferences.Preferences;
|
| +import org.chromium.chrome.browser.tab.Tab;
|
| +import org.chromium.chrome.test.ChromeActivityTestCommon.ChromeTestCommonCallback;
|
| +import org.chromium.chrome.test.util.ApplicationTestUtils;
|
| +
|
| +import java.util.List;
|
| +import java.util.concurrent.TimeoutException;
|
| +
|
| +//TODO(yolandyan): break this test rule down to smaller rules once the junit4 migration is over
|
| +public class ChromeActivityTestRule<T extends ChromeActivity>
|
| + extends ActivityTestRule<T> implements ChromeTestCommonCallback<T> {
|
| + private final ChromeActivityTestCommon<T> mTestCommon;
|
| + private String mCurrentTestName;
|
| +
|
| + public static final String DISABLE_NETWORK_PREDICTION_FLAG =
|
| + "--disable-features=NetworkPrediction";
|
| +
|
| + // ChromeActivityTestRule
|
| + private T mSetActivity;
|
| +
|
| + /**
|
| + * @param activityClass
|
| + */
|
| + public ChromeActivityTestRule(Class<T> activityClass) {
|
| + this(activityClass, false);
|
| + }
|
| +
|
| + public ChromeActivityTestRule(Class<T> activityClass, boolean initialTouchMode) {
|
| + super(activityClass, initialTouchMode, false);
|
| + mTestCommon = new ChromeActivityTestCommon<T>(activityClass, this);
|
| + }
|
| +
|
| + @Override
|
| + public Statement apply(final Statement base, Description description) {
|
| + mCurrentTestName = description.getMethodName();
|
| + final Statement superBase = super.apply(new Statement() {
|
| + @Override
|
| + public void evaluate() throws Throwable {
|
| + mTestCommon.setUp();
|
| + base.evaluate();
|
| + }
|
| + }, description);
|
| + return new Statement() {
|
| + @Override
|
| + public void evaluate() throws Throwable {
|
| + String perfTagAnalysisString = mTestCommon.setupPotentialPerfTest();
|
| + superBase.evaluate();
|
| + mTestCommon.endPerfTest(perfTagAnalysisString);
|
| + }
|
| + };
|
| + }
|
| +
|
| + /**
|
| + * Return the timeout limit for Chrome activty start in tests
|
| + */
|
| + public static int getActivityStartTimeoutMs() {
|
| + return ChromeActivityTestCommon.ACTIVITY_START_TIMEOUT_MS;
|
| + }
|
| +
|
| + @Override
|
| + protected void afterActivityFinished() {
|
| + try {
|
| + mTestCommon.tearDown();
|
| + } catch (Exception e) {
|
| + throw new RuntimeException("Failed to tearDown", e);
|
| + }
|
| + super.afterActivityFinished();
|
| + }
|
| +
|
| + // TODO(yolandyan): remove this once startActivityCompletely is refactored out of
|
| + // ChromeActivityTestRule
|
| + @Override
|
| + public T getActivity() {
|
| + if (mSetActivity != null) {
|
| + return mSetActivity;
|
| + }
|
| + return super.getActivity();
|
| + }
|
| +
|
| + /**
|
| + * Matches testString against baseString.
|
| + * Returns 0 if there is no match, 1 if an exact match and 2 if a fuzzy match.
|
| + */
|
| + public static int matchUrl(String baseString, String testString) {
|
| + return ChromeActivityTestCommon.matchUrl(baseString, testString);
|
| + }
|
| +
|
| + /**
|
| + * Invokes {@link Instrumentation#startActivitySync(Intent)} and sets the
|
| + * test case's activity to the result. See the documentation for
|
| + * {@link Instrumentation#startActivitySync(Intent)} on the timing of the
|
| + * return, but generally speaking the activity's "onCreate" has completed
|
| + * and the activity's main looper has become idle.
|
| + */
|
| + public void startActivityCompletely(Intent intent) {
|
| + mTestCommon.startActivityCompletely(intent);
|
| + }
|
| +
|
| + /** Convenience function for {@link ApplicationTestUtils#clearAppData(Context)}. */
|
| + public void clearAppData() {
|
| + mTestCommon.clearAppData();
|
| + }
|
| +
|
| + /**
|
| + * Enables or disables network predictions, i.e. prerendering, prefetching, DNS preresolution,
|
| + * etc. Network predictions are enabled by default.
|
| + */
|
| + public void setNetworkPredictionEnabled(final boolean enabled) {
|
| + mTestCommon.setNetworkPredictionEnabled(enabled);
|
| + }
|
| +
|
| + /**
|
| + * Waits for {@link AsyncTask}'s that have been queued to finish. Note, this
|
| + * only waits for tasks that have been started using the default
|
| + * {@link java.util.concurrent.Executor}, which executes tasks serially.
|
| + *
|
| + * @param timeout how long to wait for tasks to complete
|
| + */
|
| + public void waitForAsyncTasks(long timeout) throws InterruptedException {
|
| + mTestCommon.waitForAsyncTasks(timeout);
|
| + }
|
| +
|
| + /**
|
| + * Navigates to a URL directly without going through the UrlBar. This bypasses the page
|
| + * preloading mechanism of the UrlBar.
|
| + * @param url The url to load in the current tab.
|
| + * @param secondsToWait The number of seconds to wait for the page to be loaded.
|
| + * @return FULL_PRERENDERED_PAGE_LOAD or PARTIAL_PRERENDERED_PAGE_LOAD if the page has been
|
| + * prerendered. DEFAULT_PAGE_LOAD if it had not.
|
| + */
|
| + public int loadUrl(String url, long secondsToWait)
|
| + throws IllegalArgumentException, InterruptedException {
|
| + return mTestCommon.loadUrl(url, secondsToWait);
|
| + }
|
| +
|
| + /**
|
| + * Navigates to a URL directly without going through the UrlBar. This bypasses the page
|
| + * preloading mechanism of the UrlBar.
|
| + * @param url The url to load in the current tab.
|
| + * @return FULL_PRERENDERED_PAGE_LOAD or PARTIAL_PRERENDERED_PAGE_LOAD if the page has been
|
| + * prerendered. DEFAULT_PAGE_LOAD if it had not.
|
| + */
|
| + public int loadUrl(String url) throws IllegalArgumentException, InterruptedException {
|
| + return mTestCommon.loadUrl(url);
|
| + }
|
| +
|
| + /**
|
| + * @param url The url of the page to load.
|
| + * @param pageTransition The type of transition. see
|
| + * {@link org.chromium.ui.base.PageTransition}
|
| + * for valid values.
|
| + * @param tab The tab to load the url into.
|
| + * @param secondsToWait The number of seconds to wait for the page to be loaded.
|
| + * @return FULL_PRERENDERED_PAGE_LOAD or PARTIAL_PRERENDERED_PAGE_LOAD if the
|
| + * page has been prerendered. DEFAULT_PAGE_LOAD if it had not.
|
| + */
|
| + public int loadUrlInTab(String url, int pageTransition, Tab tab, long secondsToWait)
|
| + throws InterruptedException {
|
| + return mTestCommon.loadUrlInTab(url, pageTransition, tab, secondsToWait);
|
| + }
|
| +
|
| + /**
|
| + * @param url The url of the page to load.
|
| + * @param pageTransition The type of transition. see
|
| + * {@link org.chromium.ui.base.PageTransition}
|
| + * for valid values.
|
| + * @param tab The tab to load the url into.
|
| + * @return FULL_PRERENDERED_PAGE_LOAD or PARTIAL_PRERENDERED_PAGE_LOAD if the
|
| + * page has been prerendered. DEFAULT_PAGE_LOAD if it had not.
|
| + */
|
| + public int loadUrlInTab(String url, int pageTransition, Tab tab) throws InterruptedException {
|
| + return mTestCommon.loadUrlInTab(url, pageTransition, tab);
|
| + }
|
| +
|
| + /**
|
| + * Load a url in a new tab. The {@link Tab} will pretend to be created from a link.
|
| + * @param url The url of the page to load.
|
| + */
|
| + public Tab loadUrlInNewTab(String url) throws InterruptedException {
|
| + return mTestCommon.loadUrlInNewTab(url);
|
| + }
|
| +
|
| + /**
|
| + * Load a url in a new tab. The {@link Tab} will pretend to be created from a link.
|
| + * @param url The url of the page to load.
|
| + * @param incognito Whether the new tab should be incognito.
|
| + */
|
| + public Tab loadUrlInNewTab(final String url, final boolean incognito)
|
| + throws InterruptedException {
|
| + return mTestCommon.loadUrlInNewTab(url, incognito);
|
| + }
|
| +
|
| + /**
|
| + * Simulates starting Main Activity from launcher, blocks until it is started.
|
| + */
|
| + public void startMainActivityFromLauncher() throws InterruptedException {
|
| + startMainActivityWithURL(null);
|
| + }
|
| +
|
| + /**
|
| + * Starts the Main activity on the specified URL. Passing a null URL ensures the default page is
|
| + * loaded, which is the NTP with a new profile .
|
| + */
|
| + public void startMainActivityWithURL(String url) throws InterruptedException {
|
| + // Only launch Chrome.
|
| + mTestCommon.startMainActivityWithURL(url);
|
| + }
|
| +
|
| + /**
|
| + * Starts the Main activity and open a blank page.
|
| + * This is faster and less flakyness-prone than starting on the NTP.
|
| + */
|
| + public void startMainActivityOnBlankPage() throws InterruptedException {
|
| + mTestCommon.startMainActivityOnBlankPage();
|
| + }
|
| +
|
| + /**
|
| + * Starts the Main activity as if it was started from an external application, on the specified
|
| + * URL.
|
| + */
|
| + public void startMainActivityFromExternalApp(String url, String appId)
|
| + throws InterruptedException {
|
| + mTestCommon.startMainActivityFromExternalApp(url, appId);
|
| + }
|
| +
|
| + /**
|
| + * Starts the Main activity using the passed intent, and using the specified URL.
|
| + * This method waits for DEFERRED_STARTUP to fire as well as a subsequent
|
| + * idle-sync of the main looper thread, and the initial tab must either
|
| + * complete its load or it must crash before this method will return.
|
| + */
|
| + public void startMainActivityFromIntent(Intent intent, String url) throws InterruptedException {
|
| + mTestCommon.startMainActivityFromIntent(intent, url);
|
| + }
|
| +
|
| + /**
|
| + * Prepares a URL intent to start the activity.
|
| + * @param intent the intent to be modified
|
| + * @param url the URL to be used (may be null)
|
| + */
|
| + public Intent prepareUrlIntent(Intent intent, String url) {
|
| + return mTestCommon.prepareUrlIntent(intent, url);
|
| + }
|
| +
|
| + /**
|
| + * Open an incognito tab by invoking the 'new incognito' menu item.
|
| + * Returns when receiving the 'PAGE_LOAD_FINISHED' notification.
|
| + *
|
| + * TODO(yolandyan): split this into the seperate test rule, this only applies to tabbed mode
|
| + */
|
| + public void newIncognitoTabFromMenu() throws InterruptedException {
|
| + mTestCommon.newIncognitoTabFromMenu();
|
| + }
|
| +
|
| + /**
|
| + * New multiple incognito tabs by invoking the 'new incognito' menu item n times.
|
| + * @param n The number of tabs you want to create.
|
| + *
|
| + * TODO(yolandyan): split this into the seperate test rule, this only applies to tabbed mode
|
| + */
|
| + public void newIncognitoTabsFromMenu(int n) throws InterruptedException {
|
| + mTestCommon.newIncognitoTabsFromMenu(n);
|
| + }
|
| +
|
| + /**
|
| + * @return The number of incognito tabs currently open.
|
| + */
|
| + public int incognitoTabsCount() {
|
| + return mTestCommon.incognitoTabsCount();
|
| + }
|
| +
|
| + /**
|
| + * Looks up the Omnibox in the view hierarchy and types the specified
|
| + * text into it, requesting focus and using an inter-character delay of
|
| + * 200ms.
|
| + *
|
| + * @param oneCharAtATime Whether to type text one character at a time or all at once.
|
| + *
|
| + * @throws InterruptedException
|
| + *
|
| + * TODO(yolandyan): split this into the seperate test rule, this only applies to tabbed mode
|
| + */
|
| + public void typeInOmnibox(String text, boolean oneCharAtATime) throws InterruptedException {
|
| + mTestCommon.typeInOmnibox(text, oneCharAtATime);
|
| + }
|
| +
|
| + /**
|
| + * Searches for a given suggestion after typing given text in the Omnibox.
|
| + *
|
| + * @param inputText Input text to type into the Omnibox.
|
| + * @param displayText Suggestion text expected to be found. Passing in null ignores this field.
|
| + * @param url URL expected to be found. Passing in null ignores this field.
|
| + * @param type Type of suggestion expected to be found. Passing in null ignores this field.
|
| + *
|
| + * @throws InterruptedException
|
| + */
|
| + public OmniboxSuggestion findOmniboxSuggestion(String inputText, String displayText, String url,
|
| + int type) throws InterruptedException {
|
| + return mTestCommon.findOmniboxSuggestion(inputText, displayText, url, type);
|
| + }
|
| +
|
| + /**
|
| + * Returns the infobars being displayed by the current tab, or null if they don't exist.
|
| + */
|
| + public List<InfoBar> getInfoBars() {
|
| + return mTestCommon.getInfoBars();
|
| + }
|
| +
|
| + /**
|
| + * Launches the preferences menu and starts the preferences activity named fragmentName.
|
| + * Returns the activity that was started.
|
| + */
|
| + public Preferences startPreferences(String fragmentName) {
|
| + return mTestCommon.startPreferences(fragmentName);
|
| + }
|
| +
|
| + /**
|
| + * Executes the given snippet of JavaScript code within the current tab. Returns the result of
|
| + * its execution in JSON format.
|
| + * @throws InterruptedException
|
| + */
|
| + public String runJavaScriptCodeInCurrentTab(String code)
|
| + throws InterruptedException, TimeoutException {
|
| + return mTestCommon.runJavaScriptCodeInCurrentTab(code);
|
| + }
|
| +
|
| + /**
|
| + * Waits till the ContentViewCore receives the expected page scale factor
|
| + * from the compositor and asserts that this happens.
|
| + */
|
| + public void assertWaitForPageScaleFactorMatch(float expectedScale) {
|
| + mTestCommon.assertWaitForPageScaleFactorMatch(expectedScale);
|
| + }
|
| +
|
| + public String getName() {
|
| + return mCurrentTestName;
|
| + }
|
| +
|
| + @Override
|
| + public String getTestName() {
|
| + return mCurrentTestName;
|
| + }
|
| +
|
| + @Override
|
| + public Instrumentation getInstrumentation() {
|
| + return InstrumentationRegistry.getInstrumentation();
|
| + }
|
| +
|
| + /**
|
| + * ActitivityTestRule already set initial touch mode in constructor.
|
| + */
|
| + @Override
|
| + public void setActivityInitialTouchMode(boolean touchMode) {}
|
| +
|
| + @Override
|
| + public void setActivity(T chromeActivity) {
|
| + mSetActivity = chromeActivity;
|
| + }
|
| +}
|
|
|