--- old/test/java/util/zip/ZipFile/ReadZip.java 2017-09-06 09:16:58.792180107 -0700 +++ new/test/java/util/zip/ZipFile/ReadZip.java 2017-09-06 09:16:58.525156070 -0700 @@ -22,19 +22,27 @@ */ /* @test - @bug 4241361 4842702 4985614 6646605 5032358 6923692 6233323 8144977 + @bug 4241361 4842702 4985614 6646605 5032358 6923692 6233323 8144977 8186464 @summary Make sure we can read a zip file. @key randomness */ import java.io.*; +import java.net.URI; import java.nio.file.Files; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.NoSuchFileException; import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; +import java.util.List; +import java.util.Map; import java.util.zip.*; +import static java.nio.charset.StandardCharsets.US_ASCII; + public class ReadZip { private static void unreached (Object o) throws Exception @@ -137,8 +145,6 @@ newZip.delete(); } - - // Throw a FNF exception when read a non-existing zip file try { unreached (new ZipFile( new File(System.getProperty("test.src", "."), @@ -146,5 +152,54 @@ + String.valueOf(new java.util.Random().nextInt()) + ".zip"))); } catch (NoSuchFileException nsfe) {} + + // read a zip file with ZIP64 end + Path path = Paths.get(System.getProperty("test.dir", ""), "end64.zip"); + try { + URI uri = URI.create("jar:" + path.toUri()); + Map env = Map.of("create", "true", "forceZIP64End", "true"); + try (FileSystem fs = FileSystems.newFileSystem(uri, env)) { + Files.write(fs.getPath("hello"), "hello".getBytes()); + } + try (ZipFile zf = new ZipFile(path.toFile())) { + if (!"hello".equals(new String(zf.getInputStream(new ZipEntry("hello")) + .readAllBytes(), + US_ASCII))) + throw new RuntimeException("zipfile: read entry failed"); + } catch (IOException x) { + throw new RuntimeException("zipfile: zip64 end failed"); + } + try (FileSystem fs = FileSystems.newFileSystem(uri, Map.of())) { + if (!"hello".equals(new String(Files.readAllBytes(fs.getPath("hello"))))) + throw new RuntimeException("zipfs: read entry failed"); + } catch (IOException x) { + throw new RuntimeException("zipfile: zip64 end failed"); + } + } finally { + Files.deleteIfExists(path); + } + + // read a zip file created via "echo hello | zip dst.zip -", which uses + // ZIP64 end record + if (Files.notExists(Paths.get("/usr/bin/zip"))) + return; + try { + Process zip = new ProcessBuilder("zip", path.toString().toString(), "-").start(); + OutputStream os = zip.getOutputStream(); + os.write("hello".getBytes(US_ASCII)); + os.close(); + zip.waitFor(); + if (zip.exitValue() == 0 && Files.exists(path)) { + try (ZipFile zf = new ZipFile(path.toFile())) { + if (!"hello".equals(new String(zf.getInputStream(new ZipEntry("-")) + .readAllBytes()))) + throw new RuntimeException("zipfile: read entry failed"); + } catch (IOException x) { + throw new RuntimeException("zipfile: zip64 end failed"); + } + } + } finally { + Files.deleteIfExists(path); + } } }