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