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 }