test/java/util/zip/ZipFile/Comment.java

Print this page
rev 3516 : 7021582: convert jar/zip code and tests to use try-with-resources
Reviewed-by: XXX


  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         try {

  62             zos.setComment(comment);
  63             ZipEntry ze = new ZipEntry(entryName);
  64             ze.setMethod(ZipEntry.DEFLATED);
  65             zos.putNextEntry(ze);
  66             new DataOutputStream(zos).writeUTF(entryContents);
  67             zos.closeEntry();
  68         } finally {
  69             zos.close();
  70         }
  71     }
  72 
  73     private static void verifyZipFile(String name, String comment)
  74         throws Exception
  75     {
  76         // Check that Zip entry was correctly written.
  77         ZipFile zipFile = new ZipFile(name);
  78         ZipEntry zipEntry = zipFile.getEntry(entryName);
  79         InputStream is = zipFile.getInputStream(zipEntry);
  80         String result = new DataInputStream(is).readUTF();
  81         if (!result.equals(entryContents))
  82             throw new Exception("Entry contents corrupted");

  83 

  84         // Check that comment length was correctly written.
  85         RandomAccessFile file = new RandomAccessFile(name, "r");
  86         file.seek(file.length() - comment.length()
  87                   - ZipFile.ENDHDR + ZipFile.ENDCOM);
  88         int b1 = file.readUnsignedByte();
  89         int b2 = file.readUnsignedByte();
  90         if (b1 + (b2 << 8) != comment.length())
  91             throw new Exception("Zip file comment length corrupted");
  92 
  93         // Check that comment was correctly written.
  94         file.seek(file.length() - comment.length());
  95         byte [] bytes = new byte [comment.length()];
  96         file.readFully(bytes);
  97         zipFile.close();
  98         file.close();
  99         if (! comment.equals(new String(bytes, "UTF8")))
 100             throw new Exception("Zip file comment corrupted");
 101     }

 102 
 103     private static String buildComment(int length) {
 104         StringBuffer result = new StringBuffer();
 105         while (result.length() < length) {
 106             /* Endhdr is 22 bytes long, so this pattern makes it easy
 107              * to see if it is copied correctly */
 108             result.append("abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV");
 109         }
 110         String string = result.toString();
 111         string = string.substring(string.length() - length);
 112         return string;
 113     }
 114 }


  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         try (FileOutputStream fos = new FileOutputStream(name);
  61              ZipOutputStream zos = new ZipOutputStream(fos))
  62         {
  63             zos.setComment(comment);
  64             ZipEntry ze = new ZipEntry(entryName);
  65             ze.setMethod(ZipEntry.DEFLATED);
  66             zos.putNextEntry(ze);
  67             new DataOutputStream(zos).writeUTF(entryContents);
  68             zos.closeEntry();


  69         }
  70     }
  71 
  72     private static void verifyZipFile(String name, String comment)
  73         throws Exception
  74     {
  75         // Check that Zip entry was correctly written.
  76         try (ZipFile zipFile = new ZipFile(name)) {
  77             ZipEntry zipEntry = zipFile.getEntry(entryName);
  78             InputStream is = zipFile.getInputStream(zipEntry);
  79             String result = new DataInputStream(is).readUTF();
  80             if (!result.equals(entryContents))
  81                 throw new Exception("Entry contents corrupted");
  82         }
  83 
  84         try (RandomAccessFile file = new RandomAccessFile(name, "r")) {
  85             // Check that comment length was correctly written.

  86             file.seek(file.length() - comment.length()
  87                       - ZipFile.ENDHDR + ZipFile.ENDCOM);
  88             int b1 = file.readUnsignedByte();
  89             int b2 = file.readUnsignedByte();
  90             if (b1 + (b2 << 8) != comment.length())
  91                 throw new Exception("Zip file comment length corrupted");
  92 
  93             // Check that comment was correctly written.
  94             file.seek(file.length() - comment.length());
  95             byte [] bytes = new byte [comment.length()];
  96             file.readFully(bytes);


  97             if (! comment.equals(new String(bytes, "UTF8")))
  98                 throw new Exception("Zip file comment corrupted");
  99         }
 100     }
 101 
 102     private static String buildComment(int length) {
 103         StringBuffer result = new StringBuffer();
 104         while (result.length() < length) {
 105             /* Endhdr is 22 bytes long, so this pattern makes it easy
 106              * to see if it is copied correctly */
 107             result.append("abcdefghijklmnopqrstuvABCDEFGHIJKLMNOPQRSTUV");
 108         }
 109         String string = result.toString();
 110         string = string.substring(string.length() - length);
 111         return string;
 112     }
 113 }