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.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 }