blob: 1774ca8212e6542deb7bfd5e230195549a0cdf1a [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
*
* 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.
*
*/
package org.apache.commons.compress.archivers.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import junit.framework.TestCase;
import org.apache.commons.compress.archivers.ArchiveEntry;
/**
* JUnit 3 testcase for a multi-volume zip file.
*
* Some tools (like 7-zip) allow users to split a large archives into 'volumes'
* with a given size to fit them into multiple cds, usb drives, or emails with
* an attachment size limit. It's basically the same file split into chunks of
* exactly 65536 bytes length. Concatenating volumes yields exactly the original
* file. There is no mechanism in the ZIP algorithm to accommodate for this.
* Before commons-compress used to enter an infinite loop on the last entry for
* such a file. This test is intended to prove that this error doesn't occur
* anymore. All entries but the last one are returned correctly, the last entry
* yields an exception.
*
*/
public class Maven221MultiVolumeTest extends TestCase {
private static final String [] ENTRIES = new String [] {
"apache-maven-2.2.1/",
"apache-maven-2.2.1/LICENSE.txt",
"apache-maven-2.2.1/NOTICE.txt",
"apache-maven-2.2.1/README.txt",
"apache-maven-2.2.1/bin/",
"apache-maven-2.2.1/bin/m2.conf",
"apache-maven-2.2.1/bin/mvn",
"apache-maven-2.2.1/bin/mvn.bat",
"apache-maven-2.2.1/bin/mvnDebug",
"apache-maven-2.2.1/bin/mvnDebug.bat",
"apache-maven-2.2.1/boot/",
"apache-maven-2.2.1/boot/classworlds-1.1.jar",
"apache-maven-2.2.1/conf/",
"apache-maven-2.2.1/conf/settings.xml",
"apache-maven-2.2.1/lib/"
};
private static final String LAST_ENTRY_NAME =
"apache-maven-2.2.1/lib/maven-2.2.1-uber.jar";
public void testRead7ZipMultiVolumeArchiveForStream() throws IOException,
URISyntaxException {
URL zip = getClass().getResource("/apache-maven-2.2.1.zip.001");
FileInputStream archive = new FileInputStream(
new File(new URI(zip.toString())));
ZipArchiveInputStream zi = null;
try {
zi = new ZipArchiveInputStream(archive,null,false);
// these are the entries that are supposed to be processed
// correctly without any problems
for (int i = 0; i < ENTRIES.length; i++) {
assertEquals(ENTRIES[i], zi.getNextEntry().getName());
}
// this is the last entry that is truncated
ArchiveEntry lastEntry = zi.getNextEntry();
assertEquals(LAST_ENTRY_NAME, lastEntry.getName());
byte [] buffer = new byte [4096];
// before the fix, we'd get 0 bytes on this read and all
// subsequent reads thus a client application might enter
// an infinite loop after the fix, we should get an
// exception
try {
while (zi.read(buffer) > 0) { }
fail("shouldn't be able to read from truncated entry");
} catch (IOException e) {
assertEquals("Truncated ZIP file", e.getMessage());
}
// and now we get another entry, which should also yield
// an exception
try {
zi.getNextEntry();
fail("shouldn't be able to read another entry from truncated"
+ " file");
} catch (IOException e) {
// this is to be expected
}
} finally {
if (zi != null) {
zi.close();
}
}
}
public void testRead7ZipMultiVolumeArchiveForFile()
throws URISyntaxException {
URL zip = getClass().getResource("/apache-maven-2.2.1.zip.001");
File file = new File(new URI(zip.toString()));
try {
new ZipFile(file);
fail("Expected ZipFile to fail");
} catch (IOException ex) {
// expected
}
}
}