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