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