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(new ExportsBuilder.CachedExportPackageLoader()
42          {
43              @Override
44              public Collection<ExportPackage> load()
45              {
46                  // no op
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         // Test falling through to servlet context scanning
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         // Test failure when even servlet context scanning fails
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             // good stuff
190         }
191 
192         // Test failure when no servlet context
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             // good stuff
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     public void testPackagesNotConsidedInPluginsItself()
247     {
248         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.jira.not.in.plugins"));
249         assertTrue(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.osgi"));
250         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.remotable.cheese"));
251         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.webresource"));
252         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.webresource.transformer"));
253         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.cache.filecache"));
254         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.cache.filecache.impl"));
255         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.web"));
256         assertFalse(ExportsBuilder.UNDER_PLUGIN_FRAMEWORK.apply("com.atlassian.plugin.web.conditions"));
257     }
258 }