blob: 4f083f6845f9ea066a42cfece503808e063db0af [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.browser;
import android.app.Instrumentation;
import android.net.http.SslError;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* Adds a JavaScript interface to the webview and calls functions on it to verify variables
* are passed from JS to Java correctly.
*/
public class JNIBindingsTestApp extends ActivityInstrumentationTestCase2<BrowserActivity> {
private final static String TAG = "JNIBindingsTest";
private static final String SDCARD_BINDINGS_TEST_HTML = "/sdcard/bindings_test.html";
private static final int MSG_WEBKIT_DATA_READY = 101;
private BrowserActivity mActivity = null;
private Instrumentation mInst = null;
private boolean mTestDone = false;
private String mWebKitResult;
private String mExpectedWebKitResult = "Running JNI Bindings test...\n" +
"testPrimitiveTypes passed!\n" +
"testObjectTypes passed!\n" +
"testArray passed!\n" +
"testObjectArray passed!\n" +
"testObjectMembers passed!\n" +
"testJSPrimitivesToStringsInJava passed!\n" +
"testJavaReturnTypes passed!\n" +
"getIfaceProperties passed!\n" +
"testParameterTypeMismatch passed!\n";
private class GetWebKitDataThread extends Thread {
private JNIBindingsTestApp mTestApp;
private WebView mWebView;
private Handler mHandler;
GetWebKitDataThread(JNIBindingsTestApp testApp, WebView webView) {
mTestApp = testApp;
mWebView = webView;
}
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_WEBKIT_DATA_READY: {
mTestApp.setWebKitResult((String)msg.obj);
Looper.myLooper().quit();
}
default: super.handleMessage(msg); break;
}
}
};
mWebView.documentAsText(mHandler.obtainMessage(MSG_WEBKIT_DATA_READY));
Looper.loop();
}
}
public synchronized void setWebKitResult(String result) {
mWebKitResult = result;
notify();
}
public JNIBindingsTestApp() {
super(BrowserActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
mInst = getInstrumentation();
mInst.waitForIdleSync();
extractAsset();
}
@Override
protected void tearDown() throws Exception {
removeAsset();
super.tearDown();
}
protected void extractAsset() throws IOException {
InputStream in = getInstrumentation().getContext().getAssets().open("bindings_test.html");
OutputStream out = new FileOutputStream(SDCARD_BINDINGS_TEST_HTML);
byte[] buf = new byte[2048];
int len;
while ((len = in.read(buf)) >= 0 ) {
out.write(buf, 0, len);
}
out.close();
in.close();
}
protected void removeAsset(){
File fileToDelete = new File(SDCARD_BINDINGS_TEST_HTML);
fileToDelete.delete();
}
/**
* Gets the browser ready for testing by starting the application
* and wrapping the WebView's helper clients.
*/
void setUpBrowser() {
Tab tab = mActivity.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
webView.addJavascriptInterface(new JNIBindingsTest(this), "JNIBindingsTest");
webView.setWebChromeClient(new TestWebChromeClient(webView.getWebChromeClient()) {
/**
* Dismisses and logs Javascript alerts.
*/
@Override
public boolean onJsAlert(WebView view, String url, String message,
JsResult result) {
String logMsg = String.format("JS Alert '%s' received from %s", message, url);
Log.w(TAG, logMsg);
result.confirm();
return true;
}
/**
* Confirms and logs Javascript alerts.
*/
@Override
public boolean onJsConfirm(WebView view, String url, String message,
JsResult result) {
String logMsg = String.format("JS Confirmation '%s' received from %s",
message, url);
Log.w(TAG, logMsg);
result.confirm();
return true;
}
/**
* Confirms and logs Javascript alerts, providing the default value.
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result) {
String logMsg = String.format("JS Prompt '%s' received from %s; " +
"Giving default value '%s'", message, url, defaultValue);
Log.w(TAG, logMsg);
result.confirm(defaultValue);
return true;
}
});
webView.setWebViewClient(new TestWebViewClient(webView.getWebViewClient()) {
/**
* Bypasses and logs errors.
*/
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
String message = String.format("Error '%s' (%d) loading url: %s",
description, errorCode, failingUrl);
Log.w(TAG, message);
}
/**
* Ignores and logs SSL errors.
*/
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
SslError error) {
Log.w(TAG, "SSL error: " + error);
handler.proceed();
}
});
}
public synchronized void notifyComplete() {
mTestDone = true;
notify();
}
public void testJNIBindings() {
setUpBrowser();
Tab tab = mActivity.getTabControl().getCurrentTab();
WebView webView = tab.getWebView();
webView.loadUrl("file://" + SDCARD_BINDINGS_TEST_HTML);
synchronized(this) {
while(!mTestDone) {
try {
wait();
} catch (InterruptedException e) {}
}
}
// Now the tests are complete grab the DOM content and compare to the reference.
GetWebKitDataThread getWKData = new GetWebKitDataThread(this, webView);
mWebKitResult = null;
getWKData.start();
synchronized(this) {
while(mWebKitResult == null) {
try {
wait();
} catch (InterruptedException e) {}
}
}
Log.v(TAG, "WebKit result:");
Log.v(TAG, mWebKitResult);
assertEquals("Bindings test failed! See logcat for more details!", mExpectedWebKitResult,
mWebKitResult);
}
}