1 package com.atlassian.plugin.loaders.classloading;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginArtifact;
5 import com.atlassian.plugin.PluginArtifactFactory;
6 import com.atlassian.plugin.event.PluginEventManager;
7 import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
8 import com.atlassian.plugin.factories.PluginFactory;
9 import com.atlassian.plugin.impl.UnloadablePlugin;
10 import com.atlassian.plugin.loaders.ScanningPluginLoader;
11 import com.google.common.collect.Iterables;
12 import junit.framework.TestCase;
13 import static org.mockito.Matchers.anyObject;
14 import static org.mockito.Mockito.mock;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17 import static org.mockito.Mockito.never;
18
19 import java.io.File;
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.concurrent.atomic.AtomicBoolean;
23 import java.net.URI;
24
25 public class TestScanningPluginLoader extends TestCase
26 {
27
28 private PluginEventManager pluginEventManager;
29
30 @Override
31 public void setUp() throws Exception
32 {
33 super.setUp();
34 pluginEventManager = new DefaultPluginEventManager();
35 }
36
37 public void testOnShutdown()
38 {
39 PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
40 PluginArtifact art = mock(PluginArtifact.class);
41 when(artFactory.create((URI)anyObject())).thenReturn(art);
42
43 DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
44 Scanner scanner = mock(Scanner.class);
45 when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
46 PluginFactory factory = mock(PluginFactory.class);
47 Plugin plugin = mock(Plugin.class);
48 when(plugin.isUninstallable()).thenReturn(true);
49
50 when(factory.canCreate(art)).thenReturn("foo");
51 when(factory.create(art, null)).thenReturn(plugin);
52
53 ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
54 loader.loadAllPlugins(null);
55 loader.onShutdown(null);
56 verify(plugin).uninstall();
57 }
58
59 public void testFactoryThrowsRuntimeException()
60 {
61 testFactoryThrowsThrowable(new IllegalArgumentException());
62 }
63
64 public void testFactoryThrowsError()
65 {
66 testFactoryThrowsThrowable(new NoClassDefFoundError());
67 }
68
69 private void testFactoryThrowsThrowable(Throwable e)
70 {
71 PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
72 PluginArtifact art = mock(PluginArtifact.class);
73 when(artFactory.create((URI)anyObject())).thenReturn(art);
74
75
76 DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
77 Scanner scanner = mock(Scanner.class);
78 when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
79 PluginFactory factory = mock(PluginFactory.class);
80
81 when(factory.canCreate(art)).thenReturn("foo");
82 when(factory.create(art, null)).thenThrow(e);
83
84 ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
85 Iterable<Plugin> plugins = loader.loadAllPlugins(null);
86 assertNotNull(plugins);
87 assertEquals(1, Iterables.size(plugins));
88 assertTrue(plugins.iterator().next() instanceof UnloadablePlugin);
89 }
90
91 public void testOnShutdownButUninstallable()
92 {
93 PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
94 PluginArtifact art = mock(PluginArtifact.class);
95 when(artFactory.create((URI)anyObject())).thenReturn(art);
96
97 DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
98 Scanner scanner = mock(Scanner.class);
99 when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
100 PluginFactory factory = mock(PluginFactory.class);
101 Plugin plugin = mock(Plugin.class);
102 when(plugin.isUninstallable()).thenReturn(false);
103
104 when(factory.canCreate(art)).thenReturn("foo");
105 when(factory.create(art, null)).thenReturn(plugin);
106
107 ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager);
108 loader.loadAllPlugins(null);
109 loader.onShutdown(null);
110 verify(plugin, never()).uninstall();
111 }
112
113 public void testPostProcessCalledAlways()
114 {
115 final AtomicBoolean called = new AtomicBoolean(false);
116 PluginArtifactFactory artFactory = mock(PluginArtifactFactory.class);
117 PluginArtifact art = mock(PluginArtifact.class);
118 when(artFactory.create((URI)anyObject())).thenReturn(art);
119
120 DeploymentUnit unit = new DeploymentUnit(new File("foo.jar"));
121 Scanner scanner = mock(Scanner.class);
122 when(scanner.getDeploymentUnits()).thenReturn(Collections.singletonList(unit));
123 PluginFactory factory = mock(PluginFactory.class);
124 Plugin plugin = mock(Plugin.class);
125 when(plugin.isUninstallable()).thenReturn(true);
126
127 when(factory.canCreate(art)).thenReturn("foo");
128 when(factory.create(art, null)).thenReturn(plugin);
129 ScanningPluginLoader loader = new ScanningPluginLoader(scanner, Arrays.asList(factory), artFactory, pluginEventManager)
130 {
131 @Override
132 protected Plugin postProcess(Plugin plugin)
133 {
134 called.set(true);
135 return plugin;
136 }
137 };
138 loader.loadAllPlugins(null);
139 assertTrue(called.get());
140
141 called.set(false);
142 DeploymentUnit unit2 = new DeploymentUnit(new File("bar.jar"));
143 when(scanner.scan()).thenReturn(Collections.singletonList(unit2));
144 PluginArtifact art2 = mock(PluginArtifact.class);
145 when(artFactory.create((URI)anyObject())).thenReturn(art2);
146 when(factory.canCreate(art2)).thenReturn("bar");
147 when(factory.create(art2, null)).thenReturn(plugin);
148 loader.loadFoundPlugins(null);
149 assertTrue(called.get());
150 }
151 }