blob: 8fa62fb28467b47521082060c41d055131a9be09 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.clerezza.scala.tests;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.ops4j.pax.exam.CoreOptions._;
import org.ops4j.pax.exam.container.`def`.PaxRunnerOptions._;
import org.ops4j.pax.exam.junit.JUnitOptions._;
import org.junit.Assert
import org.junit.Before;
import org.junit.Test;
import org.ops4j.pax.exam.Inject;
import org.osgi.framework.BundleContext;
import javax.script.{ScriptEngineFactory, Bindings, ScriptException, Compilable}
import org.osgi.util.tracker.ServiceTracker
import scala.actors.Actor
import scala.math.random
/**
*
* @author reto
*/
@RunWith(classOf[JUnit4TestRunner])
class ScriptEngineFactoryTest {
@Inject
private var bundleContext: BundleContext = null;
private var webServerExist = false;
private var factory: ScriptEngineFactory = null;
@Before
def getService() : Unit = {
/*webServerExist = waitForWebserver();*/
factory = waitFor(classOf[ScriptEngineFactory], 300000);
}
private def waitFor[T](aClass: Class[T], timeout: Long): T = {
System.out.println("waiting for a " + aClass);
val tracker = new ServiceTracker(bundleContext,
aClass.getName(), null);
tracker.open();
val service = tracker.waitForService(timeout);
return service.asInstanceOf[T];
}
//disabled, interpretation not currently working
// @Test
// def checkEngine(): Unit = {
// Assert.assertNotNull(factory)
// Assert.assertEquals("Scala Scripting Engine for OSGi", factory.getEngineName);
// val s = "hello"
// val engine = factory.getScriptEngine
// Assert.assertEquals(s, engine.eval("\""+s+"\""))
// val bindings = engine.createBindings
// bindings.put("s",s)
// Assert.assertEquals(s, engine.eval("s", bindings))
// }
//
// @Test
// def testConcurrency : Unit = {
// val startTime = System.currentTimeMillis
// import scala.actors.Actor._
// val actorsCount = 5
// val iterationsCount = 9
// val testRunner = self
// for (i <- 1 to actorsCount) {
// object ValueVerifier extends Actor {
// def act() {
// try {
// for (i <- 1 to iterationsCount) {
// val s = "r: "+random.toString
// val engine = factory.getScriptEngine
// val bindings = engine.createBindings
// bindings.put("s",s)
// val script = """
//import scala.math.random
//Thread.sleep((random*10).toInt)
//s"""
// testRunner ! (s, engine.eval(script, bindings))
// }
// } catch {
// case t => testRunner ! t
// }
// }
// }
// ValueVerifier.start()
// }
// for (i <- 1 to (actorsCount*iterationsCount)) {
// self.receive {
// case (expected, got) => {
// Assert.assertEquals(expected, got)
// }
// case t : Throwable => throw t
// }
// }
// val duration = System.currentTimeMillis - startTime
// println("running the tests took "+duration)
//
// }
//
// @Test
// def classFromNewlyAddedBundle(): Unit = {
// val s = "hello"
// val engine = factory.getScriptEngine
// val bindings = engine.createBindings
// bindings.put("s",s)
// Assert.assertEquals(s, engine.eval("s", bindings))
// bundleContext.installBundle("http://repo2.maven.org/maven2/org/wymiwyg/wrhapi/0.8.2/wrhapi-0.8.2.jar");
// Thread.sleep(100)
// val script = """
// |import org.wymiwyg.wrhapi._
// |val h : Handler = null
// |s""".stripMargin
// Assert.assertEquals(s, engine.eval(script, bindings))
// }
@Test
def compiledScript(): Unit = {
val string = "hello"
val script = "\""+string+"\""
val engine = factory.getScriptEngine.asInstanceOf[Compilable]
val compiledScript = engine.compile(script)
Assert.assertEquals(string, compiledScript.eval())
}
@Test(expected=classOf[ScriptException])
def compileErrorScript(): Unit = {
val script = "this is not real scala !"
val engine = factory.getScriptEngine.asInstanceOf[Compilable]
val compiledScript = engine.compile(script)
}
@Test(expected=classOf[ScriptException])
def compileUnfinishedScript(): Unit = {
val script = "if (true) {"
val engine = factory.getScriptEngine.asInstanceOf[Compilable]
val compiledScript = engine.compile(script)
}
def compileNormalAfterErrorScript(): Unit = {
val script = "this is not real scala !"
val engine = factory.getScriptEngine.asInstanceOf[Compilable]
try {
val compiledScript = engine.compile(script)
} catch {
case e: Throwable => Assert.assertEquals(classOf[ScriptException], e.getClass)
}
val string = "hello"
val script2 = "\""+string+"\""
val compiledScript2 = engine.compile(script2)
Assert.assertEquals(string, compiledScript2.eval())
}
//This seems hard to realize before https://lampsvn.epfl.ch/trac/scala/ticket/3513 is fixed
/*@Test
def checkException(): Unit = {
val s = """val s="hello"
illegal.do"""
val engine = factory.getScriptEngine
try {
Assert.assertEquals("should have exception",engine.eval(s))
} catch {
case e : ScriptException => Assert.assertEquals(2, e.getLineNumber)
}
}*/
}
object ScriptEngineFactoryTest {
protected val testHttpPort = 8976;
@Configuration
def configuration() : Array[Option] = {
return options(
mavenConfiguration(),
//using old ds because of issues with 1.0.8
dsProfile(),
configProfile(),
webProfile(),
junitBundles(),
frameworks(
felix()),
systemProperty("org.osgi.service.http.port").value(
Integer.toString(testHttpPort)));
}
}