View Javadoc
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          // prevent resources being used until end of all tests
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",  // a  module that can't be individually disabled can still be disabled with the plugin
119                 "test.atlassian.plugin:gold", // modules in reverse order to enable
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         // have to uninstall one of the directory plugins
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         // have to uninstall one of the directory plugins
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     // yeah, the expected values should come first in jUnit, but varargs are so convenient...
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 }