View Javadoc
1   package org.apache.felix.bundleplugin;
2   
3   
4   /*
5    * Licensed to the Apache Software Foundation (ASF) under one
6    * or more contributor license agreements.  See the NOTICE file
7    * distributed with this work for additional information
8    * regarding copyright ownership.  The ASF licenses this file
9    * to you under the Apache License, Version 2.0 (the
10   * "License"); you may not use this file except in compliance
11   * with the License.  You may obtain a copy of the License at
12   *
13   *   http://www.apache.org/licenses/LICENSE-2.0
14   *
15   * Unless required by applicable law or agreed to in writing,
16   * software distributed under the License is distributed on an
17   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18   * KIND, either express or implied.  See the License for the
19   * specific language governing permissions and limitations
20   * under the License.
21   */
22  
23  import java.io.File;
24  import java.io.FileOutputStream;
25  import java.util.Arrays;
26  import java.util.HashMap;
27  import java.util.LinkedHashSet;
28  import java.util.Map;
29  import java.util.Properties;
30  import java.util.Set;
31  import java.util.TreeMap;
32  import java.util.jar.Manifest;
33  
34  import org.apache.maven.model.Organization;
35  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
36  import org.apache.maven.project.MavenProject;
37  import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
38  import org.apache.maven.shared.dependency.graph.DependencyNode;
39  import org.osgi.framework.Constants;
40  
41  import aQute.bnd.osgi.Analyzer;
42  import aQute.bnd.osgi.Builder;
43  import aQute.bnd.osgi.Jar;
44  
45  
46  /**
47   * Test for {@link BundlePlugin}.
48   *
49   * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
50   */
51  public class BundlePluginTest extends AbstractBundlePluginTest
52  {
53  
54      private BundlePlugin plugin;
55  
56  
57      @Override
58      protected void setUp() throws Exception
59      {
60          super.setUp();
61          plugin = new BundlePlugin();
62          plugin.setBuildDirectory( "." );
63          plugin.setOutputDirectory(new File(getBasedir(), "target" + File.separatorChar + "scratch"));
64          setVariableValueToObject(plugin, "m_dependencyGraphBuilder", lookup(DependencyGraphBuilder.class.getName(), "default"));
65      }
66  
67  
68      public void testConvertVersionToOsgi()
69      {
70          String osgiVersion;
71  
72          osgiVersion = plugin.convertVersionToOsgi( "2.1.0-SNAPSHOT" );
73          assertEquals( "2.1.0.SNAPSHOT", osgiVersion );
74  
75          osgiVersion = plugin.convertVersionToOsgi( "2.1-SNAPSHOT" );
76          assertEquals( "2.1.0.SNAPSHOT", osgiVersion );
77  
78          osgiVersion = plugin.convertVersionToOsgi( "2-SNAPSHOT" );
79          assertEquals( "2.0.0.SNAPSHOT", osgiVersion );
80  
81          osgiVersion = plugin.convertVersionToOsgi( "2" );
82          assertEquals( "2.0.0", osgiVersion );
83  
84          osgiVersion = plugin.convertVersionToOsgi( "2.1" );
85          assertEquals( "2.1.0", osgiVersion );
86  
87          osgiVersion = plugin.convertVersionToOsgi( "2.1.3" );
88          assertEquals( "2.1.3", osgiVersion );
89  
90          osgiVersion = plugin.convertVersionToOsgi( "2.1.3.4" );
91          assertEquals( "2.1.3.4", osgiVersion );
92  
93          osgiVersion = plugin.convertVersionToOsgi( "4aug2000r7-dev" );
94          assertEquals( "0.0.0.4aug2000r7-dev", osgiVersion );
95  
96          osgiVersion = plugin.convertVersionToOsgi( "1.1-alpha-2" );
97          assertEquals( "1.1.0.alpha-2", osgiVersion );
98  
99          osgiVersion = plugin.convertVersionToOsgi( "1.0-alpha-16-20070122.203121-13" );
100         assertEquals( "1.0.0.alpha-16-20070122_203121-13", osgiVersion );
101 
102         osgiVersion = plugin.convertVersionToOsgi( "1.0-20070119.021432-1" );
103         assertEquals( "1.0.0.20070119_021432-1", osgiVersion );
104 
105         osgiVersion = plugin.convertVersionToOsgi( "1-20070119.021432-1" );
106         assertEquals( "1.0.0.20070119_021432-1", osgiVersion );
107 
108         osgiVersion = plugin.convertVersionToOsgi( "1.4.1-20070217.082013-7" );
109         assertEquals( "1.4.1.20070217_082013-7", osgiVersion );
110     }
111 
112 
113     public void testReadExportedModules() throws Exception
114     {
115         File osgiBundleFile = getTestBundle();
116 
117         assertTrue( osgiBundleFile.exists() );
118 
119         MavenProject project = getMavenProjectStub();
120 
121         //        PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
122         Builder analyzer = new Builder();
123         Jar jar = new Jar( "name", osgiBundleFile );
124         analyzer.setJar( jar );
125         analyzer.setClasspath( new Jar[]
126             { jar } );
127 
128         analyzer.setProperty( Analyzer.EXPORT_PACKAGE, "*" );
129         analyzer.getJar().setManifest( analyzer.calcManifest() );
130 
131         assertEquals( 3, analyzer.getExports().size() );
132 
133         analyzer.close();
134     }
135 
136 
137     public void testTransformDirectives() throws Exception
138     {
139         Map instructions = new TreeMap();
140 
141         instructions.put( "a", "1" );
142         instructions.put( "-a", "2" );
143         instructions.put( "_a", "3" );
144         instructions.put( "A", "3" );
145         instructions.put( "_A", "1" );
146         instructions.put( "_b", "4" );
147         instructions.put( "b", "6" );
148         instructions.put( "_B", "6" );
149         instructions.put( "-B", "5" );
150         instructions.put( "B", "4" );
151 
152         instructions.put( "z", null );
153         instructions.put( "_z", null );
154 
155         Map transformedInstructions = BundlePlugin.transformDirectives( instructions );
156 
157         assertEquals( "1", transformedInstructions.get( "a" ) );
158         assertEquals( "3", transformedInstructions.get( "-a" ) );
159         assertEquals( null, transformedInstructions.get( "_a" ) );
160         assertEquals( "3", transformedInstructions.get( "A" ) );
161         assertEquals( "1", transformedInstructions.get( "-A" ) );
162         assertEquals( null, transformedInstructions.get( "_A" ) );
163         assertEquals( null, transformedInstructions.get( "_b" ) );
164         assertEquals( "4", transformedInstructions.get( "-b" ) );
165         assertEquals( "6", transformedInstructions.get( "b" ) );
166         assertEquals( null, transformedInstructions.get( "_B" ) );
167         assertEquals( "6", transformedInstructions.get( "-B" ) );
168         assertEquals( "4", transformedInstructions.get( "B" ) );
169 
170         assertEquals( "", transformedInstructions.get( "z" ) );
171         assertEquals( "", transformedInstructions.get( "-z" ) );
172     }
173 
174 
175     public void testDefaultPropertiesIncludeOrganization()
176     {
177         final Organization organization = new Organization();
178         organization.setName( "Example Organization" );
179         organization.setUrl( "http://example.org" );
180 
181         // MavenProjectStub.setOrganization(Organization) doesn't do anything, so we have to make it work this way
182         MavenProject project = new MavenProjectStub()
183         {
184             @Override
185             public Organization getOrganization()
186             {
187                 return organization;
188             }
189         };
190         project.setGroupId( "group" );
191         project.setArtifactId( "project" );
192         project.setVersion( "1.2.3.4" );
193 
194         Properties properties = plugin.getDefaultProperties( project );
195         assertEquals( organization.getName(), properties.getProperty( "project.organization.name" ) );
196         assertEquals( organization.getName(), properties.getProperty( "pom.organization.name" ) );
197         assertEquals( organization.getUrl(), properties.getProperty( "project.organization.url" ) );
198         assertEquals( organization.getUrl(), properties.getProperty( "pom.organization.url" ) );
199     }
200 
201 
202     public void testVersion() throws Exception
203     {
204         String cleanupVersion = Builder.cleanupVersion( "0.0.0.4aug2000r7-dev" );
205         assertEquals( "0.0.0.4aug2000r7-dev", cleanupVersion );
206     }
207 
208 
209     public void testPackageInfoDetection() throws Exception
210     {
211         MavenProject project = getMavenProjectStub();
212         project.addCompileSourceRoot( getBasedir() + "/src/test/java" );
213 
214         String resourcePaths = plugin.getMavenResourcePaths( project, false );
215 
216         assertEquals( "org/apache/felix/bundleplugin/packageinfo="
217             + "src/test/java/org/apache/felix/bundleplugin/packageinfo", resourcePaths );
218     }
219 
220 
221     public void testEmbedDependencyPositiveClauses() throws Exception
222     {
223         ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
224 
225         Set artifacts = new LinkedHashSet();
226 
227         artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
228         artifacts.addAll( artifactFactory.getScopedArtifacts() );
229         artifacts.addAll( artifactFactory.getTypedArtifacts() );
230 
231         MavenProject project = getMavenProjectStub();
232         project.setDependencyArtifacts( artifacts );
233 
234         Map instructions = new HashMap();
235         instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "*;classifier=;type=jar;scope=compile,"
236             + "*;classifier=;type=jar;scope=runtime" );
237         Properties props = new Properties();
238 
239         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
240         Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
241         Manifest manifest = builder.getJar().getManifest();
242 
243         String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
244         assertEquals( ".," + "compile-1.0.jar,b-1.0.jar,runtime-1.0.jar", bcp );
245 
246         String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
247         assertEquals( "compile-1.0.jar;g=\"g\";a=\"compile\";v=\"1.0\"," + "b-1.0.jar;g=\"g\";a=\"b\";v=\"1.0\","
248             + "runtime-1.0.jar;g=\"g\";a=\"runtime\";v=\"1.0\"", eas );
249     }
250 
251 
252     public void testEmbedDependencyNegativeClauses() throws Exception
253     {
254         ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
255 
256         Set artifacts = new LinkedHashSet();
257 
258         artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
259         artifacts.addAll( artifactFactory.getScopedArtifacts() );
260         artifacts.addAll( artifactFactory.getTypedArtifacts() );
261 
262         MavenProject project = getMavenProjectStub();
263         project.setDependencyArtifacts( artifacts );
264 
265         Map instructions = new HashMap();
266         instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "!type=jar, !artifactId=c" );
267         Properties props = new Properties();
268 
269         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
270         Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
271         Manifest manifest = builder.getJar().getManifest();
272 
273         String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
274         assertEquals( ".," + "a-1.0.war," + "d-1.0.zip," + "e-1.0.rar", bcp );
275 
276         String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
277         assertEquals( "a-1.0.war;g=\"g\";a=\"a\";v=\"1.0\"," + "d-1.0.zip;g=\"g\";a=\"d\";v=\"1.0\","
278             + "e-1.0.rar;g=\"g\";a=\"e\";v=\"1.0\"", eas );
279     }
280 
281 
282     public void testEmbedDependencyDuplicateKeys() throws Exception
283     {
284         ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
285 
286         Set artifacts = new LinkedHashSet();
287 
288         artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
289         artifacts.addAll( artifactFactory.getScopedArtifacts() );
290         artifacts.addAll( artifactFactory.getTypedArtifacts() );
291 
292         MavenProject project = getMavenProjectStub();
293         project.setDependencyArtifacts( artifacts );
294 
295         Map instructions = new HashMap();
296         instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "c;type=jar,c;type=sources" );
297         Properties props = new Properties();
298 
299         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
300         Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
301         Manifest manifest = builder.getJar().getManifest();
302 
303         String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
304         assertEquals( ".," + "c-1.0-three.jar," + "c-1.0.sources", bcp );
305 
306         String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
307         assertEquals( "c-1.0-three.jar;g=\"g\";a=\"c\";v=\"1.0\";c=\"three\","
308             + "c-1.0.sources;g=\"g\";a=\"c\";v=\"1.0\"", eas );
309     }
310 
311 
312     public void testEmbedDependencyMissingPositiveKey() throws Exception
313     {
314         ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
315 
316         Set artifacts = new LinkedHashSet();
317 
318         artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
319         artifacts.addAll( artifactFactory.getScopedArtifacts() );
320         artifacts.addAll( artifactFactory.getTypedArtifacts() );
321 
322         MavenProject project = getMavenProjectStub();
323         project.setDependencyArtifacts( artifacts );
324 
325         Map instructions = new HashMap();
326         instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "artifactId=a|b" );
327         Properties props = new Properties();
328 
329         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
330         Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
331         Manifest manifest = builder.getJar().getManifest();
332 
333         String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
334         assertEquals( ".," + "a-1.0-one.jar," + "b-1.0-two.jar," + "a-1.0.war," + "b-1.0.jar", bcp );
335 
336         String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
337         assertEquals( "a-1.0-one.jar;g=\"g\";a=\"a\";v=\"1.0\";c=\"one\","
338             + "b-1.0-two.jar;g=\"g\";a=\"b\";v=\"1.0\";c=\"two\"," + "a-1.0.war;g=\"g\";a=\"a\";v=\"1.0\","
339             + "b-1.0.jar;g=\"g\";a=\"b\";v=\"1.0\"", eas );
340     }
341 
342 
343     public void testEmbedDependencyMissingNegativeKey() throws Exception
344     {
345         ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
346 
347         Set artifacts = new LinkedHashSet();
348 
349         artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
350         artifacts.addAll( artifactFactory.getScopedArtifacts() );
351         artifacts.addAll(artifactFactory.getTypedArtifacts());
352 
353         MavenProject project = getMavenProjectStub();
354         project.setDependencyArtifacts(artifacts);
355         Properties props = new Properties();
356         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
357         Jar[] classpath = plugin.getClasspath(project, dependencyGraph);
358 
359         Map instructions1 = new HashMap();
360         instructions1.put( DependencyEmbedder.EMBED_DEPENDENCY, "!scope=compile" );
361         Builder builder1 = plugin.buildOSGiBundle( project, dependencyGraph, instructions1, props, classpath );
362         Manifest manifest1 = builder1.getJar().getManifest();
363 
364         Map instructions2 = new HashMap();
365         instructions2.put( DependencyEmbedder.EMBED_DEPENDENCY, "scope=!compile" );
366         Builder builder2 = plugin.buildOSGiBundle( project, dependencyGraph, instructions2, props, classpath );
367         Manifest manifest2 = builder2.getJar().getManifest();
368 
369         String bcp1 = manifest1.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
370         assertEquals( ".," + "provided-1.0.jar," + "test-1.0.jar," + "runtime-1.0.jar," + "system-1.0.jar", bcp1 );
371 
372         String eas1 = manifest1.getMainAttributes().getValue( "Embedded-Artifacts" );
373         assertEquals( "provided-1.0.jar;g=\"g\";a=\"provided\";v=\"1.0\","
374             + "test-1.0.jar;g=\"g\";a=\"test\";v=\"1.0\"," + "runtime-1.0.jar;g=\"g\";a=\"runtime\";v=\"1.0\","
375             + "system-1.0.jar;g=\"g\";a=\"system\";v=\"1.0\"", eas1 );
376 
377         String bcp2 = manifest2.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
378         assertEquals( bcp1, bcp2 );
379 
380         String eas2 = manifest2.getMainAttributes().getValue( "Embedded-Artifacts" );
381         assertEquals( eas1, eas2 );
382     }
383 
384 
385     public void testPropertySanitizing() throws Exception
386     {
387         MavenProject project = getMavenProjectStub();
388 
389         Properties props = new Properties();
390 
391         props.put( new File( "A" ), new File( "B" ) );
392         props.put( new int[4], new HashMap( 2 ) );
393         props.put( Arrays.asList( 1, "two", 3.0 ), new float[5] );
394 
395         props.put( "A", new File( "B" ) );
396         props.put( "4", new HashMap( 2 ) );
397         props.put( "1, two, 3.0", new char[5] );
398 
399         DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
400         Builder builder = plugin.getOSGiBuilder( project, new HashMap(), props, plugin.getClasspath( project, dependencyGraph ) );
401 
402         File file = new File( getBasedir(), "target" + File.separatorChar + "test.props" );
403         builder.getProperties().store( new FileOutputStream( file ), "TEST" );
404     }
405 
406     public void testIncludeJava9Fixups() {
407         Builder analyzer = new Builder();
408 
409         MavenProject project = getMavenProjectStub();
410         BundlePlugin.includeJava9Fixups(project, analyzer);
411 
412         assertEquals("Classes found in the wrong directory;is:=warning", analyzer.get("-fixupmessages"));
413     }
414 
415     public void testOverrideJava9Fixups() {
416         Builder analyzer = new Builder();
417 
418         MavenProject project = getMavenProjectStub();
419         analyzer.set("-fixupmessages", "Classes found in the wrong directory;is:=error");
420         BundlePlugin.includeJava9Fixups(project, analyzer);
421 
422         assertEquals("Classes found in the wrong directory;is:=error", analyzer.get("-fixupmessages"));
423     }
424 
425 }