blob: 57b36a61573d818fa9d4b65f60d476a5f85dbff9 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/* @test
25 @bug 4334846
26 @summary Make sure zip file comments of various sizes can be written.
27 @author Martin Buchholz
28 */
29
30import java.io.*;
31
32import java.util.zip.ZipEntry;
33import java.util.zip.ZipFile;
34import java.util.zip.ZipOutputStream;
35
36public class Comment {
37 private static final String entryName = "entryName";
38 private static final String entryContents = "entryContents";
39 private static final int commentMaxLength = 0xFFFF;
40 private static final int [] commentLengths
41 = { 0, 1, 32768, commentMaxLength - 1, commentMaxLength };
42
43 public static void main(String argv[])
44 throws Exception
45 {
46 for (int i = 0; i < commentLengths.length; ++i) {
47 int commentLength = commentLengths[i];
48 String comment = buildComment(commentLength);
49 String name = "Test" + commentLength + ".zip";
50 writeZipFile(name, comment);
51 verifyZipFile(name, comment);
52 new File(name).delete();
53 System.out.println(commentLength + ": successful");
54 }
55 }
56
57 private static void writeZipFile(String name, String comment)
58 throws IOException
59 {
60 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(name));
61 zos.setComment(comment);
62 ZipEntry ze = new ZipEntry(entryName);
63 ze.setMethod(ZipEntry.DEFLATED);
64 zos.putNextEntry(ze);
65 new DataOutputStream(zos).writeUTF(entryContents);
66 zos.closeEntry();
67 zos.close();
68 }
69
70 private static void verifyZipFile(String name, String comment)
71 throws Exception
72 {
73 // Check that Zip entry was correctly written.
74 ZipFile zipFile = new ZipFile(name);
75 ZipEntry zipEntry = zipFile.getEntry(entryName);
76 InputStream is = zipFile.getInputStream(zipEntry);
77 String result = new DataInputStream(is).readUTF();
78 if (!result.equals(entryContents))
79 throw new Exception("Entry contents corrupted");
80
81 // Check that comment length was correctly written.
82 RandomAccessFile file = new RandomAccessFile(name, "r");
83 file.seek(file.length() - comment.length()
84 - ZipFile.ENDHDR + ZipFile.ENDCOM);
85 int b1 = file.readUnsignedByte();
86 int b2 = file.readUnsignedByte();
87 if (b1 + (b2 << 8) != comment.length())
88 throw new Exception("Zip file comment length corrupted");
89
90 // Check that comment was correctly written.
91 file.seek(file.length() - comment.length());
92 byte [] bytes = new byte [comment.length()];
93 file.readFully(bytes);
94 if (! comment.equals(new String(bytes, "UTF8")))
95 throw new Exception("Zip file comment corrupted");
96 }
97
98 private static String buildComment(int length) {
99 StringBuffer result = new StringBuffer();
100 while (result.length() < length) {
101 /* Endhdr is 22 bytes long, so this pattern makes it easy
102 * to see if it is copied correctly */
103 result.append("abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV");
104 }
105 String string = result.toString();
106 string = string.substring(string.length() - length);
107 return string;
108 }
109}