1 package com.atlassian.plugin.osgi.container.felix;
2
3 import com.atlassian.plugin.testpackage1.Dummy1;
4 import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
5 import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
6 import com.atlassian.plugin.osgi.hostcomponents.impl.MockRegistration;
7 import com.atlassian.plugin.util.PluginFrameworkUtils;
8 import com.google.common.collect.ImmutableList;
9 import com.google.common.collect.ImmutableMap;
10 import junit.framework.TestCase;
11 import static org.mockito.Mockito.mock;
12 import static org.mockito.Mockito.when;
13
14 import org.twdata.pkgscanner.DefaultOsgiVersionConverter;
15 import org.twdata.pkgscanner.ExportPackage;
16
17 import javax.management.Descriptor;
18 import javax.management.DescriptorAccess;
19 import javax.print.attribute.AttributeSet;
20 import javax.print.attribute.HashAttributeSet;
21 import javax.servlet.ServletContext;
22 import javax.swing.table.DefaultTableModel;
23 import javax.swing.table.TableModel;
24 import java.io.File;
25 import java.net.MalformedURLException;
26 import java.util.ArrayList;
27 import java.util.Arrays;
28 import java.util.Collection;
29 import java.util.Collections;
30 import java.util.List;
31
32 public class TestExportsBuilder extends TestCase
33 {
34 private static final String JAVA_VERSION_KEY = "java.specification.version";
35
36 private ExportsBuilder builder;
37
38 @Override
39 public void setUp() throws Exception
40 {
41 builder = new ExportsBuilder(new ExportsBuilder.CachedExportPackageLoader()
42 {
43 @Override
44 public Collection<ExportPackage> load()
45 {
46
47 return null;
48 }
49 });
50 }
51
52 @Override
53 public void tearDown() throws Exception
54 {
55 builder = null;
56 }
57 public void testDetermineExports()
58 {
59 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration("0.0");
60
61 String exports = builder.determineExports(new ArrayList<HostComponentRegistration>(), config);
62 assertFalse(exports.contains(",,"));
63 }
64
65 public void testDetermineExportsIncludeServiceInterfaces()
66 {
67 List<HostComponentRegistration> regs = new ArrayList<HostComponentRegistration> () {{
68 add(new MockRegistration(new HashAttributeSet(), AttributeSet.class));
69 add(new MockRegistration(new DefaultTableModel(), TableModel.class));
70 }};
71 String imports = builder.determineExports(regs, new DefaultPackageScannerConfiguration());
72 assertNotNull(imports);
73 System.out.println(imports.replace(',','\n'));
74 assertTrue(imports.contains(AttributeSet.class.getPackage().getName()));
75 assertTrue(imports.contains("javax.swing.event"));
76 }
77
78 public void testConstructJdkExportsWithJdk6And7()
79 {
80 final String jdkVersion = getJavaVersion();
81 try
82 {
83 setJavaVersion(ExportsBuilder.JDK_6);
84 assertTrue(exports().contains("javax.script"));
85
86 setJavaVersion(ExportsBuilder.JDK_7);
87 assertTrue(exports().contains("javax.script"));
88 }
89 finally
90 {
91 setJavaVersion(jdkVersion);
92 }
93 }
94
95 private String exports()
96 {
97 return builder.determineExports(new ArrayList<HostComponentRegistration>(), new DefaultPackageScannerConfiguration());
98 }
99
100 public void testDetermineExportWhileConflictExists()
101 {
102 final DescriptorAccess descAccess = new DescriptorAccess() {
103 public Descriptor getDescriptor()
104 {
105 return null;
106 }
107 public void setDescriptor(Descriptor inDescriptor)
108 {
109 }
110 };
111
112 List<HostComponentRegistration> regs = new ArrayList<HostComponentRegistration> () {{
113 add(new MockRegistration(descAccess, DescriptorAccess.class));
114 }};
115
116 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration();
117 config.setPackageVersions(ImmutableMap.of("javax.management", "1.2.3"));
118
119 String exports = builder.determineExports(regs, config);
120
121 int packageCount = 0;
122 for(String imp:exports.split("[,]"))
123 {
124 if (imp.split("[;]")[0].equals("javax.management"))
125 {
126 packageCount++;
127 }
128 }
129
130 assertEquals("even though the package is found twice, we must export it only once", 1, packageCount);
131 assertTrue("found earlier always wins", exports.contains(",javax.management,"));
132 }
133
134 public void testPrecalculatedPackages()
135 {
136 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration();
137 String exports = new ExportsBuilder(new ExportsBuilder.PackageScannerExportsFileLoader("precalc-exports.xml"))
138 .determineExports(Collections.<HostComponentRegistration>emptyList(), config);
139 assertTrue(exports.contains("bar;version=1"));
140 }
141
142 public void testPackagesUnderPluginFrameworkExportedAsPluginFrameworkVersion()
143 {
144 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration();
145 config.setPackageVersions(ImmutableMap.of("com.atlassian.plugin.testpackage1", "98.76.54"));
146 config.setPackageIncludes(ImmutableList.<String>of("org.slf4j*"));
147
148 String exports = builder.determineExports(ImmutableList.<HostComponentRegistration>of(new MockRegistration(new Dummy1(){}, Dummy1.class)), config);
149
150 final String osgiVersionString = new DefaultOsgiVersionConverter().getVersion(PluginFrameworkUtils.getPluginFrameworkVersion());
151 assertTrue("any packages under com.atlassian.plugin must be exported as the framework version: " + osgiVersionString + ", but is: " + exports,
152 exports.contains("com.atlassian.plugin.testpackage1;version=" + osgiVersionString + ","));
153 assertFalse("any packages under com.atlassian.plugin must be exported as the framework version",
154 exports.contains("com.atlassian.plugin.testpackage1;version=98.76.54,"));
155 }
156
157 public void testGenerateExports() throws MalformedURLException
158 {
159 ServletContext ctx = mock(ServletContext.class);
160 when(ctx.getMajorVersion()).thenReturn(5);
161 when(ctx.getMinorVersion()).thenReturn(3);
162 when(ctx.getResource("/WEB-INF/lib")).thenReturn(getClass().getClassLoader().getResource("scanbase/WEB-INF/lib"));
163 when(ctx.getResource("/WEB-INF/classes")).thenReturn(getClass().getClassLoader().getResource("scanbase/WEB-INF/classes"));
164 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration("1.0");
165 config.setServletContext(ctx);
166 config.setPackageIncludes(Arrays.asList("javax.*", "org.*"));
167
168 Collection<ExportPackage> exports = builder.generateExports(config);
169 assertNotNull(exports);
170 assertTrue(exports.contains(new ExportPackage("org.apache.log4j", "1.2.15", new File("/whatever/log4j-1.2.15.jar"))));
171
172
173 config.setJarIncludes(Arrays.asList("testlog*", "mock*"));
174 config.setJarExcludes(Arrays.asList("log4j*"));
175 exports = builder.generateExports(config);
176 assertNotNull(exports);
177 assertTrue(exports.contains(new ExportPackage("org.apache.log4j", "1.2.15", new File("/whatever/log4j-1.2.15.jar"))));
178
179
180 config.setJarIncludes(Arrays.asList("testlog4j23*"));
181 config.setJarExcludes(Collections.<String>emptyList());
182 try
183 {
184 builder.generateExports(config);
185 fail("Should have thrown an exception");
186 }
187 catch (IllegalStateException ex)
188 {
189
190 }
191
192
193 config.setJarIncludes(Arrays.asList("testlog4j23*"));
194 config.setJarExcludes(Collections.<String>emptyList());
195 config.setServletContext(null);
196 try
197 {
198 builder.generateExports(config);
199 fail("Should have thrown an exception");
200 }
201 catch (IllegalStateException ex)
202 {
203
204 }
205 }
206
207 public void testGenerateExportsWithCorrectServletVersion() throws MalformedURLException
208 {
209 ServletContext ctx = mock(ServletContext.class);
210 when(ctx.getMajorVersion()).thenReturn(5);
211 when(ctx.getMinorVersion()).thenReturn(3);
212 when(ctx.getResource("/WEB-INF/lib")).thenReturn(getClass().getClassLoader().getResource("scanbase/WEB-INF/lib"));
213 when(ctx.getResource("/WEB-INF/classes")).thenReturn(getClass().getClassLoader().getResource("scanbase/WEB-INF/classes"));
214
215 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration("1.0");
216 config.setServletContext(ctx);
217 config.setPackageIncludes(Arrays.asList("javax.*", "org.*"));
218
219 Collection<ExportPackage> exports = builder.generateExports(config);
220
221 int pkgsToFind = 2;
222 for (ExportPackage pkg : exports)
223 {
224 if ("javax.servlet".equals(pkg.getPackageName())) {
225 assertEquals("5.3.0", pkg.getVersion());
226 pkgsToFind--;
227 }
228 if ("javax.servlet.http".equals(pkg.getPackageName())) {
229 assertEquals("5.3.0", pkg.getVersion());
230 pkgsToFind--;
231 }
232 }
233 assertEquals(0, pkgsToFind);
234 }
235
236 private static void setJavaVersion(String jdkVersion)
237 {
238 System.setProperty(JAVA_VERSION_KEY, jdkVersion);
239 }
240
241 private String getJavaVersion()
242 {
243 return System.getProperty(JAVA_VERSION_KEY);
244 }
245
246 }