package com.ibm.javascript.units;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeoutException;
import java.util.logging.Logger;
import org.apache.commons.io.IOUtils;
import org.apache.http.client.utils.DateUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.JavaScriptException;
import org.mozilla.javascript.ScriptableObject;
import com.ibm.commons.runtime.Application;
import com.ibm.commons.runtime.RuntimeFactory;
import com.ibm.commons.runtime.impl.app.RuntimeFactoryStandalone;
import com.ibm.sbt.test.lib.TestEnvironment;
public abstract class AbstractRhinoTest {
protected Context cx;
protected ScriptableObject scope;
private Application application;
private com.ibm.commons.runtime.Context context;
protected Properties properties = new Properties();
protected static String jsTestName = null;
Logger log = Logger.getLogger(BaseRhinoTest.class.getName());
@Before
public void setup() throws Exception {
// launchSnippet("TestCommunity.js");
long i = System.currentTimeMillis();
cx = ContextFactory.getGlobal().enterContext();
cx.setOptimizationLevel(-1);
cx.setLanguageVersion(Context.VERSION_1_6);
scope = cx.initStandardObjects();
// Assumes we have env.rhino.js as a resource on the classpath.
Assert.assertNotNull(getClass().getResourceAsStream(
"/com/ibm/javascript/units/env.rhino.js"));
String envjs = IOUtils.toString(getClass().getResourceAsStream(
"/com/ibm/javascript/units/env.rhino.js"));
String printFunction = "function print(message) {Packages.java.util.logging.Logger.getAnonymousLogger().info(message); }; ";
cx.evaluateString(scope, printFunction, "print", 1, null);
String xpath = IOUtils.toString(getClass().getResourceAsStream(
"/com/ibm/javascript/units/wgxpath.install.js"));
cx.evaluateString(scope, xpath, "wgxpath.install.js", 1, null);
cx.evaluateString(scope, envjs, "env.rhino.js", 1, null);
String extend = "var __pt = DOMParser.prototype.parseFromString; " +
" DOMParser.prototype.parseFromString = function(a,b) {" +
" var doc = __pt(a,b);" +
"console.log(doc);" +
" doc.evaluate = undefined; " +
" t = {}; t.document = doc;" +
" wgxpath.install(t);" +
" return doc;" +
"};" +
"";
cx.evaluateString(scope, extend, "extend_parser", 1, null);
String fixDate =
"Date.parse = function(a) {\n" +
"try {\n" +
"var d = Packages.javax.xml.bind.DatatypeConverter.parseDateTime(a);\n" +
"console.log(a + ' -----> ' + d.getTimeInMillis()); \n" +
"return d.getTimeInMillis();\n" +
"} catch(e) { console.log(e); return 'Invalid Date';}" +
"};" +
"";
cx.evaluateString(scope, fixDate, "fix_date", 1, null);
// This will load the home page DOM.
String options = "Envjs.scriptTypes['text/javascript'] = true;";
cx.evaluateString(scope, options, "opt", 1, null);
String load = "window.location = 'file:///"
+ getFrameworkFolder().replace("\\", "/")
+ "/src/main/resources/com/ibm/javascript/units/base.html' ";
cx.evaluateString(scope, load, "loadPage", 1, null);
executeScript(" document.evaluate = undefined; wgxpath.install();", "wgxpath install");
executeScript(" document.domain = 'sbtintegration.swg.usma.ibm.com' ",
"crd");
executeScript(
"var prefix = 'file:///" + getPrefixFolder().replace("\\", "/")
+ "';", "setPrefix");
executeScript(
"var overload = 'file:///" + getFrameworkFolder().replace("\\", "/")
+ "';", "setOverload");
setUpJavaSide();
loadJunitBridges();
createMockConfig();
log.info("TEST ENVIRONMENT INITIALISED IN: " + (System.currentTimeMillis() - i));
// inject a dojo file:///pathtodojo
// inject the library another file with serialized the servlet
// servlet url should point to local js file
}
abstract protected String getPrefixFolder();
abstract protected String getTestFolder();
abstract protected String getFrameworkFolder();
private void createMockConfig() {
try {
executeScript(
this.getClass().getResourceAsStream("/com/ibm/javascript/units/MockLibrary.js"),
"loadMockedLibrary");
} catch (IOException e) {
throw new UnsupportedOperationException(e);
}
}
private void loadJunitBridges() {
String scriptlet = "var assert = Packages.org.junit.Assert; "
+ "var fail = function (message) { assert.fail(message); };";
executeScript(scriptlet, "loadJUnit");
}
protected Object executeScript(String script, String mnemonic) {
long t = System.currentTimeMillis();
try {
return cx.evaluateString(scope, script, mnemonic, 1, null);
} catch (JavaScriptException e) {
Object obj = e.getValue();
ScriptableObject so = (ScriptableObject) obj;
throw e;
} finally {
log.info("EXECUTED SCRIPT '" + mnemonic +"' IN " + (System.currentTimeMillis()-t));
}
}
protected Object executeScript(File f) throws IOException {
FileInputStream fileInputStream = new FileInputStream(f);
String mnemonic = f.getAbsolutePath();
return executeScript(fileInputStream, mnemonic);
}
private Object executeScript(InputStream fileInputStream, String mnemonic)
throws IOException {
String mockLib = IOUtils.toString(fileInputStream);
if (mockLib.trim().length()==0) {
log.warning("empty script executed: " +mnemonic);
}
return executeScript(mockLib, mnemonic);
}
public final void setUpJavaSide() {
RuntimeFactory runtimeFactory = new RuntimeFactoryStandalone();
application = runtimeFactory.initApplication(null);
context = com.ibm.commons.runtime.Context.init(application, null, null);
TestEnvironment.setRequiresAuthentication(true);
}
@After
public final void tearDownJavaSide() {
com.ibm.commons.runtime.Context.destroy(context);
Application.destroy(application);
}
public String dumpDom() {
String dump = "document.body.innerHTML;";
Object ret = executeScript(dump, "tst");
log.info("data: " + ret.toString());
return ret.toString();
}
public String dumpText() {
String dump = "document.body.textContent;";
Object ret = executeScript(dump, "dumpText");
log.fine("data: " + ret.toString());
return ret.toString();
}
public String dumpText(String id) {
String dump = "document.getElementById('" + id + "').textContent;";
Object ret = executeScript(dump, "dumpTextByID");
log.fine(ret.toString());
return ret.toString();
}
protected void waitForAllPromisesToReturn() throws TimeoutException {
}
public static String getJsTestName() {
return jsTestName;
}
}