View Javadoc

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 }