View Javadoc

1   package com.atlassian.plugin.osgi.factory.transform.stage;
2   
3   import com.atlassian.plugin.PluginAccessor;
4   import com.atlassian.plugin.JarPluginArtifact;
5   import com.atlassian.plugin.osgi.SomeInterface;
6   import com.atlassian.plugin.osgi.container.OsgiContainerManager;
7   import com.atlassian.plugin.osgi.factory.transform.TransformContext;
8   import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
9   import com.atlassian.plugin.test.PluginJarBuilder;
10  
11  import org.dom4j.DocumentException;
12  import org.dom4j.DocumentHelper;
13  import org.dom4j.Element;
14  import org.slf4j.Logger;
15  import static org.mockito.Mockito.mock;
16  import static org.mockito.Mockito.when;
17  import static org.mockito.Mockito.verify;
18  import static org.mockito.Mockito.never;
19  import static org.mockito.Matchers.anyString;
20  import org.osgi.framework.ServiceReference;
21  import org.osgi.framework.Constants;
22  
23  import java.io.File;
24  import java.io.IOException;
25  
26  import junit.framework.TestCase;
27  
28  public class TestComponentImportSpringStage extends TestCase
29  {
30      public void testTransform() throws IOException, DocumentException
31      {
32          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
33  
34          // interface as attribute
35          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
36          Element component = pluginRoot.addElement("component-import");
37          component.addAttribute("key", "foo");
38          component.addAttribute("interface", "my.Foo");
39          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo'");
40  
41          // interface as element
42          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
43          component = pluginRoot.addElement("component-import");
44          component.addAttribute("key", "foo");
45          final Element inf = component.addElement("interface");
46          inf.setText("my.IFoo");
47          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.IFoo'");
48  
49      }
50  
51      public void testTransformWithCustomFilter() throws IOException, DocumentException
52      {
53          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
54  
55          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
56          Element component = pluginRoot.addElement("component-import");
57          component.addAttribute("key", "foo");
58          component.addAttribute("interface", "my.Foo");
59          component.addAttribute("filter", "(foo=bar)");
60          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo' and @filter='(foo=bar)']'");
61      }
62  
63      public void testTransformForOneApp() throws IOException, DocumentException
64      {
65          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
66  
67          Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
68          Element component = pluginRoot.addElement("component-import");
69          component.addAttribute("key", "foo");
70          component.addAttribute("interface", "my.Foo");
71          component.addAttribute("application", "bob");
72          SpringTransformerTestHelper.transform(stage, pluginRoot, "not(osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo')");
73  
74          pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
75          component = pluginRoot.addElement("component-import");
76          component.addAttribute("key", "foo");
77          component.addAttribute("interface", "my.Foo");
78          component.addAttribute("application", "foo");
79          SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo'");
80      }
81  
82      public void testTransformImportEvenUnusedPackages() throws Exception, DocumentException
83      {
84          final ComponentImportSpringStage stage = new ComponentImportSpringStage();
85          final File jar = new PluginJarBuilder().addFormattedResource("atlassian-plugin.xml", "<atlassian-plugin>",
86              "  <component-import key='foo' interface='com.atlassian.plugin.osgi.SomeInterface' />", "</atlassian-plugin>").build();
87  
88          OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
89          when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
90          final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(jar), null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
91          stage.execute(context);
92          assertTrue(context.getExtraImports().contains(SomeInterface.class.getPackage().getName()));
93  
94          // bean "foo" should be created from the component-import element, therefore it should be tracked.
95          assertTrue(context.beanExists("foo"));
96      }
97  
98      public void testTransformImportWarnUnverifiedService() throws Exception, DocumentException
99      {
100         final ComponentImportSpringStage stage = new ComponentImportSpringStage();
101         stage.log = mock(Logger.class);
102         when(stage.log.isDebugEnabled()).thenReturn(true);
103         final File jar = new PluginJarBuilder()
104             .addFormattedResource("atlassian-plugin.xml", "<atlassian-plugin>",
105             "  <component-import key='foo' interface='my.UnknownService' />", "</atlassian-plugin>").build();
106 
107         ServiceReference serviceReference = mock(ServiceReference.class);
108         when(serviceReference.getProperty(Constants.OBJECTCLASS)).thenReturn(new String[] { "my.Service"});
109 
110         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
111         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[] {serviceReference});
112 
113         final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(jar), null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
114         stage.execute(context);
115 
116         // bean "foo" should be created from the component-import element, therefore it should be tracked.
117         assertTrue(context.beanExists("foo"));
118 
119         verify(stage.log).debug(anyString());
120     }
121 
122     public void testTransformImportNoWarnForVerifiedService() throws Exception
123     {
124         final ComponentImportSpringStage stage = new ComponentImportSpringStage();
125         stage.log = mock(Logger.class);
126         final File jar = new PluginJarBuilder()
127             .addFormattedResource("atlassian-plugin.xml", "<atlassian-plugin>",
128             "  <component-import key='foo' interface='my.Service' />", "</atlassian-plugin>").build();
129 
130         ServiceReference serviceReference = mock(ServiceReference.class);
131         when(serviceReference.getProperty(Constants.OBJECTCLASS)).thenReturn(new String[] { "my.Service"});
132 
133         OsgiContainerManager osgiContainerManager = mock(OsgiContainerManager.class);
134         when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[] {serviceReference});
135 
136         final TransformContext context = new TransformContext(null, SystemExports.NONE, new JarPluginArtifact(jar), null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
137         stage.execute(context);
138         verify(stage.log, never()).warn(anyString());
139     }
140 }