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          // private component
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          // public component, interface
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          // public component, interface as attribute
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              // expected
96          }
97      }
98  
99      public void testTransformForOneApp() throws IOException, DocumentException
100     {
101         ComponentSpringStage transformer = new ComponentSpringStage();
102 
103         // public component, interface
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 }