View Javadoc
1   package com.atlassian.plugin.tracker;
2   
3   import com.atlassian.plugin.ModuleDescriptor;
4   import com.atlassian.plugin.Plugin;
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.PluginModuleDisabledEvent;
9   import com.atlassian.plugin.event.events.PluginModuleEnabledEvent;
10  import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
11  import junit.framework.TestCase;
12  
13  import java.util.Arrays;
14  import java.util.Collections;
15  import java.util.concurrent.atomic.AtomicBoolean;
16  
17  import static org.mockito.Mockito.mock;
18  import static org.mockito.Mockito.when;
19  
20  /**
21   *
22   */
23  public class TestDefaultPluginModuleTracker extends TestCase {
24      private PluginAccessor pluginAccessor;
25      private PluginEventManager pluginEventManager;
26      private DefaultPluginModuleTracker tracker;
27  
28      @Override
29      protected void setUp() throws Exception {
30          pluginAccessor = mock(PluginAccessor.class);
31          when(pluginAccessor.getEnabledPlugins()).thenReturn(Collections.<Plugin>emptyList());
32          pluginEventManager = new DefaultPluginEventManager();
33          tracker = new DefaultPluginModuleTracker<Object, MyModuleDescriptor>(pluginAccessor, pluginEventManager, MyModuleDescriptor.class);
34      }
35  
36      public void testAddModule() {
37          assertFalse(tracker.getModuleDescriptors().iterator().hasNext());
38          assertEquals(0, tracker.size());
39          MyModuleDescriptor descriptor = mock(MyModuleDescriptor.class);
40          pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
41          assertEquals(1, tracker.size());
42          assertEquals(descriptor, tracker.getModuleDescriptors().iterator().next());
43      }
44  
45      public void testAddModuleThenRemove() {
46          assertFalse(tracker.getModuleDescriptors().iterator().hasNext());
47          assertEquals(0, tracker.size());
48          MyModuleDescriptor descriptor = mock(MyModuleDescriptor.class);
49          pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
50          assertEquals(1, tracker.size());
51          assertEquals(descriptor, tracker.getModuleDescriptors().iterator().next());
52          pluginEventManager.broadcast(new PluginModuleDisabledEvent(descriptor, true));
53          assertFalse(tracker.getModuleDescriptors().iterator().hasNext());
54          assertEquals(0, tracker.size());
55      }
56  
57      public void testRemovePlugin() {
58          MyModuleDescriptor descriptor = mock(MyModuleDescriptor.class);
59          Plugin plugin = mock(Plugin.class);
60          when(descriptor.getPlugin()).thenReturn(plugin);
61          when(plugin.getModuleDescriptors()).thenReturn(Arrays.<ModuleDescriptor<?>>asList(descriptor));
62  
63          pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
64          assertEquals(1, tracker.size());
65          pluginEventManager.broadcast(new PluginDisabledEvent(plugin));
66          assertEquals(0, tracker.size());
67      }
68  
69      public void testAddModuleWithCustomizer() {
70          MyModuleDescriptor oldDescriptor = mock(MyModuleDescriptor.class);
71          final MyModuleDescriptor newDescriptor = mock(MyModuleDescriptor.class);
72          PluginModuleTracker tracker = new DefaultPluginModuleTracker<Object, MyModuleDescriptor>(
73                  pluginAccessor, pluginEventManager,
74                  MyModuleDescriptor.class,
75                  new PluginModuleTracker.Customizer<Object, MyModuleDescriptor>() {
76                      public MyModuleDescriptor adding(MyModuleDescriptor descriptor) {
77                          return newDescriptor;
78                      }
79  
80                      public void removed(MyModuleDescriptor descriptor) {
81                      }
82                  });
83          pluginEventManager.broadcast(new PluginModuleEnabledEvent(oldDescriptor));
84          assertEquals(1, tracker.size());
85          assertEquals(newDescriptor, tracker.getModuleDescriptors().iterator().next());
86      }
87  
88      public void testRemoveModuleWithCustomizer() {
89          MyModuleDescriptor descriptor = mock(MyModuleDescriptor.class);
90          final AtomicBoolean removedCalled = new AtomicBoolean();
91          PluginModuleTracker tracker = new DefaultPluginModuleTracker<Object, MyModuleDescriptor>(
92                  pluginAccessor, pluginEventManager,
93                  MyModuleDescriptor.class,
94                  new PluginModuleTracker.Customizer<Object, MyModuleDescriptor>() {
95                      public MyModuleDescriptor adding(MyModuleDescriptor descriptor) {
96                          return descriptor;
97                      }
98  
99                      public void removed(MyModuleDescriptor descriptor) {
100                         removedCalled.set(true);
101                     }
102                 });
103         pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
104         assertEquals(1, tracker.size());
105         pluginEventManager.broadcast(new PluginModuleDisabledEvent(descriptor, true));
106         assertTrue(removedCalled.get());
107     }
108 
109     public interface MyModuleDescriptor extends ModuleDescriptor<Object> {
110     }
111 
112 }