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 }