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