Repository: commons-compress Updated Branches: refs/heads/master 6edf2fc72 -> 789c39551
unit tests for Archiver Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/789c3955 Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/789c3955 Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/789c3955 Branch: refs/heads/master Commit: 789c39551ea74f8b2f8ac754d20a1c7ff3ab55b5 Parents: 6edf2fc Author: Stefan Bodewig <bode...@apache.org> Authored: Fri May 11 11:25:18 2018 +0200 Committer: Stefan Bodewig <bode...@apache.org> Committed: Fri May 11 11:25:18 2018 +0200 ---------------------------------------------------------------------- .../compress/archivers/examples/Archiver.java | 1 + .../examples/ParameterizedArchiverTest.java | 153 +++++++++++++++++++ .../archivers/examples/SevenZArchiverTest.java | 124 +++++++++++++++ 3 files changed, 278 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-compress/blob/789c3955/src/main/java/org/apache/commons/compress/archivers/examples/Archiver.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/examples/Archiver.java b/src/main/java/org/apache/commons/compress/archivers/examples/Archiver.java index 4c43bb9..f85538a 100644 --- a/src/main/java/org/apache/commons/compress/archivers/examples/Archiver.java +++ b/src/main/java/org/apache/commons/compress/archivers/examples/Archiver.java @@ -117,6 +117,7 @@ public class Archiver { } else if (ArchiveStreamFactory.SEVEN_Z.equalsIgnoreCase(format)) { create(new SevenZOutputFile(target), directory); } else { + // never reached as prefersSeekableByteChannel only returns true fpr ZIP and 7z throw new ArchiveException("don't know how to handle format " + format); } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/789c3955/src/test/java/org/apache/commons/compress/archivers/examples/ParameterizedArchiverTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/compress/archivers/examples/ParameterizedArchiverTest.java b/src/test/java/org/apache/commons/compress/archivers/examples/ParameterizedArchiverTest.java new file mode 100644 index 0000000..2267610 --- /dev/null +++ b/src/test/java/org/apache/commons/compress/archivers/examples/ParameterizedArchiverTest.java @@ -0,0 +1,153 @@ +/* + * 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.examples; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.channels.FileChannel; +import java.nio.channels.SeekableByteChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.Arrays; +import java.util.Collection; + +import org.apache.commons.compress.AbstractTestCase; +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.ArchiveException; +import org.apache.commons.compress.archivers.ArchiveInputStream; +import org.apache.commons.compress.archivers.ArchiveOutputStream; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; +import org.apache.commons.compress.utils.IOUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized.Parameters; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class ParameterizedArchiverTest extends AbstractTestCase { + + // can't test 7z here as 7z cannot write to non-seekable streams + // and reading logic would be different as well - see + // SevenZArchiverTest class + @Parameters(name = "format={0}") + public static Collection<Object[]> data() { + return Arrays.asList( + new Object[] { "tar" }, + new Object[] { "cpio" }, + new Object[] { "zip" } + ); + } + + private final String format; + private File target; + + public ParameterizedArchiverTest(String format) { + this.format = format; + } + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + File c = new File(dir, "a/b/c"); + c.mkdirs(); + try (OutputStream os = Files.newOutputStream(new File(dir, "a/b/d.txt").toPath())) { + os.write("Hello, world 1".getBytes(StandardCharsets.UTF_8)); + } + try (OutputStream os = Files.newOutputStream(new File(dir, "a/b/c/e.txt").toPath())) { + os.write("Hello, world 2".getBytes(StandardCharsets.UTF_8)); + } + target = new File(resultDir, "test." + format); + } + + @Test + public void fileVersion() throws IOException, ArchiveException { + new Archiver().create(format, target, dir); + verifyContent(); + } + + @Test + public void outputStreamVersion() throws IOException, ArchiveException { + try (OutputStream os = Files.newOutputStream(target.toPath())) { + new Archiver().create(format, os, dir); + } + verifyContent(); + } + + @Test + public void channelVersion() throws IOException, ArchiveException { + try (SeekableByteChannel c = FileChannel.open(target.toPath(), StandardOpenOption.WRITE, + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + new Archiver().create(format, c, dir); + } + verifyContent(); + } + + @Test + public void archiveStreamVersion() throws IOException, ArchiveException { + try (OutputStream os = Files.newOutputStream(target.toPath()); + ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream(format, os)) { + new Archiver().create(aos, dir); + } + verifyContent(); + } + + private void verifyContent() throws IOException, ArchiveException { + try (InputStream is = Files.newInputStream(target.toPath()); + BufferedInputStream bis = new BufferedInputStream(is); + ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(format, bis)) { + assertDir("a", ais.getNextEntry()); + assertDir("a/b", ais.getNextEntry()); + ArchiveEntry n = ais.getNextEntry(); + Assert.assertNotNull(n); + // File.list may return a/b/c or a/b/d.txt first + if (n.getName().endsWith("/")) { + assertDir("a/b/c", n); + assertHelloWorld("a/b/c/e.txt", "2", ais.getNextEntry(), ais); + assertHelloWorld("a/b/d.txt", "1", ais.getNextEntry(), ais); + } else { + assertHelloWorld("a/b/d.txt", "1", n, ais); + assertDir("a/b/c", ais.getNextEntry()); + assertHelloWorld("a/b/c/e.txt", "2", ais.getNextEntry(), ais); + } + } + } + + private void assertDir(String expectedName, ArchiveEntry entry) { + Assert.assertNotNull(expectedName + " does not exists", entry); + Assert.assertEquals(expectedName + "/", entry.getName()); + Assert.assertTrue(expectedName + " is not a directory", entry.isDirectory()); + } + + private void assertHelloWorld(String expectedName, String suffix, ArchiveEntry entry, InputStream is) + throws IOException { + Assert.assertNotNull(expectedName + " does not exists", entry); + Assert.assertEquals(expectedName, entry.getName()); + Assert.assertFalse(expectedName + " is a directory", entry.isDirectory()); + byte[] expected = ("Hello, world " + suffix).getBytes(StandardCharsets.UTF_8); + byte[] actual = IOUtils.toByteArray(is); + Assert.assertArrayEquals(expected, actual); + } +} http://git-wip-us.apache.org/repos/asf/commons-compress/blob/789c3955/src/test/java/org/apache/commons/compress/archivers/examples/SevenZArchiverTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/compress/archivers/examples/SevenZArchiverTest.java b/src/test/java/org/apache/commons/compress/archivers/examples/SevenZArchiverTest.java new file mode 100644 index 0000000..635c899 --- /dev/null +++ b/src/test/java/org/apache/commons/compress/archivers/examples/SevenZArchiverTest.java @@ -0,0 +1,124 @@ +/* + * 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.examples; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.channels.FileChannel; +import java.nio.channels.SeekableByteChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; + +import org.apache.commons.compress.AbstractTestCase; +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.ArchiveException; +import org.apache.commons.compress.archivers.StreamingNotSupportedException; +import org.apache.commons.compress.archivers.sevenz.SevenZFile; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class SevenZArchiverTest extends AbstractTestCase { + private File target; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + File c = new File(dir, "a/b/c"); + c.mkdirs(); + try (OutputStream os = Files.newOutputStream(new File(dir, "a/b/d.txt").toPath())) { + os.write("Hello, world 1".getBytes(StandardCharsets.UTF_8)); + } + try (OutputStream os = Files.newOutputStream(new File(dir, "a/b/c/e.txt").toPath())) { + os.write("Hello, world 2".getBytes(StandardCharsets.UTF_8)); + } + target = new File(resultDir, "test.7z"); + } + + @Test + public void fileVersion() throws IOException, ArchiveException { + new Archiver().create("7z", target, dir); + verifyContent(); + } + + @Test(expected = StreamingNotSupportedException.class) + public void outputStreamVersion() throws IOException, ArchiveException { + try (OutputStream os = Files.newOutputStream(target.toPath())) { + new Archiver().create("7z", os, dir); + } + } + + @Test + public void channelVersion() throws IOException, ArchiveException { + try (SeekableByteChannel c = FileChannel.open(target.toPath(), StandardOpenOption.WRITE, + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + new Archiver().create("7z", c, dir); + } + verifyContent(); + } + + // not really a 7z test but I didn't feel like adding a new test just for this + @Test(expected = ArchiveException.class) + public void unknownFormat() throws IOException, ArchiveException { + try (SeekableByteChannel c = FileChannel.open(target.toPath(), StandardOpenOption.WRITE, + StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { + new Archiver().create("unknown format", c, dir); + } + } + + private void verifyContent() throws IOException, ArchiveException { + try (SevenZFile z = new SevenZFile(target)) { + assertDir("a", z.getNextEntry()); + assertDir("a/b", z.getNextEntry()); + ArchiveEntry n = z.getNextEntry(); + Assert.assertNotNull(n); + // File.list may return a/b/c or a/b/d.txt first + if (n.getName().endsWith("/")) { + assertDir("a/b/c", n); + assertHelloWorld("a/b/c/e.txt", "2", z.getNextEntry(), z); + assertHelloWorld("a/b/d.txt", "1", z.getNextEntry(), z); + } else { + assertHelloWorld("a/b/d.txt", "1", n, z); + assertDir("a/b/c", z.getNextEntry()); + assertHelloWorld("a/b/c/e.txt", "2", z.getNextEntry(), z); + } + } + } + + private void assertDir(String expectedName, ArchiveEntry entry) { + Assert.assertNotNull(expectedName + " does not exists", entry); + Assert.assertEquals(expectedName + "/", entry.getName()); + Assert.assertTrue(expectedName + " is not a directory", entry.isDirectory()); + } + + private void assertHelloWorld(String expectedName, String suffix, ArchiveEntry entry, SevenZFile z) + throws IOException { + Assert.assertNotNull(expectedName + " does not exists", entry); + Assert.assertEquals(expectedName, entry.getName()); + Assert.assertFalse(expectedName + " is a directory", entry.isDirectory()); + byte[] expected = ("Hello, world " + suffix).getBytes(StandardCharsets.UTF_8); + byte[] actual = new byte[expected.length]; + Assert.assertEquals(actual.length, z.read(actual)); + Assert.assertEquals(-1, z.read()); + Assert.assertArrayEquals(expected, actual); + } +}