1 package com.atlassian.plugin.loaders;
2
3 import com.atlassian.plugin.*;
4 import com.atlassian.plugin.impl.UnloadablePlugin;
5 import com.google.common.collect.ImmutableList;
6 import com.google.common.collect.ImmutableSet;
7 import com.google.common.collect.Iterables;
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.mockito.Mock;
12 import org.mockito.runners.MockitoJUnitRunner;
13
14 import java.util.Set;
15
16 import static org.junit.Assert.assertEquals;
17 import static org.junit.Assert.assertSame;
18 import static org.junit.Assert.assertTrue;
19 import static org.mockito.Matchers.any;
20 import static org.mockito.Mockito.doThrow;
21 import static org.mockito.Mockito.mock;
22 import static org.mockito.Mockito.when;
23
24 @RunWith(MockitoJUnitRunner.class)
25 public final class PermissionCheckingPluginLoaderTest
26 {
27 private PermissionCheckingPluginLoader permissionCheckingPluginLoader;
28
29 @Mock
30 private PluginLoader pluginLoader;
31
32 @Mock
33 private ModuleDescriptorFactory moduleDescriptorFactory;
34
35 @Before
36 public void setUp()
37 {
38 permissionCheckingPluginLoader = new PermissionCheckingPluginLoader(pluginLoader);
39 }
40
41 @Test
42 public void loadAllPluginsWithEmptyCollectionOfPlugins()
43 {
44 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of());
45 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
46 assertTrue(Iterables.isEmpty(plugins));
47 }
48
49 @Test
50 public void loadFoundPluginsWithEmptyCollectionOfPlugins()
51 {
52 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of());
53 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
54 assertTrue(Iterables.isEmpty(plugins));
55 }
56
57 @Test
58 public void loadFoundPluginsWithPluginWithoutExecuteJavaPermissionAndNoJava()
59 {
60 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), false, false);
61
62 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
63 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
64
65 assertEquals(1, Iterables.size(plugins));
66 assertSame(plugin, Iterables.get(plugins, 0));
67 }
68
69 @Test
70 public void loadAllPluginsWithPluginWithoutExecuteJavaPermissionAndNoJava()
71 {
72 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), false, false);
73
74 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
75 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
76
77 assertEquals(1, Iterables.size(plugins));
78 assertSame(plugin, Iterables.get(plugins, 0));
79 }
80
81 @Test
82 public void loadFoundPluginsWithPluginWithoutExecuteJavaPermissionAndSomeJava()
83 {
84 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), true, false);
85
86 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
87 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
88
89 assertEquals(1, Iterables.size(plugins));
90 assertTrue(Iterables.get(plugins, 0) instanceof UnloadablePlugin);
91 }
92
93 @Test
94 public void loadAllPluginsWithPluginWithoutExecuteJavaPermissionAndSomeJava()
95 {
96 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), true, false);
97
98 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
99 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
100
101 assertEquals(1, Iterables.size(plugins));
102 assertTrue(Iterables.get(plugins, 0) instanceof UnloadablePlugin);
103 }
104
105 @Test
106 public void loadAllPluginsWithUnloadablePluginThenRemoved()
107 {
108 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), true, false);
109
110 doThrow(new PluginException("cannot find plugin")).when(pluginLoader).removePlugin(any(Plugin.class));
111 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
112 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
113
114 assertEquals(1, Iterables.size(plugins));
115 Plugin loadedPlugin = Iterables.get(plugins, 0);
116 assertTrue(loadedPlugin instanceof UnloadablePlugin);
117 permissionCheckingPluginLoader.removePlugin(loadedPlugin);
118 }
119
120 @Test
121 public void loadAllPluginsWithPluginWithNoPermissionsAndSystemModules() throws Exception
122 {
123 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), false, false);
124
125 addModuleDescriptor(plugin, true);
126
127 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
128 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
129
130 assertEquals(1, Iterables.size(plugins));
131 assertTrue(Iterables.get(plugins, 0) instanceof UnloadablePlugin);
132 }
133
134 @Test
135 public void loadAllPluginsWithPluginWithNoPermissionsAndNoSystemModules() throws Exception
136 {
137 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), false, false);
138
139 addModuleDescriptor(plugin, false);
140
141 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
142 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
143
144 assertEquals(1, Iterables.size(plugins));
145 assertSame(plugin, Iterables.get(plugins, 0));
146 }
147
148 @Test
149 public void loadFoundPluginsWithPluginWithJavaPermissionAndSomeJava() throws Exception
150 {
151 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(Permissions.EXECUTE_JAVA), true, false);
152
153 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
154 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
155
156 assertEquals(1, Iterables.size(plugins));
157 assertSame(plugin, Iterables.get(plugins, 0));
158 }
159
160 @Test
161 public void loadAllPluginsWithPluginWithCreateSystemModulePermissionsAndSystemModules() throws Exception
162 {
163 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(Permissions.CREATE_SYSTEM_MODULES), false, false);
164
165 addModuleDescriptor(plugin, true);
166
167 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
168 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
169
170 assertEquals(1, Iterables.size(plugins));
171 assertSame(plugin, Iterables.get(plugins, 0));
172 }
173
174 @Test
175 public void loadAllPluginsWithPluginWithCreateSystemModulePermissionsAndNoSystemModules() throws Exception
176 {
177 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(Permissions.CREATE_SYSTEM_MODULES), false, false);
178
179 addModuleDescriptor(plugin, false);
180
181 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
182 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
183
184 assertEquals(1, Iterables.size(plugins));
185 assertSame(plugin, Iterables.get(plugins, 0));
186 }
187
188 @Test
189 public void loadFoundPluginsWithPluginWithJavaPermissionAndNoJava() throws Exception
190 {
191 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(Permissions.EXECUTE_JAVA), false, false);
192
193 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
194 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
195
196 assertEquals(1, Iterables.size(plugins));
197 assertSame(plugin, Iterables.get(plugins, 0));
198 }
199
200 @Test
201 public void loadAllPluginsWithPluginWithJavaPermissionAndNoJava() throws Exception
202 {
203 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(Permissions.EXECUTE_JAVA), false, false);
204
205 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
206 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
207
208 assertEquals(1, Iterables.size(plugins));
209 assertSame(plugin, Iterables.get(plugins, 0));
210 }
211
212 @Test
213 public void loadFoundPluginsWithPluginWithAllPermissionsAndSomeJava() throws Exception
214 {
215 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), true, true);
216
217 when(pluginLoader.loadFoundPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
218 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadFoundPlugins(moduleDescriptorFactory);
219
220 assertEquals(1, Iterables.size(plugins));
221 assertSame(plugin, Iterables.get(plugins, 0));
222 }
223
224 @Test
225 public void loadAllPluginsWithPluginWithAllPermissionsAndSomeJava() throws Exception
226 {
227 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), true, true);
228
229 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
230 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
231
232 assertEquals(1, Iterables.size(plugins));
233 assertSame(plugin, Iterables.get(plugins, 0));
234 }
235
236 @Test
237 public void loadAllPluginsWithPluginWithAllPermissionsAndSystemModules() throws Exception
238 {
239 final PluginArtifactBackedPlugin plugin = newPlugin(ImmutableSet.<String>of(), false, true);
240 addModuleDescriptor(plugin, true);
241
242 when(pluginLoader.loadAllPlugins(moduleDescriptorFactory)).thenReturn(ImmutableList.<Plugin>of(plugin));
243 final Iterable<Plugin> plugins = permissionCheckingPluginLoader.loadAllPlugins(moduleDescriptorFactory);
244
245 assertEquals(1, Iterables.size(plugins));
246 assertSame(plugin, Iterables.get(plugins, 0));
247 }
248
249 private void addModuleDescriptor(PluginArtifactBackedPlugin plugin, boolean system)
250 {
251 ModuleDescriptor descriptor = mock(ModuleDescriptor.class);
252 when(descriptor.getKey()).thenReturn("foo");
253 when(descriptor.isSystemModule()).thenReturn(system);
254 when(plugin.getModuleDescriptors()).thenReturn(ImmutableList.<ModuleDescriptor<?>>of(descriptor));
255 }
256
257 private PluginArtifactBackedPlugin newPlugin(Set<String> permissions, boolean hasJava, boolean hasAllPermissions)
258 {
259 final PluginArtifactBackedPlugin plugin = mockPlugin(PluginArtifactBackedPlugin.class);
260 final PluginArtifact pluginArtifact = mock(PluginArtifact.class);
261 when(plugin.hasAllPermissions()).thenReturn(hasAllPermissions);
262 when(plugin.getActivePermissions()).thenReturn(permissions);
263 when(plugin.getPluginArtifact()).thenReturn(pluginArtifact);
264 when(pluginArtifact.containsJavaExecutableCode()).thenReturn(hasJava);
265 return plugin;
266 }
267
268 private <P extends Plugin> P mockPlugin(Class<P> type)
269 {
270 P mock = mock(type);
271 when(mock.getKey()).thenReturn("test-plugin-key");
272 when(mock.getName()).thenReturn("Test Plugin");
273 return mock;
274 }
275 }