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             // Test falling through to servlet context scanning
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             // Test failure when even servlet context scanning fails
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                 // good stuff
135             }
136 
137             // Test failure when no servlet context
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                 // good stuff
148             }
149 
150             mockServletContext.verify();
151         }
152 
153 }