PageRenderTime 28ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/atlassian-plugins-core/src/test/java/com/atlassian/plugin/manager/TestDefaultPluginManagerLongRunning.java

https://bitbucket.org/purewind/atlassian-plugins
Java | 279 lines | 220 code | 47 blank | 12 comment | 7 complexity | 65a471368be89328eb730776554fef0f MD5 | raw file
  1. package com.atlassian.plugin.manager;
  2. import com.atlassian.plugin.DefaultModuleDescriptorFactory;
  3. import com.atlassian.plugin.JarPluginArtifact;
  4. import com.atlassian.plugin.Plugin;
  5. import com.atlassian.plugin.PluginAccessor;
  6. import com.atlassian.plugin.PluginInformation;
  7. import com.atlassian.plugin.PluginParseException;
  8. import com.atlassian.plugin.PluginState;
  9. import com.atlassian.plugin.event.PluginEventManager;
  10. import com.atlassian.plugin.event.impl.DefaultPluginEventManager;
  11. import com.atlassian.plugin.factories.LegacyDynamicPluginFactory;
  12. import com.atlassian.plugin.factories.PluginFactory;
  13. import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
  14. import com.atlassian.plugin.impl.StaticPlugin;
  15. import com.atlassian.plugin.loaders.DirectoryPluginLoader;
  16. import com.atlassian.plugin.loaders.PluginLoader;
  17. import com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils;
  18. import com.atlassian.plugin.manager.store.MemoryPluginPersistentStateStore;
  19. import com.atlassian.plugin.mock.MockAnimalModuleDescriptor;
  20. import com.atlassian.plugin.repositories.FilePluginInstaller;
  21. import com.atlassian.plugin.test.PluginJarBuilder;
  22. import com.google.common.collect.ImmutableList;
  23. import com.mockobjects.dynamic.C;
  24. import com.mockobjects.dynamic.Mock;
  25. import org.apache.commons.io.FileUtils;
  26. import org.junit.After;
  27. import org.junit.Before;
  28. import org.junit.Test;
  29. import java.io.File;
  30. import java.io.InputStream;
  31. import java.util.Arrays;
  32. import java.util.Collections;
  33. import static com.atlassian.plugin.loaders.classloading.DirectoryPluginLoaderUtils.createFillAndCleanTempPluginDirectory;
  34. import static org.junit.Assert.assertEquals;
  35. import static org.junit.Assert.assertFalse;
  36. import static org.junit.Assert.assertNotNull;
  37. import static org.junit.Assert.assertNull;
  38. import static org.junit.Assert.assertTrue;
  39. import static org.junit.Assert.fail;
  40. public class TestDefaultPluginManagerLongRunning {
  41. /**
  42. * the object being tested
  43. */
  44. private DefaultPluginManager manager;
  45. private PluginPersistentStateStore pluginStateStore;
  46. private DefaultModuleDescriptorFactory moduleDescriptorFactory; // we should be able to use the interface here?
  47. private DirectoryPluginLoader directoryPluginLoader;
  48. private PluginEventManager pluginEventManager;
  49. @Before
  50. public void setUp() throws Exception {
  51. pluginEventManager = new DefaultPluginEventManager();
  52. pluginStateStore = new MemoryPluginPersistentStateStore();
  53. moduleDescriptorFactory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  54. }
  55. @After
  56. public void tearDown() throws Exception {
  57. manager = null;
  58. moduleDescriptorFactory = null;
  59. pluginStateStore = null;
  60. if (directoryPluginLoader != null) {
  61. directoryPluginLoader.shutDown();
  62. directoryPluginLoader = null;
  63. }
  64. }
  65. private DefaultPluginManager newDefaultPluginManager(PluginLoader... pluginLoaders) {
  66. return new DefaultPluginManager(pluginStateStore, ImmutableList.copyOf(pluginLoaders), moduleDescriptorFactory, new DefaultPluginEventManager());
  67. }
  68. @Test
  69. public void testEnableFailed() throws PluginParseException {
  70. final Mock mockPluginLoader = new Mock(PluginLoader.class);
  71. final Plugin plugin = new StaticPlugin() {
  72. public PluginState enableInternal() {
  73. return PluginState.DISABLED;
  74. }
  75. public void disableInternal() {
  76. // do nothing
  77. }
  78. };
  79. plugin.setKey("foo");
  80. plugin.setEnabledByDefault(false);
  81. plugin.setPluginInformation(new PluginInformation());
  82. mockPluginLoader.expectAndReturn("loadAllPlugins", C.ANY_ARGS, Collections.singletonList(plugin));
  83. manager = newDefaultPluginManager((PluginLoader) mockPluginLoader.proxy());
  84. manager.init();
  85. assertEquals(1, manager.getPlugins().size());
  86. assertEquals(0, manager.getEnabledPlugins().size());
  87. assertFalse(plugin.getPluginState() == PluginState.ENABLED);
  88. manager.enablePlugin("foo");
  89. assertEquals(1, manager.getPlugins().size());
  90. assertEquals(0, manager.getEnabledPlugins().size());
  91. assertFalse(plugin.getPluginState() == PluginState.ENABLED);
  92. }
  93. private DefaultPluginManager makeClassLoadingPluginManager(File pluginsTestDir) throws PluginParseException {
  94. directoryPluginLoader = new DirectoryPluginLoader(pluginsTestDir, ImmutableList.<PluginFactory>of(
  95. new LegacyDynamicPluginFactory(PluginAccessor.Descriptor.FILENAME)), pluginEventManager);
  96. manager = newDefaultPluginManager(directoryPluginLoader);
  97. moduleDescriptorFactory.addModuleDescriptor("animal", MockAnimalModuleDescriptor.class);
  98. manager.init();
  99. return manager;
  100. }
  101. @Test
  102. public void testInstallPluginTwiceWithSameName() throws Exception {
  103. final DirectoryPluginLoaderUtils.ScannerDirectories directories = createFillAndCleanTempPluginDirectory();
  104. File pluginsTestDir = directories.pluginsTestDir;
  105. FileUtils.cleanDirectory(pluginsTestDir);
  106. final File plugin = File.createTempFile("plugin", ".jar");
  107. plugin.delete();
  108. File jar = new PluginJarBuilder("plugin")
  109. .addPluginInformation("some.key", "My name", "1.0", 1)
  110. .addResource("foo.txt", "foo")
  111. .addJava("my.MyClass",
  112. "package my; public class MyClass {}")
  113. .build();
  114. FileUtils.moveFile(jar, plugin);
  115. final DefaultPluginManager manager = makeClassLoadingPluginManager(pluginsTestDir);
  116. manager.setPluginInstaller(new FilePluginInstaller(pluginsTestDir));
  117. final String pluginKey = manager.installPlugin(new JarPluginArtifact(plugin));
  118. assertTrue(new File(pluginsTestDir, plugin.getName()).exists());
  119. final Plugin installedPlugin = manager.getPlugin(pluginKey);
  120. assertNotNull(installedPlugin);
  121. InputStream s0 = installedPlugin.getClassLoader().getResourceAsStream("foo.txt");
  122. assertNotNull(s0);
  123. s0.close();
  124. assertNull(installedPlugin.getClassLoader().getResourceAsStream("bar.txt"));
  125. assertNotNull(installedPlugin.getClassLoader().loadClass("my.MyClass"));
  126. try {
  127. installedPlugin.getClassLoader().loadClass("my.MyNewClass");
  128. fail("Expected ClassNotFoundException for unknown class");
  129. } catch (final ClassNotFoundException e) {
  130. // expected
  131. }
  132. // sleep to ensure the new plugin is picked up
  133. Thread.sleep(1000);
  134. File jartmp = new PluginJarBuilder("plugin")
  135. .addPluginInformation("some.key", "My name", "1.0", 1)
  136. .addResource("bar.txt", "bar")
  137. .addJava("my.MyNewClass",
  138. "package my; public class MyNewClass {}")
  139. .build();
  140. plugin.delete();
  141. FileUtils.moveFile(jartmp, plugin);
  142. // reinstall the plugin
  143. final String pluginKey2 = manager.installPlugin(new JarPluginArtifact(plugin));
  144. assertTrue(new File(pluginsTestDir, plugin.getName()).exists());
  145. final Plugin installedPlugin2 = manager.getPlugin(pluginKey2);
  146. assertNotNull(installedPlugin2);
  147. assertEquals(1, manager.getEnabledPlugins().size());
  148. assertNull(installedPlugin2.getClassLoader().getResourceAsStream("foo.txt"));
  149. InputStream s1 = installedPlugin2.getClassLoader().getResourceAsStream("bar.txt");
  150. assertNotNull(s1);
  151. s1.close();
  152. assertNotNull(installedPlugin2.getClassLoader().loadClass("my.MyNewClass"));
  153. try {
  154. installedPlugin2.getClassLoader().loadClass("my.MyClass");
  155. fail("Expected ClassNotFoundException for unknown class");
  156. } catch (final ClassNotFoundException e) {
  157. // expected
  158. }
  159. }
  160. @Test
  161. public void testInstallPluginTwiceWithDifferentName() throws Exception {
  162. final DirectoryPluginLoaderUtils.ScannerDirectories directories = createFillAndCleanTempPluginDirectory();
  163. File pluginsTestDir = directories.pluginsTestDir;
  164. FileUtils.cleanDirectory(pluginsTestDir);
  165. final File plugin1 = new PluginJarBuilder("plugin").addPluginInformation("some.key", "My name", "1.0", 1).addResource("foo.txt", "foo").addJava(
  166. "my.MyClass", "package my; public class MyClass {}").build();
  167. final DefaultPluginManager manager = makeClassLoadingPluginManager(pluginsTestDir);
  168. manager.setPluginInstaller(new FilePluginInstaller(pluginsTestDir));
  169. final String pluginKey = manager.installPlugin(new JarPluginArtifact(plugin1));
  170. assertTrue(new File(pluginsTestDir, plugin1.getName()).exists());
  171. final Plugin installedPlugin = manager.getPlugin(pluginKey);
  172. assertNotNull(installedPlugin);
  173. InputStream s0 = installedPlugin.getClassLoader().getResourceAsStream("foo.txt");
  174. assertNotNull(s0);
  175. s0.close();
  176. InputStream s1 = installedPlugin.getClassLoader().getResourceAsStream("bar.txt");
  177. assertNull(s1);
  178. assertNotNull(installedPlugin.getClassLoader().loadClass("my.MyClass"));
  179. try {
  180. installedPlugin.getClassLoader().loadClass("my.MyNewClass");
  181. fail("Expected ClassNotFoundException for unknown class");
  182. } catch (final ClassNotFoundException e) {
  183. // expected
  184. }
  185. // sleep to ensure the new plugin is picked up
  186. Thread.sleep(1000);
  187. final File plugin2 = new PluginJarBuilder("plugin").addPluginInformation("some.key", "My name", "1.0", 1)
  188. .addResource("bar.txt", "bar").addJava("my.MyNewClass", "package my; public class MyNewClass {}")
  189. .build();
  190. // reinstall the plugin
  191. final String pluginKey2 = manager.installPlugin(new JarPluginArtifact(plugin2));
  192. assertFalse(new File(pluginsTestDir, plugin1.getName()).exists());
  193. assertTrue(new File(pluginsTestDir, plugin2.getName()).exists());
  194. final Plugin installedPlugin2 = manager.getPlugin(pluginKey2);
  195. assertNotNull(installedPlugin2);
  196. assertEquals(1, manager.getEnabledPlugins().size());
  197. InputStream s2 = installedPlugin2.getClassLoader().getResourceAsStream("foo.txt");
  198. assertNull(s2);
  199. InputStream s3 = installedPlugin2.getClassLoader().getResourceAsStream("bar.txt");
  200. assertNotNull(s3);
  201. s3.close();
  202. assertNotNull(installedPlugin2.getClassLoader().loadClass("my.MyNewClass"));
  203. try {
  204. installedPlugin2.getClassLoader().loadClass("my.MyClass");
  205. fail("Expected ClassNotFoundException for unknown class");
  206. } catch (final ClassNotFoundException e) {
  207. // expected
  208. }
  209. }
  210. @Test
  211. public void testAddPluginsWithDependencyIssuesNoResolution() throws Exception {
  212. final Plugin servicePlugin = new EnableInPassPlugin("service.plugin", 4);
  213. final Plugin clientPlugin = new EnableInPassPlugin("client.plugin", 1);
  214. manager = newDefaultPluginManager();
  215. manager.addPlugins(null, Arrays.asList(servicePlugin, clientPlugin));
  216. assertTrue(clientPlugin.getPluginState() == PluginState.ENABLED);
  217. assertFalse(servicePlugin.getPluginState() == PluginState.ENABLED);
  218. }
  219. private static class EnableInPassPlugin extends StaticPlugin {
  220. private int pass;
  221. public EnableInPassPlugin(final String key, final int pass) {
  222. this.pass = pass;
  223. setKey(key);
  224. }
  225. @Override
  226. public void enable() {
  227. if (--pass <= 0) {
  228. super.enable();
  229. }
  230. }
  231. }
  232. }