blob: 21cdd6847bf6539728cb685d5563d6e484a4d7fc [file] [log] [blame]
/*
* 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
*
* https://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.
*
*/
package org.apache.tools.ant.taskdefs;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildFileRule;
import org.apache.tools.ant.FileUtilities;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.StreamUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
/**
*/
public class JarTest {
@Rule
public final BuildFileRule buildRule = new BuildFileRule();
@Rule
public ExpectedException thrown = ExpectedException.none();
private static String tempJar = "tmp.jar";
private static String tempDir = "jartmp/";
@Before
public void setUp() {
buildRule.configureProject("src/etc/testcases/taskdefs/jar.xml");
buildRule.executeTarget("setUp");
}
/**
* Expected failure due to required argument not specified
*/
@Test(expected = BuildException.class)
public void test1() {
buildRule.executeTarget("test1");
// TODO assert exception message
}
/**
* Expected failure due to nonexistent manifest file
*/
@Test(expected = BuildException.class)
public void test2() {
buildRule.executeTarget("test2");
// TODO assert exception message
}
/**
* Expected failure due to unrecognized whenempty attribute: format C: /y
*/
@Test(expected = BuildException.class)
public void test3() {
buildRule.executeTarget("test3");
// TODO assert exception message
}
private File getOutputDir() {
return new File(buildRule.getProject().getProperty("output"));
}
@Test
public void test4() {
buildRule.executeTarget("test4");
File jarFile = new File(getOutputDir(), tempJar);
assertTrue(jarFile.exists());
}
@Test
public void testNoRecreateWithoutUpdate() {
testNoRecreate("test4");
}
@Test
public void testNoRecreateWithUpdate() {
testNoRecreate("testNoRecreateWithUpdate");
}
private void testNoRecreate(String secondTarget) {
buildRule.executeTarget("test4");
File jarFile = new File(getOutputDir(), tempJar);
// move the modified date back a couple of seconds rather than delay the test on each run
assumeTrue(jarFile.setLastModified(jarFile.lastModified()
- FileUtils.getFileUtils().getFileTimestampGranularity() * 3));
long jarModifiedDate = jarFile.lastModified();
buildRule.executeTarget(secondTarget);
assertEquals("jar has not been recreated in " + secondTarget,
jarModifiedDate, jarFile.lastModified());
}
@Test
public void testRecreateWithoutUpdateAdditionalFiles() {
testRecreate("test4", "testRecreateWithoutUpdateAdditionalFiles");
}
@Test
public void testRecreateWithUpdateAdditionalFiles() {
testRecreate("test4", "testRecreateWithUpdateAdditionalFiles");
}
@Test
public void testRecreateWithoutUpdateNewerFile() {
testRecreate("testRecreateNewerFileSetup", "testRecreateWithoutUpdateNewerFile");
}
@Test
public void testRecreateWithUpdateNewerFile() {
testRecreate("testRecreateNewerFileSetup", "testRecreateWithUpdateNewerFile");
}
private void testRecreate(String firstTarget, String secondTarget) {
//Move the modified date on all input back a couple of seconds rather then delay the test to achieve a similar effect
FileUtilities.rollbackTimestamps(buildRule.getProject().getBaseDir(), 5);
buildRule.executeTarget(firstTarget);
File jarFile = new File(getOutputDir(), tempJar);
//Move the modified date back a couple of seconds rather then delay the test to achieve a similar effect
FileUtilities.rollbackTimestamps(buildRule.getOutputDir(), 5);
long jarModifiedDate = jarFile.lastModified();
buildRule.executeTarget(secondTarget);
jarFile = new File(getOutputDir(), tempJar);
assertTrue("jar has been recreated in " + secondTarget, jarModifiedDate < jarFile.lastModified());
}
@Test
public void testManifestStaysIntact() throws IOException, ManifestException {
buildRule.executeTarget("testManifestStaysIntact");
Manifest mf1;
try (FileReader r1 = new FileReader(new File(getOutputDir(), tempDir + "manifest"))) {
mf1 = new Manifest(r1);
}
Manifest mf2;
try (FileReader r2 = new FileReader(new File(getOutputDir(), tempDir
+ "META-INF/MANIFEST.MF"))) {
mf2 = new Manifest(r2);
}
assertEquals(mf1, mf2);
}
@Test
public void testNoRecreateBasedirExcludesWithUpdate() {
testNoRecreate("testNoRecreateBasedirExcludesWithUpdate");
}
@Test
public void testNoRecreateBasedirExcludesWithoutUpdate() {
testNoRecreate("testNoRecreateBasedirExcludesWithoutUpdate");
}
@Test
public void testNoRecreateZipfilesetExcludesWithUpdate() {
testNoRecreate("testNoRecreateZipfilesetExcludesWithUpdate");
}
@Test
public void testNoRecreateZipfilesetExcludesWithoutUpdate() {
testNoRecreate("testNoRecreateZipfilesetExcludesWithoutUpdate");
}
@Test
public void testRecreateZipfilesetWithoutUpdateAdditionalFiles() {
testRecreate("test4", "testRecreateZipfilesetWithoutUpdateAdditionalFiles");
}
@Test
public void testRecreateZipfilesetWithUpdateAdditionalFiles() {
testRecreate("test4", "testRecreateZipfilesetWithUpdateAdditionalFiles");
}
@Test
public void testRecreateZipfilesetWithoutUpdateNewerFile() {
testRecreate("testRecreateNewerFileSetup", "testRecreateZipfilesetWithoutUpdateNewerFile");
}
@Test
public void testRecreateZipfilesetWithUpdateNewerFile() {
testRecreate("testRecreateNewerFileSetup", "testRecreateZipfilesetWithUpdateNewerFile");
}
@Test
public void testCreateWithEmptyFileset() {
buildRule.executeTarget("testCreateWithEmptyFilesetSetUp");
buildRule.executeTarget("testCreateWithEmptyFileset");
buildRule.executeTarget("testCreateWithEmptyFileset");
}
@Test
public void testUpdateIfOnlyManifestHasChanged() {
buildRule.executeTarget("testUpdateIfOnlyManifestHasChanged");
File jarXml = new File(getOutputDir(), tempDir + "jar.xml");
assertTrue(jarXml.exists());
}
// bugzilla report 10262
@Test
public void testNoDuplicateIndex() throws IOException {
buildRule.executeTarget("testIndexTests");
try (ZipFile archive = new ZipFile(new File(getOutputDir(), tempJar))) {
assertEquals(1, StreamUtils.enumerationAsStream(archive.entries())
.filter(ze -> ze.getName().equals("META-INF/INDEX.LIST")).count());
}
}
// bugzilla report 16972
@Test
public void testRootFilesInIndex() throws IOException {
buildRule.executeTarget("testIndexTests");
try (ZipFile archive = new ZipFile(new File(getOutputDir(), tempJar))) {
ZipEntry ze = archive.getEntry("META-INF/INDEX.LIST");
InputStream is = archive.getInputStream(ze);
BufferedReader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
boolean foundArchive = false;
boolean foundSub = false;
boolean foundSubFoo = false;
boolean foundFoo = false;
String line = r.readLine();
while (line != null) {
switch (line) {
case "tmp.jar":
foundArchive = true;
break;
case "foo":
foundFoo = true;
break;
case "sub":
foundSub = true;
break;
case "sub/foo":
foundSubFoo = true;
break;
}
line = r.readLine();
}
assertTrue(foundArchive);
assertTrue(foundSub);
assertFalse(foundSubFoo);
assertTrue(foundFoo);
}
}
@Test
public void testManifestOnlyJar() {
buildRule.executeTarget("testManifestOnlyJar");
assertThat(buildRule.getLog(), containsString("Building MANIFEST-only jar: "));
File manifestFile = new File(getOutputDir(), tempDir + "META-INF" + File.separator + "MANIFEST.MF");
assertTrue(manifestFile.exists());
}
@Test
public void testIndexJarsPlusJarMarker() throws IOException {
buildRule.executeTarget("testIndexJarsPlusJarMarker");
try (ZipFile archive = new ZipFile(new File(getOutputDir(), tempJar + "2"))) {
ZipEntry ze = archive.getEntry("META-INF/INDEX.LIST");
InputStream is = archive.getInputStream(ze);
BufferedReader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
// tmp.jar
boolean foundTmp = false;
boolean foundA = false;
boolean foundAB = false;
boolean foundABC = false;
// tmp2.jar
boolean foundTmp2 = false;
boolean foundD = false;
boolean foundDE = false;
boolean foundDEF = false;
String line = r.readLine();
while (line != null) {
switch (line) {
case "tmp.jar":
foundTmp = true;
break;
case "a":
foundA = true;
break;
case "a/b":
foundAB = true;
break;
case "a/b/c":
foundABC = true;
break;
case "tmp.jar2":
foundTmp2 = true;
break;
case "d":
foundD = true;
break;
case "d/e":
foundDE = true;
break;
case "d/e/f":
foundDEF = true;
break;
}
line = r.readLine();
}
assertTrue(foundTmp);
assertTrue(foundA);
assertTrue(foundAB);
assertTrue(foundABC);
assertTrue(foundTmp2);
assertTrue(foundD);
assertTrue(foundDE);
assertTrue(foundDEF);
}
}
@Test
public void testIndexJarsPlusJarMarkerWithMapping() throws IOException {
buildRule.executeTarget("testIndexJarsPlusJarMarkerWithMapping");
try (ZipFile archive = new ZipFile(new File(getOutputDir(), tempJar + "2"))) {
ZipEntry ze = archive.getEntry("META-INF/INDEX.LIST");
InputStream is = archive.getInputStream(ze);
BufferedReader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
// tmp.jar
boolean foundTmp = false;
boolean foundA = false;
boolean foundAB = false;
boolean foundABC = false;
// tmp2.jar
boolean foundTmp2 = false;
boolean foundD = false;
boolean foundDE = false;
boolean foundDEF = false;
String line = r.readLine();
while (line != null) {
System.out.println("line = " + line);
switch (line) {
case "foo/tmp.jar":
foundTmp = true;
break;
case "a":
foundA = true;
break;
case "a/b":
foundAB = true;
break;
case "a/b/c":
foundABC = true;
break;
case "tmp.jar2":
foundTmp2 = true;
break;
case "d":
foundD = true;
break;
case "d/e":
foundDE = true;
break;
case "d/e/f":
foundDEF = true;
break;
}
line = r.readLine();
}
assertTrue(foundTmp);
assertTrue(foundA);
assertTrue(foundAB);
assertTrue(foundABC);
assertTrue(foundTmp2);
assertTrue(foundD);
assertTrue(foundDE);
assertTrue(foundDEF);
}
}
@Test
public void testNoVersionInfoFail() {
thrown.expect(BuildException.class);
thrown.expectMessage("No Implementation-Title set.");
buildRule.executeTarget("testNoVersionInfoFail");
}
@Test
public void testNoVersionInfoIgnore() {
buildRule.executeTarget("testNoVersionInfoIgnore");
assertThat(buildRule.getFullLog(), containsString("No Implementation-Title set."));
assertThat(buildRule.getFullLog(), containsString("No Implementation-Version set."));
assertThat(buildRule.getFullLog(), containsString("No Implementation-Vendor set."));
}
@Test
public void testNoVersionInfoWarn() {
buildRule.executeTarget("testNoVersionInfoWarn");
assertThat(buildRule.getLog(), containsString("No Implementation-Title set."));
assertThat(buildRule.getLog(), containsString("No Implementation-Version set."));
assertThat(buildRule.getLog(), containsString("No Implementation-Vendor set."));
}
@Test
public void testNoVersionInfoNoStrict() {
buildRule.executeTarget("testNoVersionInfoNoStrict");
assertThat(buildRule.getLog(), not(containsString("No Implementation-Title set.")));
assertThat(buildRule.getLog(), not(containsString("No Implementation-Version set.")));
assertThat(buildRule.getLog(), not(containsString("No Implementation-Vendor set.")));
}
@Test
public void testHasVersionInfo() {
buildRule.executeTarget("testHasVersionInfo");
assertThat(buildRule.getLog(), not(containsString("No Implementation-Title set.")));
assertThat(buildRule.getLog(), not(containsString("No Implementation-Version set.")));
assertThat(buildRule.getLog(), not(containsString("No Implementation-Vendor set.")));
}
}