am adf25974: am 15a93894: Tests for ZIP sign extension bugs.
* commit 'adf25974a44503066df61cc0be515395fd7253b6':
Tests for ZIP sign extension bugs.
diff --git a/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java b/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
index b18ebb4..0845b32 100644
--- a/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
+++ b/luni/src/test/java/libcore/java/util/zip/ZipEntryTest.java
@@ -16,9 +16,11 @@
package libcore.java.util.zip;
+import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.jar.JarEntry;
@@ -28,52 +30,143 @@
import java.util.zip.ZipOutputStream;
public class ZipEntryTest extends junit.framework.TestCase {
+ private static File createTemporaryZipFile() throws IOException {
+ File result = File.createTempFile("ZipFileTest", "zip");
+ result.deleteOnExit();
+ return result;
+ }
- /**
- * http://code.google.com/p/android/issues/detail?id=4690
- */
- public void test_utf8FileNames() throws Exception {
- // Create a zip file containing non-ASCII filenames.
- File f = File.createTempFile("your", "mum");
- List<String> filenames = Arrays.asList("us-ascii",
- "\u043c\u0430\u0440\u0442\u0430", // russian
- "\u1f00\u03c0\u1f78", // greek
- "\u30b3\u30f3\u30cb\u30c1\u30cf"); // japanese
- ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));
- for (String filename : filenames) {
- out.putNextEntry(new ZipEntry(filename));
- out.closeEntry(); // Empty files are fine.
- }
- out.close();
- // Read it back, and check we find all those names.
- // This failed when we were mangling the encoding.
- ZipFile zipFile = new ZipFile(f);
- for (String filename : filenames) {
- assertNotNull(filename, zipFile.getEntry(filename));
- }
- // Check that ZipInputStream works too.
- ZipInputStream in = new ZipInputStream(new FileInputStream(f));
- ZipEntry entry;
- int entryCount = 0;
- while ((entry = in.getNextEntry()) != null) {
- assertTrue(entry.getName(), filenames.contains(entry.getName()));
- ++entryCount;
- }
- assertEquals(filenames.size(), entryCount);
- in.close();
+ private static ZipOutputStream createZipOutputStream(File f) throws IOException {
+ return new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
+ }
+
+ private static String makeString(int count, String s) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < count; ++i) {
+ sb.append(s);
}
+ return sb.toString();
+ }
- /**
- * http://b/2099615
- */
- public void testClone() {
- byte[] extra = { 5, 7, 9 };
- JarEntry jarEntry = new JarEntry("foo");
- jarEntry.setExtra(extra);
- assertSame("Expected no defensive copy of extra", extra, jarEntry.getExtra());
-
- ZipEntry clone = (ZipEntry) jarEntry.clone();
- assertEquals(JarEntry.class, clone.getClass());
- assertNotSame(extra, clone.getExtra());
+ // http://code.google.com/p/android/issues/detail?id=4690
+ public void test_utf8FileNames() throws Exception {
+ // Create a zip file containing non-ASCII filenames.
+ File f = File.createTempFile("your", "mum");
+ List<String> filenames = Arrays.asList("us-ascii",
+ "\u043c\u0430\u0440\u0442\u0430", // russian
+ "\u1f00\u03c0\u1f78", // greek
+ "\u30b3\u30f3\u30cb\u30c1\u30cf"); // japanese
+ ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));
+ for (String filename : filenames) {
+ out.putNextEntry(new ZipEntry(filename));
+ out.closeEntry(); // Empty files are fine.
}
+ out.close();
+ // Read it back, and check we find all those names.
+ // This failed when we were mangling the encoding.
+ ZipFile zipFile = new ZipFile(f);
+ for (String filename : filenames) {
+ assertNotNull(filename, zipFile.getEntry(filename));
+ }
+ // Check that ZipInputStream works too.
+ ZipInputStream in = new ZipInputStream(new FileInputStream(f));
+ ZipEntry entry;
+ int entryCount = 0;
+ while ((entry = in.getNextEntry()) != null) {
+ assertTrue(entry.getName(), filenames.contains(entry.getName()));
+ ++entryCount;
+ }
+ assertEquals(filenames.size(), entryCount);
+ in.close();
+ }
+
+ // http://b/2099615
+ public void testClone() {
+ byte[] extra = { 5, 7, 9 };
+ JarEntry jarEntry = new JarEntry("foo");
+ jarEntry.setExtra(extra);
+ assertSame("Expected no defensive copy of extra", extra, jarEntry.getExtra());
+
+ ZipEntry clone = (ZipEntry) jarEntry.clone();
+ assertEquals(JarEntry.class, clone.getClass());
+ assertNotSame(extra, clone.getExtra());
+ }
+
+ public void testTooLongName() throws Exception {
+ String tooLongName = makeString(65536, "z");
+ try {
+ new ZipEntry(tooLongName);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ public void testMaxLengthName() throws Exception {
+ String maxLengthName = makeString(65535, "z");
+
+ File f = createTemporaryZipFile();
+ ZipOutputStream out = createZipOutputStream(f);
+ out.putNextEntry(new ZipEntry(maxLengthName));
+ out.closeEntry();
+ out.close();
+
+ // Read it back, and check that we see the entry.
+ ZipFile zipFile = new ZipFile(f);
+ assertNotNull(zipFile.getEntry(maxLengthName));
+ zipFile.close();
+ }
+
+ public void testTooLongExtra() throws Exception {
+ byte[] tooLongExtra = new byte[65536];
+ ZipEntry ze = new ZipEntry("x");
+ try {
+ ze.setExtra(tooLongExtra);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ public void testMaxLengthExtra() throws Exception {
+ byte[] maxLengthExtra = new byte[65535];
+
+ File f = createTemporaryZipFile();
+ ZipOutputStream out = createZipOutputStream(f);
+ ZipEntry ze = new ZipEntry("x");
+ ze.setExtra(maxLengthExtra);
+ out.putNextEntry(ze);
+ out.closeEntry();
+ out.close();
+
+ // Read it back, and check that we see the entry.
+ ZipFile zipFile = new ZipFile(f);
+ assertEquals(maxLengthExtra.length, zipFile.getEntry("x").getExtra().length);
+ zipFile.close();
+ }
+
+ public void testTooLongComment() throws Exception {
+ String tooLongComment = makeString(65536, "z");
+ ZipEntry ze = new ZipEntry("x");
+ try {
+ ze.setComment(tooLongComment);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ public void testMaxLengthComment() throws Exception {
+ String maxLengthComment = makeString(65535, "z");
+
+ File f = createTemporaryZipFile();
+ ZipOutputStream out = createZipOutputStream(f);
+ ZipEntry ze = new ZipEntry("x");
+ ze.setComment(maxLengthComment);
+ out.putNextEntry(ze);
+ out.closeEntry();
+ out.close();
+
+ // Read it back, and check that we see the entry.
+ ZipFile zipFile = new ZipFile(f);
+ assertEquals(maxLengthComment, zipFile.getEntry("x").getComment());
+ zipFile.close();
+ }
}