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