PageRenderTime 25ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/atlassian-plugins-osgi/src/test/java/it/com/atlassian/plugin/osgi/TestEnableDisablePlugin.java

https://bitbucket.org/atlassian/atlassian-plugins
Java | 337 lines | 289 code | 48 blank | 0 comment | 9 complexity | 247e6fafe7b47969e8ce8198772230d1 MD5 | raw file
  1. package it.com.atlassian.plugin.osgi;
  2. import com.atlassian.plugin.DefaultModuleDescriptorFactory;
  3. import com.atlassian.plugin.JarPluginArtifact;
  4. import com.atlassian.plugin.Plugin;
  5. import com.atlassian.plugin.PluginRestartState;
  6. import com.atlassian.plugin.PluginState;
  7. import com.atlassian.plugin.descriptors.AbstractModuleDescriptor;
  8. import com.atlassian.plugin.descriptors.RequiresRestart;
  9. import com.atlassian.plugin.hostcontainer.DefaultHostContainer;
  10. import com.atlassian.plugin.module.ContainerManagedPlugin;
  11. import com.atlassian.plugin.module.ModuleFactory;
  12. import com.atlassian.plugin.osgi.Callable2;
  13. import com.atlassian.plugin.osgi.Callable3;
  14. import com.atlassian.plugin.osgi.PluginInContainerTestBase;
  15. import com.atlassian.plugin.osgi.hostcomponents.ComponentRegistrar;
  16. import com.atlassian.plugin.osgi.hostcomponents.HostComponentProvider;
  17. import com.atlassian.plugin.test.PluginJarBuilder;
  18. import org.junit.Test;
  19. import org.osgi.framework.Bundle;
  20. import org.osgi.util.tracker.ServiceTracker;
  21. import java.io.File;
  22. import static org.junit.Assert.assertEquals;
  23. import static org.junit.Assert.assertFalse;
  24. import static org.junit.Assert.assertNotNull;
  25. import static org.junit.Assert.assertTrue;
  26. public class TestEnableDisablePlugin extends PluginInContainerTestBase {
  27. @Test
  28. public void testEnableDisableEnable() throws Exception {
  29. File pluginJar = new PluginJarBuilder("enabledisabletest")
  30. .addPluginInformation("enabledisable", "foo", "1.0")
  31. .addJava("my.Foo", "package my;" +
  32. "public class Foo {}")
  33. .build();
  34. initPluginManager(null);
  35. pluginController.installPlugins(new JarPluginArtifact(pluginJar));
  36. Plugin plugin = pluginAccessor.getPlugin("enabledisable");
  37. assertNotNull(((ContainerManagedPlugin) plugin).getContainerAccessor().createBean(plugin.loadClass("my.Foo", this.getClass())));
  38. pluginController.disablePlugin("enabledisable");
  39. pluginController.enablePlugins("enabledisable");
  40. plugin = pluginAccessor.getPlugin("enabledisable");
  41. assertNotNull(((ContainerManagedPlugin) plugin).getContainerAccessor().createBean(plugin.loadClass("my.Foo", this.getClass())));
  42. }
  43. @Test
  44. public void testEnableDisableEnableWithPublicComponent() throws Exception {
  45. File pluginJar = new PluginJarBuilder("enabledisabletest")
  46. .addFormattedResource("atlassian-plugin.xml",
  47. "<atlassian-plugin name='Test 2' key='enabledisablewithcomponent' pluginsVersion='2'>",
  48. " <plugin-info>",
  49. " <version>1.0</version>",
  50. " </plugin-info>",
  51. " <component key='foo' class='my.Foo' public='true' interface='my.Fooable'/>",
  52. "</atlassian-plugin>")
  53. .addJava("my.Fooable", "package my;" +
  54. "public interface Fooable {}")
  55. .addFormattedJava("my.Foo", "package my;",
  56. "public class Foo implements Fooable, org.springframework.beans.factory.DisposableBean {",
  57. " public void destroy() throws Exception { Thread.sleep(500); }",
  58. "}")
  59. .build();
  60. initPluginManager(null);
  61. pluginController.installPlugins(new JarPluginArtifact(pluginJar));
  62. Plugin plugin = pluginAccessor.getPlugin("enabledisablewithcomponent");
  63. assertEquals(PluginState.ENABLED, plugin.getPluginState());
  64. assertNotNull(((ContainerManagedPlugin) plugin).getContainerAccessor().createBean(plugin.loadClass("my.Foo", this.getClass())));
  65. pluginController.disablePlugin("enabledisablewithcomponent");
  66. pluginController.enablePlugins("enabledisablewithcomponent");
  67. plugin = pluginAccessor.getPlugin("enabledisablewithcomponent");
  68. assertEquals(PluginState.ENABLED, plugin.getPluginState());
  69. assertNotNull(((ContainerManagedPlugin) plugin).getContainerAccessor().createBean(plugin.loadClass("my.Foo", this.getClass())));
  70. }
  71. @Test
  72. public void testDisableEnableOfPluginThatRequiresRestart() throws Exception {
  73. final DefaultModuleDescriptorFactory factory = new DefaultModuleDescriptorFactory(new DefaultHostContainer());
  74. factory.addModuleDescriptor("requiresRestart", RequiresRestartModuleDescriptor.class);
  75. new PluginJarBuilder()
  76. .addFormattedResource("atlassian-plugin.xml",
  77. "<atlassian-plugin name='Test 2' key='test.restartrequired' pluginsVersion='2'>",
  78. " <plugin-info>",
  79. " <version>1.0</version>",
  80. " </plugin-info>",
  81. " <requiresRestart key='foo' />",
  82. "</atlassian-plugin>")
  83. .build(pluginsDir);
  84. initPluginManager(null, factory);
  85. assertEquals(1, pluginAccessor.getPlugins().size());
  86. assertNotNull(pluginAccessor.getPlugin("test.restartrequired"));
  87. assertTrue(pluginAccessor.isPluginEnabled("test.restartrequired"));
  88. assertEquals(1, pluginAccessor.getEnabledModuleDescriptorsByClass(RequiresRestartModuleDescriptor.class).size());
  89. assertEquals(PluginRestartState.NONE, pluginAccessor.getPluginRestartState("test.restartrequired"));
  90. pluginController.disablePlugin("test.restartrequired");
  91. assertFalse(pluginAccessor.isPluginEnabled("test.restartrequired"));
  92. pluginController.enablePlugins("test.restartrequired");
  93. assertEquals(1, pluginAccessor.getPlugins().size());
  94. assertNotNull(pluginAccessor.getPlugin("test.restartrequired"));
  95. assertTrue(pluginAccessor.isPluginEnabled("test.restartrequired"));
  96. assertEquals(PluginRestartState.NONE, pluginAccessor.getPluginRestartState("test.restartrequired"));
  97. assertEquals(1, pluginAccessor.getEnabledModuleDescriptorsByClass(RequiresRestartModuleDescriptor.class).size());
  98. }
  99. @Test
  100. public void testEnableEnablesDependentPlugins() throws Exception {
  101. installDependentPlugins();
  102. Plugin provider = pluginAccessor.getPlugin("provider");
  103. Plugin consumer = pluginAccessor.getPlugin("consumer");
  104. assertEquals(PluginState.ENABLED, provider.getPluginState());
  105. assertEquals(PluginState.ENABLED, consumer.getPluginState());
  106. pluginController.disablePlugin("provider");
  107. pluginController.disablePlugin("consumer");
  108. assertEquals(PluginState.DISABLED, provider.getPluginState());
  109. assertEquals(PluginState.DISABLED, consumer.getPluginState());
  110. pluginController.enablePlugins("consumer");
  111. assertEquals(PluginState.ENABLED, consumer.getPluginState());
  112. assertEquals(PluginState.ENABLED, provider.getPluginState());
  113. }
  114. @Test
  115. public void testDisablePersistsDisablesOfDependentPlugins() throws Exception {
  116. installDependentPlugins();
  117. Plugin provider = pluginAccessor.getPlugin("provider");
  118. Plugin consumer = pluginAccessor.getPlugin("consumer");
  119. assertEquals(PluginState.ENABLED, provider.getPluginState());
  120. assertEquals(PluginState.ENABLED, consumer.getPluginState());
  121. pluginController.disablePlugin("provider");
  122. assertFalse("The provider should be disabled as we've disabled it explicitly", store.load().isEnabled(provider));
  123. assertFalse("The consumer should be disabled as it depends on the provider", store.load().isEnabled(consumer));
  124. }
  125. @Test
  126. public void testStoppedOsgiBundleDetected() throws Exception {
  127. new PluginJarBuilder("osgi")
  128. .addFormattedResource("META-INF/MANIFEST.MF",
  129. "Manifest-Version: 1.0",
  130. "Bundle-SymbolicName: my",
  131. "Bundle-Version: 1.0",
  132. "")
  133. .build(pluginsDir);
  134. initPluginManager();
  135. Plugin plugin = pluginAccessor.getPlugin("my-1.0");
  136. assertTrue("Enabled in accessor", pluginAccessor.isPluginEnabled("my-1.0"));
  137. assertTrue("Enabled in plugin", plugin.getPluginState() == PluginState.ENABLED);
  138. for (Bundle bundle : osgiContainerManager.getBundles()) {
  139. if (bundle.getSymbolicName().equals("my")) {
  140. bundle.stop();
  141. }
  142. }
  143. assertFalse("Disabled in accessor", pluginAccessor.isPluginEnabled("my-1.0"));
  144. assertTrue("Disabled in plugin", plugin.getPluginState() == PluginState.DISABLED);
  145. }
  146. @Test
  147. public void testStoppedOsgiPluginDetected() throws Exception {
  148. new PluginJarBuilder("osgi")
  149. .addPluginInformation("my", "foo", "1.0")
  150. .build(pluginsDir);
  151. initPluginManager();
  152. Plugin plugin = pluginAccessor.getPlugin("my");
  153. assertTrue(pluginAccessor.isPluginEnabled("my"));
  154. assertTrue(plugin.getPluginState() == PluginState.ENABLED);
  155. for (Bundle bundle : osgiContainerManager.getBundles()) {
  156. if (bundle.getSymbolicName().equals("my")) {
  157. bundle.stop();
  158. }
  159. }
  160. assertFalse(pluginAccessor.isPluginEnabled("my"));
  161. assertTrue(plugin.getPluginState() == PluginState.DISABLED);
  162. }
  163. @Test
  164. public void testEnableEnablesDependentPluginsWithBundles() throws Exception {
  165. PluginJarBuilder builderProvider = new PluginJarBuilder("enabledisable-prov")
  166. .addFormattedResource("META-INF/MANIFEST.MF",
  167. "Manifest-Version: 1.0",
  168. "Bundle-SymbolicName: my",
  169. "Atlassian-Plugin-Key: provider",
  170. "Export-Package: my",
  171. "")
  172. .addJava("my.Foo", "package my;" +
  173. "public interface Foo {}");
  174. PluginJarBuilder builderConsumer = new PluginJarBuilder("enabledisable-con", builderProvider.getClassLoader())
  175. .addFormattedResource("atlassian-plugin.xml",
  176. "<atlassian-plugin name='Test' key='consumer' pluginsVersion='2'>",
  177. " <plugin-info>",
  178. " <version>1.0</version>",
  179. " <bundle-instructions><Import-Package>my</Import-Package></bundle-instructions>",
  180. " </plugin-info>",
  181. "</atlassian-plugin>")
  182. .addJava("my2.Bar", "package my2;" +
  183. "public class Bar implements my.Foo {}");
  184. initPluginManager(null);
  185. pluginController.installPlugins(new JarPluginArtifact(builderProvider.build()));
  186. pluginController.installPlugins(new JarPluginArtifact(builderConsumer.build()));
  187. Plugin provider = pluginAccessor.getPlugin("provider");
  188. Plugin consumer = pluginAccessor.getPlugin("consumer");
  189. assertEquals(PluginState.ENABLED, provider.getPluginState());
  190. assertEquals(PluginState.ENABLED, consumer.getPluginState());
  191. pluginController.disablePlugin("provider");
  192. pluginController.disablePlugin("consumer");
  193. assertEquals(PluginState.DISABLED, provider.getPluginState());
  194. assertEquals(PluginState.DISABLED, consumer.getPluginState());
  195. pluginController.enablePlugins("consumer");
  196. assertEquals(PluginState.ENABLED, consumer.getPluginState());
  197. assertEquals(PluginState.ENABLED, provider.getPluginState());
  198. }
  199. @Test
  200. public void testDisableDoesNotKillLongRunningOperation() throws Exception {
  201. File pluginJar = new PluginJarBuilder("longrunning")
  202. .addFormattedResource("atlassian-plugin.xml",
  203. "<atlassian-plugin name='Test' key='longrunning' pluginsVersion='2'>",
  204. " <plugin-info>",
  205. " <version>1.0</version>",
  206. " </plugin-info>",
  207. " <component key='comp' class='my.Foo' public='true'>",
  208. " <interface>com.atlassian.plugin.osgi.Callable3</interface>",
  209. " </component>",
  210. "</atlassian-plugin>")
  211. .addFormattedJava("my.Foo",
  212. "package my;",
  213. "import com.atlassian.plugin.osgi.*;",
  214. "public class Foo implements Callable3{",
  215. " private Callable2 callable;",
  216. " public Foo(Callable2 callable) {",
  217. " this.callable = callable;",
  218. " }",
  219. " public String call() throws Exception {",
  220. " Thread.sleep(2000);",
  221. " return callable.call();",
  222. " }",
  223. "}")
  224. .build();
  225. initPluginManager(new HostComponentProvider() {
  226. public void provide(ComponentRegistrar registrar) {
  227. registrar.register(Callable2.class).forInstance(new Callable2() {
  228. public String call() {
  229. return "called";
  230. }
  231. }).withName("foobar");
  232. }
  233. });
  234. pluginController.installPlugins(new JarPluginArtifact(pluginJar));
  235. assertTrue(pluginAccessor.getPlugin("longrunning").getPluginState() == PluginState.ENABLED);
  236. final ServiceTracker tracker = osgiContainerManager.getServiceTracker("com.atlassian.plugin.osgi.Callable3");
  237. final Callable3 service = (Callable3) tracker.getService();
  238. final StringBuilder sb = new StringBuilder();
  239. Thread t = new Thread() {
  240. public void run() {
  241. try {
  242. sb.append(service.call());
  243. } catch (Exception e) {
  244. throw new RuntimeException(e);
  245. }
  246. }
  247. };
  248. t.start();
  249. pluginController.disablePlugin("longrunning");
  250. t.join();
  251. assertEquals("called", sb.toString());
  252. }
  253. @RequiresRestart
  254. public static class RequiresRestartModuleDescriptor extends AbstractModuleDescriptor<Void> {
  255. public RequiresRestartModuleDescriptor() {
  256. super(ModuleFactory.LEGACY_MODULE_FACTORY);
  257. }
  258. @Override
  259. public Void getModule() {
  260. throw new UnsupportedOperationException("You should never be getting a module from this descriptor " + this.getClass().getName());
  261. }
  262. }
  263. private void installDependentPlugins() throws Exception
  264. {
  265. PluginJarBuilder builderProvider = new PluginJarBuilder("enabledisable-prov")
  266. .addFormattedResource("atlassian-plugin.xml",
  267. "<atlassian-plugin name='Test' key='provider' pluginsVersion='2'>",
  268. " <plugin-info>",
  269. " <version>1.0</version>",
  270. " <bundle-instructions><Export-Package>my</Export-Package></bundle-instructions>",
  271. " </plugin-info>",
  272. "</atlassian-plugin>")
  273. .addJava("my.Foo", "package my;" +
  274. "public interface Foo {}");
  275. PluginJarBuilder builderConsumer = new PluginJarBuilder("enabledisable-con", builderProvider.getClassLoader())
  276. .addFormattedResource("atlassian-plugin.xml",
  277. "<atlassian-plugin name='Test' key='consumer' pluginsVersion='2'>",
  278. " <plugin-info>",
  279. " <version>1.0</version>",
  280. " <bundle-instructions><Import-Package>my</Import-Package></bundle-instructions>",
  281. " </plugin-info>",
  282. "</atlassian-plugin>")
  283. .addJava("my2.Bar", "package my2;" +
  284. "public class Bar implements my.Foo {}");
  285. initPluginManager(null);
  286. pluginController.installPlugins(new JarPluginArtifact(builderProvider.build()));
  287. pluginController.installPlugins(new JarPluginArtifact(builderConsumer.build()));
  288. }
  289. }