View Javadoc

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          // call the cached method multiple times.
39          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
40          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
41  
42          // broadcast new module and then call again.
43          DummyParentDescriptor descriptor = mock(DummyParentDescriptor.class);
44          pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
45          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
46  
47          // should have been called at most once.
48          verify(delegate, times(1)).getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
49      }
50  
51      public void testFlushCacheAfterAnyPluginDisable()
52      {
53          // call the cached method multiple times.
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  }