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