1 package com.atlassian.plugin.osgi.container.felix;
2
3 import junit.framework.TestCase;
4
5 import java.io.File;
6 import java.util.*;
7
8 import org.apache.commons.io.FileUtils;
9 import org.twdata.pkgscanner.ExportPackage;
10 import com.atlassian.plugin.osgi.hostcomponents.HostComponentRegistration;
11 import com.atlassian.plugin.osgi.hostcomponents.impl.MockRegistration;
12 import com.atlassian.plugin.osgi.container.impl.DefaultPackageScannerConfiguration;
13 import com.mockobjects.dynamic.Mock;
14 import com.mockobjects.dynamic.C;
15
16 import javax.print.attribute.HashAttributeSet;
17 import javax.print.attribute.AttributeSet;
18 import javax.swing.table.DefaultTableModel;
19 import javax.swing.table.TableModel;
20 import javax.servlet.ServletContext;
21
22 public class TestExportsBuilder extends TestCase
23 {
24 private File tmpDir;
25 private ExportsBuilder builder;
26
27 @Override
28 public void setUp() throws Exception
29 {
30 tmpDir = new File("target/temp");
31 if (tmpDir.exists()) FileUtils.cleanDirectory(tmpDir);
32 tmpDir.mkdirs();
33 builder = new ExportsBuilder();
34 }
35
36 @Override
37 public void tearDown() throws Exception
38 {
39 tmpDir = null;
40 builder = null;
41 }
42 public void testDetermineExports()
43 {
44 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration("0.0");
45
46 String exports = builder.determineExports(new ArrayList<HostComponentRegistration>(), config, tmpDir);
47 assertFalse(exports.contains(",,"));
48 }
49
50 public void testConstructAutoExports()
51 {
52 List<ExportPackage> exports = new ArrayList<ExportPackage>();
53 exports.add(new ExportPackage("foo.bar", "1.0", new File("/whatever/foobar-1.0.jar")));
54 exports.add(new ExportPackage("foo.bar", "1.0-asdf-asdf", new File("/whatever/foobar-1.0.jar")));
55 StringBuilder sb = new StringBuilder();
56 builder.constructAutoExports(sb, exports);
57
58 assertEquals("foo.bar;version=1.0,foo.bar,", sb.toString());
59 }
60
61 public void testDetermineExportsIncludeServiceInterfaces()
62 {
63 List<HostComponentRegistration> regs = new ArrayList<HostComponentRegistration> () {{
64 add(new MockRegistration(new HashAttributeSet(), AttributeSet.class));
65 add(new MockRegistration(new DefaultTableModel(), TableModel.class));
66 }};
67 String imports = builder.determineExports(regs, new DefaultPackageScannerConfiguration(), tmpDir);
68 assertNotNull(imports);
69 System.out.println(imports.replace(',','\n'));
70 assertTrue(imports.contains(AttributeSet.class.getPackage().getName()));
71 assertTrue(imports.contains("javax.swing.event"));
72 }
73
74 public void testConstructJdkExports()
75 {
76 StringBuilder sb = new StringBuilder();
77 builder.constructJdkExports(sb,"jdk-packages.test.txt");
78 assertEquals("foo.bar,foo.baz", sb.toString());
79 sb = new StringBuilder();
80 builder.constructJdkExports(sb, ExportsBuilder.JDK_PACKAGES_PATH);
81 assertTrue(sb.toString().contains("org.xml.sax"));
82 }
83
84 public void testConstructJdkExportsWithJdk5And6()
85 {
86 String jdkVersion = System.getProperty("java.specification.version");
87 try
88 {
89 System.setProperty("java.specification.version", "1.5");
90 String exports = builder.determineExports(new ArrayList<HostComponentRegistration>(), new DefaultPackageScannerConfiguration(), tmpDir);
91 assertFalse(exports.contains("javax.script"));
92 System.setProperty("java.specification.version", "1.6");
93 exports = builder.determineExports(new ArrayList<HostComponentRegistration>(), new DefaultPackageScannerConfiguration(), tmpDir);
94 assertTrue(exports.contains("javax.script"));
95 }
96 finally
97 {
98 System.setProperty("java.specification.version", jdkVersion);
99 }
100 }
101
102
103 public void testGenerateExports()
104 {
105 Mock mockServletContext = new Mock(ServletContext.class);
106 mockServletContext.expectAndReturn("getResource", C.args(C.eq("/WEB-INF/lib")), getClass().getClassLoader().getResource("scanbase/WEB-INF/lib"));
107 mockServletContext.expectAndReturn("getResource", C.args(C.eq("/WEB-INF/classes")), getClass().getClassLoader().getResource("scanbase/WEB-INF/classes"));
108 DefaultPackageScannerConfiguration config = new DefaultPackageScannerConfiguration();
109 config.setPackageIncludes(Arrays.asList("org.*"));
110 config.setServletContext((ServletContext) mockServletContext.proxy());
111
112 Collection<ExportPackage> exports = builder.generateExports(config);
113 assertNotNull(exports);
114 assertTrue(exports.contains(new ExportPackage("org.apache.log4j", "1.2.15", new File("/whatever/log4j-1.2.15.jar"))));
115
116
117 config.setJarIncludes(Arrays.asList("testlog*"));
118 config.setJarExcludes(Arrays.asList("log4j*"));
119 exports = builder.generateExports(config);
120 assertNotNull(exports);
121 assertTrue(exports.contains(new ExportPackage("org.apache.log4j", "1.2.15", new File("/whatever/log4j-1.2.15.jar"))));
122
123
124 mockServletContext.expectAndReturn("getResource", C.args(C.eq("/WEB-INF/lib")), getClass().getClassLoader().getResource("scanbase/WEB-INF/lib"));
125 mockServletContext.expectAndReturn("getResource", C.args(C.eq("/WEB-INF/classes")), getClass().getClassLoader().getResource("scanbase/WEB-INF/classes"));
126 config.setJarIncludes(Arrays.asList("testlog4j23*"));
127 config.setJarExcludes(Collections.<String>emptyList());
128 try
129 {
130 exports = builder.generateExports(config);
131 fail("Should have thrown an exception");
132 } catch (IllegalStateException ex)
133 {
134
135 }
136
137
138 config.setJarIncludes(Arrays.asList("testlog4j23*"));
139 config.setJarExcludes(Collections.<String>emptyList());
140 config.setServletContext(null);
141 try
142 {
143 exports = builder.generateExports(config);
144 fail("Should have thrown an exception");
145 } catch (IllegalStateException ex)
146 {
147
148 }
149
150 mockServletContext.verify();
151 }
152
153 }