Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2167)

Unified Diff: android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java

Issue 2933623002: Create AwJUnit4ClassRunner AwActivityTestRule and convert AwContentsTest (Closed)
Patch Set: address bo's comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
new file mode 100644
index 0000000000000000000000000000000000000000..bc666e8b9d10c705210a8875de4ad49feab7e4c0
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwActivityTestRule.java
@@ -0,0 +1,407 @@
+// 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.android_webview.test;
+
+import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
+
+import android.app.Instrumentation;
+import android.content.Context;
+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.android_webview.AwBrowserContext;
+import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwContentsClient;
+import org.chromium.android_webview.AwSettings;
+import org.chromium.android_webview.test.AwTestBase.PopupInfo;
+import org.chromium.android_webview.test.AwTestBase.TestDependencyFactory;
+import org.chromium.android_webview.test.AwTestCommon.AwTestCommonCallback;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.InMemorySharedPreferences;
+import org.chromium.net.test.util.TestWebServer;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.concurrent.Callable;
+
+/** Custom ActivityTestRunner for WebView instrumentation tests */
+public class AwActivityTestRule
+ extends ActivityTestRule<AwTestRunnerActivity> implements AwTestCommonCallback {
+ public static final long WAIT_TIMEOUT_MS = scaleTimeout(15000);
+
+ public static final int CHECK_INTERVAL = 100;
+
+ private Description mCurrentTestDescription;
+
+ private final AwTestCommon mTestCommon;
+
+ public AwActivityTestRule() {
+ super(AwTestRunnerActivity.class);
+ mTestCommon = new AwTestCommon(this);
+ }
+
+ @Override
+ public Statement apply(final Statement base, Description description) {
+ mCurrentTestDescription = description;
+ return super.apply(new Statement() {
+ @Override
+ public void evaluate() throws Throwable {
+ setUp();
+ base.evaluate();
+ }
+ }, description);
+ }
+
+ public void setUp() throws Exception {
+ mTestCommon.setUp();
+ }
+
+ public void createAwBrowserContext() {
+ mTestCommon.createAwBrowserContext();
+ }
+
+ public AwBrowserContext createAwBrowserContextOnUiThread(
+ InMemorySharedPreferences prefs, Context appContext) {
+ return mTestCommon.createAwBrowserContextOnUiThread(prefs, appContext);
+ }
+
+ public void startBrowserProcess() throws Exception {
+ mTestCommon.startBrowserProcess();
+ }
+
+ /**
+ * Override this to return false if the test doesn't want to create an AwBrowserContext
+ * automatically.
+ */
+ protected boolean needsAwBrowserContextCreated() {
+ return mTestCommon.needsAwBrowserContextCreated();
+ }
+
+ /**
+ * Override this to return false if the test doesn't want the browser startup sequence to
+ * be run automatically.
+ * @return Whether the instrumentation test requires the browser process to already be started.
+ */
+ protected boolean needsBrowserProcessStarted() {
+ return mTestCommon.needsBrowserProcessStarted();
+ }
+
+ /**
+ * Runs a {@link Callable} on the main thread, blocking until it is
+ * complete, and returns the result. Calls
+ * {@link Instrumentation#waitForIdleSync()} first to help avoid certain
+ * race conditions.
+ *
+ * @param <R> Type of result to return
+ */
+ public <R> R runTestOnUiThreadAndGetResult(Callable<R> callable) throws Exception {
+ return mTestCommon.runTestOnUiThreadAndGetResult(callable);
+ }
+
+ public void enableJavaScriptOnUiThread(final AwContents awContents) {
+ mTestCommon.enableJavaScriptOnUiThread(awContents);
+ }
+
+ public void setNetworkAvailableOnUiThread(
+ final AwContents awContents, final boolean networkUp) {
+ mTestCommon.setNetworkAvailableOnUiThread(awContents, networkUp);
+ }
+
+ /**
+ * Loads url on the UI thread and blocks until onPageFinished is called.
+ */
+ public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+ final String url) throws Exception {
+ mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url);
+ }
+
+ public void loadUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+ final String url, final Map<String, String> extraHeaders) throws Exception {
+ mTestCommon.loadUrlSync(awContents, onPageFinishedHelper, url, extraHeaders);
+ }
+
+ public void loadUrlSyncAndExpectError(final AwContents awContents,
+ CallbackHelper onPageFinishedHelper, CallbackHelper onReceivedErrorHelper,
+ final String url) throws Exception {
+ mTestCommon.loadUrlSyncAndExpectError(
+ awContents, onPageFinishedHelper, onReceivedErrorHelper, url);
+ }
+
+ /**
+ * Loads url on the UI thread but does not block.
+ */
+ public void loadUrlAsync(final AwContents awContents, final String url) throws Exception {
+ mTestCommon.loadUrlAsync(awContents, url);
+ }
+
+ public void loadUrlAsync(
+ final AwContents awContents, final String url, final Map<String, String> extraHeaders) {
+ mTestCommon.loadUrlAsync(awContents, url, extraHeaders);
+ }
+
+ /**
+ * Posts url on the UI thread and blocks until onPageFinished is called.
+ */
+ public void postUrlSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+ final String url, byte[] postData) throws Exception {
+ mTestCommon.postUrlSync(awContents, onPageFinishedHelper, url, postData);
+ }
+
+ /**
+ * Loads url on the UI thread but does not block.
+ */
+ public void postUrlAsync(final AwContents awContents, final String url, byte[] postData)
+ throws Exception {
+ mTestCommon.postUrlAsync(awContents, url, postData);
+ }
+
+ /**
+ * Loads data on the UI thread and blocks until onPageFinished is called.
+ */
+ public void loadDataSync(final AwContents awContents, CallbackHelper onPageFinishedHelper,
+ final String data, final String mimeType, final boolean isBase64Encoded)
+ throws Exception {
+ mTestCommon.loadDataSync(awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded);
+ }
+
+ public void loadDataSyncWithCharset(final AwContents awContents,
+ CallbackHelper onPageFinishedHelper, final String data, final String mimeType,
+ final boolean isBase64Encoded, final String charset) throws Exception {
+ mTestCommon.loadDataSyncWithCharset(
+ awContents, onPageFinishedHelper, data, mimeType, isBase64Encoded, charset);
+ }
+
+ /**
+ * Loads data on the UI thread but does not block.
+ */
+ public void loadDataAsync(final AwContents awContents, final String data, final String mimeType,
+ final boolean isBase64Encoded) throws Exception {
+ mTestCommon.loadDataAsync(awContents, data, mimeType, isBase64Encoded);
+ }
+
+ public void loadDataWithBaseUrlSync(final AwContents awContents,
+ CallbackHelper onPageFinishedHelper, final String data, final String mimeType,
+ final boolean isBase64Encoded, final String baseUrl, final String historyUrl)
+ throws Throwable {
+ mTestCommon.loadDataWithBaseUrlSync(awContents, onPageFinishedHelper, data, mimeType,
+ isBase64Encoded, baseUrl, historyUrl);
+ }
+
+ public void loadDataWithBaseUrlAsync(final AwContents awContents, final String data,
+ final String mimeType, final boolean isBase64Encoded, final String baseUrl,
+ final String historyUrl) throws Throwable {
+ mTestCommon.loadDataWithBaseUrlAsync(
+ awContents, data, mimeType, isBase64Encoded, baseUrl, historyUrl);
+ }
+
+ /**
+ * Reloads the current page synchronously.
+ */
+ public void reloadSync(final AwContents awContents, CallbackHelper onPageFinishedHelper)
+ throws Exception {
+ mTestCommon.reloadSync(awContents, onPageFinishedHelper);
+ }
+
+ /**
+ * Stops loading on the UI thread.
+ */
+ public void stopLoading(final AwContents awContents) {
+ mTestCommon.stopLoading(awContents);
+ }
+
+ public void waitForVisualStateCallback(final AwContents awContents) throws Exception {
+ mTestCommon.waitForVisualStateCallback(awContents);
+ }
+
+ public void insertVisualStateCallbackOnUIThread(final AwContents awContents,
+ final long requestId, final AwContents.VisualStateCallback callback) {
+ mTestCommon.insertVisualStateCallbackOnUIThread(awContents, requestId, callback);
+ }
+
+ // Waits for the pixel at the center of AwContents to color up into expectedColor.
+ // Note that this is a stricter condition that waiting for a visual state callback,
+ // as visual state callback only indicates that *something* has appeared in WebView.
+ public void waitForPixelColorAtCenterOfView(final AwContents awContents,
+ final AwTestContainerView testContainerView, final int expectedColor) throws Exception {
+ mTestCommon.waitForPixelColorAtCenterOfView(awContents, testContainerView, expectedColor);
+ }
+
+ protected TestDependencyFactory createTestDependencyFactory() {
+ return mTestCommon.createTestDependencyFactory();
+ }
+
+ public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient) {
+ return mTestCommon.createAwTestContainerView(awContentsClient);
+ }
+
+ public AwTestContainerView createAwTestContainerView(final AwContentsClient awContentsClient,
+ boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+ return mTestCommon.createAwTestContainerView(
+ awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+ }
+
+ public AwBrowserContext getAwBrowserContext() {
+ return mTestCommon.getAwBrowserContext();
+ }
+
+ public AwTestContainerView createDetachedAwTestContainerView(
+ final AwContentsClient awContentsClient) {
+ return mTestCommon.createDetachedAwTestContainerView(awContentsClient);
+ }
+
+ public AwTestContainerView createDetachedAwTestContainerView(
+ final AwContentsClient awContentsClient, boolean supportsLegacyQuirks,
+ TestDependencyFactory testDependencyFactory) {
+ return mTestCommon.createDetachedAwTestContainerView(
+ awContentsClient, supportsLegacyQuirks, testDependencyFactory);
+ }
+
+ protected boolean isHardwareAcceleratedTest() {
+ return mTestCommon.isHardwareAcceleratedTest();
+ }
+
+ public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client)
+ throws Exception {
+ return mTestCommon.createAwTestContainerViewOnMainSync(client);
+ }
+
+ public AwTestContainerView createAwTestContainerViewOnMainSync(
+ final AwContentsClient client, final boolean supportsLegacyQuirks) {
+ return mTestCommon.createAwTestContainerViewOnMainSync(client, supportsLegacyQuirks);
+ }
+
+ public AwTestContainerView createAwTestContainerViewOnMainSync(final AwContentsClient client,
+ final boolean supportsLegacyQuirks, final TestDependencyFactory testDependencyFactory) {
+ return mTestCommon.createAwTestContainerViewOnMainSync(
+ client, supportsLegacyQuirks, testDependencyFactory);
+ }
+
+ public void destroyAwContentsOnMainSync(final AwContents awContents) {
+ mTestCommon.destroyAwContentsOnMainSync(awContents);
+ }
+
+ public String getTitleOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.getTitleOnUiThread(awContents);
+ }
+
+ public AwSettings getAwSettingsOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.getAwSettingsOnUiThread(awContents);
+ }
+
+ /**
+ * Verify double quotes in both sides of the raw string. Strip the double quotes and
+ * returns rest of the string.
+ */
+ protected String maybeStripDoubleQuotes(String raw) {
+ return mTestCommon.maybeStripDoubleQuotes(raw);
+ }
+
+ /**
+ * Executes the given snippet of JavaScript code within the given ContentView. Returns the
+ * result of its execution in JSON format.
+ */
+ public String executeJavaScriptAndWaitForResult(final AwContents awContents,
+ TestAwContentsClient viewClient, final String code) throws Exception {
+ return mTestCommon.executeJavaScriptAndWaitForResult(awContents, viewClient, code);
+ }
+
+ /**
+ * Executes JavaScript code within the given ContentView to get the text content in
+ * document body. Returns the result string without double quotes.
+ */
+ public String getJavaScriptResultBodyTextContent(
+ final AwContents awContents, final TestAwContentsClient viewClient) throws Exception {
+ return mTestCommon.getJavaScriptResultBodyTextContent(awContents, viewClient);
+ }
+
+
+ /**
+ * Wrapper around CriteriaHelper.pollInstrumentationThread. This uses AwTestBase-specifc
+ * timeouts and treats timeouts and exceptions as test failures automatically.
+ */
+ public static void pollInstrumentationThread(final Callable<Boolean> callable)
+ throws Exception {
+ AwTestCommon.pollInstrumentationThread(callable);
+ }
+
+ /**
+ * Wrapper around {@link AwTestBase#poll()} but runs the callable on the UI thread.
+ */
+ public void pollUiThread(final Callable<Boolean> callable) throws Exception {
+ mTestCommon.pollUiThread(callable);
+ }
+
+ /**
+ * Clears the resource cache. Note that the cache is per-application, so this will clear the
+ * cache for all WebViews used.
+ */
+ public void clearCacheOnUiThread(final AwContents awContents, final boolean includeDiskFiles)
+ throws Exception {
+ mTestCommon.clearCacheOnUiThread(awContents, includeDiskFiles);
+ }
+
+ /**
+ * Returns pure page scale.
+ */
+ public float getScaleOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.getScaleOnUiThread(awContents);
+ }
+
+ /**
+ * Returns page scale multiplied by the screen density.
+ */
+ public float getPixelScaleOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.getPixelScaleOnUiThread(awContents);
+ }
+
+ /**
+ * Returns whether a user can zoom the page in.
+ */
+ public boolean canZoomInOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.canZoomInOnUiThread(awContents);
+ }
+
+ /**
+ * Returns whether a user can zoom the page out.
+ */
+ public boolean canZoomOutOnUiThread(final AwContents awContents) throws Exception {
+ return mTestCommon.canZoomOutOnUiThread(awContents);
+ }
+
+ public void killRenderProcessOnUiThreadAsync(final AwContents awContents) throws Exception {
+ mTestCommon.killRenderProcessOnUiThreadAsync(awContents);
+ }
+
+ /**
+ * Loads the main html then triggers the popup window.
+ */
+ public void triggerPopup(final AwContents parentAwContents,
+ TestAwContentsClient parentAwContentsClient, TestWebServer testWebServer,
+ String mainHtml, String popupHtml, String popupPath, String triggerScript)
+ throws Exception {
+ mTestCommon.triggerPopup(parentAwContents, parentAwContentsClient, testWebServer, mainHtml,
+ popupHtml, popupPath, triggerScript);
+ }
+
+ /**
+ * Supplies the popup window with AwContents then waits for the popup window to finish loading.
+ */
+ public PopupInfo connectPendingPopup(final AwContents parentAwContents) throws Exception {
+ return mTestCommon.connectPendingPopup(parentAwContents);
+ }
+
+ @Override
+ public boolean testMethodHasAnnotation(Class<? extends Annotation> clazz) {
+ return mCurrentTestDescription.getAnnotation(clazz) != null ? true : false;
+ }
+
+ @Override
+ public Instrumentation getInstrumentation() {
+ return InstrumentationRegistry.getInstrumentation();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698