Commit af92aa44 authored by mnaganov's avatar mnaganov Committed by Commit bot

[Android] Refactor Java Bridge tests

This is to bring in some sanity, and to facilitate extracting common
test code to be used by both ContentShellTests and AwShellTests.

BUG=476880

Review URL: https://codereview.chromium.org/1102753002

Cr-Commit-Position: refs/heads/master@{#327294}
parent 1b0e3685
// Copyright 2012 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.content.browser;
import android.util.Log;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.NavigationController;
import org.chromium.content_shell_apk.ContentShellActivity;
import org.chromium.content_shell_apk.ContentShellTestBase;
/**
* Provides test environment for ContentView Test Shell.
* This is a helper class for Content Shell tests.
*/
public class ContentViewTestBase extends ContentShellTestBase {
protected TestCallbackHelperContainer mTestCallbackHelperContainer;
/**
* Sets up the ContentView and injects the supplied object. Intended to be called from setUp().
*/
protected void setUpContentView(final Object object, final String name) throws Exception {
// This starts the activity, so must be called on the test thread.
final ContentShellActivity activity = launchContentShellWithUrl(
UrlUtils.encodeHtmlDataUri("<html><head></head><body>test</body></html>"));
waitForActiveShellToBeDoneLoading();
// On the UI thread, load an empty page and wait for it to finish
// loading so that the Java object is injected.
try {
runTestOnUiThread(new Runnable() {
@Override
public void run() {
ContentViewCore viewCore = activity.getActiveContentViewCore();
viewCore.addPossiblyUnsafeJavascriptInterface(object, name, null);
mTestCallbackHelperContainer = new TestCallbackHelperContainer(viewCore);
}
});
loadDataSync(activity.getActiveContentViewCore().getWebContents()
.getNavigationController(), "<!DOCTYPE html><title></title>", "text/html",
false);
} catch (Throwable e) {
throw new RuntimeException(
"Failed to set up ContentView: " + Log.getStackTraceString(e));
}
}
/**
* Loads data on the UI thread and blocks until onPageFinished is called.
* TODO(cramya): Move method to a separate util file once UiUtils.java moves into base.
*/
protected void loadDataSync(final NavigationController navigationController, final String data,
final String mimeType, final boolean isBase64Encoded) throws Throwable {
loadUrl(navigationController, mTestCallbackHelperContainer,
LoadUrlParams.createLoadDataParams(data, mimeType, isBase64Encoded));
}
}
...@@ -151,7 +151,7 @@ public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase { ...@@ -151,7 +151,7 @@ public class JavaBridgeArrayCoercionTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestObject = new TestObject(); mTestObject = new TestObject();
setUpContentView(mTestObject, "testObject"); injectObjectAndReload(mTestObject, "testObject");
} }
// Note that all tests use a single element array for simplicity. We test // Note that all tests use a single element array for simplicity. We test
......
...@@ -91,7 +91,7 @@ public class JavaBridgeArrayTest extends JavaBridgeTestBase { ...@@ -91,7 +91,7 @@ public class JavaBridgeArrayTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestObject = new TestObject(); mTestObject = new TestObject();
setUpContentView(mTestObject, "testObject"); injectObjectAndReload(mTestObject, "testObject");
} }
@SmallTest @SmallTest
......
...@@ -16,7 +16,6 @@ import org.chromium.base.test.util.Feature; ...@@ -16,7 +16,6 @@ import org.chromium.base.test.util.Feature;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer; import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
...@@ -96,7 +95,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase { ...@@ -96,7 +95,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestController = new TestController(); mTestController = new TestController();
setUpContentView(mTestController, "testController"); injectObjectAndReload(mTestController, "testController");
} }
// Note that this requires that we can pass a JavaScript string to Java. // Note that this requires that we can pass a JavaScript string to Java.
...@@ -105,26 +104,6 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase { ...@@ -105,26 +104,6 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
return mTestController.waitForStringValue(); return mTestController.waitForStringValue();
} }
protected void injectObjectAndReload(final Object object, final String name) throws Throwable {
injectObjectAndReload(object, name, null);
}
protected void injectObjectAndReload(final Object object, final String name,
final Class<? extends Annotation> requiredAnnotation) throws Throwable {
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mTestCallbackHelperContainer.getOnPageFinishedHelper();
int currentCallCount = onPageFinishedHelper.getCallCount();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(object,
name, requiredAnnotation);
getContentViewCore().getWebContents().getNavigationController().reload(true);
}
});
onPageFinishedHelper.waitForCallback(currentCallCount);
}
protected void synchronousPageReload() throws Throwable { protected void synchronousPageReload() throws Throwable {
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mTestCallbackHelperContainer.getOnPageFinishedHelper(); mTestCallbackHelperContainer.getOnPageFinishedHelper();
...@@ -410,20 +389,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase { ...@@ -410,20 +389,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
} }
} }
final TestObject testObject = new TestObject(); final TestObject testObject = new TestObject();
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = injectObjectsAndReload(testObject, "testObject1", testObject, "testObject2", null);
mTestCallbackHelperContainer.getOnPageFinishedHelper();
int currentCallCount = onPageFinishedHelper.getCallCount();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
testObject, "testObject1", null);
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
testObject, "testObject2", null);
getContentViewCore().getWebContents().getNavigationController().reload(true);
}
});
onPageFinishedHelper.waitForCallback(currentCallCount);
executeJavaScript("testObject1.method()"); executeJavaScript("testObject1.method()");
assertEquals(1, mTestController.waitForIntValue()); assertEquals(1, mTestController.waitForIntValue());
executeJavaScript("testObject2.method()"); executeJavaScript("testObject2.method()");
...@@ -462,20 +428,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase { ...@@ -462,20 +428,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
return innerObject; return innerObject;
} }
}; };
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper = injectObjectsAndReload(object, "testObject", innerObject, "innerObject", null);
mTestCallbackHelperContainer.getOnPageFinishedHelper();
int currentCallCount = onPageFinishedHelper.getCallCount();
runTestOnUiThread(new Runnable() {
@Override
public void run() {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
object, "testObject", null);
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
innerObject, "innerObject", null);
getContentViewCore().getWebContents().getNavigationController().reload(true);
}
});
onPageFinishedHelper.waitForCallback(currentCallCount);
executeJavaScript("testObject.getInnerObject().method()"); executeJavaScript("testObject.getInnerObject().method()");
assertEquals(1, mTestController.waitForIntValue()); assertEquals(1, mTestController.waitForIntValue());
executeJavaScript("innerObject.method()"); executeJavaScript("innerObject.method()");
...@@ -1039,16 +992,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase { ...@@ -1039,16 +992,7 @@ public class JavaBridgeBasicsTest extends JavaBridgeTestBase {
} }
final TestObject testObject1 = new TestObject(1); final TestObject testObject1 = new TestObject(1);
final TestObject testObject2 = new TestObject(2); final TestObject testObject2 = new TestObject(2);
runTestOnUiThread(new Runnable() { injectObjectsAndReload(testObject1, "testObject1", testObject2, "testObject2", null);
@Override
public void run() {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
testObject1, "testObject1", null);
getContentViewCore().addPossiblyUnsafeJavascriptInterface(
testObject2, "testObject2", null);
getContentViewCore().getWebContents().getNavigationController().reload(true);
}
});
executeJavaScript("testObject1.method()"); executeJavaScript("testObject1.method()");
assertEquals(1, mTestController.waitForIntValue()); assertEquals(1, mTestController.waitForIntValue());
executeJavaScript("testObject2.method()"); executeJavaScript("testObject2.method()");
......
...@@ -9,6 +9,8 @@ import android.test.suitebuilder.annotation.SmallTest; ...@@ -9,6 +9,8 @@ import android.test.suitebuilder.annotation.SmallTest;
import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.content_public.browser.JavaScriptCallback; import org.chromium.content_public.browser.JavaScriptCallback;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_public.browser.NavigationController;
import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContents;
/** /**
...@@ -40,7 +42,7 @@ public class JavaBridgeChildFrameTest extends JavaBridgeTestBase { ...@@ -40,7 +42,7 @@ public class JavaBridgeChildFrameTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestController = new TestController(); mTestController = new TestController();
setUpContentView(mTestController, "testController"); injectObjectAndReload(mTestController, "testController");
} }
@SmallTest @SmallTest
...@@ -124,4 +126,13 @@ public class JavaBridgeChildFrameTest extends JavaBridgeTestBase { ...@@ -124,4 +126,13 @@ public class JavaBridgeChildFrameTest extends JavaBridgeTestBase {
resultCallback.waitForResult(); resultCallback.waitForResult();
return result[0]; return result[0];
} }
/**
* Loads data on the UI thread and blocks until onPageFinished is called.
*/
private void loadDataSync(final NavigationController navigationController, final String data,
final String mimeType, final boolean isBase64Encoded) throws Throwable {
loadUrl(navigationController, mTestCallbackHelperContainer,
LoadUrlParams.createLoadDataParams(data, mimeType, isBase64Encoded));
}
} }
...@@ -186,9 +186,8 @@ public class JavaBridgeCoercionTest extends JavaBridgeTestBase { ...@@ -186,9 +186,8 @@ public class JavaBridgeCoercionTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestObject = new TestObject(); mTestObject = new TestObject();
setUpContentView(mTestObject, "testObject");
mTestController = new TestController(); mTestController = new TestController();
setUpContentView(mTestController, "testController"); injectObjectsAndReload(mTestObject, "testObject", mTestController, "testController", null);
} }
// Test passing a 32-bit integer JavaScript number to a method of an // Test passing a 32-bit integer JavaScript number to a method of an
......
...@@ -53,7 +53,7 @@ public class JavaBridgeFieldsTest extends JavaBridgeTestBase { ...@@ -53,7 +53,7 @@ public class JavaBridgeFieldsTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestObject = new TestObject(); mTestObject = new TestObject();
setUpContentView(mTestObject, "testObject"); injectObjectAndReload(mTestObject, "testObject");
} }
// Note that this requires that we can pass a JavaScript string to Java. // Note that this requires that we can pass a JavaScript string to Java.
......
...@@ -108,7 +108,7 @@ public class JavaBridgeReturnValuesTest extends JavaBridgeTestBase { ...@@ -108,7 +108,7 @@ public class JavaBridgeReturnValuesTest extends JavaBridgeTestBase {
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
mTestObject = new TestObject(); mTestObject = new TestObject();
setUpContentView(mTestObject, "testObject"); injectObjectAndReload(mTestObject, "testObject");
} }
// Note that this requires that we can pass a JavaScript string to Java. // Note that this requires that we can pass a JavaScript string to Java.
......
...@@ -4,15 +4,56 @@ ...@@ -4,15 +4,56 @@
package org.chromium.content.browser; package org.chromium.content.browser;
import android.util.Log;
import junit.framework.Assert; import junit.framework.Assert;
import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.base.annotations.SuppressFBWarnings;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.content_shell_apk.ContentShellActivity;
import org.chromium.content_shell_apk.ContentShellTestBase;
import java.lang.annotation.Annotation;
/** /**
* Common functionality for testing the Java Bridge. * Common functionality for testing the Java Bridge.
*/ */
public class JavaBridgeTestBase extends ContentViewTestBase { public class JavaBridgeTestBase extends ContentShellTestBase {
protected TestCallbackHelperContainer mTestCallbackHelperContainer;
/**
* Sets up the ContentView. Intended to be called from setUp().
*/
private void setUpContentView() throws Exception {
// This starts the activity, so must be called on the test thread.
final ContentShellActivity activity = launchContentShellWithUrl(
UrlUtils.encodeHtmlDataUri("<html><head></head><body>test</body></html>"));
waitForActiveShellToBeDoneLoading();
try {
runTestOnUiThread(new Runnable() {
@Override
public void run() {
mTestCallbackHelperContainer = new TestCallbackHelperContainer(
activity.getActiveContentViewCore());
}
});
} catch (Throwable e) {
throw new RuntimeException(
"Failed to set up ContentView: " + Log.getStackTraceString(e));
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
setUpContentView();
}
@SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD") @SuppressFBWarnings("CHROMIUM_SYNCHRONIZED_METHOD")
protected class Controller { protected class Controller {
private boolean mIsResultReady; private boolean mIsResultReady;
...@@ -50,4 +91,39 @@ public class JavaBridgeTestBase extends ContentViewTestBase { ...@@ -50,4 +91,39 @@ public class JavaBridgeTestBase extends ContentViewTestBase {
} }
}); });
} }
protected void injectObjectAndReload(final Object object, final String name) throws Exception {
injectObjectAndReload(object, name, null);
}
protected void injectObjectAndReload(final Object object, final String name,
final Class<? extends Annotation> requiredAnnotation) throws Exception {
injectObjectsAndReload(object, name, null, null, requiredAnnotation);
}
protected void injectObjectsAndReload(final Object object1, final String name1,
final Object object2, final String name2,
final Class<? extends Annotation> requiredAnnotation) throws Exception {
TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
mTestCallbackHelperContainer.getOnPageFinishedHelper();
int currentCallCount = onPageFinishedHelper.getCallCount();
try {
runTestOnUiThread(new Runnable() {
@Override
public void run() {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(object1,
name1, requiredAnnotation);
if (object2 != null && name2 != null) {
getContentViewCore().addPossiblyUnsafeJavascriptInterface(object2,
name2, requiredAnnotation);
}
getContentViewCore().getWebContents().getNavigationController().reload(true);
}
});
onPageFinishedHelper.waitForCallback(currentCallCount);
} catch (Throwable e) {
throw new RuntimeException(
"Failed to injectObjectsAndReload: " + Log.getStackTraceString(e));
}
}
} }
...@@ -10,11 +10,12 @@ import android.view.WindowManager; ...@@ -10,11 +10,12 @@ import android.view.WindowManager;
import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DisabledTest;
import org.chromium.content.browser.test.util.JavaScriptUtils; import org.chromium.content.browser.test.util.JavaScriptUtils;
import org.chromium.content_shell_apk.ContentShellTestBase;
/** /**
* Test suite for viewport-related properties. * Test suite for viewport-related properties.
*/ */
public class ViewportTest extends ContentViewTestBase { public class ViewportTest extends ContentShellTestBase {
protected String evaluateStringValue(String expression) throws Throwable { protected String evaluateStringValue(String expression) throws Throwable {
return JavaScriptUtils.executeJavaScriptAndWaitForResult(getWebContents(), return JavaScriptUtils.executeJavaScriptAndWaitForResult(getWebContents(),
......
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