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