View Javadoc

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