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
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
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
96 assertThat(moduleDescriptor.isEnabled(), is(true));
97
98
99 assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class));
100
101
102 pluginController.removeDynamicModule(plugin, moduleDescriptor);
103
104
105 assertThat(plugin.getModuleDescriptors(), emptyIterable());
106 assertThat(plugin.getDynamicModuleDescriptors(), emptyIterable());
107 assertThat(plugin.getModuleDescriptor(getModuleKey()), nullValue());
108
109
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
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
126 assertThat(moduleEvents, Matchers.<Class>contains(PluginModuleEnablingEvent.class, PluginModuleEnabledEvent.class));
127 }
128
129 @Test
130 public void addDisabled() {
131
132 final Element e = new DOMElement("bazza");
133 e.addAttribute("key", "mckenzie");
134 final ModuleDescriptor moduleDescriptor = pluginController.addDynamicModule(plugin, e);
135
136
137 assertThat(moduleDescriptor.isEnabled(), is(false));
138 assertThat(moduleDescriptor, is(instanceOf(UnrecognisedModuleDescriptor.class)));
139
140
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 }