package org.camunda.bpm.extension.osgi.scripting.impl;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collections;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.camunda.bpm.engine.ProcessEngineException;
import org.camunda.bpm.engine.impl.scripting.engine.ScriptBindingsFactory;
import org.camunda.bpm.extension.osgi.TestScriptEngineFactory;
import org.camunda.bpm.extension.osgi.scripting.ScriptEngineResolver;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
public class OsgiScriptingEnginesTest {
@Test
public void bindingsFactoryConstructor() {
ScriptBindingsFactory mock = mock(ScriptBindingsFactory.class);
OsgiScriptingEngines osgiScriptingEngines = new OsgiScriptingEngines(mock);
assertThat(osgiScriptingEngines.getScriptBindingsFactory(), is(mock));
}
@Test(expected = ProcessEngineException.class)
public void getNonExistingScriptEngine() throws InvalidSyntaxException {
BundleContext context = mock(BundleContext.class);
when(context.getServiceReferences(anyString(), isNull(String.class))).thenReturn(null);
ScriptBindingsFactory bindingsFactory = mock(ScriptBindingsFactory.class);
TestOsgiScriptingEngines scriptingEngines = new TestOsgiScriptingEngines(bindingsFactory);
scriptingEngines.ctx = context;
ScriptEngine engine = scriptingEngines.getScriptEngineForLanguage("Pythin");
assertThat(engine, is(nullValue()));
}
@SuppressWarnings("unchecked")
@Test
public void getExistingScriptEngine() throws InvalidSyntaxException, ScriptException {
BundleContext context = mock(BundleContext.class);
ServiceReference<ScriptEngineResolver> serviceReference = mock(ServiceReference.class);
ScriptEngineResolver scriptEngineResolver = mock(ScriptEngineResolver.class);
when(context.getService(serviceReference)).thenReturn(scriptEngineResolver);
when(context.getServiceReferences(eq(ScriptEngineResolver.class), isNull(String.class))).thenReturn(Collections.singletonList(serviceReference));
ScriptEngine scriptEngine = mock(ScriptEngine.class);
when(scriptEngineResolver.resolveScriptEngine("Python")).thenReturn(scriptEngine);
ScriptBindingsFactory bindingsFactory = mock(ScriptBindingsFactory.class);
when(scriptEngine.eval(anyString(), isNull(Bindings.class))).thenReturn("Success");
when(scriptEngine.eval(anyString(), any(Bindings.class))).thenReturn("Success");
TestOsgiScriptingEngines scriptingEngines = new TestOsgiScriptingEngines(bindingsFactory);
scriptingEngines.ctx = context;
ScriptEngine engine = scriptingEngines.getScriptEngineForLanguage("Python");
assertThat(engine, is(scriptEngine));
}
@Test
public void resolveScriptEngineWhenNoScriptEngineResolverIsPresent() throws InvalidSyntaxException {
ScriptBindingsFactory mock = mock(ScriptBindingsFactory.class);
TestOsgiScriptingEngines osgiScriptingEngines = new TestOsgiScriptingEngines(mock);
BundleContext context = mock(BundleContext.class);
osgiScriptingEngines.ctx = context;
ScriptEngine scriptEngine = osgiScriptingEngines.resolveScriptEngine("foo");
assertThat(scriptEngine, is(nullValue()));
}
@SuppressWarnings("unchecked")
@Test
public void resolveScriptEngine() throws InvalidSyntaxException {
ScriptBindingsFactory mock = mock(ScriptBindingsFactory.class);
TestOsgiScriptingEngines osgiScriptingEngines = new TestOsgiScriptingEngines(mock);
BundleContext context = mock(BundleContext.class);
ServiceReference<ScriptEngineResolver> serviceRef = mock(ServiceReference.class);
when(context.getServiceReferences(eq(ScriptEngineResolver.class), isNull(String.class))).thenReturn(Collections.singleton(serviceRef));
ScriptEngineResolver scriptEngineResolver = mock(ScriptEngineResolver.class);
when(context.getService(eq(serviceRef))).thenReturn(scriptEngineResolver);
ScriptEngine scriptEngine = new TestScriptEngineFactory.TestScriptEngine();
when(scriptEngineResolver.resolveScriptEngine(eq("foo"))).thenReturn(scriptEngine);
osgiScriptingEngines.ctx = context;
ScriptEngine resolvedScriptEngine = osgiScriptingEngines.resolveScriptEngine("foo");
assertThat(resolvedScriptEngine, is(scriptEngine));
}
private class TestOsgiScriptingEngines extends OsgiScriptingEngines {
public TestOsgiScriptingEngines(ScriptBindingsFactory scriptBindingsFactory) {
super(scriptBindingsFactory);
}
private BundleContext ctx;
/**
* Overridden for test purposes.
*/
@Override
protected BundleContext getBundleContext() {
return ctx;
}
}
}