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