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