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.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          // prevent resources being used until end of all tests
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",  // a  module that can't be individually disabled can still be disabled with the plugin
106                 "test.atlassian.plugin:gold", // modules in reverse order to enable
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         // have to uninstall one of the directory plugins
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         // have to uninstall one of the directory plugins
184         manager.uninstall(manager.getPlugin("test.atlassian.plugin.classloaded2"));
185 
186         assertListEquals(listener.getEventClasses(),
187                 PluginModuleDisabledEvent.class,
188                 PluginDisabledEvent.class);
189     }
190 
191     // yeah, the expected values should come first in jUnit, but varargs are so convenient...
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 }