PageRenderTime 23ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/atlassian-plugins-osgi/src/test/java/com/atlassian/plugin/osgi/factory/transform/stage/TestComponentSpringStage.java

https://bitbucket.org/purewind/atlassian-plugins
Java | 247 lines | 201 code | 36 blank | 10 comment | 0 complexity | 3ca62700770f6ac5dfed32cfc4140109 MD5 | raw file
  1. package com.atlassian.plugin.osgi.factory.transform.stage;
  2. import com.atlassian.plugin.JarPluginArtifact;
  3. import com.atlassian.plugin.PluginAccessor;
  4. import com.atlassian.plugin.PluginArtifact;
  5. import com.atlassian.plugin.osgi.container.OsgiContainerManager;
  6. import com.atlassian.plugin.osgi.factory.transform.TransformContext;
  7. import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
  8. import com.atlassian.plugin.test.PluginJarBuilder;
  9. import com.atlassian.plugin.util.validation.ValidationException;
  10. import com.mockobjects.dynamic.C;
  11. import com.mockobjects.dynamic.Mock;
  12. import junit.framework.TestCase;
  13. import org.dom4j.DocumentException;
  14. import org.dom4j.DocumentHelper;
  15. import org.dom4j.Element;
  16. import org.osgi.framework.Constants;
  17. import org.osgi.framework.ServiceReference;
  18. import java.io.ByteArrayInputStream;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import static org.mockito.Mockito.mock;
  22. import static org.mockito.Mockito.when;
  23. public class TestComponentSpringStage extends TestCase {
  24. public void testTransform() throws IOException, DocumentException {
  25. ComponentSpringStage transformer = new ComponentSpringStage();
  26. // private component
  27. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  28. Element component = pluginRoot.addElement("component");
  29. component.addAttribute("key", "foo");
  30. component.addAttribute("class", "my.Foo");
  31. component.addAttribute("alias", "hohoho");
  32. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
  33. "beans:alias[@name='foo' and @alias='hohoho']");
  34. // public component, interface
  35. pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  36. component = pluginRoot.addElement("component");
  37. component.addAttribute("key", "foo");
  38. component.addAttribute("class", "my.Foo");
  39. component.addAttribute("public", "true");
  40. Element inf = component.addElement("interface");
  41. inf.setText("my.IFoo");
  42. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
  43. "osgi:service[@id='foo_osgiService' and @ref='foo']",
  44. "//osgi:interfaces",
  45. "//beans:value[.='my.IFoo']");
  46. // public component, interface as attribute
  47. pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  48. component = pluginRoot.addElement("component");
  49. component.addAttribute("key", "foo");
  50. component.addAttribute("class", "my.Foo");
  51. component.addAttribute("public", "true");
  52. component.addAttribute("interface", "my.IFoo");
  53. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
  54. "osgi:service[@id='foo_osgiService' and @ref='foo']",
  55. "//osgi:interfaces",
  56. "//beans:value[.='my.IFoo']");
  57. }
  58. public void testTransformWithServiceProperties() throws IOException, DocumentException {
  59. ComponentSpringStage transformer = new ComponentSpringStage();
  60. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  61. Element component = pluginRoot.addElement("component");
  62. component.addAttribute("key", "foo");
  63. component.addAttribute("class", "my.Foo");
  64. component.addAttribute("public", "true");
  65. component.addAttribute("interface", "my.IFoo");
  66. Element svcprops = component.addElement("service-properties");
  67. Element prop = svcprops.addElement("entry");
  68. prop.addAttribute("key", "foo");
  69. prop.addAttribute("value", "bar");
  70. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
  71. "osgi:service[@id='foo_osgiService']/osgi:service-properties",
  72. "osgi:service[@id='foo_osgiService']/osgi:service-properties/beans:entry[@key='foo' and @value='bar']",
  73. "//osgi:interfaces",
  74. "//beans:value[.='my.IFoo']");
  75. svcprops.clearContent();
  76. try {
  77. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
  78. "osgi:service[@id='foo_osgiService']/osgi:service-properties",
  79. "//osgi:interfaces",
  80. "//beans:value[.='my.IFoo']");
  81. fail("Validation exception should have been thrown");
  82. } catch (ValidationException ex) {
  83. // expected
  84. }
  85. }
  86. public void testTransformForOneApp() throws IOException, DocumentException {
  87. ComponentSpringStage transformer = new ComponentSpringStage();
  88. // public component, interface
  89. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  90. Element component = pluginRoot.addElement("component");
  91. component.addAttribute("key", "foo");
  92. component.addAttribute("class", "my.Foo");
  93. component.addAttribute("public", "true");
  94. component.addAttribute("application", "bar");
  95. Element inf = component.addElement("interface");
  96. inf.setText("my.IFoo");
  97. SpringTransformerTestHelper.transform(transformer, pluginRoot, "not(beans:bean[@id='foo' and @class='my.Foo'])");
  98. pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  99. component = pluginRoot.addElement("component");
  100. component.addAttribute("key", "foo");
  101. component.addAttribute("class", "my.Foo");
  102. component.addAttribute("public", "true");
  103. component.addAttribute("application", "foo");
  104. inf = component.addElement("interface");
  105. inf.setText("my.IFoo");
  106. SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']");
  107. }
  108. public void testExportsAdded() throws IOException {
  109. ComponentSpringStage transformer = new ComponentSpringStage();
  110. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  111. Element component = pluginRoot.addElement("component");
  112. component.addAttribute("key", "foo");
  113. component.addAttribute("class", "my.Foo");
  114. component.addAttribute("public", "true");
  115. Element inf = component.addElement("interface");
  116. inf.setText("my.IFoo");
  117. Mock mockPluginArtifact = new Mock(PluginArtifact.class);
  118. mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
  119. mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
  120. new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
  121. mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), true);
  122. OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
  123. when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
  124. TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
  125. transformer.execute(ctx);
  126. assertTrue(ctx.getExtraExports().contains("my"));
  127. // the generated bean should be tracked.
  128. assertTrue(ctx.beanExists("foo"));
  129. mockPluginArtifact.verify();
  130. }
  131. public void testExportsNotInJar() throws IOException {
  132. ComponentSpringStage transformer = new ComponentSpringStage();
  133. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  134. Element component = pluginRoot.addElement("component");
  135. component.addAttribute("key", "foo");
  136. component.addAttribute("class", "my.Foo");
  137. component.addAttribute("public", "true");
  138. Element inf = component.addElement("interface");
  139. inf.setText("my.IFoo");
  140. Mock mockPluginArtifact = new Mock(PluginArtifact.class);
  141. mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
  142. mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
  143. new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
  144. mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), false);
  145. OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
  146. when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
  147. TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
  148. transformer.execute(ctx);
  149. assertFalse(ctx.getExtraExports().contains("my"));
  150. // the generated bean should be tracked.
  151. assertTrue(ctx.beanExists("foo"));
  152. mockPluginArtifact.verify();
  153. }
  154. public void testExportsExist() throws IOException {
  155. ComponentSpringStage transformer = new ComponentSpringStage();
  156. Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
  157. Element component = pluginRoot.addElement("component");
  158. component.addAttribute("key", "foo");
  159. component.addAttribute("class", "my.Foo");
  160. component.addAttribute("public", "true");
  161. Element inf = component.addElement("interface");
  162. inf.setText("my.IFoo");
  163. Mock mockPluginArtifact = new Mock(PluginArtifact.class);
  164. mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
  165. mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
  166. new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
  167. OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
  168. when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
  169. TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo", osgiContainerManager);
  170. ctx.getExtraExports().add("my");
  171. transformer.execute(ctx);
  172. assertEquals(ctx.getExtraExports().indexOf("my"), ctx.getExtraExports().lastIndexOf("my"));
  173. // the generated bean should be tracked.
  174. assertTrue(ctx.beanExists("foo"));
  175. mockPluginArtifact.verify();
  176. }
  177. public void testImportManifestGenerationOnInterfaces() throws Exception {
  178. final ComponentSpringStage stage = new ComponentSpringStage();
  179. final File pluginJar = new PluginJarBuilder()
  180. .addFormattedJava("my.MyFooChild",
  181. "package my;",
  182. "public class MyFooChild extends com.atlassian.plugin.osgi.factory.transform.dummypackage2.DummyClass2 {",
  183. "}")
  184. .addFormattedJava("my2.MyFooInterface",
  185. "package my2;",
  186. "public interface MyFooInterface {}")
  187. .addFormattedResource("atlassian-plugin.xml",
  188. "<atlassian-plugin name='plugin1' key='first' pluginsVersion='2'>",
  189. " <plugin-info>",
  190. " <version>1.0</version>",
  191. " </plugin-info>",
  192. " <component key='component1' class='my.MyFooChild' public='true'>",
  193. " <interface>com.atlassian.plugin.osgi.factory.transform.dummypackage0.DummyInterface0</interface>",
  194. " <interface>com.atlassian.plugin.osgi.factory.transform.dummypackage1.DummyInterface1</interface>",
  195. " <interface>my2.MyFooInterface</interface>",
  196. " </component>",
  197. "</atlassian-plugin>")
  198. .build();
  199. ServiceReference serviceReference = mock(ServiceReference.class);
  200. when(serviceReference.getProperty(Constants.OBJECTCLASS)).thenReturn(new String[]{"my.Service"});
  201. OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
  202. when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[]{serviceReference});
  203. final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(pluginJar), null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
  204. stage.execute(context);
  205. // don't import local interface.
  206. assertFalse(context.getExtraImports().contains("my2.MyFooInterface"));
  207. // import only interfaces that don't exist in the plugin itself.
  208. assertTrue(context.getExtraImports().contains("com.atlassian.plugin.osgi.factory.transform.dummypackage1"));
  209. assertTrue(context.getExtraImports().contains("com.atlassian.plugin.osgi.factory.transform.dummypackage0"));
  210. }
  211. }