View Javadoc

1   package com.atlassian.plugin.loaders;
2   
3   import com.atlassian.plugin.ModuleDescriptorFactory;
4   import com.atlassian.plugin.Plugin;
5   import com.atlassian.plugin.PluginArtifact;
6   
7   import com.google.common.collect.ImmutableList;
8   
9   import org.junit.Test;
10  import org.junit.runner.RunWith;
11  import org.mockito.Answers;
12  import org.mockito.Mock;
13  import org.mockito.runners.MockitoJUnitRunner;
14  
15  import static org.hamcrest.Matchers.containsInAnyOrder;
16  import static org.junit.Assert.assertEquals;
17  import static org.junit.Assert.assertFalse;
18  import static org.junit.Assert.assertNull;
19  import static org.junit.Assert.assertThat;
20  import static org.junit.Assert.assertTrue;
21  import static org.junit.Assert.fail;
22  
23  import static org.mockito.Mockito.atLeastOnce;
24  import static org.mockito.Mockito.mock;
25  import static org.mockito.Mockito.verify;
26  import static org.mockito.Mockito.when;
27  
28  @RunWith(MockitoJUnitRunner.class)
29  public class TestForwardingPluginLoader
30  {
31      @Mock(answer = Answers.RETURNS_DEEP_STUBS)
32      Plugin plugin;
33  
34      @Mock
35      PluginArtifact pluginArtifact;
36  
37      @Test
38      public void forwardsPluginLoaderMethodsToDelegate()
39      {
40          PluginLoader delegate = mock(PluginLoader.class);
41          final ForwardingPluginLoader loader = new ForwardingPluginLoader(delegate);
42          final ModuleDescriptorFactory moduleDescriptorFactory = mock(ModuleDescriptorFactory.class);
43          final Plugin pluginB = mock(Plugin.class);
44          when(delegate.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.of(plugin, pluginB));
45          when(delegate.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.of(plugin));
46          when(delegate.supportsAddition()).thenReturn(true);
47          when(delegate.supportsRemoval()).thenReturn(true);
48          when(delegate.isDynamicPluginLoader()).thenReturn(false);
49  
50          assertThat(loader.loadAllPlugins(moduleDescriptorFactory), containsInAnyOrder(plugin, pluginB));
51          verify(delegate).loadAllPlugins(moduleDescriptorFactory);
52          assertThat(loader.loadFoundPlugins(moduleDescriptorFactory), containsInAnyOrder(plugin));
53          verify(delegate).loadFoundPlugins(moduleDescriptorFactory);
54          assertTrue(loader.supportsAddition());
55          verify(delegate).supportsAddition();
56          assertTrue(loader.supportsRemoval());
57          verify(delegate).supportsRemoval();
58          loader.removePlugin(pluginB);
59          verify(delegate).removePlugin(pluginB);
60          assertFalse(loader.isDynamicPluginLoader());
61          verify(delegate).isDynamicPluginLoader();
62          try
63          {
64              loader.canLoad(pluginArtifact);
65              fail();
66          }
67          catch(IllegalStateException ise)
68          {
69              // Expected
70          }
71          // Should be ignored - there is no state we can check
72          loader.discardPlugin(plugin);
73      }
74  
75      @Test
76      public void forwardsDynamicPluginLoaderMethodsToDelegate()
77      {
78          DynamicPluginLoader delegate = mock(DynamicPluginLoader.class);
79          final ForwardingPluginLoader loader = new ForwardingPluginLoader(delegate);
80          final String pluginKey = "plugin-key-A";
81          final PluginArtifact pluginArtifactB = mock(PluginArtifact.class);
82          when(delegate.isDynamicPluginLoader()).thenReturn(true);
83          when(delegate.canLoad(pluginArtifact)).thenReturn(pluginKey);
84          when(delegate.canLoad(pluginArtifactB)).thenReturn(null);
85  
86          assertEquals(loader.canLoad(pluginArtifact), pluginKey);
87          verify(delegate).canLoad(pluginArtifact);
88          assertNull(loader.canLoad(pluginArtifactB));
89          verify(delegate).canLoad(pluginArtifactB);
90          verify(delegate, atLeastOnce()).isDynamicPluginLoader();
91      }
92  
93      @Test
94      public void forwardsDiscardablePluginLoaderMethodsToDelegate()
95      {
96          DiscardablePluginLoader delegate = mock(DiscardablePluginLoader.class);
97          final ForwardingPluginLoader loader = new ForwardingPluginLoader(delegate);
98          loader.discardPlugin(plugin);
99          verify(delegate).discardPlugin(plugin);
100     }
101 }