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