View Javadoc
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 }