blob: 62c7b15d70ebac26f85bc90cb5c146e70d56964c [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.compressors;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.Deflater;
import java.util.zip.GZIPInputStream;
import org.apache.commons.compress.AbstractTestCase;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipParameters;
import org.apache.commons.compress.utils.IOUtils;
import org.junit.Assert;
import org.junit.Test;
public final class GZipTestCase extends AbstractTestCase {
@Test
public void testGzipCreation() throws Exception {
final File input = getFile("test1.xml");
final File output = new File(dir, "test1.xml.gz");
try (OutputStream out = new FileOutputStream(output)) {
try (CompressorOutputStream cos = new CompressorStreamFactory()
.createCompressorOutputStream("gz", out)) {
IOUtils.copy(new FileInputStream(input), cos);
}
}
}
@Test
public void testGzipUnarchive() throws Exception {
final File input = getFile("bla.tgz");
final File output = new File(dir, "bla.tar");
try (InputStream is = new FileInputStream(input)) {
final CompressorInputStream in = new CompressorStreamFactory()
.createCompressorInputStream("gz", is);
FileOutputStream out = null;
try {
out = new FileOutputStream(output);
IOUtils.copy(in, out);
} finally {
if (out != null) {
out.close();
}
in.close();
}
}
}
@Test
public void testConcatenatedStreamsReadFirstOnly() throws Exception {
final File input = getFile("multiple.gz");
try (InputStream is = new FileInputStream(input)) {
try (CompressorInputStream in = new CompressorStreamFactory()
.createCompressorInputStream("gz", is)) {
assertEquals('a', in.read());
assertEquals(-1, in.read());
}
}
}
@Test
public void testConcatenatedStreamsReadFully() throws Exception {
final File input = getFile("multiple.gz");
try (InputStream is = new FileInputStream(input)) {
try (CompressorInputStream in = new GzipCompressorInputStream(is, true)) {
assertEquals('a', in.read());
assertEquals('b', in.read());
assertEquals(0, in.available());
assertEquals(-1, in.read());
}
}
}
/**
* @see "https://issues.apache.org/jira/browse/COMPRESS-84"
*/
@Test
public void testCorruptedInput() throws Exception {
InputStream in = null;
OutputStream out = null;
CompressorInputStream cin = null;
try {
in = new FileInputStream(getFile("bla.tgz"));
out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
in.close();
out.close();
final byte[] data = ((ByteArrayOutputStream) out).toByteArray();
in = new ByteArrayInputStream(data, 0, data.length - 1);
cin = new CompressorStreamFactory()
.createCompressorInputStream("gz", in);
out = new ByteArrayOutputStream();
try {
IOUtils.copy(cin, out);
fail("Expected an exception");
} catch (final IOException ioex) {
// the whole point of the test
}
} finally {
if (out != null) {
out.close();
}
if (cin != null) {
cin.close();
}
if (in != null) {
in.close();
}
}
}
@Test
public void testInteroperabilityWithGzipCompressorInputStream() throws Exception {
byte[] content;
try (FileInputStream fis = new FileInputStream(getFile("test3.xml"))) {
content = IOUtils.toByteArray(fis);
}
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
final GzipParameters parameters = new GzipParameters();
parameters.setCompressionLevel(Deflater.BEST_COMPRESSION);
parameters.setOperatingSystem(3);
parameters.setFilename("test3.xml");
parameters.setComment("Test file");
parameters.setModificationTime(System.currentTimeMillis());
final GzipCompressorOutputStream out = new GzipCompressorOutputStream(bout, parameters);
out.write(content);
out.flush();
out.close();
final GzipCompressorInputStream in = new GzipCompressorInputStream(new ByteArrayInputStream(bout.toByteArray()));
final byte[] content2 = IOUtils.toByteArray(in);
Assert.assertArrayEquals("uncompressed content", content, content2);
}
@Test
public void testInteroperabilityWithGZIPInputStream() throws Exception {
byte[] content;
try (FileInputStream fis = new FileInputStream(getFile("test3.xml"))) {
content = IOUtils.toByteArray(fis);
}
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
final GzipParameters parameters = new GzipParameters();
parameters.setCompressionLevel(Deflater.BEST_COMPRESSION);
parameters.setOperatingSystem(3);
parameters.setFilename("test3.xml");
parameters.setComment("Test file");
parameters.setModificationTime(System.currentTimeMillis());
final GzipCompressorOutputStream out = new GzipCompressorOutputStream(bout, parameters);
out.write(content);
out.flush();
out.close();
final GZIPInputStream in = new GZIPInputStream(new ByteArrayInputStream(bout.toByteArray()));
final byte[] content2 = IOUtils.toByteArray(in);
Assert.assertArrayEquals("uncompressed content", content, content2);
}
@Test
public void testInvalidCompressionLevel() {
final GzipParameters parameters = new GzipParameters();
try {
parameters.setCompressionLevel(10);
fail("IllegalArgumentException not thrown");
} catch (final IllegalArgumentException e) {
// expected
}
try {
parameters.setCompressionLevel(-5);
fail("IllegalArgumentException not thrown");
} catch (final IllegalArgumentException e) {
// expected
}
}
private void testExtraFlags(final int compressionLevel, final int flag) throws Exception {
byte[] content;
try (FileInputStream fis = new FileInputStream(getFile("test3.xml"))) {
content = IOUtils.toByteArray(fis);
}
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
final GzipParameters parameters = new GzipParameters();
parameters.setCompressionLevel(compressionLevel);
final GzipCompressorOutputStream out = new GzipCompressorOutputStream(bout, parameters);
IOUtils.copy(new ByteArrayInputStream(content), out);
out.flush();
out.close();
assertEquals("extra flags (XFL)", flag, bout.toByteArray()[8]);
}
@Test
public void testExtraFlagsFastestCompression() throws Exception {
testExtraFlags(Deflater.BEST_SPEED, 4);
}
@Test
public void testExtraFlagsBestCompression() throws Exception {
testExtraFlags(Deflater.BEST_COMPRESSION, 2);
}
@Test
public void testExtraFlagsDefaultCompression() throws Exception {
testExtraFlags(Deflater.DEFAULT_COMPRESSION, 0);
}
@Test
public void testOverWrite() throws Exception {
final GzipCompressorOutputStream out = new GzipCompressorOutputStream(new ByteArrayOutputStream());
out.close();
try {
out.write(0);
fail("IOException expected");
} catch (final IOException e) {
// expected
}
}
@Test
public void testMetadataRoundTrip() throws Exception {
final ByteArrayOutputStream bout = new ByteArrayOutputStream();
final GzipParameters parameters = new GzipParameters();
parameters.setCompressionLevel(Deflater.BEST_COMPRESSION);
parameters.setModificationTime(123456000);
parameters.setOperatingSystem(13);
parameters.setFilename("test3.xml");
parameters.setComment("Umlaute möglich?");
try (GzipCompressorOutputStream out = new GzipCompressorOutputStream(bout, parameters); FileInputStream fis = new FileInputStream(getFile("test3" +
".xml"))) {
IOUtils.copy(fis, out);
}
final GzipCompressorInputStream input =
new GzipCompressorInputStream(new ByteArrayInputStream(bout.toByteArray()));
input.close();
final GzipParameters readParams = input.getMetaData();
assertEquals(Deflater.BEST_COMPRESSION, readParams.getCompressionLevel());
assertEquals(123456000, readParams.getModificationTime());
assertEquals(13, readParams.getOperatingSystem());
assertEquals("test3.xml", readParams.getFilename());
assertEquals("Umlaute möglich?", readParams.getComment());
}
}