diff options
Diffstat (limited to 'generator/src/test/java/com/google/archivepatcher/generator/MinimalZipEntryTest.java')
-rw-r--r-- | generator/src/test/java/com/google/archivepatcher/generator/MinimalZipEntryTest.java | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/generator/src/test/java/com/google/archivepatcher/generator/MinimalZipEntryTest.java b/generator/src/test/java/com/google/archivepatcher/generator/MinimalZipEntryTest.java new file mode 100644 index 0000000..d0bde74 --- /dev/null +++ b/generator/src/test/java/com/google/archivepatcher/generator/MinimalZipEntryTest.java @@ -0,0 +1,264 @@ +// Copyright 2016 Google Inc. All rights reserved. +// +// 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.google.archivepatcher.generator; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link MinimalZipEntry}. */ +@RunWith(JUnit4.class) +@SuppressWarnings("javadoc") +public class MinimalZipEntryTest { + private static final int COMPRESSION_METHOD = 8; // (meaning deflate) + private static final long CRC32 = 123; + private static final long COMPRESSED_SIZE = 456; + private static final long UNCOMPRESSED_SIZE = 789; + private static final byte[] FILE_NAME_BYTES = new byte[] {'f', 'o', 'o', '.', 'b', 'a', 'r'}; + private static final boolean GENERAL_PURPOSE_BIT_FLAG_11 = true; // (meaning file name is UTF8) + private static final long FILE_OFFSET_OF_LOCAL_ENTRY = 1337; + private static final long FILE_OFFSET_OF_COMPRESSED_DATA = 2674; + + private MinimalZipEntry defaultEntry; + private MinimalZipEntry clonedDefaultEntry; + private MinimalZipEntry alteredCompressionMethod; + private MinimalZipEntry alteredCrc32; + private MinimalZipEntry alteredCompressedSize; + private MinimalZipEntry alteredUncompressedSize; + private MinimalZipEntry alteredFileNameBytes; + private MinimalZipEntry alteredGeneralPurposeBitFlag11; + private MinimalZipEntry alteredOffsetOfLocalEntry; + private MinimalZipEntry alteredFileOffsetOfCompressedData; + private List<MinimalZipEntry> allMutations; + + @Before + public void setup() throws Exception { + defaultEntry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + clonedDefaultEntry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredCompressionMethod = + new MinimalZipEntry( + COMPRESSION_METHOD - 1, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredCrc32 = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32 - 1, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredCompressedSize = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE - 1, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredUncompressedSize = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE - 1, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredFileNameBytes = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + new byte[] {'x'}, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredGeneralPurposeBitFlag11 = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + !GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredOffsetOfLocalEntry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY - 1); + alteredFileOffsetOfCompressedData = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + alteredFileOffsetOfCompressedData.setFileOffsetOfCompressedData(FILE_OFFSET_OF_COMPRESSED_DATA); + allMutations = + Collections.unmodifiableList( + Arrays.asList( + alteredCompressionMethod, + alteredCrc32, + alteredCompressedSize, + alteredUncompressedSize, + alteredFileNameBytes, + alteredGeneralPurposeBitFlag11, + alteredOffsetOfLocalEntry, + alteredFileOffsetOfCompressedData)); + } + + @Test + public void testGetFileName() throws Exception { + // Make a string with some chars that are from DOS ANSI art days, these chars have different + // binary representations in UTF8 and Cp437. We use light, medium, and dark "shade" characters + // (0x2591, 0x2592, 0x2593 respectively) for this purpose. Go go ANSI art! + // https://en.wikipedia.org/wiki/Code_page_437 + // https://en.wikipedia.org/wiki/Block_Elements + String fileName = new String("\u2591\u2592\u2593AWESOME\u2593\u2592\u2591"); + byte[] utf8Bytes = fileName.getBytes("UTF8"); + byte[] cp437Bytes = fileName.getBytes("Cp437"); + Assert.assertFalse(Arrays.equals(utf8Bytes, cp437Bytes)); // For test sanity + + MinimalZipEntry utf8Entry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + utf8Bytes, + true /* utf8 */, + FILE_OFFSET_OF_LOCAL_ENTRY); + Assert.assertArrayEquals(utf8Bytes, utf8Entry.getFileNameBytes()); + String fileNameFromUtf8Bytes = utf8Entry.getFileName(); + Assert.assertEquals(fileName, fileNameFromUtf8Bytes); + + MinimalZipEntry cp437Entry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + cp437Bytes, + false /* cp437 */, + FILE_OFFSET_OF_LOCAL_ENTRY); + Assert.assertArrayEquals(cp437Bytes, cp437Entry.getFileNameBytes()); + String fileNameFromCp437Bytes = cp437Entry.getFileName(); + Assert.assertEquals(fileName, fileNameFromCp437Bytes); + } + + @Test + public void testIsDeflateCompressed() { + // Compression method == 8, and uncompressed size != compressed size + Assert.assertTrue(defaultEntry.isDeflateCompressed()); + // Compression method == 8, but uncompressed size == compressed size (ie, STOR'ed entry) + MinimalZipEntry stored = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + 1000, + 1000, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + Assert.assertFalse(stored.isDeflateCompressed()); + // Compression method != 8 (obviously not deflate) + Assert.assertFalse(alteredCompressionMethod.isDeflateCompressed()); + } + + @Test + @SuppressWarnings("EqualsIncompatibleType") // For ErrorProne + public void testEquals() { + Assert.assertEquals(defaultEntry, defaultEntry); + MinimalZipEntry clonedDefaultEntry = + new MinimalZipEntry( + COMPRESSION_METHOD, + CRC32, + COMPRESSED_SIZE, + UNCOMPRESSED_SIZE, + FILE_NAME_BYTES, + GENERAL_PURPOSE_BIT_FLAG_11, + FILE_OFFSET_OF_LOCAL_ENTRY); + Assert.assertEquals(defaultEntry, clonedDefaultEntry); + for (MinimalZipEntry mutation : allMutations) { + Assert.assertNotEquals(defaultEntry, mutation); + } + Assert.assertFalse(defaultEntry.equals(null)); + Assert.assertFalse(defaultEntry.equals("foo")); + } + + @Test + public void testHashCode() { + Set<MinimalZipEntry> hashSet = new HashSet<>(); + hashSet.add(defaultEntry); + hashSet.add(clonedDefaultEntry); + Assert.assertEquals(1, hashSet.size()); + hashSet.addAll(allMutations); + Assert.assertEquals(1 + allMutations.size(), hashSet.size()); + } + + @Test + public void testGetters() { + Assert.assertEquals(COMPRESSED_SIZE, defaultEntry.getCompressedSize()); + Assert.assertEquals(COMPRESSION_METHOD, defaultEntry.getCompressionMethod()); + Assert.assertEquals(CRC32, defaultEntry.getCrc32OfUncompressedData()); + Assert.assertArrayEquals(FILE_NAME_BYTES, defaultEntry.getFileNameBytes()); + Assert.assertEquals(FILE_OFFSET_OF_LOCAL_ENTRY, defaultEntry.getFileOffsetOfLocalEntry()); + Assert.assertEquals(GENERAL_PURPOSE_BIT_FLAG_11, defaultEntry.getGeneralPurposeFlagBit11()); + Assert.assertEquals(UNCOMPRESSED_SIZE, defaultEntry.getUncompressedSize()); + + // Special one, only alteredFileOffsetOfCompressedData has this field set... + Assert.assertEquals(-1, defaultEntry.getFileOffsetOfCompressedData()); + Assert.assertEquals( + FILE_OFFSET_OF_COMPRESSED_DATA, + alteredFileOffsetOfCompressedData.getFileOffsetOfCompressedData()); + } +} |