1 package com.atlassian.plugin.osgi.factory.transform.stage;
2
3 import junit.framework.TestCase;
4 import org.dom4j.DocumentException;
5 import org.dom4j.DocumentHelper;
6 import org.dom4j.Element;
7
8 import java.io.IOException;
9 import java.io.File;
10 import java.io.ByteArrayInputStream;
11 import java.util.Collections;
12
13 import com.atlassian.plugin.osgi.factory.transform.TransformContext;
14 import com.atlassian.plugin.osgi.factory.transform.model.SystemExports;
15 import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
16 import com.atlassian.plugin.PluginArtifact;
17 import com.atlassian.plugin.PluginParseException;
18 import com.atlassian.plugin.util.validation.ValidationException;
19 import com.atlassian.plugin.test.PluginJarBuilder;
20 import com.mockobjects.dynamic.Mock;
21 import com.mockobjects.dynamic.C;
22
23 public class TestComponentSpringStage extends TestCase
24 {
25 public void testTransform() throws IOException, DocumentException
26 {
27 ComponentSpringStage transformer = new ComponentSpringStage();
28
29
30 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
31 Element component = pluginRoot.addElement("component");
32 component.addAttribute("key", "foo");
33 component.addAttribute("class", "my.Foo");
34 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']");
35
36
37 pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
38 component = pluginRoot.addElement("component");
39 component.addAttribute("key", "foo");
40 component.addAttribute("class", "my.Foo");
41 component.addAttribute("public", "true");
42 Element inf = component.addElement("interface");
43 inf.setText("my.IFoo");
44 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
45 "osgi:service[@id='foo_osgiService' and @ref='foo']",
46 "//osgi:interfaces",
47 "//beans:value[.='my.IFoo']");
48
49
50 pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
51 component = pluginRoot.addElement("component");
52 component.addAttribute("key", "foo");
53 component.addAttribute("class", "my.Foo");
54 component.addAttribute("public", "true");
55 component.addAttribute("interface", "my.IFoo");
56 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
57 "osgi:service[@id='foo_osgiService' and @ref='foo']",
58 "//osgi:interfaces",
59 "//beans:value[.='my.IFoo']");
60
61 }
62
63 public void testTransformWithServiceProperties() throws IOException, DocumentException
64 {
65 ComponentSpringStage transformer = new ComponentSpringStage();
66
67 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
68 Element component = pluginRoot.addElement("component");
69 component.addAttribute("key", "foo");
70 component.addAttribute("class", "my.Foo");
71 component.addAttribute("public", "true");
72 component.addAttribute("interface", "my.IFoo");
73
74 Element svcprops = component.addElement("service-properties");
75 Element prop = svcprops.addElement("entry");
76 prop.addAttribute("key", "foo");
77 prop.addAttribute("value", "bar");
78 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
79 "osgi:service[@id='foo_osgiService']/osgi:service-properties",
80 "osgi:service[@id='foo_osgiService']/osgi:service-properties/beans:entry[@key='foo' and @value='bar']",
81 "//osgi:interfaces",
82 "//beans:value[.='my.IFoo']");
83
84 svcprops.clearContent();
85 try
86 {
87 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']",
88 "osgi:service[@id='foo_osgiService']/osgi:service-properties",
89 "//osgi:interfaces",
90 "//beans:value[.='my.IFoo']");
91 fail("Validation exception should have been thrown");
92 }
93 catch (ValidationException ex)
94 {
95
96 }
97 }
98
99 public void testTransformForOneApp() throws IOException, DocumentException
100 {
101 ComponentSpringStage transformer = new ComponentSpringStage();
102
103
104 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
105 Element component = pluginRoot.addElement("component");
106 component.addAttribute("key", "foo");
107 component.addAttribute("class", "my.Foo");
108 component.addAttribute("public", "true");
109 component.addAttribute("application", "bar");
110 Element inf = component.addElement("interface");
111 inf.setText("my.IFoo");
112 SpringTransformerTestHelper.transform(transformer, pluginRoot, "not(beans:bean[@id='foo' and @class='my.Foo'])");
113
114 pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
115 component = pluginRoot.addElement("component");
116 component.addAttribute("key", "foo");
117 component.addAttribute("class", "my.Foo");
118 component.addAttribute("public", "true");
119 component.addAttribute("application", "foo");
120 inf = component.addElement("interface");
121 inf.setText("my.IFoo");
122 SpringTransformerTestHelper.transform(transformer, pluginRoot, "beans:bean[@id='foo' and @class='my.Foo']");
123
124 }
125
126 public void testExportsAdded() throws IOException
127 {
128 ComponentSpringStage transformer = new ComponentSpringStage();
129 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
130 Element component = pluginRoot.addElement("component");
131 component.addAttribute("key", "foo");
132 component.addAttribute("class", "my.Foo");
133 component.addAttribute("public", "true");
134 Element inf = component.addElement("interface");
135 inf.setText("my.IFoo");
136
137 Mock mockPluginArtifact = new Mock(PluginArtifact.class);
138 mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
139 mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
140 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
141 mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), true);
142 TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo");
143 transformer.execute(ctx);
144
145 assertTrue(ctx.getExtraExports().contains("my"));
146 mockPluginArtifact.verify();
147 }
148
149 public void testExportsNotInJar() throws IOException
150 {
151 ComponentSpringStage transformer = new ComponentSpringStage();
152 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
153 Element component = pluginRoot.addElement("component");
154 component.addAttribute("key", "foo");
155 component.addAttribute("class", "my.Foo");
156 component.addAttribute("public", "true");
157 Element inf = component.addElement("interface");
158 inf.setText("my.IFoo");
159
160 Mock mockPluginArtifact = new Mock(PluginArtifact.class);
161 mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
162 mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
163 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
164 mockPluginArtifact.expectAndReturn("doesResourceExist", C.args(C.eq("my/IFoo.class")), false);
165 TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo");
166 transformer.execute(ctx);
167
168 assertFalse(ctx.getExtraExports().contains("my"));
169 mockPluginArtifact.verify();
170 }
171
172 public void testExportsExist() throws IOException
173 {
174 ComponentSpringStage transformer = new ComponentSpringStage();
175 Element pluginRoot = DocumentHelper.createDocument().addElement("atlassian-plugin");
176 Element component = pluginRoot.addElement("component");
177 component.addAttribute("key", "foo");
178 component.addAttribute("class", "my.Foo");
179 component.addAttribute("public", "true");
180 Element inf = component.addElement("interface");
181 inf.setText("my.IFoo");
182
183 Mock mockPluginArtifact = new Mock(PluginArtifact.class);
184 mockPluginArtifact.matchAndReturn("toFile", new PluginJarBuilder().build());
185 mockPluginArtifact.expectAndReturn("getResourceAsStream", C.args(C.eq("foo")),
186 new ByteArrayInputStream(SpringTransformerTestHelper.elementToString(pluginRoot).getBytes()));
187 TransformContext ctx = new TransformContext(null, SystemExports.NONE, (PluginArtifact) mockPluginArtifact.proxy(), null, "foo");
188 ctx.getExtraExports().add("my");
189 transformer.execute(ctx);
190
191 assertEquals(ctx.getExtraExports().indexOf("my"), ctx.getExtraExports().lastIndexOf("my"));
192 mockPluginArtifact.verify();
193 }
194 }