package org.camunda.bpm.extension.osgi.scripting.impl;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
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.verify;
import static org.mockito.Mockito.when;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Dictionary;
import javax.script.ScriptEngine;
import org.camunda.bpm.extension.osgi.TestScriptEngineFactory;
import org.camunda.bpm.extension.osgi.scripting.ScriptEngineResolver;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
public class BundleScriptEngineResolverTest {
@SuppressWarnings("unchecked")
@Test
public void register() {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, null);
scriptEngineResolver.register();
verify(bundleContext).registerService(eq(ScriptEngineResolver.class), eq(scriptEngineResolver), isNull(Dictionary.class));
}
@SuppressWarnings("unchecked")
@Test
public void unregister() {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, null);
ServiceRegistration<ScriptEngineResolver> serviceReg = mock(ServiceRegistration.class);
when(bundleContext.registerService(eq(ScriptEngineResolver.class), eq(scriptEngineResolver), isNull(Dictionary.class))).thenReturn(serviceReg);
scriptEngineResolver.register();
scriptEngineResolver.unregister();
verify(serviceReg).unregister();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void resolveTestScriptEngine() throws MalformedURLException, ClassNotFoundException {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
Class factoryClazz = TestScriptEngineFactory.class;
when(bundle.loadClass(eq(factoryClazz.getName()))).thenReturn(factoryClazz);
URL configFile = new File("src/test/resources/javax.script.ScriptEngineFactory").toURI().toURL();
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, configFile);
ScriptEngine scriptEngine = scriptEngineResolver.resolveScriptEngine("Uber-language");
assertThat(scriptEngine, is(instanceOf(TestScriptEngineFactory.TestScriptEngine.class)));
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void resolveTestScriptEngineWithCommentsInFile() throws MalformedURLException, ClassNotFoundException {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
Class factoryClazz = TestScriptEngineFactory.class;
when(bundle.loadClass(eq(factoryClazz.getName()))).thenReturn(factoryClazz);
URL configFile = new File("src/test/resources/javax.script.ScriptEngineFactoryComment").toURI().toURL();
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, configFile);
ScriptEngine scriptEngine = scriptEngineResolver.resolveScriptEngine("Uber-language");
assertThat(scriptEngine, is(instanceOf(TestScriptEngineFactory.TestScriptEngine.class)));
}
@SuppressWarnings("unchecked")
@Test
public void throwsExceptionWhenReceivingInvalidScriptEngine() throws Exception {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
@SuppressWarnings("rawtypes")
Class clazz = this.getClass();
when(bundle.loadClass(anyString())).thenReturn(clazz);
URL configFile = new File("src/test/resources/javax.script.ScriptEngineFactory").toURI().toURL();
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, configFile);
ScriptEngine scriptEngine = scriptEngineResolver.resolveScriptEngine("Uber-language");
assertThat(scriptEngine, is(nullValue()));
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void resolveScriptEngineWithWrongName() throws MalformedURLException, ClassNotFoundException {
Bundle bundle = mock(Bundle.class);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
Class factoryClazz = TestScriptEngineFactory.class;
when(bundle.loadClass(eq(factoryClazz.getName()))).thenReturn(factoryClazz);
URL configFile = new File("src/test/resources/javax.script.ScriptEngineFactory").toURI().toURL();
BundleScriptEngineResolver scriptEngineResolver = new BundleScriptEngineResolver(bundle, configFile);
ScriptEngine scriptEngine = scriptEngineResolver.resolveScriptEngine("Java");
assertThat(scriptEngine, is(nullValue()));
}
}