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
62 }
63
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 }