| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 | /** *    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.File;import java.io.FileInputStream;import java.io.FileOutputStream;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 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);    }  }}
 |