View Javadoc
1   package it.com.atlassian.plugin.osgi;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.PluginException;
5   import com.atlassian.plugin.PluginInternal;
6   import com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptor;
7   import com.atlassian.plugin.event.PluginEventListener;
8   import com.atlassian.plugin.event.events.PluginModuleDisabledEvent;
9   import com.atlassian.plugin.event.events.PluginModuleDisablingEvent;
10  import com.atlassian.plugin.event.events.PluginModuleEnabledEvent;
11  import com.atlassian.plugin.event.events.PluginModuleEnablingEvent;
12  import com.atlassian.plugin.osgi.PluginInContainerTestBase;
13  import org.dom4j.Element;
14  import org.dom4j.dom.DOMElement;
15  import org.hamcrest.Matchers;
16  import org.junit.After;
17  import org.junit.Before;
18  import org.junit.Rule;
19  import org.junit.Test;
20  import org.junit.rules.ExpectedException;
21  
22  import java.util.ArrayList;
23  import java.util.Collections;
24  import java.util.List;
25  
26  import static org.hamcrest.Matchers.containsString;
27  import static org.hamcrest.Matchers.instanceOf;
28  import static org.hamcrest.Matchers.nullValue;
29  import static org.hamcrest.collection.IsEmptyCollection.empty;
30  import static org.hamcrest.collection.IsEmptyIterable.emptyIterable;
31  import static org.hamcrest.core.Is.is;
32  import static org.junit.Assert.assertThat;
33  import static org.mockito.Mockito.mock;
34  import static org.mockito.Mockito.when;
35  
36  public abstract class AbstractTestDynamicModules extends PluginInContainerTestBase {
37      @Rule
38      public final ExpectedException expectedException = ExpectedException.none();
39  
40      PluginInternal plugin;
41  
42      List<Class> moduleEvents;
43  
44      abstract String getPluginKey();
45  
46      abstract String getModuleKey();
47  
48      abstract ModuleDescriptor addModule();
49  
50      @Override
51      @Before
52      public void setUp() throws Exception {
53          super.setUp();
54  
55          pluginEventManager.register(this);
56  
57          moduleEvents = Collections.synchronizedList(new ArrayList<Class>());
58      }
59  
60      @Override
61      @After
62      public void tearDown() throws Exception {
63          pluginEventManager.unregister(this);
64  
65          super.tearDown();
66      }
67  
68      @Test
69      public void removeNonExistent() {
70          final ModuleDescriptor moduleDescriptor = mock(ModuleDescriptor.class);
71          when(moduleDescriptor.getKey()).thenReturn("dodgeyModuleKey");
72  
73          expectedException.expect(PluginException.class);
74          expectedException.expectMessage(containsString("dodgeyModuleKey"));
75          expectedException.expectMessage(containsString(getPluginKey()));
76  
77          pluginController.removeDynamicModule(plugin, moduleDescriptor);
78      }
79  
80      @Test
81      public void addRemove() throws Exception {
82          // no modules, dynamic or otherwise
83          assertThat(plugin.getModuleDescriptors(), emptyIterable());
84          assertThat(plugin.getDynamicModuleDescriptors(), emptyIterable());
85          assertThat(plugin.getModuleDescriptor(getModuleKey()), nullValue());
86          assertThat(moduleEvents, empty());
87  
88          final ModuleDescriptor moduleDescriptor = addModule();
89  
90          // it's added as dynamic and regular
91          assertThat(plugin.getDynamicModuleDescriptors(), Matchers.<ModuleDescriptor<?>>containsInAnyOrder(moduleDescriptor));
92          assertThat(plugin.getModuleDescriptors(), Matchers.<ModuleDescriptor<?>>containsInAnyOrder(moduleDescriptor));
93          assertThat(plugin.getModuleDescriptor(getModuleKey()), Matchers.<ModuleDescriptor<?>>is(moduleDescriptor));
94  
95          // should be enabled
96          assertThat(moduleDescriptor.isEnabled(), is(true));
97  
98          // events were published
99          assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class));
100 
101         // may be removed
102         pluginController.removeDynamicModule(plugin, moduleDescriptor);
103 
104         // no more modules
105         assertThat(plugin.getModuleDescriptors(), emptyIterable());
106         assertThat(plugin.getDynamicModuleDescriptors(), emptyIterable());
107         assertThat(plugin.getModuleDescriptor(getModuleKey()), nullValue());
108 
109         // events were published
110         assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class, PluginModuleDisablingEvent.class, PluginModuleDisabledEvent.class));
111     }
112 
113     @Test
114     public void addTwice() {
115         addModule();
116 
117         // events were published
118         assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class));
119 
120         expectedException.expect(PluginException.class);
121         expectedException.expectMessage(containsString(getModuleKey()));
122 
123         addModule();
124 
125         // no further events were published
126         assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class));
127     }
128 
129     @Test
130     public void addDisabled() {
131         // add a rubbish module that will be unrecognised
132         final Element e = new DOMElement("bazza");
133         e.addAttribute("key", "mckenzie");
134         final ModuleDescriptor moduleDescriptor = pluginController.addDynamicModule(plugin, e);
135 
136         // shouldn't be enabled as it is an UnrecognisedModuleDescriptor
137         assertThat(moduleDescriptor.isEnabled(), is(false));
138         assertThat(moduleDescriptor, is(instanceOf(UnrecognisedModuleDescriptor.class)));
139 
140         // events were not published
141         assertThat(moduleEvents, empty());
142     }
143 
144     @PluginEventListener
145     public void onBeforePluginModuleEnabledEvent(PluginModuleEnablingEvent event) {
146         if (getModuleKey().equals(event.getModule().getKey())) {
147             moduleEvents.add(PluginModuleEnablingEvent.class);
148         }
149     }
150 
151     @PluginEventListener
152     public void onPluginModuleEnabledEvent(PluginModuleEnabledEvent event) {
153         if (getModuleKey().equals(event.getModule().getKey())) {
154             moduleEvents.add(PluginModuleEnabledEvent.class);
155         }
156     }
157 
158     @PluginEventListener
159     public void onBeforePluginModuleDisabledEvent(PluginModuleDisablingEvent event) {
160         if (getModuleKey().equals(event.getModule().getKey())) {
161             moduleEvents.add(PluginModuleDisablingEvent.class);
162         }
163     }
164 
165     @PluginEventListener
166     public void onPluginModuleDisableEvent(PluginModuleDisabledEvent event) {
167         if (getModuleKey().equals(event.getModule().getKey())) {
168             moduleEvents.add(PluginModuleDisabledEvent.class);
169         }
170     }
171 }