@Test public void testThatExternalAttributesFieldIsFunctional() throws IOException { // Prepare some sample modes to write into the zip file. final ImmutableList<String> samples = ImmutableList.of("rwxrwxrwx", "rw-r--r--", "--x--x--x", "---------"); for (String stringMode : samples) { long mode = MorePosixFilePermissions.toMode(PosixFilePermissions.fromString(stringMode)); // Write a tiny sample zip file, which sets the external attributes per the // permission sample above. try (CustomZipOutputStream out = ZipOutputStreams.newOutputStream(output, OVERWRITE_EXISTING)) { CustomZipEntry entry = new CustomZipEntry("test"); entry.setTime(System.currentTimeMillis()); entry.setExternalAttributes(mode << 16); out.putNextEntry(entry); out.write(new byte[0]); } // Now re-read the zip file using apache's commons-compress, which supports parsing // the external attributes field. try (ZipFile in = new ZipFile(output.toFile())) { Enumeration<ZipArchiveEntry> entries = in.getEntries(); ZipArchiveEntry entry = entries.nextElement(); assertEquals(mode, entry.getExternalAttributes() >> 16); assertFalse(entries.hasMoreElements()); } } }
@Test public void packingALargeFileShouldGenerateTheSameOutputWhenOverwritingAsWhenAppending() throws IOException { File reference = File.createTempFile("reference", ".zip"); String packageName = getClass().getPackage().getName().replace(".", "/"); URL sample = Resources.getResource(packageName + "/macbeth.properties"); byte[] input = Resources.toByteArray(sample); try (CustomZipOutputStream out = ZipOutputStreams.newOutputStream(output, OVERWRITE_EXISTING); ZipOutputStream ref = new ZipOutputStream(new FileOutputStream(reference))) { CustomZipEntry entry = new CustomZipEntry("macbeth.properties"); entry.setTime(System.currentTimeMillis()); out.putNextEntry(entry); ref.putNextEntry(entry); out.write(input); ref.write(input); } byte[] seen = Files.readAllBytes(output); byte[] expected = Files.readAllBytes(reference.toPath()); // Make sure the output is valid. try (ZipInputStream in = new ZipInputStream(Files.newInputStream(output))) { ZipEntry entry = in.getNextEntry(); assertEquals("macbeth.properties", entry.getName()); assertNull(in.getNextEntry()); } assertArrayEquals(expected, seen); }
@Test public void compressionCanBeSetOnAPerFileBasisAndIsHonoured() throws IOException { // Create some input that can be compressed. String packageName = getClass().getPackage().getName().replace(".", "/"); URL sample = Resources.getResource(packageName + "/sample-bytes.properties"); byte[] input = Resources.toByteArray(sample); try (CustomZipOutputStream out = ZipOutputStreams.newOutputStream(output)) { CustomZipEntry entry = new CustomZipEntry("default"); // Don't set the compression level. Should be the default. out.putNextEntry(entry); out.write(input); entry = new CustomZipEntry("stored"); entry.setCompressionLevel(NO_COMPRESSION); byte[] bytes = "stored".getBytes(); entry.setSize(bytes.length); entry.setCrc(Hashing.crc32().hashBytes(bytes).padToLong()); out.putNextEntry(entry); out.write(bytes); entry = new CustomZipEntry("best"); entry.setCompressionLevel(BEST_COMPRESSION); out.putNextEntry(entry); out.write(input); } try (ZipInputStream in = new ZipInputStream(Files.newInputStream(output))) { ZipEntry entry = in.getNextEntry(); assertEquals("default", entry.getName()); ByteStreams.copy(in, ByteStreams.nullOutputStream()); long defaultCompressedSize = entry.getCompressedSize(); assertNotEquals(entry.getCompressedSize(), entry.getSize()); entry = in.getNextEntry(); ByteStreams.copy(in, ByteStreams.nullOutputStream()); assertEquals("stored", entry.getName()); assertEquals(entry.getCompressedSize(), entry.getSize()); entry = in.getNextEntry(); ByteStreams.copy(in, ByteStreams.nullOutputStream()); assertEquals("best", entry.getName()); ByteStreams.copy(in, ByteStreams.nullOutputStream()); assertThat(entry.getCompressedSize(), lessThan(defaultCompressedSize)); } }
@Test public void canWriteContentToStoredZips() throws IOException { Path overwriteZip = Files.createTempFile("overwrite", ".zip"); byte[] input = "I like cheese".getBytes(UTF_8); try (CustomZipOutputStream overwrite = ZipOutputStreams.newOutputStream(overwriteZip, OVERWRITE_EXISTING); CustomZipOutputStream appending = ZipOutputStreams.newOutputStream(output, APPEND_TO_ZIP)) { CustomZipEntry entry = new CustomZipEntry("cheese.txt"); entry.setCompressionLevel(NO_COMPRESSION); entry.setTime(0); overwrite.putNextEntry(entry); appending.putNextEntry(entry); overwrite.write(input); appending.write(input); } }
@Test public void shouldChangeMethodWhenCompressionLevelIsChanged() { CustomZipEntry entry = new CustomZipEntry("cake"); assertEquals(ZipEntry.DEFLATED, entry.getMethod()); assertEquals(Deflater.DEFAULT_COMPRESSION, entry.getCompressionLevel()); entry.setCompressionLevel(NO_COMPRESSION); assertEquals(ZipEntry.STORED, entry.getMethod()); entry.setCompressionLevel(BEST_COMPRESSION); assertEquals(ZipEntry.DEFLATED, entry.getMethod()); }