1 package com.atlassian.plugin.manager;
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.events.PluginDisabledEvent;
7 import com.atlassian.plugin.event.events.PluginModuleEnabledEvent;
8 import com.atlassian.plugin.loaders.PluginLoader;
9 import org.junit.Before;
10 import org.junit.Test;
11 import org.mockito.Mockito;
12
13 import static org.junit.Assert.assertEquals;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.times;
16 import static org.mockito.Mockito.verify;
17
18 public class TestEnabledModuleCachingPluginAccessor extends TestDefaultPluginManager
19 {
20 private PluginAccessor delegate;
21 private PluginAccessor cachingPluginAccessorToMock;
22 private PluginAccessor cachingPluginAccessorToReal;
23
24 @Before
25 public void setUpMocks() throws Exception
26 {
27 manager = newDefaultPluginManager();
28 delegate = Mockito.mock(PluginAccessor.class);
29 cachingPluginAccessorToMock = new EnabledModuleCachingPluginAccessor(delegate, pluginEventManager);
30 cachingPluginAccessorToReal = new EnabledModuleCachingPluginAccessor(manager, pluginEventManager);
31 }
32
33 @Override
34 protected DefaultPluginManager newDefaultPluginManager(PluginLoader... pluginLoaders)
35 {
36 manager = super.newDefaultPluginManager(pluginLoaders);
37 cachingPluginAccessorToReal = new EnabledModuleCachingPluginAccessor(manager, pluginEventManager);
38 return manager;
39 }
40
41 @Override
42 protected PluginAccessor getPluginAccessor()
43 {
44 return cachingPluginAccessorToReal;
45 }
46
47 @Test
48 public void testDelegateShouldCalculateAtMostOnce()
49 {
50
51 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
52 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
53
54
55 DummyParentDescriptor descriptor = mock(DummyParentDescriptor.class);
56 pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
57 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
58
59
60 verify(delegate, times(1)).getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
61 }
62
63 @Test
64 public void testFlushCacheAfterAnyPluginDisable()
65 {
66
67 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
68 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
69
70 pluginEventManager.broadcast(new PluginDisabledEvent(mock(Plugin.class)));
71 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
72 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
73
74 verify(delegate, times(2)).getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
75 }
76
77 @Test
78 public void testChildAndParentClassBeingTrackedSeparately()
79 {
80 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyChildDescriptor.class);
81 cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
82
83 pluginEventManager.broadcast(new PluginModuleEnabledEvent(mock(DummyChildDescriptor.class)));
84 pluginEventManager.broadcast(new PluginModuleEnabledEvent(mock(DummyParentDescriptor.class)));
85
86 assertEquals(1, cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyChildDescriptor.class).size());
87 assertEquals(2, cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class).size());
88 }
89
90 public abstract class DummyParentDescriptor implements ModuleDescriptor
91 {
92 }
93
94 public abstract class DummyChildDescriptor extends DummyParentDescriptor
95 {
96 }
97 }