1 package com.atlassian.plugin.osgi.factory;
2
3 import java.util.Collections;
4 import java.util.List;
5 import java.util.Map;
6
7 import com.atlassian.plugin.ModuleDescriptor;
8 import com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptor;
9 import com.atlassian.plugin.event.PluginEventManager;
10 import com.atlassian.plugin.module.ModuleFactory;
11 import com.atlassian.plugin.osgi.StubServletModuleDescriptor;
12 import com.atlassian.plugin.osgi.external.ListableModuleDescriptorFactory;
13 import com.atlassian.plugin.servlet.ServletModuleManager;
14 import com.atlassian.plugin.servlet.descriptors.ServletModuleDescriptor;
15
16 import org.dom4j.Element;
17 import org.dom4j.dom.DOMElement;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.osgi.framework.Bundle;
21 import org.osgi.framework.BundleContext;
22 import org.osgi.framework.ServiceReference;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertTrue;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
29
30 public class TestUnrecognizedModuleDescriptorServiceTrackerCustomizer
31 {
32 private PluginEventManager pluginEventManager;
33 private OsgiPlugin plugin;
34 private UnrecognizedModuleDescriptorServiceTrackerCustomizer instance;
35 private Bundle bundle;
36 private BundleContext bundleContext;
37
38 @Before
39 public void setUp() throws Exception
40 {
41 pluginEventManager = mock(PluginEventManager.class);
42 plugin = mock(OsgiPlugin.class);
43 bundle = mock(Bundle.class);
44 when(plugin.getBundle()).thenReturn(bundle);
45 bundleContext = mock(BundleContext.class);
46 when(bundle.getBundleContext()).thenReturn(bundleContext);
47 instance = new UnrecognizedModuleDescriptorServiceTrackerCustomizer(plugin, pluginEventManager);
48 }
49
50 @Test
51 public void testGetModuleDescriptorsByDescriptorClass()
52 {
53 ModuleFactory moduleFactory = mock(ModuleFactory.class);
54 ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
55 StubServletModuleDescriptor stubServletModuleDescriptor =
56 new StubServletModuleDescriptor(moduleFactory, servletModuleManager);
57 when(plugin.getModuleDescriptors()).thenReturn(
58 Collections.<ModuleDescriptor<?>>singleton(stubServletModuleDescriptor));
59
60 List<ServletModuleDescriptor> result = instance.getModuleDescriptorsByDescriptorClass(
61 ServletModuleDescriptor.class);
62 assertEquals(Collections.<ServletModuleDescriptor>singletonList(stubServletModuleDescriptor), result);
63 }
64
65 @Test
66 public void testGetModuleDescriptorsByDescriptorClassWithSubclass()
67 {
68 ModuleFactory moduleFactory = mock(ModuleFactory.class);
69 ServletModuleManager servletModuleManager = mock(ServletModuleManager.class);
70 ServletModuleDescriptor servletModuleDescriptor =
71 new ServletModuleDescriptor(moduleFactory, servletModuleManager);
72 when(plugin.getModuleDescriptors()).thenReturn(
73 Collections.<ModuleDescriptor<?>>singleton(servletModuleDescriptor));
74
75 List<StubServletModuleDescriptor> result = instance.getModuleDescriptorsByDescriptorClass(
76 StubServletModuleDescriptor.class);
77 assertTrue(result.isEmpty());
78 }
79
80 @Test
81 public void unrecognisedModuleDescriptorIsRecognisedOnceAvailable() throws Exception
82 {
83 UnrecognisedModuleDescriptor unrecognised = new UnrecognisedModuleDescriptor();
84 unrecognised.setKey("unique-key");
85 unrecognised.setPlugin(plugin);
86 Element elem = new DOMElement("not-initially-known");
87
88 Map<String, Element> moduleElements = Collections.singletonMap("unique-key", elem);
89 when(plugin.getModuleElements()).thenReturn(moduleElements);
90
91 when(plugin.getModuleDescriptors()).thenReturn(
92 Collections.<ModuleDescriptor<?>>singleton(unrecognised));
93
94 ListableModuleDescriptorFactory moduleDescriptorFactory = mock(ListableModuleDescriptorFactory.class);
95 when(moduleDescriptorFactory.hasModuleDescriptor("not-initially-known")).thenReturn(true);
96 ModuleDescriptor md = mock(ModuleDescriptor.class);
97 when(moduleDescriptorFactory.getModuleDescriptor("not-initially-known")).thenReturn(md);
98
99 ServiceReference serviceReference = mock(ServiceReference.class);
100 when(bundleContext.getService(serviceReference)).thenReturn(moduleDescriptorFactory);
101 instance.addingService(serviceReference);
102
103 verify(md).init(plugin, elem);
104 verify(plugin).addModuleDescriptor(md);
105 }
106 }