123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- /**
- * Copyright (C) 2012 ZeroTurnaround LLC <support@zeroturnaround.com>
- *
- * Licensed 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.
- */
- import java.io.BufferedInputStream;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.FileReader;
- import java.io.IOException;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipOutputStream;
- import junit.framework.TestCase;
- import org.apache.commons.io.FileUtils;
- import org.apache.commons.io.IOUtils;
- import org.zeroturnaround.zip.ZipEntrySource;
- import org.zeroturnaround.zip.ZipException;
- import org.zeroturnaround.zip.ZipUtil;
- public class ZipUtilTest extends TestCase {
- public void testUnpackEntryFromFile() throws IOException {
- final String name = "foo";
- final byte[] contents = "bar".getBytes();
- File file = File.createTempFile("temp", null);
- try {
- // Create the ZIP file
- ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file));
- try {
- zos.putNextEntry(new ZipEntry(name));
- zos.write(contents);
- zos.closeEntry();
- }
- finally {
- IOUtils.closeQuietly(zos);
- }
- // Test the ZipUtil
- byte[] actual = ZipUtil.unpackEntry(file, name);
- assertNotNull(actual);
- assertEquals(new String(contents), new String(actual));
- }
- // 1
-
- // 2
-
- // 3
- finally {
- FileUtils.deleteQuietly(file);
- }
- }
-
- public void testUnpackEntryFromStreamToFile() throws IOException {
- final String name = "foo";
- final byte[] contents = "bar".getBytes();
- File file = File.createTempFile("temp", null);
- try {
- // Create the ZIP file
- ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file));
- try {
- zos.putNextEntry(new ZipEntry(name));
- zos.write(contents);
- zos.closeEntry();
- }
- finally {
- IOUtils.closeQuietly(zos);
- }
- FileInputStream fis = new FileInputStream(file);
- File outputFile = File.createTempFile("temp-output", null);
- boolean result = ZipUtil.unpackEntry(fis, name, outputFile);
- assertTrue(result);
-
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(outputFile));
- byte[] actual = new byte[1024];
- int read = bis.read(actual);
- bis.close();
-
- assertEquals(new String(contents), new String(actual, 0, read));
- }
- // 1
-
- // 2
-
- // 3
- finally {
- FileUtils.deleteQuietly(file);
- }
- }
-
- public void testUnpackEntryFromStream() throws IOException {
- final String name = "foo";
- final byte[] contents = "bar".getBytes();
- File file = File.createTempFile("temp", null);
- try {
- // Create the ZIP file
- ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(file));
- try {
- zos.putNextEntry(new ZipEntry(name));
- zos.write(contents);
- zos.closeEntry();
- }
- finally {
- IOUtils.closeQuietly(zos);
- }
- FileInputStream fis = new FileInputStream(file);
- // Test the ZipUtil
- byte[] actual = ZipUtil.unpackEntry(fis, name);
- assertNotNull(actual);
- assertEquals(new String(contents), new String(actual));
- }
- // 1
-
- // 2
-
- // 3
- finally {
- FileUtils.deleteQuietly(file);
- }
- }
- public void testDuplicateEntryAtAdd() throws IOException {
- File src = new File(getClass().getResource("duplicate.zip").getPath());
- File dest = File.createTempFile("temp", null);
- try {
- ZipUtil.addEntries(src, new ZipEntrySource[0], dest);
- }
- finally {
- FileUtils.deleteQuietly(dest);
- }
- }
- public void testDuplicateEntryAtReplace() throws IOException {
- File src = new File(getClass().getResource("duplicate.zip").getPath());
- File dest = File.createTempFile("temp", null);
- try {
- ZipUtil.replaceEntries(src, new ZipEntrySource[0], dest);
- }
- finally {
- FileUtils.deleteQuietly(dest);
- }
- }
- public void testDuplicateEntryAtAddOrReplace() throws IOException {
- File src = new File(getClass().getResource("duplicate.zip").getPath());
- File dest = File.createTempFile("temp", null);
- try {
- ZipUtil.addOrReplaceEntries(src, new ZipEntrySource[0], dest);
- }
- finally {
- FileUtils.deleteQuietly(dest);
- }
- }
- public void testUnexplode() throws IOException {
- File file = File.createTempFile("tempFile", null);
- File tmpDir = file.getParentFile();
- unexplodeWithException(file, "shouldn't be able to unexplode file that is not a directory");
- assertTrue("Should be able to delete tmp file", file.delete());
- unexplodeWithException(file, "shouldn't be able to unexplode file that doesn't exist");
- // create empty tmp dir with the same name as deleted file
- File dir = new File(tmpDir, file.getName());
- dir.deleteOnExit();
- assertTrue("Should be able to create directory with the same name as there was tmp file", dir.mkdir());
- unexplodeWithException(dir, "shouldn't be able to unexplode dir that doesn't contain any files");
- // unexplode should succeed with at least one file in directory
- File.createTempFile("temp", null, dir);
- ZipUtil.unexplode(dir);
- assertTrue("zip file should exist with the same name as the directory that was unexploded", dir.exists());
- assertTrue("unexploding input directory should have produced zip file with the same name", !dir.isDirectory());
- assertTrue("Should be able to delete zip that was created from directory", dir.delete());
- }
- public void testPackEntry() throws Exception {
- File fileToPack = new File(getClass().getResource("TestFile.txt").getPath());
- File dest = File.createTempFile("temp", null);
- ZipUtil.packEntry(fileToPack, dest);
- assertTrue(dest.exists());
- ZipUtil.explode(dest);
- assertTrue((new File(dest, "TestFile.txt")).exists());
- // if fails then maybe somebody changed the file contents and did not update
- // the test
- assertEquals(108, (new File(dest, "TestFile.txt")).length());
- }
- public void testPackEntries() throws Exception {
- File fileToPack = new File(getClass().getResource("TestFile.txt").getPath());
- File fileToPackII = new File(getClass().getResource("TestFile-II.txt").getPath());
- File dest = File.createTempFile("temp", null);
- ZipUtil.packEntries(new File[] { fileToPack, fileToPackII }, dest);
- assertTrue(dest.exists());
- ZipUtil.explode(dest);
- assertTrue((new File(dest, "TestFile.txt")).exists());
- assertTrue((new File(dest, "TestFile-II.txt")).exists());
- // if fails then maybe somebody changed the file contents and did not update
- // the test
- assertEquals(108, (new File(dest, "TestFile.txt")).length());
- assertEquals(103, (new File(dest, "TestFile-II.txt")).length());
- }
- public void testZipException() {
- boolean exceptionThrown = false;
- try {
- ZipUtil.pack(new File("nonExistent"), new File("weeheha"));
- }
- catch (ZipException e) {
- exceptionThrown = true;
- }
- assertTrue(exceptionThrown);
- }
- public void testPreserveRoot() throws Exception {
- File dest = File.createTempFile("temp", null);
- File parent = new File(getClass().getResource("TestFile.txt").getPath()).getParentFile();
- ZipUtil.pack(parent, dest, true);
- ZipUtil.explode(dest);
- assertTrue((new File(dest, parent.getName())).exists());
- }
- private void unexplodeWithException(File file, String message) {
- boolean ok = false;
- try {
- ZipUtil.unexplode(file);
- }
- catch (Exception e) {
- ok = true;
- }
- assertTrue(message, ok);
- }
- public void testArchiveEquals() {
- File src = new File(getClass().getResource("demo.zip").getPath());
- // byte-by-byte copy
- File src2 = new File(getClass().getResource("demo-copy.zip").getPath());
- assertTrue(ZipUtil.archiveEquals(src, src2));
-
- // entry by entry copy
- File src3 = new File(getClass().getResource("demo-copy-II.zip").getPath());
- assertTrue(ZipUtil.archiveEquals(src, src3));
- }
-
- public void testRepackArchive() throws IOException {
- File src = new File(getClass().getResource("demo.zip").getPath());
- File dest = File.createTempFile("temp", null);
- ZipUtil.repack(src, dest, 1);
- assertTrue(ZipUtil.archiveEquals(src, dest));
- }
- public void testContainsAnyEntry() throws IOException {
- File src = new File(getClass().getResource("demo.zip").getPath());
- boolean exists = ZipUtil.containsAnyEntry(src, new String[] { "foo.txt", "bar.txt" });
- assertTrue(exists);
- exists = ZipUtil.containsAnyEntry(src, new String[] { "foo.txt", "does-not-exist.txt" });
- assertTrue(exists);
- exists = ZipUtil.containsAnyEntry(src, new String[] { "does-not-exist-I.txt", "does-not-exist-II.txt" });
- assertFalse(exists);
- }
- public void testAddEntry() throws IOException {
- File src = new File(getClass().getResource("demo.zip").getPath());
- final String fileName = "TestFile.txt";
- assertFalse(ZipUtil.containsEntry(src, fileName));
- File newEntry = new File(getClass().getResource(fileName).getPath());
- File dest = File.createTempFile("temp.zip", null);
- ZipUtil.addEntry(src, fileName, newEntry, dest);
- assertTrue(ZipUtil.containsEntry(dest, fileName));
- }
- public void testRemoveEntry() throws IOException {
- File src = new File(getClass().getResource("demo.zip").getPath());
- File dest = File.createTempFile("temp", null);
- try {
- ZipUtil.removeEntry(src, "bar.txt", dest);
- assertTrue("Result zip misses entry 'foo.txt'", ZipUtil.containsEntry(dest, "foo.txt"));
- assertTrue("Result zip misses entry 'foo1.txt'", ZipUtil.containsEntry(dest, "foo1.txt"));
- assertTrue("Result zip misses entry 'foo2.txt'", ZipUtil.containsEntry(dest, "foo2.txt"));
- assertFalse("Result zip still contains 'bar.txt'", ZipUtil.containsEntry(dest, "bar.txt"));
- }
- finally {
- FileUtils.deleteQuietly(dest);
- }
- }
- public void testRemoveDirs() throws IOException {
- File src = new File(getClass().getResource("demo-dirs.zip").getPath());
- File dest = File.createTempFile("temp", null);
- try {
- ZipUtil.removeEntries(src, new String[] { "bar.txt", "a/b" }, dest);
- assertFalse("Result zip still contains 'bar.txt'", ZipUtil.containsEntry(dest, "bar.txt"));
- assertFalse("Result zip still contains dir 'a/b'", ZipUtil.containsEntry(dest, "a/b"));
- assertTrue("Result doesn't containt 'attic'", ZipUtil.containsEntry(dest, "attic/treasure.txt"));
- assertTrue("Entry whose prefix is dir name is removed too: 'b.txt'", ZipUtil.containsEntry(dest, "a/b.txt"));
- assertFalse("Entry in a removed dir is still there: 'a/b/c.txt'", ZipUtil.containsEntry(dest, "a/b/c.txt"));
- }
- finally {
- FileUtils.deleteQuietly(dest);
- }
- }
- }
|