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