blob: e049ac6e49e970385dc7b94103f93d78acebc641 [file] [log] [blame]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.Project;
/**
* Testcase for the Manifest class used in the jar task.
*
* @author Conor MacNeill <conor@apache.org>
*/
public class ManifestTest extends BuildFileTest {
public static final String EXPANDED_MANIFEST
= "src/etc/testcases/taskdefs/manifests/META-INF/MANIFEST.MF";
public static final String LONG_LINE
= "AReallyLongLineToTestLineBreakingInManifests-ACapabilityWhich" +
"IsSureToLeadToHundredsOfQuestionsAboutWhyAntMungesManifests" +
"OfCourseTheAnswerIsThatIsWhatTheSpecRequiresAndIfAnythingHas" +
"AProblemWithThatItIsNotABugInAnt";
public ManifestTest(String name) {
super(name);
}
public void setUp() {
configureProject("src/etc/testcases/taskdefs/manifest.xml");
}
public void tearDown() {
executeTarget("clean");
}
/**
* Empty manifest - is OK
*/
public void test1() throws ManifestException, IOException {
executeTarget("test1");
Manifest manifest = getManifest(EXPANDED_MANIFEST);
String version = manifest.getManifestVersion();
assertEquals("Manifest was not created with correct version - ", "1.0", version);
}
/**
* Simple Manifest with version 2.0
*/
public void test2() throws ManifestException, IOException {
executeTarget("test2");
Manifest manifest = getManifest(EXPANDED_MANIFEST);
String version = manifest.getManifestVersion();
assertEquals("Manifest was not created with correct version - ", "2.0", version);
}
/**
* Malformed manifest - no : on the line
*/
public void test3() {
expectBuildExceptionContaining("test3", "Manifest is invalid - no colon on header line",
"Invalid Manifest");
}
/**
* Malformed manifest - starts with continuation line
*/
public void test4() {
expectBuildExceptionContaining("test4", "Manifest is invalid - section starts with continuation line",
"Invalid Manifest");
}
/**
* Malformed manifest - Name attribute in main section
*/
public void test5() {
executeTarget("test5");
String output = getLog();
boolean hasWarning = output.indexOf("Manifest warning: \"Name\" attributes should not occur in the main section") != -1;
assertEquals("Expected warning about Name in main section", true, hasWarning);
}
/**
* New Section not starting with Name attribute.
*/
public void test6() {
expectBuildExceptionContaining("test6", "Manifest is invalid - section starts with incorrect attribute",
"Invalid Manifest");
String output = getLog();
boolean hasWarning = output.indexOf("Manifest sections should start with a \"Name\" attribute") != -1;
assertEquals("Expected warning about section not starting with Name: attribute", true, hasWarning);
}
/**
* From attribute is illegal
*/
public void test7() {
executeTarget("test7");
boolean hasWarning = getLog().indexOf("Manifest attributes should not start with \"From\"") != -1;
assertEquals("Expected warning about From: attribute", true, hasWarning);
}
/**
* Inline manifest - OK
*/
public void test8() throws IOException, ManifestException {
executeTarget("test8");
Manifest manifest = getManifest(EXPANDED_MANIFEST);
Manifest.Section mainSection = manifest.getMainSection();
String classpath = mainSection.getAttributeValue("class-path");
assertEquals("Class-Path attribute was not set correctly - ", "fubar", classpath);
Manifest.Section testSection = manifest.getSection("Test");
String testAttr = testSection.getAttributeValue("TestAttr");
assertEquals("TestAttr attribute was not set correctly - ", "Test", testAttr);
}
/**
* Inline manifest - Invalid since has a Name attribute in the section element
*/
public void test9() {
expectBuildExceptionContaining("test9", "Construction is invalid - Name attribute should not be used",
"Specify the section name using the \"name\" attribute of the <section> element");
}
/**
* Inline manifest - Invalid attribute without name
*/
public void test10() {
expectBuildExceptionContaining("test10", "Attribute has no name",
"Attributes must have name and value");
}
/**
* Inline manifest - Invalid attribute without value
*/
public void test11() {
expectBuildExceptionContaining("test11", "Attribute has no value",
"Attributes must have name and value");
}
/**
* Inline manifest - Invalid attribute without value
*/
public void test12() {
expectBuildExceptionContaining("test12", "Section with no name",
"Sections must have a name");
}
/**
* Inline manifest - Duplicate attribute
*/
public void test13() {
expectBuildExceptionContaining("test13", "Duplicate Attribute",
"The attribute \"Test\" may not occur more than once in the same section");
}
/**
* Inline manifest - OK since classpath entries can be duplicated.
*/
public void test14() throws IOException, ManifestException {
executeTarget("test14");
Manifest manifest = getManifest(EXPANDED_MANIFEST);
Manifest.Section mainSection = manifest.getMainSection();
String classpath = mainSection.getAttributeValue("class-path");
assertEquals("Class-Path attribute was not set correctly - ",
"Test1 Test2 Test3 Test4", classpath);
Object classPathAttr = mainSection.getAttribute("class-PATH");
assertTrue("Class path attribute should be a Vector", classPathAttr instanceof Vector);
}
/**
* Tets long line wrapping
*/
public void testLongLine() throws IOException, ManifestException {
Project project = getProject();
project.setUserProperty("test.longline", LONG_LINE);
executeTarget("testLongLine");
Manifest manifest = getManifest(EXPANDED_MANIFEST);
Manifest.Section mainSection = manifest.getMainSection();
String classpath = mainSection.getAttributeValue("class-path");
assertEquals("Class-Path attribute was not set correctly - ",
LONG_LINE, classpath);
}
/**
* file attribute for manifest task is required.
*/
public void testNoFile() {
expectBuildException("testNoFile", "file is required");
}
/**
* replace changes Manifest-Version from 2.0 to 1.0
*/
public void testReplace() throws IOException, ManifestException {
executeTarget("testReplace");
Manifest mf = getManifest("src/etc/testcases/taskdefs/mftest.mf");
assertNotNull(mf);
assertEquals(Manifest.getDefaultManifest(), mf);
}
/**
* update keeps the Manifest-Version and adds a new attribute Foo
*/
public void testUpdate() throws IOException, ManifestException {
executeTarget("testUpdate");
Manifest mf = getManifest("src/etc/testcases/taskdefs/mftest.mf");
assertNotNull(mf);
assertTrue(!Manifest.getDefaultManifest().equals(mf));
String mfAsString = mf.toString();
assertNotNull(mfAsString);
assertTrue(mfAsString.startsWith("Manifest-Version: 2.0"));
assertTrue(mfAsString.indexOf("Foo: Bar") > -1);
}
/**
* Reads mftest.mf.
*/
private Manifest getManifest(String filename) throws IOException, ManifestException {
FileReader r = new FileReader(filename);
try {
return new Manifest(r);
} finally {
r.close();
}
}
}