package org.codehaus.plexus.archiver.jar;
/*
* Copyright 2001,2004 The Apache Software Foundation
*
* Licensed 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.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Enumeration;
import java.util.jar.Attributes;
import org.codehaus.plexus.PlexusTestCase;
/**
* @author Emmanuel Venisse
* @version $Id$
*/
public class ManifestTest
extends PlexusTestCase
{
public void testManifestReader1()
throws Exception
{
Manifest manifest = getManifest( "src/test/resources/manifests/manifest1.mf" );
String version = manifest.getManifestVersion();
assertEquals( "Manifest was not created with correct version - ", "1.0", version );
}
public void testManifestReader2()
throws Exception
{
try
{
getManifest( "src/test/resources/manifests/manifest2.mf" );
fail( "Manifest isn't well formed. It must be generate an exception." );
}
catch ( IOException ignore )
{
}
}
public void testManifestReader3()
throws Exception
{
try
{
getManifest( "src/test/resources/manifests/manifest3.mf" );
fail( "Manifest isn't well formed. It must be generate an exception." );
}
catch ( IOException ignore )
{
}
}
public void testManifestReader5()
throws Exception
{
try
{
getManifest( "src/test/resources/manifests/manifest5.mf" );
fail();
}
catch ( IOException ignore )
{
}
}
public void testAddConfiguredSection()
throws ManifestException
{
Manifest manifest = new Manifest();
Manifest.Section section = new Manifest.Section();
section.setName( "fud" );
section.addConfiguredAttribute( new Manifest.Attribute( "bar", "baz" ) );
manifest.addConfiguredSection( section );
assertEquals( "baz", manifest.getAttributes( "fud" ).getValue( "bar" ) );
}
public void testAttributeLongLineWrite()
throws Exception
{
StringWriter writer = new StringWriter();
Manifest.Attribute attr = new Manifest.Attribute();
String longLineOfChars =
"123456789 123456789 123456789 123456789 123456789 123456789 123456789 "
+ "123456789 123456789 123456789 ";
attr.setName( "test" );
attr.setValue( longLineOfChars );
attr.write( new PrintWriter( writer ) );
writer.flush();
assertEquals( "should be multiline",
"test: 123456789 123456789 123456789 123456789 123456789 123456789 1234"
+ Manifest.EOL +
" 56789 123456789 123456789 123456789 " + Manifest.EOL,
writer.toString() );
}
public void testDualClassPath()
throws ManifestException, IOException
{
Manifest manifest =
getManifest( "src/test/resources/manifests/manifestWithDualClassPath.mf" );
final String attribute = manifest.getMainSection().getAttributeValue( "Class-Path" );
// According to discussions, we drop support for duplicate class-path attribute
assertEquals("baz", attribute);
}
public void testAttributeMultiLineValue()
throws Exception
{
checkMultiLineAttribute( "123456789" + Manifest.EOL + "123456789",
"123456789" + Manifest.EOL + " 123456789" + Manifest.EOL );
}
public void testAttributeDifferentLineEndings()
throws Exception
{
checkMultiLineAttribute("\tA\rB\n\t C\r\n \tD\n\r", "\tA" + Manifest.EOL +
" B" + Manifest.EOL +
" \t C" + Manifest.EOL +
" \tD" + Manifest.EOL);
}
public void testAddAttributes()
throws ManifestException, IOException
{
Manifest manifest = getManifest( "src/test/resources/manifests/manifestMerge1.mf" );
Manifest.ExistingSection fudz = manifest.getSection( "Fudz" );
fudz.addConfiguredAttribute( new Manifest.Attribute( "boz", "bzz" ) );
assertEquals( "bzz", fudz.getAttribute( "boz" ).getValue());
assertEquals( "bzz", manifest.getSection( "Fudz" ).getAttributeValue( "boz" ) );
}
public void testRemoveAttributes()
throws ManifestException, IOException
{
Manifest manifest = getManifest( "src/test/resources/manifests/manifestMerge1.mf" );
Manifest.ExistingSection fudz = manifest.getSection( "Fudz" );
fudz.addConfiguredAttribute( new Manifest.Attribute( "boz", "bzz" ) );
assertEquals( "bzz", fudz.getAttributeValue( "boz" ) );
fudz.removeAttribute( "boz" );
assertNull( fudz.getAttributeValue( "boz" ) );
}
public void testAttributeSerialization()
throws IOException, ManifestException
{
Manifest manifest = new Manifest( );
manifest.getMainAttributes().putValue( "mfa1", "fud1" );
manifest.getMainSection().addAttributeAndCheck( new Manifest.Attribute( "mfa2", "fud2" ) );
Attributes attributes = new Attributes( );
attributes.putValue( "attA", "baz" );
manifest.getEntries().put( "sub", attributes );
manifest.getSection( "sub" ).addAttributeAndCheck( new Manifest.Attribute( "attB", "caB" ) );
StringWriter writer = new StringWriter();
manifest.write( new PrintWriter( writer ) );
String s = writer.toString();
assertTrue( s.contains( "mfa1: fud1" ) );
assertTrue( s.contains( "mfa2: fud2" ) );
assertTrue( s.contains( "attA: baz" ) );
assertTrue( s.contains( "attB: caB" ) );
}
public void testDefaultBehaviour()
{
Manifest manifest = new Manifest();
Manifest.ExistingSection mainSection = manifest.getMainSection();
assertNotNull( mainSection );
String bar = mainSection.getAttributeValue( "Bar" );
assertNull( bar );
assertNull( manifest.getSection( "Fud" ) );
}
public void testGetDefaultManifest()
throws Exception
{
java.util.jar.Manifest mf = Manifest.getDefaultManifest();
java.util.jar.Attributes mainAttributes = mf.getMainAttributes();
assertEquals( 3, mainAttributes.size() );
assertTrue(
mainAttributes.containsKey( new java.util.jar.Attributes.Name( "Manifest-Version" ) ) );
assertTrue(
mainAttributes.containsKey( new java.util.jar.Attributes.Name( "Created-By" ) ) );
assertTrue(
mainAttributes.containsKey( new java.util.jar.Attributes.Name( "Archiver-Version" ) ) );
}
public void checkMultiLineAttribute( String in, String expected )
throws Exception
{
StringWriter writer = new StringWriter();
Manifest.Attribute attr = new Manifest.Attribute();
attr.setName( "test" );
attr.setValue( in );
attr.write( new PrintWriter( writer ) );
writer.flush();
// Print the string with whitespace replaced with special codes
// so in case of failure you can see what went wrong.
System.err.println( "String: " + dumpString( writer.toString() ) );
assertEquals( "should be indented multiline", "test: " + expected, writer.toString() );
}
private static String dumpString( String in )
{
String out = "";
char[] chars = in.toCharArray();
for ( char aChar : chars )
{
switch ( aChar )
{
case '\t':
out += "\\t";
break;
case '\r':
out += "\\r";
break;
case '\n':
out += "\\n";
break;
case ' ':
out += "\\s";
break;
default:
out += aChar;
break;
}
}
return out;
}
public void testAddAttributesPlexusManifest()
throws ManifestException, IOException
{
Manifest manifest = getManifest( "src/test/resources/manifests/manifestMerge1.mf" );
Manifest.ExistingSection fudz = manifest.getSection( "Fudz" );
fudz.addConfiguredAttribute( new Manifest.Attribute( "boz", "bzz" ) );
assertEquals( "bzz", manifest.getSection( "Fudz" ).getAttributeValue( "boz" ) );
}
public void testRemoveAttributesPlexusManifest()
throws ManifestException, IOException
{
Manifest manifest = getManifest( "src/test/resources/manifests/manifestMerge1.mf" );
Manifest.ExistingSection fudz = manifest.getSection( "Fudz" );
fudz.addConfiguredAttribute( new Manifest.Attribute( "boz", "bzz" ) );
assertEquals( "bzz", fudz.getAttributeValue( "boz" ) );
fudz.removeAttribute( "boz" );
assertNull( fudz.getAttributeValue( "boz" ) );
}
public void testAttributeSerializationPlexusManifest()
throws IOException, ManifestException
{
Manifest manifest = new Manifest( );
manifest.getMainSection().addConfiguredAttribute( new Manifest.Attribute( "mfa1", "fud1" ) );
manifest.getMainSection().addConfiguredAttribute( new Manifest.Attribute( "mfa2", "fud2" ) );
Manifest.Section attributes = new Manifest.Section( );
attributes.setName( "TestSection" );
attributes.addConfiguredAttribute( new Manifest.Attribute( "attA", "baz" ) );
attributes.addConfiguredAttribute( new Manifest.Attribute( "attB", "caB" ) );
manifest.addConfiguredSection( attributes );
StringWriter writer = new StringWriter();
manifest.write( new PrintWriter( writer ) );
String s = writer.toString();
assertTrue( s.contains( "mfa1: fud1" ) );
assertTrue( s.contains( "mfa2: fud2" ) );
assertTrue( s.contains( "attA: baz" ) );
assertTrue( s.contains( "attB: caB" ) );
}
public void testClassPathPlexusManifest()
throws ManifestException
{
Manifest manifest = new Manifest();
manifest.addConfiguredAttribute(
new Manifest.Attribute( ManifestConstants.ATTRIBUTE_CLASSPATH, "fud" ) );
manifest.addConfiguredAttribute(
new Manifest.Attribute( ManifestConstants.ATTRIBUTE_CLASSPATH, "duf" ) );
assertEquals( "fud duf", manifest.getMainSection().getAttributeValue(
ManifestConstants.ATTRIBUTE_CLASSPATH ) );
}
public void testAddConfiguredSectionPlexusManifest()
throws ManifestException
{
Manifest manifest = new Manifest();
Manifest.Section section = new Manifest.Section();
section.setName( "fud" );
section.addConfiguredAttribute( new Manifest.Attribute( "bar", "baz" ) );
manifest.addConfiguredSection( section );
assertEquals( "baz", manifest.getSection( "fud" ).getAttributeValue( "bar" ));
}
/**
* Reads a Manifest file.
*
* @param filename the file
* @return a manifest
* @throws java.io.IOException .
* @throws ManifestException .
*/
private Manifest getManifest( String filename )
throws IOException, ManifestException
{
FileReader r = new FileReader( getTestFile( filename ) );
try
{
return new Manifest( r );
}
finally
{
r.close();
}
}
}