package bsh; import org.junit.Assert; import org.junit.Test; import java.util.concurrent.atomic.AtomicInteger; public class InterpreterConcurrencyTest { static final String script = /* 1 */ "call(param) {" + /* 3 */ " class Echo {\n" + /* 4 */ " \n" + /* 5 */ " final Object _s;\n" + /* 6 */ " \n" + /* 7 */ " Echo(Object s) {\n" + /* 8 */ " _s = s;\n" + /* 9 */ " }\n" + /* 0 */ " \n" + /* 11 */ " Object echo() {\n" + /* 12 */ " return param;\n" + /* 13 */ " }\n" + /* 14 */ " \n" + /* 15 */ " }\n" + /* 16 */ " \n" + /* 17 */ " return new Echo(param).echo();\n" + /* 18 */ "}" + /* 19 */ "return this;"; @Test public void single_threaded() throws Exception { final This callable = createCallable(); Assert.assertEquals("foo", callable.invokeMethod("call", new Object[] { "foo" })); Assert.assertEquals(42, callable.invokeMethod("call", new Object[] { 42 })); } @Test public void multi_threaded_callable() throws Exception { final AtomicInteger counter = new AtomicInteger(); final String script = "call(v) {"+ " return v;" + "}" + "return this;"; final Interpreter interpreter = new Interpreter(); final This callable = (This) interpreter.eval(script); final Runnable runnable = new Runnable() { public void run() { final int value = counter.incrementAndGet(); try { Assert.assertEquals(value, callable.invokeMethod("call", new Object[] { value } )); } catch (final EvalError evalError) { throw new RuntimeException(evalError); } } }; TestUtil.measureConcurrentTime(runnable, 30, 30, 100); } @Test public void multi_threaded_class_generation() throws Exception { final This callable = createCallable(); final AtomicInteger counter = new AtomicInteger(); final Runnable runnable = new Runnable() { public void run() { try { final int i = counter.incrementAndGet(); final Object o = callable.invokeMethod("call", new Object[]{i}); Assert.assertEquals(i, o); } catch (final EvalError evalError) { throw new RuntimeException(evalError); } } }; TestUtil.measureConcurrentTime(runnable, 30, 30, 100); } private This createCallable() throws EvalError { final Interpreter interpreter = new Interpreter(); return (This) interpreter.eval(script); } }