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.osgi.hostcomponents.HostComponentRegistration;
10 import com.atlassian.plugin.test.PluginJarBuilder;
11 import junit.framework.TestCase;
12 import org.osgi.framework.ServiceReference;
13
14 import java.io.File;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
18
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.when;
21
22 public class TestScanDescriptorForHostClassesStage extends TestCase
23 {
24 private OsgiContainerManager osgiContainerManager;
25 private HostComponentRegistration registration;
26
27 @Override
28 protected void setUp() throws Exception
29 {
30 super.setUp();
31
32 osgiContainerManager = mock(OsgiContainerManager.class);
33 registration = mock(HostComponentRegistration.class);
34 when(osgiContainerManager.getRegisteredServices()).thenReturn(new ServiceReference[0]);
35 }
36
37 public void testTransform() throws Exception
38 {
39 final File plugin = new PluginJarBuilder("plugin")
40 .addFormattedResource("atlassian-plugin.xml",
41 "<atlassian-plugin name='Test Bundle instruction plugin 2' key='test.plugin'>",
42 " <plugin-info>",
43 " <version>1.0</version>",
44 " </plugin-info>",
45 " <foo key='bar' class='com.atlassian.plugin.osgi.Foo' />",
46 "</atlassian-plugin>")
47 .build();
48
49 ScanDescriptorForHostClassesStage stage = new ScanDescriptorForHostClassesStage();
50 SystemExports exports = new SystemExports("com.atlassian.plugin.osgi");
51 final TransformContext context = new TransformContext(Collections.<HostComponentRegistration> emptyList(), exports, new JarPluginArtifact(plugin),
52 null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
53 stage.execute(context);
54 assertTrue(context.getExtraImports().contains("com.atlassian.plugin.osgi"));
55 }
56
57 public void testTransformButPackageInPlugin() throws Exception
58 {
59 final File plugin = new PluginJarBuilder("plugin")
60 .addFormattedResource("atlassian-plugin.xml",
61 "<atlassian-plugin name='Test Bundle instruction plugin 2' key='test.plugin'>",
62 " <plugin-info>",
63 " <version>1.0</version>",
64 " </plugin-info>",
65 " <foo key='bar' class='com.atlassian.plugin.osgi.Foo' />",
66 "</atlassian-plugin>")
67 .addResource("com/atlassian/plugin/osgi/", "")
68 .addResource("com/atlassian/plugin/osgi/Foo.class", "asd")
69 .build();
70
71 ScanDescriptorForHostClassesStage stage = new ScanDescriptorForHostClassesStage();
72 SystemExports exports = new SystemExports("com.atlassian.plugin.osgi");
73 final TransformContext context = new TransformContext(Collections.<HostComponentRegistration> emptyList(), exports, new JarPluginArtifact(plugin),
74 null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
75 stage.execute(context);
76 assertTrue(!context.getExtraImports().contains("com.atlassian.plugin.osgi"));
77 }
78
79 public void testTransformIgnoreUnknown() throws Exception
80 {
81 final File plugin = new PluginJarBuilder("plugin")
82 .addFormattedResource("atlassian-plugin.xml",
83 "<atlassian-plugin name='Test Bundle instruction plugin 2' key='test.plugin'>",
84 " <plugin-info>",
85 " <version>1.0</version>",
86 " </plugin-info>",
87 " <foo key='bar' class='blat.Foo' />",
88 "</atlassian-plugin>")
89 .build();
90
91 ScanDescriptorForHostClassesStage stage = new ScanDescriptorForHostClassesStage();
92 SystemExports exports = new SystemExports("com.atlassian.plugin.osgi");
93 final TransformContext context = new TransformContext(Collections.<HostComponentRegistration> emptyList(), exports, new JarPluginArtifact(plugin),
94 null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
95 stage.execute(context);
96 assertFalse(context.getExtraImports().contains("blat"));
97 }
98
99 public void testTransformWithHostComponentConstructorReferences() throws Exception
100 {
101 when(registration.getMainInterfaceClasses()).thenReturn(new Class<?>[] {SomeInterface.class});
102 List<HostComponentRegistration> registrations = new ArrayList<HostComponentRegistration>(1);
103 registrations.add(registration);
104
105 final File plugin = new PluginJarBuilder("testUpgradeOfBundledPlugin")
106 .addFormattedResource("atlassian-plugin.xml",
107 "<atlassian-plugin name='Test' key='hostClass' pluginsVersion='2'>",
108 " <plugin-info>",
109 " <version>1.0</version>",
110 " </plugin-info>",
111 " <object key='hostClass' class='com.atlassian.plugin.osgi.HostClassUsingHostComponentConstructor'/>",
112 "</atlassian-plugin>")
113 .build();
114
115 ScanDescriptorForHostClassesStage stage = new ScanDescriptorForHostClassesStage();
116 SystemExports exports = new SystemExports("com.atlassian.plugin.osgi");
117 final TransformContext context = new TransformContext(registrations, exports, new JarPluginArtifact(plugin),
118 null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
119 stage.execute(context);
120 assertEquals(1, context.getRequiredHostComponents().size());
121 assertEquals(registration, context.getRequiredHostComponents().iterator().next());
122 }
123
124 public void testTransformWithHostComponentSetterReferences() throws Exception
125 {
126 when(registration.getMainInterfaceClasses()).thenReturn(new Class<?>[] {SomeInterface.class});
127 List<HostComponentRegistration> registrations = new ArrayList<HostComponentRegistration>(1);
128 registrations.add(registration);
129
130 final File plugin = new PluginJarBuilder("testUpgradeOfBundledPlugin")
131 .addFormattedResource("atlassian-plugin.xml",
132 "<atlassian-plugin name='Test' key='hostClass' pluginsVersion='2'>",
133 " <plugin-info>",
134 " <version>1.0</version>",
135 " </plugin-info>",
136 " <object key='hostClass' class='com.atlassian.plugin.osgi.HostClassUsingHostComponentSetter'/>",
137 "</atlassian-plugin>")
138 .build();
139
140 ScanDescriptorForHostClassesStage stage = new ScanDescriptorForHostClassesStage();
141 SystemExports exports = new SystemExports("com.atlassian.plugin.osgi");
142 final TransformContext context = new TransformContext(registrations, exports, new JarPluginArtifact(plugin),
143 null, PluginAccessor.Descriptor.FILENAME, osgiContainerManager);
144 stage.execute(context);
145 assertEquals(1, context.getRequiredHostComponents().size());
146 assertEquals(registration, context.getRequiredHostComponents().iterator().next());
147 }
148 }