@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()); }
@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); } }