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 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          // call the cached method multiple times.
49          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
50          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
51  
52          // broadcast new module and then call again.
53          DummyParentDescriptor descriptor = mock(DummyParentDescriptor.class);
54          pluginEventManager.broadcast(new PluginModuleEnabledEvent(descriptor));
55          cachingPluginAccessorToMock.getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
56  
57          // should have been called at most once.
58          verify(delegate, times(1)).getEnabledModuleDescriptorsByClass(DummyParentDescriptor.class);
59      }
60  
61      public void testFlushCacheAfterAnyPluginDisable()
62      {
63          // call the cached method multiple times.
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  }