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