| Index: chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCommon.java
|
| diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCommon.java
|
| similarity index 68%
|
| copy from chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java
|
| copy to chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCommon.java
|
| index 725048b20a738a0c80dc3698b1d1cc99e172b3ea..c26b1ac52a999472a92f843bc207b77b7c1b77d1 100644
|
| --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCaseBase.java
|
| +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestCommon.java
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// 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.
|
|
|
| @@ -13,11 +13,12 @@ import android.net.Uri;
|
| import android.os.AsyncTask;
|
| import android.os.Bundle;
|
| import android.provider.Browser;
|
| -import android.test.InstrumentationTestRunner;
|
| +import android.support.test.internal.runner.listener.InstrumentationResultPrinter;
|
| import android.text.TextUtils;
|
| -import android.view.View;
|
| import android.widget.ListView;
|
|
|
| +import org.junit.Assert;
|
| +
|
| import org.chromium.base.ActivityState;
|
| import org.chromium.base.ApplicationStatus;
|
| import org.chromium.base.ApplicationStatus.ActivityStateListener;
|
| @@ -25,14 +26,10 @@ import org.chromium.base.Log;
|
| import org.chromium.base.PerfTraceEvent;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.annotations.SuppressFBWarnings;
|
| -import org.chromium.base.test.BaseActivityInstrumentationTestCase;
|
| import org.chromium.base.test.util.CallbackHelper;
|
| -import org.chromium.base.test.util.CommandLineFlags;
|
| import org.chromium.base.test.util.PerfTest;
|
| -import org.chromium.base.test.util.parameter.BaseParameter;
|
| import org.chromium.chrome.R;
|
| import org.chromium.chrome.browser.ChromeActivity;
|
| -import org.chromium.chrome.browser.ChromeSwitches;
|
| import org.chromium.chrome.browser.ChromeTabbedActivity;
|
| import org.chromium.chrome.browser.DeferredStartupHandler;
|
| import org.chromium.chrome.browser.document.ChromeLauncherActivity;
|
| @@ -56,15 +53,10 @@ import org.chromium.chrome.test.util.ApplicationTestUtils;
|
| import org.chromium.chrome.test.util.ChromeTabUtils;
|
| import org.chromium.chrome.test.util.MenuUtils;
|
| import org.chromium.chrome.test.util.NewTabPageTestUtils;
|
| -import org.chromium.chrome.test.util.parameters.AddFakeAccountToAppParameter;
|
| -import org.chromium.chrome.test.util.parameters.AddFakeAccountToOsParameter;
|
| -import org.chromium.chrome.test.util.parameters.AddGoogleAccountToOsParameter;
|
| import org.chromium.content.browser.test.util.Criteria;
|
| import org.chromium.content.browser.test.util.CriteriaHelper;
|
| import org.chromium.content.browser.test.util.JavaScriptUtils;
|
| import org.chromium.content.browser.test.util.RenderProcessLimit;
|
| -import org.chromium.content.browser.test.util.TestTouchUtils;
|
| -import org.chromium.content.browser.test.util.TouchCommon;
|
| import org.chromium.content_public.browser.LoadUrlParams;
|
| import org.chromium.ui.base.PageTransition;
|
|
|
| @@ -74,7 +66,6 @@ import java.lang.reflect.Method;
|
| import java.util.Calendar;
|
| import java.util.LinkedList;
|
| import java.util.List;
|
| -import java.util.Map;
|
| import java.util.concurrent.Callable;
|
| import java.util.concurrent.ExecutionException;
|
| import java.util.concurrent.Semaphore;
|
| @@ -83,23 +74,11 @@ import java.util.concurrent.TimeoutException;
|
| import java.util.concurrent.atomic.AtomicInteger;
|
| import java.util.concurrent.atomic.AtomicReference;
|
|
|
| -/**
|
| - * Base class for all Chrome instrumentation tests.
|
| - * All tests must inherit from this class and define their own test methods
|
| - * See ChromeTabbedActivityTestBase.java for example.
|
| - * @param <T> A {@link ChromeActivity} class
|
| - */
|
| -@CommandLineFlags.Add({
|
| - ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
|
| - // Preconnect causes issues with the single-threaded Java test server.
|
| - "--disable-features=NetworkPrediction"})
|
| -public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| - extends BaseActivityInstrumentationTestCase<T> {
|
| -
|
| - private static final String TAG = "cr_CATestCaseBase";
|
| +final class ChromeActivityTestCommon<T extends ChromeActivity> {
|
| + private static final String TAG = "cr_CATestCommon";
|
|
|
| // The number of ms to wait for the rendering activity to be started.
|
| - protected static final int ACTIVITY_START_TIMEOUT_MS = 1000;
|
| + static final int ACTIVITY_START_TIMEOUT_MS = 1000;
|
|
|
| private static final String PERF_ANNOTATION_FORMAT = "**PERFANNOTATION(%s):";
|
|
|
| @@ -112,10 +91,11 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| protected boolean mSkipClearAppData;
|
| private Thread.UncaughtExceptionHandler mDefaultUncaughtExceptionHandler;
|
| private Class<T> mChromeActivityClass;
|
| + private ChromeTestCommonCallback<T> mCallback;
|
|
|
| - public ChromeActivityTestCaseBase(Class<T> activityClass) {
|
| - super(activityClass);
|
| + ChromeActivityTestCommon(Class<T> activityClass, ChromeTestCommonCallback<T> callback) {
|
| mChromeActivityClass = activityClass;
|
| + mCallback = callback;
|
| }
|
|
|
| private class ChromeUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
|
| @@ -126,49 +106,38 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| stackTrace += "\nSearch logcat for \"StrictMode policy violation\" for full stack.";
|
| }
|
| Bundle resultsBundle = new Bundle();
|
| - resultsBundle.putString(InstrumentationTestRunner.REPORT_KEY_NAME_CLASS,
|
| - getClass().getName());
|
| - resultsBundle.putString(InstrumentationTestRunner.REPORT_KEY_NAME_TEST, getName());
|
| - resultsBundle.putString(InstrumentationTestRunner.REPORT_KEY_STACK, stackTrace);
|
| - getInstrumentation().sendStatus(-1, resultsBundle);
|
| + resultsBundle.putString(
|
| + InstrumentationResultPrinter.REPORT_KEY_NAME_CLASS, getClass().getName());
|
| + resultsBundle.putString(
|
| + InstrumentationResultPrinter.REPORT_KEY_NAME_TEST, mCallback.getTestName());
|
| + resultsBundle.putString(InstrumentationResultPrinter.REPORT_KEY_STACK, stackTrace);
|
| + mCallback.getInstrumentation().sendStatus(-1, resultsBundle);
|
| mDefaultUncaughtExceptionHandler.uncaughtException(t, e);
|
| }
|
| }
|
|
|
| - @Override
|
| - protected void setUp() throws Exception {
|
| - super.setUp();
|
| + void setUp() throws Exception {
|
| mDefaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
|
| Thread.setDefaultUncaughtExceptionHandler(new ChromeUncaughtExceptionHandler());
|
| - ApplicationTestUtils.setUp(getInstrumentation().getTargetContext(), !mSkipClearAppData);
|
| - setActivityInitialTouchMode(false);
|
| + ApplicationTestUtils.setUp(
|
| + mCallback.getInstrumentation().getTargetContext(), !mSkipClearAppData);
|
| + mCallback.setActivityInitialTouchMode(false);
|
|
|
| // Preload Calendar so that it does not trigger ReadFromDisk Strict mode violations if
|
| // called on the UI Thread. See https://crbug.com/705477 and https://crbug.com/577185
|
| Calendar.getInstance();
|
| -
|
| - startMainActivity();
|
| }
|
|
|
| - @Override
|
| - protected void tearDown() throws Exception {
|
| - ApplicationTestUtils.tearDown(getInstrumentation().getTargetContext());
|
| + void tearDown() throws Exception {
|
| + ApplicationTestUtils.tearDown(mCallback.getInstrumentation().getTargetContext());
|
| Thread.setDefaultUncaughtExceptionHandler(mDefaultUncaughtExceptionHandler);
|
| - super.tearDown();
|
| }
|
|
|
| /**
|
| - * Called to start the Main Activity, the subclass should implemented with it desired start
|
| - * method.
|
| - * TODO: Make startMainActivityFromLauncher the default.
|
| - */
|
| - public abstract void startMainActivity() throws InterruptedException;
|
| -
|
| - /**
|
| * Matches testString against baseString.
|
| * Returns 0 if there is no match, 1 if an exact match and 2 if a fuzzy match.
|
| */
|
| - protected static int matchUrl(String baseString, String testString) {
|
| + static int matchUrl(String baseString, String testString) {
|
| if (baseString.equals(testString)) {
|
| return 1;
|
| }
|
| @@ -185,7 +154,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * return, but generally speaking the activity's "onCreate" has completed
|
| * and the activity's main looper has become idle.
|
| */
|
| - protected void startActivityCompletely(Intent intent) {
|
| + void startActivityCompletely(Intent intent) {
|
| final CallbackHelper activityCallback = new CallbackHelper();
|
| final AtomicReference<T> activityRef = new AtomicReference<>();
|
| ActivityStateListener stateListener = new ActivityStateListener() {
|
| @@ -206,11 +175,11 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| ApplicationStatus.registerStateListenerForAllActivities(stateListener);
|
|
|
| try {
|
| - getInstrumentation().startActivitySync(intent);
|
| + mCallback.getInstrumentation().startActivitySync(intent);
|
| activityCallback.waitForCallback("Activity did not start as expected", 0);
|
| T activity = activityRef.get();
|
| - assertNotNull("Activity reference is null.", activity);
|
| - setActivity(activity);
|
| + Assert.assertNotNull("Activity reference is null.", activity);
|
| + mCallback.setActivity(activity);
|
| Log.d(TAG, "startActivityCompletely <<");
|
| } catch (InterruptedException | TimeoutException e) {
|
| throw new RuntimeException(e);
|
| @@ -220,16 +189,16 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| }
|
|
|
| /** Convenience function for {@link ApplicationTestUtils#clearAppData(Context)}. */
|
| - protected void clearAppData() {
|
| - ApplicationTestUtils.clearAppData(getInstrumentation().getTargetContext());
|
| + void clearAppData() {
|
| + ApplicationTestUtils.clearAppData(mCallback.getInstrumentation().getTargetContext());
|
| }
|
|
|
| /**
|
| * Enables or disables network predictions, i.e. prerendering, prefetching, DNS preresolution,
|
| * etc. Network predictions are enabled by default.
|
| */
|
| - protected void setNetworkPredictionEnabled(final boolean enabled) {
|
| - getInstrumentation().runOnMainSync(new Runnable() {
|
| + void setNetworkPredictionEnabled(final boolean enabled) {
|
| + mCallback.getInstrumentation().runOnMainSync(new Runnable() {
|
| @Override
|
| public void run() {
|
| PrefServiceBridge.getInstance().setNetworkPredictionEnabled(enabled);
|
| @@ -238,70 +207,13 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| }
|
|
|
| /**
|
| - * Starts (synchronously) a drag motion. Normally followed by dragTo() and dragEnd().
|
| - *
|
| - * @param x
|
| - * @param y
|
| - * @param downTime (in ms)
|
| - * @see TestTouchUtils
|
| - */
|
| - protected void dragStart(float x, float y, long downTime) {
|
| - TouchCommon.dragStart(getActivity(), x, y, downTime);
|
| - }
|
| -
|
| - /**
|
| - * Drags / moves (synchronously) to the specified coordinates. Normally preceeded by
|
| - * dragStart() and followed by dragEnd()
|
| - *
|
| - * @param fromX
|
| - * @param toX
|
| - * @param fromY
|
| - * @param toY
|
| - * @param stepCount
|
| - * @param downTime (in ms)
|
| - * @see TestTouchUtils
|
| - */
|
| - protected void dragTo(float fromX, float toX, float fromY,
|
| - float toY, int stepCount, long downTime) {
|
| - TouchCommon.dragTo(getActivity(), fromX, toX, fromY, toY, stepCount, downTime);
|
| - }
|
| -
|
| - /**
|
| - * Finishes (synchronously) a drag / move at the specified coordinate.
|
| - * Normally preceeded by dragStart() and dragTo().
|
| - *
|
| - * @param x
|
| - * @param y
|
| - * @param downTime (in ms)
|
| - * @see TestTouchUtils
|
| - */
|
| - protected void dragEnd(float x, float y, long downTime) {
|
| - TouchCommon.dragEnd(getActivity(), x, y, downTime);
|
| - }
|
| -
|
| - /**
|
| - * Sends (synchronously) a single click to the center of the View.
|
| - *
|
| - * <p>
|
| - * Differs from
|
| - * {@link TestTouchUtils#singleClickView(android.app.Instrumentation, View)}
|
| - * as this does not rely on injecting events into the different activity. Injecting events has
|
| - * been unreliable for us and simulating the touch events in this manner is just as effective.
|
| - *
|
| - * @param v The view to be clicked.
|
| - */
|
| - public void singleClickView(View v) {
|
| - TouchCommon.singleClickView(v);
|
| - }
|
| -
|
| - /**
|
| * 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 {
|
| + void waitForAsyncTasks(long timeout) throws InterruptedException {
|
| final Semaphore s = new Semaphore(0);
|
| new AsyncTask<Void, Void, Void>() {
|
| @Override
|
| @@ -309,8 +221,9 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| s.release();
|
| return null;
|
| }
|
| - }.execute();
|
| - assertTrue(s.tryAcquire(timeout, TimeUnit.MILLISECONDS));
|
| + }
|
| + .execute();
|
| + Assert.assertTrue(s.tryAcquire(timeout, TimeUnit.MILLISECONDS));
|
| }
|
|
|
| /**
|
| @@ -321,10 +234,10 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @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(final String url, long secondsToWait)
|
| + int loadUrl(final String url, long secondsToWait)
|
| throws IllegalArgumentException, InterruptedException {
|
| return loadUrlInTab(url, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR,
|
| - getActivity().getActivityTab(), secondsToWait);
|
| + mCallback.getActivity().getActivityTab(), secondsToWait);
|
| }
|
|
|
| /**
|
| @@ -334,9 +247,9 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @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(final String url) throws IllegalArgumentException, InterruptedException {
|
| + int loadUrl(final String url) throws IllegalArgumentException, InterruptedException {
|
| return loadUrlInTab(url, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR,
|
| - getActivity().getActivityTab());
|
| + mCallback.getActivity().getActivityTab());
|
| }
|
|
|
| /**
|
| @@ -349,9 +262,9 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @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(final String url, final int pageTransition, final Tab tab,
|
| - long secondsToWait) throws InterruptedException {
|
| - assertNotNull("Cannot load the url in a null tab", tab);
|
| + int loadUrlInTab(final String url, final int pageTransition, final Tab tab, long secondsToWait)
|
| + throws InterruptedException {
|
| + Assert.assertNotNull("Cannot load the url in a null tab", tab);
|
| final AtomicInteger result = new AtomicInteger();
|
|
|
| ChromeTabUtils.waitForTabPageLoaded(tab, new Runnable() {
|
| @@ -360,13 +273,12 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @Override
|
| public void run() {
|
| - result.set(tab.loadUrl(
|
| - new LoadUrlParams(url, pageTransition)));
|
| + result.set(tab.loadUrl(new LoadUrlParams(url, pageTransition)));
|
| }
|
| });
|
| }
|
| }, secondsToWait);
|
| - getInstrumentation().waitForIdleSync();
|
| + mCallback.getInstrumentation().waitForIdleSync();
|
| return result.get();
|
| }
|
|
|
| @@ -379,7 +291,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @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(final String url, final int pageTransition, final Tab tab)
|
| + int loadUrlInTab(final String url, final int pageTransition, final Tab tab)
|
| throws InterruptedException {
|
| return loadUrlInTab(url, pageTransition, tab, CallbackHelper.WAIT_TIMEOUT_SECONDS);
|
| }
|
| @@ -388,7 +300,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * 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(final String url) throws InterruptedException {
|
| + Tab loadUrlInNewTab(final String url) throws InterruptedException {
|
| return loadUrlInNewTab(url, false);
|
| }
|
|
|
| @@ -397,29 +309,28 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @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 {
|
| + Tab loadUrlInNewTab(final String url, final boolean incognito) throws InterruptedException {
|
| Tab tab = null;
|
| try {
|
| tab = ThreadUtils.runOnUiThreadBlocking(new Callable<Tab>() {
|
| @Override
|
| public Tab call() throws Exception {
|
| - return getActivity().getTabCreator(incognito)
|
| - .launchUrl(url, TabLaunchType.FROM_LINK);
|
| + return mCallback.getActivity().getTabCreator(incognito).launchUrl(
|
| + url, TabLaunchType.FROM_LINK);
|
| }
|
| });
|
| } catch (ExecutionException e) {
|
| - fail("Failed to create new tab");
|
| + Assert.fail("Failed to create new tab");
|
| }
|
| ChromeTabUtils.waitForTabPageLoaded(tab, url);
|
| - getInstrumentation().waitForIdleSync();
|
| + mCallback.getInstrumentation().waitForIdleSync();
|
| return tab;
|
| }
|
|
|
| /**
|
| * Simulates starting Main Activity from launcher, blocks until it is started.
|
| */
|
| - protected void startMainActivityFromLauncher() throws InterruptedException {
|
| + void startMainActivityFromLauncher() throws InterruptedException {
|
| startMainActivityWithURL(null);
|
| }
|
|
|
| @@ -427,10 +338,10 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * 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 .
|
| */
|
| - protected void startMainActivityWithURL(String url) throws InterruptedException {
|
| + void startMainActivityWithURL(String url) throws InterruptedException {
|
| // Only launch Chrome.
|
| - Intent intent = new Intent(
|
| - TextUtils.isEmpty(url) ? Intent.ACTION_MAIN : Intent.ACTION_VIEW);
|
| + Intent intent =
|
| + new Intent(TextUtils.isEmpty(url) ? Intent.ACTION_MAIN : Intent.ACTION_VIEW);
|
| intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
| startMainActivityFromIntent(intent, url);
|
| }
|
| @@ -439,7 +350,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * Starts the Main activity and open a blank page.
|
| * This is faster and less flakyness-prone than starting on the NTP.
|
| */
|
| - protected void startMainActivityOnBlankPage() throws InterruptedException {
|
| + void startMainActivityOnBlankPage() throws InterruptedException {
|
| startMainActivityWithURL("about:blank");
|
| }
|
|
|
| @@ -447,8 +358,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * Starts the Main activity as if it was started from an external application, on the specified
|
| * URL.
|
| */
|
| - protected void startMainActivityFromExternalApp(String url, String appId)
|
| - throws InterruptedException {
|
| + void startMainActivityFromExternalApp(String url, String appId) throws InterruptedException {
|
| Intent intent = new Intent(Intent.ACTION_VIEW);
|
| if (appId != null) {
|
| intent.putExtra(Browser.EXTRA_APPLICATION_ID, appId);
|
| @@ -462,8 +372,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * 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.
|
| */
|
| - protected void startMainActivityFromIntent(Intent intent, String url)
|
| - throws InterruptedException {
|
| + void startMainActivityFromIntent(Intent intent, String url) throws InterruptedException {
|
| prepareUrlIntent(intent, url);
|
|
|
| startActivityCompletely(intent);
|
| @@ -471,10 +380,10 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| CriteriaHelper.pollUiThread(new Criteria("Tab never selected/initialized.") {
|
| @Override
|
| public boolean isSatisfied() {
|
| - return getActivity().getActivityTab() != null;
|
| + return mCallback.getActivity().getActivityTab() != null;
|
| }
|
| });
|
| - Tab tab = getActivity().getActivityTab();
|
| + Tab tab = mCallback.getActivity().getActivityTab();
|
|
|
| ChromeTabUtils.waitForTabPageLoaded(tab, (String) null);
|
|
|
| @@ -489,9 +398,9 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| }
|
| });
|
|
|
| - assertNotNull(tab);
|
| - assertNotNull(tab.getView());
|
| - getInstrumentation().waitForIdleSync();
|
| + Assert.assertNotNull(tab);
|
| + Assert.assertNotNull(tab.getView());
|
| + mCallback.getInstrumentation().waitForIdleSync();
|
| }
|
|
|
| /**
|
| @@ -499,21 +408,21 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @param intent the intent to be modified
|
| * @param url the URL to be used (may be null)
|
| */
|
| - protected Intent prepareUrlIntent(Intent intent, String url) {
|
| + Intent prepareUrlIntent(Intent intent, String url) {
|
| intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
| - intent.setComponent(new ComponentName(getInstrumentation().getTargetContext(),
|
| - ChromeLauncherActivity.class));
|
| + intent.setComponent(new ComponentName(
|
| + mCallback.getInstrumentation().getTargetContext(), ChromeLauncherActivity.class));
|
|
|
| if (url != null) {
|
| intent.setData(Uri.parse(url));
|
| }
|
|
|
| try {
|
| - Method method = getClass().getMethod(getName(), (Class[]) null);
|
| + Method method = getClass().getMethod(mCallback.getTestName(), (Class[]) null);
|
| if (((AnnotatedElement) method).isAnnotationPresent(RenderProcessLimit.class)) {
|
| RenderProcessLimit limit = method.getAnnotation(RenderProcessLimit.class);
|
| - intent.putExtra(ChromeTabbedActivity.INTENT_EXTRA_TEST_RENDER_PROCESS_LIMIT,
|
| - limit.value());
|
| + intent.putExtra(
|
| + ChromeTabbedActivity.INTENT_EXTRA_TEST_RENDER_PROCESS_LIMIT, limit.value());
|
| }
|
| } catch (NoSuchMethodException ex) {
|
| // Ignore exception.
|
| @@ -525,13 +434,13 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * Open an incognito tab by invoking the 'new incognito' menu item.
|
| * Returns when receiving the 'PAGE_LOAD_FINISHED' notification.
|
| */
|
| - protected void newIncognitoTabFromMenu() throws InterruptedException {
|
| + void newIncognitoTabFromMenu() throws InterruptedException {
|
| Tab tab = null;
|
|
|
| final CallbackHelper createdCallback = new CallbackHelper();
|
| final CallbackHelper selectedCallback = new CallbackHelper();
|
|
|
| - TabModel incognitoTabModel = getActivity().getTabModelSelector().getModel(true);
|
| + TabModel incognitoTabModel = mCallback.getActivity().getTabModelSelector().getModel(true);
|
| TabModelObserver observer = new EmptyTabModelObserver() {
|
| @Override
|
| public void didAddTab(Tab tab, TabLaunchType type) {
|
| @@ -545,26 +454,26 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| };
|
| incognitoTabModel.addObserver(observer);
|
|
|
| - MenuUtils.invokeCustomMenuActionSync(getInstrumentation(), getActivity(),
|
| - R.id.new_incognito_tab_menu_id);
|
| + MenuUtils.invokeCustomMenuActionSync(mCallback.getInstrumentation(),
|
| + mCallback.getActivity(), R.id.new_incognito_tab_menu_id);
|
|
|
| try {
|
| createdCallback.waitForCallback(0);
|
| } catch (TimeoutException ex) {
|
| - fail("Never received tab created event");
|
| + Assert.fail("Never received tab created event");
|
| }
|
| try {
|
| selectedCallback.waitForCallback(0);
|
| } catch (TimeoutException ex) {
|
| - fail("Never received tab selected event");
|
| + Assert.fail("Never received tab selected event");
|
| }
|
| incognitoTabModel.removeObserver(observer);
|
|
|
| - tab = getActivity().getActivityTab();
|
| + tab = mCallback.getActivity().getActivityTab();
|
|
|
| ChromeTabUtils.waitForTabPageLoaded(tab, (String) null);
|
| NewTabPageTestUtils.waitForNtpLoaded(tab);
|
| - getInstrumentation().waitForIdleSync();
|
| + mCallback.getInstrumentation().waitForIdleSync();
|
| Log.d(TAG, "newIncognitoTabFromMenu <<");
|
| }
|
|
|
| @@ -572,8 +481,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * New multiple incognito tabs by invoking the 'new incognito' menu item n times.
|
| * @param n The number of tabs you want to create.
|
| */
|
| - protected void newIncognitoTabsFromMenu(int n)
|
| - throws InterruptedException {
|
| + void newIncognitoTabsFromMenu(int n) throws InterruptedException {
|
| while (n > 0) {
|
| newIncognitoTabFromMenu();
|
| --n;
|
| @@ -583,11 +491,11 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| /**
|
| * @return The number of incognito tabs currently open.
|
| */
|
| - protected int incognitoTabsCount() {
|
| + int incognitoTabsCount() {
|
| return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() {
|
| @Override
|
| public Integer call() {
|
| - return getActivity().getTabModelSelector().getModel(true).getCount();
|
| + return mCallback.getActivity().getTabModelSelector().getModel(true).getCount();
|
| }
|
| });
|
| }
|
| @@ -601,10 +509,10 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| *
|
| * @throws InterruptedException
|
| */
|
| - public void typeInOmnibox(final String text, final boolean oneCharAtATime)
|
| + void typeInOmnibox(final String text, final boolean oneCharAtATime)
|
| throws InterruptedException {
|
| - final UrlBar urlBar = (UrlBar) getActivity().findViewById(R.id.url_bar);
|
| - assertNotNull(urlBar);
|
| + final UrlBar urlBar = (UrlBar) mCallback.getActivity().findViewById(R.id.url_bar);
|
| + Assert.assertNotNull(urlBar);
|
|
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @Override
|
| @@ -617,7 +525,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| });
|
|
|
| if (oneCharAtATime) {
|
| - final Instrumentation instrumentation = getInstrumentation();
|
| + final Instrumentation instrumentation = mCallback.getInstrumentation();
|
| for (int i = 0; i < text.length(); ++i) {
|
| instrumentation.sendStringSync(text.substring(i, i + 1));
|
| // Let's put some delay between key strokes to simulate a user pressing the keys.
|
| @@ -636,20 +544,18 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| *
|
| * @throws InterruptedException
|
| */
|
| - protected OmniboxSuggestion findOmniboxSuggestion(String inputText, String displayText,
|
| - String url, int type) throws InterruptedException {
|
| + OmniboxSuggestion findOmniboxSuggestion(String inputText, String displayText, String url,
|
| + int type) throws InterruptedException {
|
| long endTime = System.currentTimeMillis() + OMNIBOX_FIND_SUGGESTION_TIMEOUT_MS;
|
|
|
| // Multiple suggestion events may occur before the one we're interested in is received.
|
| final CallbackHelper onSuggestionsReceivedHelper = new CallbackHelper();
|
| final LocationBarLayout locationBar =
|
| - (LocationBarLayout) getActivity().findViewById(R.id.location_bar);
|
| + (LocationBarLayout) mCallback.getActivity().findViewById(R.id.location_bar);
|
| locationBar.setAutocompleteController(new AutocompleteController(locationBar) {
|
| @Override
|
| - public void onSuggestionsReceived(
|
| - List<OmniboxSuggestion> suggestions,
|
| - String inlineAutocompleteText,
|
| - long currentNativeAutocompleteResult) {
|
| + public void onSuggestionsReceived(List<OmniboxSuggestion> suggestions,
|
| + String inlineAutocompleteText, long currentNativeAutocompleteResult) {
|
| super.onSuggestionsReceived(
|
| suggestions, inlineAutocompleteText, currentNativeAutocompleteResult);
|
| onSuggestionsReceivedHelper.notifyCalled();
|
| @@ -662,8 +568,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| while (true) {
|
| try {
|
| int callbackCount = onSuggestionsReceivedHelper.getCallCount();
|
| - onSuggestionsReceivedHelper.waitForCallback(
|
| - callbackCount, 1,
|
| + onSuggestionsReceivedHelper.waitForCallback(callbackCount, 1,
|
| endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
|
| } catch (TimeoutException exception) {
|
| return null;
|
| @@ -673,13 +578,15 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| CriteriaHelper.pollInstrumentationThread(new Criteria() {
|
| @Override
|
| public boolean isSatisfied() {
|
| - return ((LocationBarLayout) getActivity().findViewById(
|
| - R.id.location_bar)).getSuggestionList() != null;
|
| + return ((LocationBarLayout) mCallback.getActivity().findViewById(
|
| + R.id.location_bar))
|
| + .getSuggestionList()
|
| + != null;
|
| }
|
| }, 3000, 10);
|
| final ListView suggestionListView = locationBar.getSuggestionList();
|
| - OmniboxResultItem popupItem = (OmniboxResultItem) suggestionListView
|
| - .getItemAtPosition(0);
|
| + OmniboxResultItem popupItem =
|
| + (OmniboxResultItem) suggestionListView.getItemAtPosition(0);
|
| OmniboxSuggestion suggestion = popupItem.getSuggestion();
|
| if (suggestionListView.getCount() == 1
|
| && suggestion.getDisplayText().equals(inputText)
|
| @@ -717,13 +624,13 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| /**
|
| * Returns the infobars being displayed by the current tab, or null if they don't exist.
|
| */
|
| - protected List<InfoBar> getInfoBars() {
|
| + List<InfoBar> getInfoBars() {
|
| return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<List<InfoBar>>() {
|
| @Override
|
| public List<InfoBar> call() throws Exception {
|
| - Tab currentTab = getActivity().getActivityTab();
|
| - assertNotNull(currentTab);
|
| - assertNotNull(currentTab.getInfoBarContainer());
|
| + Tab currentTab = mCallback.getActivity().getActivityTab();
|
| + Assert.assertNotNull(currentTab);
|
| + Assert.assertNotNull(currentTab.getInfoBarContainer());
|
| return currentTab.getInfoBarContainer().getInfoBarsForTesting();
|
| }
|
| });
|
| @@ -733,11 +640,11 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * Launches the preferences menu and starts the preferences activity named fragmentName.
|
| * Returns the activity that was started.
|
| */
|
| - protected Preferences startPreferences(String fragmentName) {
|
| - Context context = getInstrumentation().getTargetContext();
|
| + Preferences startPreferences(String fragmentName) {
|
| + Context context = mCallback.getInstrumentation().getTargetContext();
|
| Intent intent = PreferencesLauncher.createIntentForSettingsPage(context, fragmentName);
|
| - Activity activity = getInstrumentation().startActivitySync(intent);
|
| - assertTrue(activity instanceof Preferences);
|
| + Activity activity = mCallback.getInstrumentation().startActivitySync(intent);
|
| + Assert.assertTrue(activity instanceof Preferences);
|
| return (Preferences) activity;
|
| }
|
|
|
| @@ -746,38 +653,19 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * its execution in JSON format.
|
| * @throws InterruptedException
|
| */
|
| - protected String runJavaScriptCodeInCurrentTab(String code) throws InterruptedException,
|
| - TimeoutException {
|
| + String runJavaScriptCodeInCurrentTab(String code)
|
| + throws InterruptedException, TimeoutException {
|
| return JavaScriptUtils.executeJavaScriptAndWaitForResult(
|
| - getActivity().getCurrentContentViewCore().getWebContents(), code);
|
| - }
|
| -
|
| - @Override
|
| - protected void runTest() throws Throwable {
|
| - String perfTagAnalysisString = setupPotentialPerfTest();
|
| - super.runTest();
|
| - endPerfTest(perfTagAnalysisString);
|
| - }
|
| -
|
| - @Override
|
| - protected Map<String, BaseParameter> createAvailableParameters() {
|
| - Map<String, BaseParameter> availableParameters = super.createAvailableParameters();
|
| - availableParameters.put(AddFakeAccountToAppParameter.PARAMETER_TAG,
|
| - new AddFakeAccountToAppParameter(getParameterReader(), getInstrumentation()));
|
| - availableParameters.put(AddFakeAccountToOsParameter.PARAMETER_TAG,
|
| - new AddFakeAccountToOsParameter(getParameterReader(), getInstrumentation()));
|
| - availableParameters.put(AddGoogleAccountToOsParameter.PARAMETER_TAG,
|
| - new AddGoogleAccountToOsParameter(getParameterReader(), getInstrumentation()));
|
| - return availableParameters;
|
| + mCallback.getActivity().getCurrentContentViewCore().getWebContents(), code);
|
| }
|
|
|
| /**
|
| * Waits till the ContentViewCore receives the expected page scale factor
|
| * from the compositor and asserts that this happens.
|
| */
|
| - protected void assertWaitForPageScaleFactorMatch(final float expectedScale)
|
| - throws InterruptedException {
|
| - ApplicationTestUtils.assertWaitForPageScaleFactorMatch(getActivity(), expectedScale);
|
| + void assertWaitForPageScaleFactorMatch(final float expectedScale) {
|
| + ApplicationTestUtils.assertWaitForPageScaleFactorMatch(
|
| + mCallback.getActivity(), expectedScale);
|
| }
|
|
|
| /**
|
| @@ -790,16 +678,13 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * perf output in this case. In the case that the autoTrace parameter is set for the current
|
| * test method, this will also start the PerfTrace facility automatically.
|
| *
|
| - * @param willTestRun Whether or not this test will actually be run.
|
| * @return A specially formatted string that contains which JSON perf markers to look at. This
|
| * will be analyzed by the perf test harness.
|
| */
|
| @SuppressFBWarnings({
|
| - "REC_CATCH_EXCEPTION",
|
| - "RV_RETURN_VALUE_IGNORED_BAD_PRACTICE",
|
| - })
|
| - private String setupPotentialPerfTest() {
|
| - File perfFile = getInstrumentation().getTargetContext().getFileStreamPath(
|
| + "REC_CATCH_EXCEPTION", "RV_RETURN_VALUE_IGNORED_BAD_PRACTICE", })
|
| + String setupPotentialPerfTest() {
|
| + File perfFile = mCallback.getInstrumentation().getTargetContext().getFileStreamPath(
|
| PERF_OUTPUT_FILE);
|
| perfFile.delete();
|
| PerfTraceEvent.setOutputFile(perfFile);
|
| @@ -807,7 +692,7 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| String perfAnnotationString = "";
|
|
|
| try {
|
| - Method method = getClass().getMethod(getName(), (Class[]) null);
|
| + Method method = getClass().getMethod(mCallback.getTestName(), (Class[]) null);
|
| PerfTest annotation = method.getAnnotation(PerfTest.class);
|
| if (annotation != null) {
|
| StringBuilder annotationData = new StringBuilder();
|
| @@ -816,8 +701,8 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| // Grab the minimum number of trace calls we will track (if names(),
|
| // graphNames(), and graphValues() do not have the same number of elements, we
|
| // will track as many as we can given the data available.
|
| - final int maxIndex = Math.min(annotation.traceNames().length, Math.min(
|
| - annotation.graphNames().length, annotation.seriesNames().length));
|
| + final int maxIndex = Math.min(annotation.traceNames().length,
|
| + Math.min(annotation.graphNames().length, annotation.seriesNames().length));
|
|
|
| List<String> allNames = new LinkedList<>();
|
| for (int i = 0; i < maxIndex; ++i) {
|
| @@ -827,9 +712,12 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| String graphName = annotation.graphNames()[i].replaceAll("[,;]", "-");
|
| String seriesName = annotation.seriesNames()[i].replaceAll("[,;]", "-");
|
| if (annotation.traceTiming()) {
|
| - annotationData.append(name).append(",")
|
| - .append(graphName).append(",")
|
| - .append(seriesName).append(';');
|
| + annotationData.append(name)
|
| + .append(",")
|
| + .append(graphName)
|
| + .append(",")
|
| + .append(seriesName)
|
| + .append(';');
|
| }
|
|
|
| // If memory tracing is enabled, add an additional graph for each one
|
| @@ -841,9 +729,12 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| String memName = PerfTraceEvent.makeMemoryTraceNameFromTimingName(name);
|
| String memGraphName = PerfTraceEvent.makeSafeTraceName(
|
| graphName, MEMORY_TRACE_GRAPH_SUFFIX);
|
| - annotationData.append(memName).append(",")
|
| - .append(memGraphName).append(",")
|
| - .append(seriesName).append(';');
|
| + annotationData.append(memName)
|
| + .append(",")
|
| + .append(memGraphName)
|
| + .append(",")
|
| + .append(seriesName)
|
| + .append(';');
|
| allNames.add(memName);
|
| }
|
| }
|
| @@ -877,9 +768,9 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| * @param perfTagAnalysisString A specially formatted string that tells the perf test harness
|
| * which perf tags to analyze.
|
| */
|
| - private void endPerfTest(String perfTagAnalysisString) {
|
| + void endPerfTest(String perfTagAnalysisString) {
|
| try {
|
| - Method method = getClass().getMethod(getName(), (Class[]) null);
|
| + Method method = getClass().getMethod(mCallback.getTestName(), (Class[]) null);
|
| PerfTest annotation = method.getAnnotation(PerfTest.class);
|
| if (annotation != null) {
|
| if (PerfTraceEvent.enabled()) {
|
| @@ -892,4 +783,12 @@ public abstract class ChromeActivityTestCaseBase<T extends ChromeActivity>
|
| // Eat exception here.
|
| }
|
| }
|
| +
|
| + public interface ChromeTestCommonCallback<T extends ChromeActivity> {
|
| + String getTestName();
|
| + void setActivity(T t);
|
| + Instrumentation getInstrumentation();
|
| + void setActivityInitialTouchMode(boolean touchMode);
|
| + T getActivity();
|
| + }
|
| }
|
|
|