1 package com.atlassian.plugin.osgi.bridge.external;
2
3 import org.junit.Test;
4 import org.mockito.ArgumentCaptor;
5 import org.osgi.framework.BundleContext;
6 import org.osgi.framework.ServiceEvent;
7 import org.osgi.framework.ServiceListener;
8 import org.osgi.framework.ServiceReference;
9
10 import java.util.concurrent.Callable;
11
12 import static org.junit.Assert.assertEquals;
13 import static org.mockito.ArgumentMatchers.anyString;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17
18 public class TestHostComponentFactoryBean {
19
20 @SuppressWarnings("unchecked")
21 @Test
22 public void testGetService() throws Exception {
23 BundleContext ctx = mock(BundleContext.class);
24 ServiceReference<Callable<String>> ref = mock(ServiceReference.class);
25 when(ctx.getServiceReferences((String) null, "(foo=bar)")).thenReturn(new ServiceReference<?>[]{ref});
26 when(ctx.getService(ref)).thenReturn(() -> "foo");
27
28 ArgumentCaptor<ServiceListener> serviceListener = ArgumentCaptor.forClass(ServiceListener.class);
29
30 HostComponentFactoryBean bean = new HostComponentFactoryBean();
31 bean.setBundleContext(ctx);
32 bean.setFilter("(foo=bar)");
33 bean.setInterfaces(new Class[]{Callable.class});
34 bean.afterPropertiesSet();
35
36 assertEquals("foo", ((Callable) bean.getObject()).call());
37
38 verify(ctx).addServiceListener(serviceListener.capture(), anyString());
39 ServiceReference<Callable<String>> updatedRef = mock(ServiceReference.class);
40 when(ctx.getService(updatedRef)).thenReturn(() -> "boo");
41 serviceListener.getValue().serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, updatedRef));
42
43 assertEquals("boo", ((Callable) bean.getObject()).call());
44 }
45 }