PageRenderTime 46ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/atlassian-plugins-core/src/test/java/it/com/atlassian/plugin/loaders/TestSinglePluginLoader.java

https://bitbucket.org/atlassian/atlassian-plugins
Java | 269 lines | 211 code | 43 blank | 15 comment | 2 complexity | cfe90f84424668dbdc7e0151c3037143 MD5 | raw file
  1. package it.com.atlassian.plugin.loaders;
  2. import com.atlassian.plugin.DefaultModuleDescriptorFactory;
  3. import com.atlassian.plugin.ModuleDescriptor;
  4. import com.atlassian.plugin.Plugin;
  5. import com.atlassian.plugin.StateAware;
  6. import com.atlassian.plugin.descriptors.UnrecognisedModuleDescriptor;
  7. import com.atlassian.plugin.elements.ResourceDescriptor;
  8. import com.atlassian.plugin.elements.ResourceLocation;
  9. import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
  10. import com.atlassian.plugin.impl.UnloadablePlugin;
  11. import com.atlassian.plugin.loaders.SinglePluginLoader;
  12. import com.atlassian.plugin.mock.MockAnimalModuleDescriptor;
  13. import com.atlassian.plugin.mock.MockBear;
  14. import com.atlassian.plugin.mock.MockGold;
  15. import com.atlassian.plugin.mock.MockMineral;
  16. import com.atlassian.plugin.mock.MockMineralModuleDescriptor;
  17. import com.atlassian.plugin.mock.MockVegetableModuleDescriptor;
  18. import com.atlassian.plugin.util.ClassLoaderUtils;
  19. import com.google.common.collect.ImmutableList;
  20. import com.google.common.collect.Iterables;
  21. import org.hamcrest.Matchers;
  22. import org.hamcrest.collection.IsIterableWithSize;
  23. import org.junit.Test;
  24. import java.util.ArrayList;
  25. import java.util.Collection;
  26. import java.util.Iterator;
  27. import java.util.List;
  28. import java.util.Map;
  29. import static org.hamcrest.MatcherAssert.assertThat;
  30. import static org.hamcrest.Matchers.endsWith;
  31. import static org.hamcrest.Matchers.hasSize;
  32. import static org.hamcrest.Matchers.instanceOf;
  33. import static org.hamcrest.Matchers.is;
  34. import static org.hamcrest.Matchers.notNullValue;
  35. import static org.hamcrest.Matchers.nullValue;
  36. public class TestSinglePluginLoader {
  37. @Test
  38. public void singlePluginLoader() {
  39. final SinglePluginLoader loader = new SinglePluginLoader("test-system-plugin.xml");
  40. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  41. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  42. moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
  43. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  44. assertThat(plugins, IsIterableWithSize.iterableWithSize(1));
  45. // test the plugin information
  46. final Plugin plugin = plugins.iterator().next();
  47. assertThat(plugin.isSystemPlugin(), is(true));
  48. }
  49. @Test
  50. public void rejectOsgiPlugin() {
  51. final SinglePluginLoader loader = new SinglePluginLoader("test-osgi-plugin.xml");
  52. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  53. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  54. assertThat(plugins, IsIterableWithSize.iterableWithSize(1));
  55. // test the plugin information
  56. final Plugin plugin = plugins.iterator().next();
  57. assertThat(plugin, instanceOf(UnloadablePlugin.class));
  58. assertThat(plugin.getKey(), is("test.atlassian.plugin"));
  59. }
  60. @Test
  61. public void atlassianPlugin() {
  62. final SinglePluginLoader loader = new SinglePluginLoader("test-atlassian-plugin.xml");
  63. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  64. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  65. moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
  66. moduleDescriptorFactory.addModuleDescriptor("vegetable", MockVegetableModuleDescriptor.class);
  67. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  68. assertThat(plugins, IsIterableWithSize.iterableWithSize(1));
  69. // test the plugin information
  70. final Plugin plugin = plugins.iterator().next();
  71. enableModules(plugin);
  72. assertThat(plugin.getName(), is("Test Plugin"));
  73. assertThat(plugin.getKey(), is("test.atlassian.plugin"));
  74. assertThat(plugin.getPluginInformation(), notNullValue());
  75. assertThat(plugin.getPluginInformation().getVersion(), is("1.0"));
  76. assertThat(plugin.getI18nNameKey(), is("test.atlassian.plugin.i18n"));
  77. assertThat(plugin.getPluginInformation().getDescriptionKey(), is("test.atlassian.plugin.desc.i18n"));
  78. assertThat(plugin.getPluginInformation().getDescription(), is("This plugin descriptor is just used for test purposes!"));
  79. assertThat(plugin.getPluginInformation().getVendorName(), is("Atlassian Software Systems Pty Ltd"));
  80. assertThat(plugin.getPluginInformation().getVendorUrl(), is("http://www.atlassian.com"));
  81. assertThat(plugin.getModuleDescriptors().size(), is(4));
  82. final ModuleDescriptor bearDescriptor = plugin.getModuleDescriptor("bear");
  83. assertThat(bearDescriptor.getCompleteKey(), is("test.atlassian.plugin:bear"));
  84. assertThat(bearDescriptor.getKey(), is("bear"));
  85. assertThat(bearDescriptor.getName(), is("Bear Animal"));
  86. assertThat(bearDescriptor.getModuleClass(), Matchers.<Class>is(MockBear.class));
  87. assertThat(bearDescriptor.getDescription(), is("A plugin module to describe a bear"));
  88. assertThat(bearDescriptor.isEnabledByDefault(), is(true));
  89. assertThat(bearDescriptor.getI18nNameKey(), is("test.atlassian.module.bear.name"));
  90. assertThat(bearDescriptor.getDescriptionKey(), is("test.atlassian.module.bear.description"));
  91. final Iterable<ResourceDescriptor> resources = bearDescriptor.getResourceDescriptors();
  92. assertThat(resources, IsIterableWithSize.iterableWithSize(3));
  93. final Map<String, String> params = bearDescriptor.getParams();
  94. assertThat(params.get("height"), is("20"));
  95. assertThat(params.get("colour"), is("brown"));
  96. final List<ModuleDescriptor<MockGold>> goldDescriptors = plugin.getModuleDescriptorsByModuleClass(MockGold.class);
  97. assertThat(goldDescriptors, hasSize(1));
  98. final ModuleDescriptor goldDescriptor = goldDescriptors.get(0);
  99. assertThat(goldDescriptor.getCompleteKey(), is("test.atlassian.plugin:gold"));
  100. assertThat(goldDescriptor.getModule(), Matchers.is(new MockGold(20)));
  101. final List<ModuleDescriptor<MockMineral>> mineralDescriptors = plugin.getModuleDescriptorsByModuleClass(MockMineral.class);
  102. assertThat(mineralDescriptors, hasSize(1));
  103. final ModuleDescriptor mineralDescriptor = mineralDescriptors.get(0);
  104. assertThat(mineralDescriptor, is(goldDescriptor));
  105. assertThat(plugin.getResourceDescriptors(), IsIterableWithSize.iterableWithSize(1));
  106. final ResourceLocation pluginResource = plugin.getResourceLocation("download", "icon.gif");
  107. assertThat(pluginResource.getLocation(), is("/icon.gif"));
  108. }
  109. @Test
  110. public void disabledPlugin() {
  111. final SinglePluginLoader loader = new SinglePluginLoader("test-disabled-plugin.xml");
  112. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  113. moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
  114. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  115. assertThat(plugins, Matchers.iterableWithSize(1));
  116. final Plugin plugin = plugins.iterator().next();
  117. assertThat(plugin.isEnabledByDefault(), is(false));
  118. final Collection<ModuleDescriptor<?>> moduleDescriptors = plugin.getModuleDescriptors();
  119. assertThat(moduleDescriptors, hasSize(1));
  120. final ModuleDescriptor module = plugin.getModuleDescriptor("gold");
  121. assertThat(module.isEnabledByDefault(), is(false));
  122. }
  123. @Test
  124. public void pluginsInOrder() {
  125. final SinglePluginLoader loader = new SinglePluginLoader(ClassLoaderUtils.getResource("test-ordered-pluginmodules.xml", SinglePluginLoader.class));
  126. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  127. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  128. final Iterable plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  129. final Plugin plugin = (Plugin) plugins.iterator().next();
  130. final Collection<ModuleDescriptor<?>> modules = plugin.getModuleDescriptors();
  131. assertThat(modules, hasSize(3));
  132. final Iterator iterator = modules.iterator();
  133. assertThat(((MockAnimalModuleDescriptor) iterator.next()).getKey(), is("yogi1"));
  134. assertThat(((MockAnimalModuleDescriptor) iterator.next()).getKey(), is("yogi2"));
  135. assertThat(((MockAnimalModuleDescriptor) iterator.next()).getKey(), is("yogi3"));
  136. }
  137. @Test
  138. public void unknownPluginModule() {
  139. final SinglePluginLoader loader = new SinglePluginLoader("test-bad-plugin.xml");
  140. final Iterable<Plugin> plugins = loader.loadAllPlugins(new DefaultModuleDescriptorFactory(new DefaultHostContainer()));
  141. assertThat(plugins, Matchers.iterableWithSize(1));
  142. final Plugin plugin = plugins.iterator().next();
  143. final List<ModuleDescriptor<?>> moduleList = ImmutableList.copyOf(plugin.getModuleDescriptors());
  144. assertThat(moduleList, hasSize(1));
  145. // The module that had the problem should be an
  146. // UnrecognisedModuleDescriptor
  147. assertThat(moduleList.get(0).getClass(), Matchers.<Class>is(UnrecognisedModuleDescriptor.class));
  148. }
  149. // PLUG-5
  150. @Test
  151. public void pluginWithOnlyPermittedModules() {
  152. final SinglePluginLoader loader = new SinglePluginLoader("test-atlassian-plugin.xml");
  153. // Define the module descriptor factory
  154. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  155. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  156. moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
  157. // Exclude mineral
  158. final List<String> permittedList = new ArrayList<>();
  159. permittedList.add("animal");
  160. moduleDescriptorFactory.setPermittedModuleKeys(permittedList);
  161. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  162. // 1 plugin returned
  163. assertThat(plugins, Matchers.iterableWithSize(1));
  164. final Plugin plugin = plugins.iterator().next();
  165. // Only one descriptor, animal
  166. assertThat(plugin.getModuleDescriptors(), hasSize(1));
  167. assertThat(plugin.getModuleDescriptor("bear"), notNullValue());
  168. assertThat(plugin.getModuleDescriptor("gold"), nullValue());
  169. }
  170. // PLUG-5
  171. @Test
  172. public void pluginWithOnlyPermittedModulesAndMissingModuleDescriptor() {
  173. final SinglePluginLoader loader = new SinglePluginLoader("test-atlassian-plugin.xml");
  174. // Define the module descriptor factory
  175. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  176. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  177. // Exclude mineral
  178. final List<String> permittedList = new ArrayList<>();
  179. permittedList.add("animal");
  180. moduleDescriptorFactory.setPermittedModuleKeys(permittedList);
  181. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  182. // 1 plugin returned
  183. assertThat(plugins, Matchers.iterableWithSize(1));
  184. final Plugin plugin = plugins.iterator().next();
  185. // Only one descriptor, animal
  186. assertThat(plugin.getModuleDescriptors(), hasSize(1));
  187. assertThat(plugin.getModuleDescriptor("bear"), notNullValue());
  188. assertThat(plugin.getModuleDescriptor("gold"), nullValue());
  189. }
  190. @Test
  191. public void badPluginKey() {
  192. final SinglePluginLoader loader = new SinglePluginLoader("test-bad-plugin-key-plugin.xml");
  193. final Iterable<Plugin> plugins = loader.loadAllPlugins(null);
  194. assertThat(plugins, Matchers.iterableWithSize(1));
  195. final Plugin plugin = plugins.iterator().next();
  196. assertThat(plugin, instanceOf(UnloadablePlugin.class));
  197. assertThat(plugin.getKey(), is("test-bad-plugin-key-plugin.xml"));
  198. assertThat(((UnloadablePlugin) plugin).getErrorText(), endsWith("Plugin keys cannot contain ':'. Key is 'test:bad'"));
  199. }
  200. @Test
  201. public void nonUniqueKeysWithinAPlugin() {
  202. final SinglePluginLoader loader = new SinglePluginLoader("test-bad-non-unique-keys-plugin.xml");
  203. final DefaultModuleDescriptorFactory moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  204. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  205. moduleDescriptorFactory.addModuleDescriptor("mineral", MockMineralModuleDescriptor.class);
  206. final Iterable<Plugin> plugins = loader.loadAllPlugins(moduleDescriptorFactory);
  207. assertThat(plugins, Matchers.iterableWithSize(1));
  208. final Plugin plugin = Iterables.get(plugins, 0);
  209. assertThat(plugin, instanceOf(UnloadablePlugin.class));
  210. assertThat(((UnloadablePlugin) plugin).getErrorText(), endsWith("Found duplicate key 'bear' within plugin 'test.bad.plugin'"));
  211. }
  212. @Test
  213. public void badResource() {
  214. final Iterable<Plugin> plugins = new SinglePluginLoader("foo").loadAllPlugins(null);
  215. assertThat(plugins, Matchers.iterableWithSize(1));
  216. assertThat(Iterables.get(plugins, 0), instanceOf(UnloadablePlugin.class));
  217. assertThat(Iterables.get(plugins, 0).getKey(), is("foo"));
  218. }
  219. public void enableModules(final Plugin plugin) {
  220. for (final ModuleDescriptor descriptor : plugin.getModuleDescriptors()) {
  221. if (descriptor instanceof StateAware) {
  222. ((StateAware) descriptor).enabled();
  223. }
  224. }
  225. }
  226. }