package org.camunda.bpm.extension.osgi.scripting.impl;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
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.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Dictionary;
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 ScriptEngineBundleScannerTest {
private URL scriptEngineUrl;
@Test
public void registerNonExistingScriptEngine() {
Bundle bundle = mock(Bundle.class);
when(bundle.findEntries(any(String.class), any(String.class), anyBoolean())).thenReturn(Collections.enumeration(Collections.<URL> emptyList()));
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
ArrayList<BundleScriptEngineResolver> resolvers = new ArrayList<BundleScriptEngineResolver>(0);
customizer.registerScriptEngines(bundle, resolvers);
assertThat(resolvers.isEmpty(), is(true));
}
@Test
public void registerNullScriptEngine() {
Bundle bundle = mock(Bundle.class);
when(bundle.findEntries(any(String.class), any(String.class), anyBoolean())).thenReturn(null);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
ArrayList<BundleScriptEngineResolver> resolvers = new ArrayList<BundleScriptEngineResolver>(0);
customizer.registerScriptEngines(bundle, resolvers);
assertThat(resolvers.isEmpty(), is(true));
}
@Test
public void registerScriptEngine() throws MalformedURLException {
Bundle bundle = mockBundleWithScriptEngine(435L);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
ArrayList<BundleScriptEngineResolver> resolvers = new ArrayList<BundleScriptEngineResolver>(1);
customizer.registerScriptEngines(bundle, resolvers);
assertThat(resolvers.size(), is(1));
BundleScriptEngineResolver resolver = resolvers.get(0);
assertThat(resolver, is(instanceOf(BundleScriptEngineResolver.class)));
}
@SuppressWarnings("unchecked")
@Test
public void addingBundleWithService() throws MalformedURLException {
long bundleId = 123L;
Bundle bundle = mockBundleWithScriptEngine(bundleId);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
Bundle addedBundle = customizer.addBundle(bundle);
assertThat(addedBundle, is(bundle));
BundleScriptEngineResolver bundleScriptEngineResolver = customizer.getResolvers().get(bundleId).get(0);
verify(bundleContext).registerService(eq(ScriptEngineResolver.class), eq(bundleScriptEngineResolver), (Dictionary<String, ?>) isNull());
assertThat(customizer.getResolvers().size(), is(1));
assertThat(customizer.getResolvers().containsKey(bundleId), is(true));
}
@Test
public void removedBundleWithoutScriptingEngine() {
long bundleId = 123L;
Bundle bundle = mock(Bundle.class);
when(bundle.getBundleId()).thenReturn(bundleId);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
customizer.addBundle(bundle);
customizer.removedBundle(bundle);
assertThat(customizer.getResolvers().isEmpty(), is(true));
}
@Test
public void removedBundleWithoutScriptingEngineWhenMultipleArePresent() {
long bundleId = 123L;
Bundle bundle = mock(Bundle.class);
Bundle bundle2 = mock(Bundle.class);
Bundle bundle3 = mock(Bundle.class);
when(bundle.getBundleId()).thenReturn(bundleId);
when(bundle2.getBundleId()).thenReturn(bundleId + 2);
when(bundle3.getBundleId()).thenReturn(bundleId + 4);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
customizer.addBundle(bundle);
customizer.addBundle(bundle2);
customizer.addBundle(bundle3);
customizer.removedBundle(bundle);
assertThat(customizer.getResolvers().size(), is(2));
assertThat(customizer.getResolvers().get(bundleId), is(nullValue()));
}
@SuppressWarnings("unchecked")
@Test
public void removeBundleWithService() throws MalformedURLException {
Bundle bundle = mockBundleWithScriptEngine(1234L);
BundleContext bundleContext = mock(BundleContext.class);
when(bundle.getBundleContext()).thenReturn(bundleContext);
ServiceRegistration<ScriptEngineResolver> serviceRegMock = mock(ServiceRegistration.class);
when(bundleContext.registerService(eq(ScriptEngineResolver.class), any(BundleScriptEngineResolver.class), (Dictionary<String, ?>) isNull())).thenReturn(
serviceRegMock);
ScriptEngineBundleScanner customizer = new ScriptEngineBundleScanner();
customizer.addBundle(bundle);
customizer.removedBundle(bundle);
verify(serviceRegMock).unregister();
}
public Bundle mockBundleWithScriptEngine(Long bundleId) {
try {
scriptEngineUrl = new URL("http://localhost");
} catch (MalformedURLException e) {
e.printStackTrace();
fail();
}
Bundle bundle = mock(Bundle.class);
when(bundle.getSymbolicName()).thenReturn("mock bundle");
when(bundle.findEntries(any(String.class), any(String.class), anyBoolean())).thenReturn(Collections.enumeration(Collections.singleton(scriptEngineUrl)));
when(bundle.getBundleId()).thenReturn(bundleId);
return bundle;
}
}