1 package com.atlassian.plugin.osgi.factory.transform.stage;
2
3 import com.atlassian.plugin.JarPluginArtifact;
4 import com.atlassian.plugin.PluginAccessor;
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 import org.dom4j.DocumentException;
11 import org.dom4j.DocumentHelper;
12 import org.dom4j.Element;
13 import org.junit.Test;
14 import org.osgi.framework.Constants;
15 import org.osgi.framework.ServiceReference;
16 import org.slf4j.Logger;
17
18 import java.io.File;
19 import java.io.IOException;
20
21 import static org.junit.Assert.assertTrue;
22 import static org.mockito.ArgumentMatchers.any;
23 import static org.mockito.ArgumentMatchers.anyString;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.never;
26 import static org.mockito.Mockito.verify;
27 import static org.mockito.Mockito.when;
28
29 public class TestComponentImportSpringStage {
30
31 @Test
32 public void testTransform() throws IOException, DocumentException {
33 final ComponentImportSpringStage stage = new ComponentImportSpringStage();
34
35
36 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
37 Element component = pluginRoot.addElement("component-import");
38 component.addAttribute("key", "foo");
39 component.addAttribute("interface", "my.Foo");
40 SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.Foo'");
41
42
43 pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
44 component = pluginRoot.addElement("component-import");
45 component.addAttribute("key", "foo");
46 final Element inf = component.addElement("interface");
47 inf.setText("my.IFoo");
48 SpringTransformerTestHelper.transform(stage, pluginRoot, "osgi:reference[@id='foo']/osgi:interfaces/beans:value/text()='my.IFoo'");
49 }
50
51 @Test
52 public void testTransformWithCustomFilter() throws IOException, DocumentException {
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 @Test
64 public void testTransformForOneApp() throws IOException, DocumentException {
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 @Test
83 public void testTransformImportEvenUnusedPackages() throws Exception {
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
95 assertTrue(context.beanExists("foo"));
96 }
97
98 @Test
99 public void testTransformImportWarnUnverifiedService() throws Exception {
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
117 assertTrue(context.beanExists("foo"));
118
119 verify(stage.log).debug(anyString(), anyString(), anyString(), anyString());
120 }
121
122 @Test
123 public void testTransformImportNoWarnForVerifiedService() throws Exception {
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 }