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
70 }
71
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 }