blob: 7d7803e8adf0412b4f7be4e95c61f6df8b88e34a [file] [log] [blame]
package org.apache.felix.bundleplugin;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.TreeMap;
import java.util.jar.Manifest;
import org.apache.maven.model.Organization;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
import org.apache.maven.project.MavenProject;
import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
import org.apache.maven.shared.dependency.graph.DependencyNode;
import org.osgi.framework.Constants;
import aQute.bnd.osgi.Analyzer;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Jar;
/**
* Test for {@link BundlePlugin}.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class BundlePluginTest extends AbstractBundlePluginTest
{
private BundlePlugin plugin;
@Override
protected void setUp() throws Exception
{
super.setUp();
plugin = new BundlePlugin();
plugin.setBuildDirectory( "." );
plugin.setOutputDirectory(new File(getBasedir(), "target" + File.separatorChar + "scratch"));
setVariableValueToObject(plugin, "m_dependencyGraphBuilder", lookup(DependencyGraphBuilder.class.getName(), "default"));
}
public void testConvertVersionToOsgi()
{
String osgiVersion;
osgiVersion = plugin.convertVersionToOsgi( "2.1.0-SNAPSHOT" );
assertEquals( "2.1.0.SNAPSHOT", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2.1-SNAPSHOT" );
assertEquals( "2.1.0.SNAPSHOT", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2-SNAPSHOT" );
assertEquals( "2.0.0.SNAPSHOT", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2" );
assertEquals( "2.0.0", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2.1" );
assertEquals( "2.1.0", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2.1.3" );
assertEquals( "2.1.3", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "2.1.3.4" );
assertEquals( "2.1.3.4", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "4aug2000r7-dev" );
assertEquals( "0.0.0.4aug2000r7-dev", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "1.1-alpha-2" );
assertEquals( "1.1.0.alpha-2", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "1.0-alpha-16-20070122.203121-13" );
assertEquals( "1.0.0.alpha-16-20070122_203121-13", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "1.0-20070119.021432-1" );
assertEquals( "1.0.0.20070119_021432-1", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "1-20070119.021432-1" );
assertEquals( "1.0.0.20070119_021432-1", osgiVersion );
osgiVersion = plugin.convertVersionToOsgi( "1.4.1-20070217.082013-7" );
assertEquals( "1.4.1.20070217_082013-7", osgiVersion );
}
public void testReadExportedModules() throws Exception
{
File osgiBundleFile = getTestBundle();
assertTrue( osgiBundleFile.exists() );
MavenProject project = getMavenProjectStub();
// PackageVersionAnalyzer analyzer = new PackageVersionAnalyzer();
Builder analyzer = new Builder();
Jar jar = new Jar( "name", osgiBundleFile );
analyzer.setJar( jar );
analyzer.setClasspath( new Jar[]
{ jar } );
analyzer.setProperty( Analyzer.EXPORT_PACKAGE, "*" );
analyzer.getJar().setManifest( analyzer.calcManifest() );
assertEquals( 3, analyzer.getExports().size() );
analyzer.close();
}
public void testTransformDirectives() throws Exception
{
Map instructions = new TreeMap();
instructions.put( "a", "1" );
instructions.put( "-a", "2" );
instructions.put( "_a", "3" );
instructions.put( "A", "3" );
instructions.put( "_A", "1" );
instructions.put( "_b", "4" );
instructions.put( "b", "6" );
instructions.put( "_B", "6" );
instructions.put( "-B", "5" );
instructions.put( "B", "4" );
instructions.put( "z", null );
instructions.put( "_z", null );
Map transformedInstructions = BundlePlugin.transformDirectives( instructions );
assertEquals( "1", transformedInstructions.get( "a" ) );
assertEquals( "3", transformedInstructions.get( "-a" ) );
assertEquals( null, transformedInstructions.get( "_a" ) );
assertEquals( "3", transformedInstructions.get( "A" ) );
assertEquals( "1", transformedInstructions.get( "-A" ) );
assertEquals( null, transformedInstructions.get( "_A" ) );
assertEquals( null, transformedInstructions.get( "_b" ) );
assertEquals( "4", transformedInstructions.get( "-b" ) );
assertEquals( "6", transformedInstructions.get( "b" ) );
assertEquals( null, transformedInstructions.get( "_B" ) );
assertEquals( "6", transformedInstructions.get( "-B" ) );
assertEquals( "4", transformedInstructions.get( "B" ) );
assertEquals( "", transformedInstructions.get( "z" ) );
assertEquals( "", transformedInstructions.get( "-z" ) );
}
public void testDefaultPropertiesIncludeOrganization()
{
final Organization organization = new Organization();
organization.setName( "Example Organization" );
organization.setUrl( "http://example.org" );
// MavenProjectStub.setOrganization(Organization) doesn't do anything, so we have to make it work this way
MavenProject project = new MavenProjectStub()
{
@Override
public Organization getOrganization()
{
return organization;
}
};
project.setGroupId( "group" );
project.setArtifactId( "project" );
project.setVersion( "1.2.3.4" );
Properties properties = plugin.getDefaultProperties( project );
assertEquals( organization.getName(), properties.getProperty( "project.organization.name" ) );
assertEquals( organization.getName(), properties.getProperty( "pom.organization.name" ) );
assertEquals( organization.getUrl(), properties.getProperty( "project.organization.url" ) );
assertEquals( organization.getUrl(), properties.getProperty( "pom.organization.url" ) );
}
public void testVersion() throws Exception
{
String cleanupVersion = Builder.cleanupVersion( "0.0.0.4aug2000r7-dev" );
assertEquals( "0.0.0.4aug2000r7-dev", cleanupVersion );
}
public void testPackageInfoDetection() throws Exception
{
MavenProject project = getMavenProjectStub();
project.addCompileSourceRoot( getBasedir() + "/src/test/java" );
String resourcePaths = plugin.getMavenResourcePaths( project, false );
assertEquals( "org/apache/felix/bundleplugin/packageinfo="
+ "src/test/java/org/apache/felix/bundleplugin/packageinfo", resourcePaths );
}
public void testEmbedDependencyPositiveClauses() throws Exception
{
ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
Set artifacts = new LinkedHashSet();
artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
artifacts.addAll( artifactFactory.getScopedArtifacts() );
artifacts.addAll( artifactFactory.getTypedArtifacts() );
MavenProject project = getMavenProjectStub();
project.setDependencyArtifacts( artifacts );
Map instructions = new HashMap();
instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "*;classifier=;type=jar;scope=compile,"
+ "*;classifier=;type=jar;scope=runtime" );
Properties props = new Properties();
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
Manifest manifest = builder.getJar().getManifest();
String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( ".," + "compile-1.0.jar,b-1.0.jar,runtime-1.0.jar", bcp );
String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( "compile-1.0.jar;g=\"g\";a=\"compile\";v=\"1.0\"," + "b-1.0.jar;g=\"g\";a=\"b\";v=\"1.0\","
+ "runtime-1.0.jar;g=\"g\";a=\"runtime\";v=\"1.0\"", eas );
}
public void testEmbedDependencyNegativeClauses() throws Exception
{
ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
Set artifacts = new LinkedHashSet();
artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
artifacts.addAll( artifactFactory.getScopedArtifacts() );
artifacts.addAll( artifactFactory.getTypedArtifacts() );
MavenProject project = getMavenProjectStub();
project.setDependencyArtifacts( artifacts );
Map instructions = new HashMap();
instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "!type=jar, !artifactId=c" );
Properties props = new Properties();
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
Manifest manifest = builder.getJar().getManifest();
String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( ".," + "a-1.0.war," + "d-1.0.zip," + "e-1.0.rar", bcp );
String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( "a-1.0.war;g=\"g\";a=\"a\";v=\"1.0\"," + "d-1.0.zip;g=\"g\";a=\"d\";v=\"1.0\","
+ "e-1.0.rar;g=\"g\";a=\"e\";v=\"1.0\"", eas );
}
public void testEmbedDependencyDuplicateKeys() throws Exception
{
ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
Set artifacts = new LinkedHashSet();
artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
artifacts.addAll( artifactFactory.getScopedArtifacts() );
artifacts.addAll( artifactFactory.getTypedArtifacts() );
MavenProject project = getMavenProjectStub();
project.setDependencyArtifacts( artifacts );
Map instructions = new HashMap();
instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "c;type=jar,c;type=sources" );
Properties props = new Properties();
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
Manifest manifest = builder.getJar().getManifest();
String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( ".," + "c-1.0-three.jar," + "c-1.0.sources", bcp );
String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( "c-1.0-three.jar;g=\"g\";a=\"c\";v=\"1.0\";c=\"three\","
+ "c-1.0.sources;g=\"g\";a=\"c\";v=\"1.0\"", eas );
}
public void testEmbedDependencyMissingPositiveKey() throws Exception
{
ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
Set artifacts = new LinkedHashSet();
artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
artifacts.addAll( artifactFactory.getScopedArtifacts() );
artifacts.addAll( artifactFactory.getTypedArtifacts() );
MavenProject project = getMavenProjectStub();
project.setDependencyArtifacts( artifacts );
Map instructions = new HashMap();
instructions.put( DependencyEmbedder.EMBED_DEPENDENCY, "artifactId=a|b" );
Properties props = new Properties();
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Builder builder = plugin.buildOSGiBundle( project, dependencyGraph, instructions, props, plugin.getClasspath( project, dependencyGraph ) );
Manifest manifest = builder.getJar().getManifest();
String bcp = manifest.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( ".," + "a-1.0-one.jar," + "b-1.0-two.jar," + "a-1.0.war," + "b-1.0.jar", bcp );
String eas = manifest.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( "a-1.0-one.jar;g=\"g\";a=\"a\";v=\"1.0\";c=\"one\","
+ "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\","
+ "b-1.0.jar;g=\"g\";a=\"b\";v=\"1.0\"", eas );
}
public void testEmbedDependencyMissingNegativeKey() throws Exception
{
ArtifactStubFactory artifactFactory = new ArtifactStubFactory( plugin.getOutputDirectory(), true );
Set artifacts = new LinkedHashSet();
artifacts.addAll( artifactFactory.getClassifiedArtifacts() );
artifacts.addAll( artifactFactory.getScopedArtifacts() );
artifacts.addAll(artifactFactory.getTypedArtifacts());
MavenProject project = getMavenProjectStub();
project.setDependencyArtifacts(artifacts);
Properties props = new Properties();
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Jar[] classpath = plugin.getClasspath(project, dependencyGraph);
Map instructions1 = new HashMap();
instructions1.put( DependencyEmbedder.EMBED_DEPENDENCY, "!scope=compile" );
Builder builder1 = plugin.buildOSGiBundle( project, dependencyGraph, instructions1, props, classpath );
Manifest manifest1 = builder1.getJar().getManifest();
Map instructions2 = new HashMap();
instructions2.put( DependencyEmbedder.EMBED_DEPENDENCY, "scope=!compile" );
Builder builder2 = plugin.buildOSGiBundle( project, dependencyGraph, instructions2, props, classpath );
Manifest manifest2 = builder2.getJar().getManifest();
String bcp1 = manifest1.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( ".," + "provided-1.0.jar," + "test-1.0.jar," + "runtime-1.0.jar," + "system-1.0.jar", bcp1 );
String eas1 = manifest1.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( "provided-1.0.jar;g=\"g\";a=\"provided\";v=\"1.0\","
+ "test-1.0.jar;g=\"g\";a=\"test\";v=\"1.0\"," + "runtime-1.0.jar;g=\"g\";a=\"runtime\";v=\"1.0\","
+ "system-1.0.jar;g=\"g\";a=\"system\";v=\"1.0\"", eas1 );
String bcp2 = manifest2.getMainAttributes().getValue( Constants.BUNDLE_CLASSPATH );
assertEquals( bcp1, bcp2 );
String eas2 = manifest2.getMainAttributes().getValue( "Embedded-Artifacts" );
assertEquals( eas1, eas2 );
}
public void testPropertySanitizing() throws Exception
{
MavenProject project = getMavenProjectStub();
Properties props = new Properties();
props.put( new File( "A" ), new File( "B" ) );
props.put( new int[4], new HashMap( 2 ) );
props.put( Arrays.asList( 1, "two", 3.0 ), new float[5] );
props.put( "A", new File( "B" ) );
props.put( "4", new HashMap( 2 ) );
props.put( "1, two, 3.0", new char[5] );
DependencyNode dependencyGraph = plugin.buildDependencyGraph(project);
Builder builder = plugin.getOSGiBuilder( project, new HashMap(), props, plugin.getClasspath( project, dependencyGraph ) );
File file = new File( getBasedir(), "target" + File.separatorChar + "test.props" );
builder.getProperties().store( new FileOutputStream( file ), "TEST" );
}
}