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