blob: 79e576c4015024a8d2a5a7c147331ebf3b162c6d [file] [log] [blame]
package org.apache.aries.plugin.esa;
/*
* 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.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import aQute.lib.osgi.Analyzer;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.codehaus.plexus.archiver.zip.ZipEntry;
import org.codehaus.plexus.archiver.zip.ZipFile;
/**
* @author <a href="mailto:aramirez@apache.org">Allan Ramirez</a>
*/
public class EsaMojoTest
extends AbstractMojoTestCase
{
public void testEsaTestEnvironment()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-test/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
}
public void testBasicEsa()
throws Exception
{
testBasicEsa( "target/test-classes/unit/basic-esa-test/plugin-config.xml", null );
}
public void testBasicEsaPgkType()
throws Exception
{
testBasicEsa( "target/test-classes/unit/basic-esa-test-with-pgk-type/plugin-config.xml", "maven-esa-test-1.0-SNAPSHOT.jar" );
}
private void testBasicEsa(String path, String extraExpectedFiles)
throws Exception
{
File testPom = new File( getBasedir(),
path );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
if (extraExpectedFiles != null)
{
expectedFiles.add( extraExpectedFiles );
}
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
}
public void testBasicEsaWithDescriptor()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-with-descriptor/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
}
public void testBasicEsaWithManifest()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-with-manifest/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "META-INF/MANIFEST.MF" );
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
}
private Manifest getSubsystemManifest(ZipFile esa) throws Exception {
ZipEntry entry = esa.getEntry("OSGI-INF/SUBSYSTEM.MF");
InputStream in = esa.getInputStream(entry);
Manifest mf = new Manifest(in);
return mf;
}
private Map<String, Map<String, String>> getHeader(Manifest mf, String header) {
Attributes attributes = mf.getMainAttributes();
String value = attributes.getValue(header);
assertNotNull("Header " + header + " not found", value);
return Analyzer.parseHeader(value, null);
}
private void testForHeader(ZipFile esa, String header, String exactEntry) throws Exception {
Enumeration entries = esa.getEntries();
// Test Use-Bundle & Subsytem-Type inclusion
ZipEntry entry = esa.getEntry("OSGI-INF/SUBSYSTEM.MF");
BufferedReader br = new BufferedReader(new InputStreamReader(esa.getInputStream(entry)));
Boolean foundHeader=false;
String line;
while ((line = br.readLine()) != null) {
if (line.contains(header)) {
assertEquals(exactEntry, line);
foundHeader = true;
}
}
assertTrue("Found " + header + ":", foundHeader);
}
public void testSubsystemManifestGeneration()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-without-manifest/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
// Test for the Use-Bundle header
testForHeader(esa, "Use-Bundle", "Use-Bundle: org.apache.aries.test.Bundle;version=1.0.0-SNAPSHOT");
// Test for the Subsystem-Type header
testForHeader(esa, "Subsystem-Type", "Subsystem-Type: feature");
}
public void testSubsystemStartOrder()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-start-order/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
Manifest mf = getSubsystemManifest(esa);
Map<String, Map<String, String>> header = getHeader(mf, "Subsystem-Content");
Map<String, String> attributes = null;
attributes = header.get("maven-artifact01-1.0-SNAPSHOT");
assertNotNull(attributes);
assertEquals("[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT]", attributes.get("version"));
// start-order is actually a directive, shows up here as the name+":"
assertEquals("1", attributes.get("start-order:"));
assertNull(attributes.get("type"));
attributes = header.get("maven-artifact02-1.0-SNAPSHOT");
assertNotNull(attributes);
assertEquals("[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT]", attributes.get("version"));
assertEquals("2", attributes.get("start-order:"));
assertNull(attributes.get("type"));
}
public void testArchiveContentConfigurationNoBundles()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-no-bundles/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
}
public void testArchiveContentConfigurationSubsystemContentBundles()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-content-bundles-only/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.properties" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/pom.xml" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/maven-esa-test/" );
expectedFiles.add( "META-INF/maven/org.apache.maven.test/" );
expectedFiles.add( "META-INF/maven/" );
expectedFiles.add( "META-INF/" );
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
}
public void testCustomInstructions()
throws Exception
{
File testPom = new File( getBasedir(),
"target/test-classes/unit/basic-esa-custom-instructions/plugin-config.xml" );
EsaMojo mojo = ( EsaMojo ) lookupMojo( "esa", testPom );
assertNotNull( mojo );
String finalName = ( String ) getVariableValueFromObject( mojo, "finalName" );
String workDir = ( String ) getVariableValueFromObject( mojo, "workDirectory" );
String outputDir = ( String ) getVariableValueFromObject( mojo, "outputDirectory" );
mojo.execute();
//check the generated esa file
File esaFile = new File( outputDir, finalName + ".esa" );
assertTrue( esaFile.exists() );
//expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add( "OSGI-INF/SUBSYSTEM.MF" );
expectedFiles.add( "OSGI-INF/" );
expectedFiles.add( "maven-artifact01-1.0-SNAPSHOT.jar" );
expectedFiles.add( "maven-artifact02-1.0-SNAPSHOT.jar" );
ZipFile esa = new ZipFile( esaFile );
Enumeration entries = esa.getEntries();
assertTrue( entries.hasMoreElements() );
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
// Test for the Foo header
testForHeader(esa, "Foo", "Foo: bar");
// Test for the MyHeader header
testForHeader(esa, "MyHeader", "MyHeader: myValue");
// Test for the Subsystem-Name header
testForHeader(esa, "Subsystem-Name", "Subsystem-Name: myName");
}
public void testSubsystemContentType()
throws Exception
{
File testPom = new File(getBasedir(),
"target/test-classes/unit/basic-esa-content-type/plugin-config.xml");
EsaMojo mojo = (EsaMojo) lookupMojo("esa", testPom);
assertNotNull(mojo);
String finalName = (String) getVariableValueFromObject(mojo, "finalName");
String workDir = (String) getVariableValueFromObject(mojo, "workDirectory");
String outputDir = (String) getVariableValueFromObject(mojo, "outputDirectory");
mojo.execute();
// check the generated esa file
File esaFile = new File(outputDir, finalName + ".esa");
assertTrue(esaFile.exists());
// expected files/directories inside the esa file
List expectedFiles = new ArrayList();
expectedFiles.add("OSGI-INF/SUBSYSTEM.MF");
expectedFiles.add("OSGI-INF/");
expectedFiles.add("maven-artifact01-1.0-SNAPSHOT.jar");
expectedFiles.add("maven-artifact02-1.0-SNAPSHOT.jar");
expectedFiles.add("maven-artifact03-1.1-SNAPSHOT.jar");
ZipFile esa = new ZipFile(esaFile);
Enumeration entries = esa.getEntries();
assertTrue(entries.hasMoreElements());
int missing = getSizeOfExpectedFiles(entries, expectedFiles);
assertEquals("Missing files: " + expectedFiles, 0, missing);
Manifest mf = getSubsystemManifest(esa);
Map<String, Map<String, String>> header = getHeader(mf, "Subsystem-Content");
Map<String, String> attributes = null;
attributes = header.get("maven-artifact01-1.0-SNAPSHOT");
assertNotNull(attributes);
assertEquals("[1.0.0.SNAPSHOT,1.0.0.SNAPSHOT]", attributes.get("version"));
assertNull(attributes.get("type"));
attributes = header.get("maven-artifact02-1.0-SNAPSHOT");
assertNotNull(attributes);
assertEquals("[1.3,2.5)", attributes.get("version"));
assertNull(attributes.get("type"));
attributes = header.get("maven-artifact03");
assertNotNull(attributes);
assertEquals("[1.1.0.SNAPSHOT.NNN,1.1.0.SNAPSHOT.NNN]", attributes.get("version"));
assertEquals("osgi.fragment", attributes.get("type"));
attributes = header.get("maven-artifact04");
assertNotNull(attributes);
assertEquals("[1.2.0.SNAPSHOT,1.2.0.SNAPSHOT]", attributes.get("version"));
assertEquals("feature", attributes.get("type"));
}
private int getSizeOfExpectedFiles( Enumeration entries, List expectedFiles )
{
while( entries.hasMoreElements() )
{
ZipEntry entry = ( ZipEntry ) entries.nextElement();
if( expectedFiles.contains( entry.getName() ) )
{
expectedFiles.remove( entry.getName() );
assertFalse( expectedFiles.contains( entry.getName() ) );
}
else
{
fail( entry.getName() + " is not included in the expected files" );
}
}
return expectedFiles.size();
}
}