View Javadoc

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         // Test falling through to servlet context scanning
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         // Test failure when even servlet context scanning fails
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             // good stuff
174         }
175 
176         // Test failure when no servlet context
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             // good stuff
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 }