1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.DefaultModuleDescriptorFactory;
4 import com.atlassian.plugin.JarPluginArtifact;
5 import com.atlassian.plugin.PluginAccessor;
6 import com.atlassian.plugin.event.PluginEventManager;
7 import com.atlassian.plugin.event.events.PluginDisabledEvent;
8 import com.atlassian.plugin.event.events.PluginEnabledEvent;
9 import com.atlassian.plugin.event.events.PluginModuleDisabledEvent;
10 import com.atlassian.plugin.event.events.PluginModuleEnabledEvent;
11 import com.atlassian.plugin.event.events.PluginTransactionStartEvent;
12 import com.atlassian.plugin.event.events.PluginTransactionEndEvent;
13 import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
14 import com.atlassian.plugin.event.listeners.RecordingListener;
15 import com.atlassian.plugin.factories.LegacyDynamicPluginFactory;
16 import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
17 import com.atlassian.plugin.loaders.DirectoryPluginLoader;
18 import com.atlassian.plugin.loaders.PluginLoader;
19 import com.atlassian.plugin.loaders.SinglePluginLoader;
20 import com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils;
21 import com.atlassian.plugin.manager.store.MemoryPluginPersistentStateStore;
22 import com.atlassian.plugin.mock.MockAnimalModuleDescriptor;
23 import com.atlassian.plugin.mock.MockMineralModuleDescriptor;
24 import com.atlassian.plugin.mock.MockVegetableModuleDescriptor;
25 import com.atlassian.plugin.repositories.FilePluginInstaller;
26 import com.google.common.collect.ImmutableList;
27 import org.junit.After;
28 import org.junit.Before;
29 import org.junit.Test;
30
31 import java.io.File;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.List;
35
36 import static java.util.Arrays.asList;
37 import static org.junit.Assert.assertEquals;
38 import static org.junit.Assert.assertTrue;
39
40 public class TestDefaultPluginManagerEvents {
41 private DefaultPluginManager manager;
42 private RecordingListener listener;
43
44 @Before
45 public void setUp() throws Exception {
46 listener = new RecordingListener(
47 PluginTransactionStartEvent.class,
48 PluginTransactionEndEvent.class,
49 PluginEnabledEvent.class,
50 PluginDisabledEvent.class,
51 PluginModuleEnabledEvent.class,
52 PluginModuleDisabledEvent.class);
53
54 manager = buildPluginManager(listener);
55 manager.init();
56 listener.reset();
57 }
58
59 @After
60 public void tearDown() {
61
62 manager = null;
63 listener = null;
64 }
65
66 @Test
67 public void testInitialisationEvents() throws Exception {
68 DefaultPluginManager manager = buildPluginManager(listener);
69 manager.init();
70
71 assertListEquals(listener.getEventClasses(),
72 PluginTransactionStartEvent.class,
73 PluginModuleEnabledEvent.class,
74 PluginModuleEnabledEvent.class,
75 PluginModuleEnabledEvent.class,
76 PluginEnabledEvent.class,
77 PluginModuleEnabledEvent.class,
78 PluginEnabledEvent.class,
79 PluginModuleEnabledEvent.class,
80 PluginEnabledEvent.class,
81 PluginTransactionEndEvent.class);
82 assertListEquals(listener.getEventPluginOrModuleKeys(),
83 asList(null,
84 "test.atlassian.plugin:bear",
85 "test.atlassian.plugin:gold",
86 "test.atlassian.plugin:veg",
87 "test.atlassian.plugin",
88 "test.atlassian.plugin.classloaded:paddington",
89 "test.atlassian.plugin.classloaded",
90 "test.atlassian.plugin.classloaded2:pooh",
91 "test.atlassian.plugin.classloaded2",
92 null),
93 asList(null,
94 "test.atlassian.plugin:bear",
95 "test.atlassian.plugin:gold",
96 "test.atlassian.plugin:veg",
97 "test.atlassian.plugin",
98 "test.atlassian.plugin.classloaded2:pooh",
99 "test.atlassian.plugin.classloaded2",
100 "test.atlassian.plugin.classloaded:paddington",
101 "test.atlassian.plugin.classloaded",
102 null));
103 }
104
105 @Test
106 public void testDisablePlugin() {
107 manager.disablePlugin("test.atlassian.plugin");
108
109 assertListEquals(listener.getEventClasses(),
110 PluginTransactionStartEvent.class,
111 PluginModuleDisabledEvent.class,
112 PluginModuleDisabledEvent.class,
113 PluginModuleDisabledEvent.class,
114 PluginDisabledEvent.class,
115 PluginTransactionEndEvent.class);
116 assertListEquals(listener.getEventPluginOrModuleKeys(),
117 null,
118 "test.atlassian.plugin:veg",
119 "test.atlassian.plugin:gold",
120 "test.atlassian.plugin:bear",
121 "test.atlassian.plugin",
122 null);
123 }
124
125 @Test
126 public void testEnablePlugin() {
127 manager.disablePlugin("test.atlassian.plugin");
128 listener.reset();
129 manager.enablePlugins("test.atlassian.plugin");
130
131 assertListEquals(listener.getEventClasses(),
132 PluginTransactionStartEvent.class,
133 PluginModuleEnabledEvent.class,
134 PluginModuleEnabledEvent.class,
135 PluginModuleEnabledEvent.class,
136 PluginEnabledEvent.class,
137 PluginTransactionEndEvent.class);
138 assertListEquals(listener.getEventPluginOrModuleKeys(),
139 null,
140 "test.atlassian.plugin:bear",
141 "test.atlassian.plugin:gold",
142 "test.atlassian.plugin:veg",
143 "test.atlassian.plugin",
144 null);
145 }
146
147 @Test
148 public void testEnableDisabledByDefaultPlugin() {
149 manager.enablePlugins("test.disabled.plugin");
150
151 assertListEquals(listener.getEventClasses(),
152 PluginTransactionStartEvent.class,
153 PluginEnabledEvent.class,
154 PluginTransactionEndEvent.class);
155 assertListEquals(listener.getEventPluginOrModuleKeys(),
156 null,
157 "test.disabled.plugin",
158 null);
159
160 listener.reset();
161 manager.enablePluginModule("test.disabled.plugin:gold");
162
163 assertListEquals(listener.getEventClasses(),
164 PluginTransactionStartEvent.class,
165 PluginModuleEnabledEvent.class,
166 PluginTransactionEndEvent.class);
167 assertListEquals(listener.getEventPluginOrModuleKeys(),
168 null,
169 "test.disabled.plugin:gold",
170 null);
171 }
172
173 @Test
174 public void testDisableModule() {
175 manager.disablePluginModule("test.atlassian.plugin:bear");
176
177 assertListEquals(listener.getEventClasses(),
178 PluginTransactionStartEvent.class,
179 PluginModuleDisabledEvent.class,
180 PluginTransactionEndEvent.class);
181 assertListEquals(listener.getEventPluginOrModuleKeys(),
182 null,
183 "test.atlassian.plugin:bear",
184 null);
185 }
186
187 @Test
188 public void testDisableModuleWithCannotDisableDoesNotFireEvent() {
189 manager.disablePluginModule("test.atlassian.plugin:veg");
190 assertListEquals(listener.getEventClasses(),
191 PluginTransactionStartEvent.class,
192 PluginTransactionEndEvent.class);
193 }
194
195 @Test
196 public void testEnableModule() {
197 manager.disablePluginModule("test.atlassian.plugin:bear");
198 listener.reset();
199 manager.enablePluginModule("test.atlassian.plugin:bear");
200
201 assertListEquals(listener.getEventClasses(),
202 PluginTransactionStartEvent.class,
203 PluginModuleEnabledEvent.class,
204 PluginTransactionEndEvent.class);
205 assertListEquals(listener.getEventPluginOrModuleKeys(),
206 null,
207 "test.atlassian.plugin:bear",
208 null);
209 }
210
211 @Test
212 public void testInstallPlugin() {
213
214 manager.uninstall(manager.getPlugin("test.atlassian.plugin.classloaded2"));
215 listener.reset();
216 File pluginJar = new File(DirectoryPluginLoaderUtils.getTestPluginsDirectory(),
217 "pooh-test-plugin.jar");
218 manager.installPlugins(new JarPluginArtifact(pluginJar));
219
220 assertListEquals(listener.getEventClasses(),
221 PluginTransactionStartEvent.class,
222 PluginModuleEnabledEvent.class,
223 PluginEnabledEvent.class,
224 PluginTransactionEndEvent.class);
225 }
226
227 @Test
228 public void testUninstallPlugin() {
229
230 manager.uninstall(manager.getPlugin("test.atlassian.plugin.classloaded2"));
231
232 assertListEquals(listener.getEventClasses(),
233 PluginTransactionStartEvent.class,
234 PluginModuleDisabledEvent.class,
235 PluginDisabledEvent.class,
236 PluginTransactionEndEvent.class);
237 }
238
239
240 private static void assertListEquals(List<String> actual, List<String>... oneOfExpected) {
241 boolean found = false;
242 for (List<String> expected : oneOfExpected) {
243 if (actual.equals(expected)) {
244 found = true;
245 break;
246 }
247 }
248 assertTrue("Unexpected list: " + actual, found);
249 }
250
251 private static void assertListEquals(List actual, Object... expected) {
252 String message = "Expected list was: " + Arrays.toString(expected) + ", " +
253 "but actual was: " + actual;
254 assertEquals(message, expected.length, actual.size());
255 for (int i = 0; i < actual.size(); i++) {
256 assertEquals(message, expected[i], actual.get(i));
257 }
258 }
259
260 private DefaultPluginManager buildPluginManager(RecordingListener listener) throws Exception {
261 PluginEventManager pluginEventManager = new DefaultPluginEventManager();
262 pluginEventManager.register(listener);
263
264 DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
265 moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
266 moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
267 moduleDescriptorFactory.addModuleDescriptor("vegetable", MockVegetableModuleDescriptor.class);
268
269 File pluginTempDirectory = DirectoryPluginLoaderUtils.copyTestPluginsToTempDirectory();
270 List<PluginLoader> pluginLoaders = buildPluginLoaders(pluginEventManager, pluginTempDirectory);
271
272 DefaultPluginManager manager = new DefaultPluginManager(new MemoryPluginPersistentStateStore(), pluginLoaders,
273 moduleDescriptorFactory, pluginEventManager);
274 manager.setPluginInstaller(new FilePluginInstaller(pluginTempDirectory));
275
276 return manager;
277 }
278
279 private List<PluginLoader> buildPluginLoaders(PluginEventManager pluginEventManager, File pluginTempDirectory) {
280 List<PluginLoader> pluginLoaders = new ArrayList<>();
281 pluginLoaders.add(new SinglePluginLoader("test-atlassian-plugin.xml"));
282 pluginLoaders.add(new SinglePluginLoader("test-disabled-plugin.xml"));
283 DirectoryPluginLoader directoryPluginLoader = new DirectoryPluginLoader(
284 pluginTempDirectory,
285 ImmutableList.of(new LegacyDynamicPluginFactory(PluginAccessor.Descriptor.FILENAME)),
286 pluginEventManager);
287 pluginLoaders.add(directoryPluginLoader);
288 return pluginLoaders;
289 }
290 }