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