/* * Copyright 2016-present Facebook, Inc. * * 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. */ package com.facebook.buck.zip; import static java.util.zip.Deflater.BEST_COMPRESSION; import static java.util.zip.Deflater.DEFAULT_COMPRESSION; import static java.util.zip.Deflater.NO_COMPRESSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import com.google.common.hash.HashCode; import com.google.common.hash.Hashing; import java.io.FileOutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.TimeZone; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.hamcrest.Matchers; import org.junit.Test; public class CustomZipEntryTest { @Test public void shouldChangeMethodWhenCompressionLevelIsChanged() { CustomZipEntry entry = new CustomZipEntry("cake"); assertEquals(ZipEntry.DEFLATED, entry.getMethod()); assertEquals(DEFAULT_COMPRESSION, entry.getCompressionLevel()); entry.setCompressionLevel(NO_COMPRESSION); assertEquals(ZipEntry.STORED, entry.getMethod()); assertEquals(NO_COMPRESSION, entry.getCompressionLevel()); entry.setCompressionLevel(BEST_COMPRESSION); assertEquals(ZipEntry.DEFLATED, entry.getMethod()); assertEquals(BEST_COMPRESSION, entry.getCompressionLevel()); } @Test public void producedZipFilesAreTimezoneAgnostic() throws Exception { HashCode referenceHash = writeSimpleJarAndGetHash(); TimeZone previousDefault = TimeZone.getDefault(); try { String[] availableIDs = TimeZone.getAvailableIDs(); assertThat(availableIDs.length, Matchers.greaterThan(1)); for (String timezoneID : availableIDs) { TimeZone timeZone = TimeZone.getTimeZone(timezoneID); TimeZone.setDefault(timeZone); assertThat(writeSimpleJarAndGetHash(), Matchers.equalTo(referenceHash)); } } finally { TimeZone.setDefault(previousDefault); } } private HashCode writeSimpleJarAndGetHash() throws Exception { Path output = Files.createTempFile("example", ".jar"); try (FileOutputStream fileOutputStream = new FileOutputStream(output.toFile()); ZipOutputStream out = new JarOutputStream(fileOutputStream)) { ZipEntry entry = new CustomZipEntry("test"); out.putNextEntry(entry); out.write(new byte[0]); entry = new ZipEntry("test1"); entry.setTime(ZipConstants.getFakeTime()); out.putNextEntry(entry); out.write(new byte[0]); } return Hashing.sha1().hashBytes(Files.readAllBytes(output)); } }