Wed, 16 Mar 2011 09:41:30 -0700
7026359: (langtools) fix big jar test
Reviewed-by: jjg
ksrini@923 | 1 | /* |
ksrini@923 | 2 | * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. |
ksrini@923 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
ksrini@923 | 4 | * |
ksrini@923 | 5 | * This code is free software; you can redistribute it and/or modify it |
ksrini@923 | 6 | * under the terms of the GNU General Public License version 2 only, as |
ksrini@923 | 7 | * published by the Free Software Foundation. |
ksrini@923 | 8 | * |
ksrini@923 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
ksrini@923 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
ksrini@923 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
ksrini@923 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
ksrini@923 | 13 | * accompanied this code). |
ksrini@923 | 14 | * |
ksrini@923 | 15 | * You should have received a copy of the GNU General Public License version |
ksrini@923 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
ksrini@923 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
ksrini@923 | 18 | * |
ksrini@923 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ksrini@923 | 20 | * or visit www.oracle.com if you need additional information or have any |
ksrini@923 | 21 | * questions. |
ksrini@923 | 22 | */ |
ksrini@923 | 23 | |
ksrini@923 | 24 | /* |
ksrini@923 | 25 | * @test |
mcimadamore@924 | 26 | * @bug 6836682 7025988 |
ksrini@936 | 27 | * @summary JavacFileManager handling of zip64 archives (Scenario A and B) |
ksrini@923 | 28 | * @compile -XDignore.symbol.file T6836682.java Utils.java |
ksrini@923 | 29 | * @run main T6836682 |
ksrini@923 | 30 | */ |
ksrini@936 | 31 | /* |
ksrini@936 | 32 | * This test consists of two scenarios: |
ksrini@936 | 33 | * |
ksrini@936 | 34 | * Scenario A: create a jar with entries exceeding 64K, and see if the javac |
ksrini@936 | 35 | * can handle this large jar on the classpath. Generally this test completes |
ksrini@936 | 36 | * within a minute |
ksrini@936 | 37 | * |
ksrini@936 | 38 | * Scenario B: create a jar with a large enough file exceeding 4GB, and |
ksrini@936 | 39 | * similarly test javac. This test is known to be slow and problematic on |
ksrini@936 | 40 | * certain operating systems, thus this test can be selected by passing a |
ksrini@936 | 41 | * property through jtreg as follows: |
ksrini@936 | 42 | * -javaoptions=-DT6836682.testScenarioB=true. |
ksrini@936 | 43 | * Note this test will only run iff all the disk requirements are met at runtime. |
ksrini@936 | 44 | */ |
ksrini@936 | 45 | import java.io.BufferedInputStream; |
ksrini@923 | 46 | import java.io.BufferedOutputStream; |
ksrini@923 | 47 | import java.io.File; |
ksrini@923 | 48 | import java.io.FileInputStream; |
ksrini@923 | 49 | import java.io.FileOutputStream; |
ksrini@923 | 50 | import java.io.IOException; |
ksrini@936 | 51 | import java.io.OutputStream; |
ksrini@923 | 52 | import java.nio.file.Files; |
ksrini@923 | 53 | import java.nio.file.Path; |
ksrini@936 | 54 | import java.util.zip.CRC32; |
ksrini@923 | 55 | import java.util.zip.ZipEntry; |
ksrini@936 | 56 | import java.util.zip.ZipOutputStream; |
ksrini@923 | 57 | |
ksrini@923 | 58 | public class T6836682 { |
ksrini@923 | 59 | |
ksrini@923 | 60 | private static final long GIGA = 1024 * 1024 * 1024; |
ksrini@936 | 61 | private static final int BUFFER_LEN = Short.MAX_VALUE * 2; |
ksrini@923 | 62 | |
ksrini@936 | 63 | static long getCount(long minlength) { |
ksrini@936 | 64 | return (minlength / BUFFER_LEN) + 1; |
ksrini@936 | 65 | } |
ksrini@936 | 66 | |
ksrini@936 | 67 | static long computeCRC(long minlength) { |
ksrini@936 | 68 | CRC32 crc = new CRC32(); |
ksrini@936 | 69 | byte[] buffer = new byte[BUFFER_LEN]; |
ksrini@936 | 70 | long count = getCount(minlength); |
ksrini@936 | 71 | for (long i = 0; i < count; i++) { |
ksrini@936 | 72 | crc.update(buffer); |
ksrini@936 | 73 | } |
ksrini@936 | 74 | return crc.getValue(); |
ksrini@936 | 75 | } |
ksrini@936 | 76 | |
ksrini@936 | 77 | static long computeCRC(File inFile) throws IOException { |
ksrini@936 | 78 | byte[] buffer = new byte[8192]; |
ksrini@936 | 79 | CRC32 crc = new CRC32(); |
ksrini@936 | 80 | FileInputStream fis = null; |
ksrini@936 | 81 | BufferedInputStream bis = null; |
ksrini@923 | 82 | try { |
ksrini@936 | 83 | fis = new FileInputStream(inFile); |
ksrini@936 | 84 | bis = new BufferedInputStream(fis); |
ksrini@936 | 85 | int n = bis.read(buffer); |
ksrini@936 | 86 | while (n > 0) { |
ksrini@936 | 87 | crc.update(buffer, 0, n); |
ksrini@936 | 88 | n = bis.read(buffer); |
ksrini@923 | 89 | } |
ksrini@923 | 90 | } finally { |
ksrini@936 | 91 | Utils.close(bis); |
ksrini@936 | 92 | Utils.close(fis); |
ksrini@923 | 93 | } |
ksrini@936 | 94 | return crc.getValue(); |
ksrini@936 | 95 | } |
ksrini@936 | 96 | |
ksrini@936 | 97 | static void createLargeFile(OutputStream os, long minlength) throws IOException { |
ksrini@936 | 98 | byte[] buffer = new byte[BUFFER_LEN]; |
ksrini@936 | 99 | long count = getCount(minlength); |
ksrini@936 | 100 | for (long i = 0; i < count; i++) { |
ksrini@936 | 101 | os.write(buffer); |
ksrini@923 | 102 | } |
ksrini@936 | 103 | os.flush(); |
ksrini@923 | 104 | } |
ksrini@923 | 105 | |
ksrini@923 | 106 | static void createJarWithLargeFile(File jarFile, File javaFile, |
ksrini@923 | 107 | long minlength) throws IOException { |
ksrini@923 | 108 | Utils.createClassFile(javaFile, null, true); |
ksrini@936 | 109 | File classFile = new File(Utils.getClassFileName(javaFile)); |
ksrini@936 | 110 | ZipOutputStream zos = null; |
ksrini@936 | 111 | BufferedOutputStream bos = null; |
ksrini@936 | 112 | FileInputStream fis = null; |
ksrini@936 | 113 | try { |
ksrini@936 | 114 | zos = new ZipOutputStream(new FileOutputStream(jarFile)); |
ksrini@936 | 115 | zos.setLevel(ZipOutputStream.STORED); |
ksrini@936 | 116 | zos.setMethod(0); |
ksrini@936 | 117 | bos = new BufferedOutputStream(zos); |
ksrini@936 | 118 | |
ksrini@936 | 119 | ZipEntry ze = new ZipEntry("large.data"); |
ksrini@936 | 120 | ze.setCompressedSize(getCount(minlength) * BUFFER_LEN); |
ksrini@936 | 121 | ze.setSize(getCount(minlength) * BUFFER_LEN); |
ksrini@936 | 122 | ze.setCrc(computeCRC(minlength)); |
ksrini@936 | 123 | ze.setMethod(ZipEntry.STORED); |
ksrini@936 | 124 | zos.putNextEntry(ze); |
ksrini@936 | 125 | createLargeFile(bos, minlength); |
ksrini@936 | 126 | |
ksrini@936 | 127 | ze = new ZipEntry(classFile.getName()); |
ksrini@936 | 128 | ze.setCompressedSize(classFile.length()); |
ksrini@936 | 129 | ze.setSize(classFile.length()); |
ksrini@936 | 130 | ze.setCrc(computeCRC(classFile)); |
ksrini@936 | 131 | ze.setMethod(ZipEntry.STORED); |
ksrini@936 | 132 | zos.putNextEntry(ze); |
ksrini@936 | 133 | fis = new FileInputStream(classFile); |
ksrini@936 | 134 | Utils.copyStream(fis, bos); |
ksrini@936 | 135 | bos.flush(); |
ksrini@936 | 136 | zos.closeEntry(); |
ksrini@936 | 137 | } finally { |
ksrini@936 | 138 | Utils.close(bos); |
ksrini@936 | 139 | Utils.close(zos); |
ksrini@936 | 140 | Utils.close(fis); |
ksrini@936 | 141 | } |
ksrini@923 | 142 | // deleted to prevent accidental linkage |
ksrini@923 | 143 | new File(Utils.getClassFileName(javaFile)).delete(); |
ksrini@923 | 144 | } |
ksrini@923 | 145 | |
ksrini@923 | 146 | static void createLargeJar(File jarFile, File javaFile) throws IOException { |
ksrini@923 | 147 | File classFile = new File(Utils.getClassFileName(javaFile)); |
ksrini@923 | 148 | Utils.createClassFile(javaFile, null, true); |
ksrini@936 | 149 | ZipOutputStream zos = null; |
ksrini@923 | 150 | FileInputStream fis = null; |
ksrini@936 | 151 | final int MAX = Short.MAX_VALUE * 2 + 10; |
ksrini@936 | 152 | ZipEntry ze = null; |
ksrini@923 | 153 | try { |
ksrini@936 | 154 | zos = new ZipOutputStream(new FileOutputStream(jarFile)); |
ksrini@936 | 155 | zos.setLevel(ZipOutputStream.STORED); |
ksrini@936 | 156 | zos.setMethod(ZipOutputStream.STORED); |
ksrini@936 | 157 | for (int i = 0; i < MAX ; i++) { |
ksrini@936 | 158 | ze = new ZipEntry("X" + i + ".txt"); |
ksrini@936 | 159 | ze.setSize(0); |
ksrini@936 | 160 | ze.setCompressedSize(0); |
ksrini@936 | 161 | ze.setCrc(0); |
ksrini@936 | 162 | zos.putNextEntry(ze); |
ksrini@936 | 163 | } |
ksrini@923 | 164 | |
ksrini@936 | 165 | // add a class file |
ksrini@936 | 166 | ze = new ZipEntry(classFile.getName()); |
ksrini@936 | 167 | ze.setCompressedSize(classFile.length()); |
ksrini@936 | 168 | ze.setSize(classFile.length()); |
ksrini@936 | 169 | ze.setCrc(computeCRC(classFile)); |
ksrini@936 | 170 | zos.putNextEntry(ze); |
ksrini@923 | 171 | fis = new FileInputStream(classFile); |
ksrini@936 | 172 | Utils.copyStream(fis, zos); |
ksrini@923 | 173 | } finally { |
ksrini@936 | 174 | Utils.close(zos); |
ksrini@923 | 175 | Utils.close(fis); |
ksrini@923 | 176 | // deleted to prevent accidental linkage |
ksrini@923 | 177 | new File(Utils.getClassFileName(javaFile)).delete(); |
ksrini@923 | 178 | } |
ksrini@936 | 179 | } |
ksrini@923 | 180 | |
ksrini@923 | 181 | // a jar with entries exceeding 64k + a class file for the existential test |
ksrini@936 | 182 | public static void testScenarioA(String... args) throws IOException { |
ksrini@923 | 183 | File largeJar = new File("large.jar"); |
ksrini@923 | 184 | File javaFile = new File("Foo.java"); |
ksrini@923 | 185 | createLargeJar(largeJar, javaFile); |
ksrini@923 | 186 | |
ksrini@923 | 187 | File testFile = new File("Bar.java"); |
ksrini@923 | 188 | try { |
ksrini@923 | 189 | Utils.createJavaFile(testFile, javaFile); |
ksrini@923 | 190 | if (!Utils.compile("-doe", "-verbose", "-cp", |
ksrini@923 | 191 | largeJar.getAbsolutePath(), testFile.getAbsolutePath())) { |
ksrini@923 | 192 | throw new IOException("test failed"); |
ksrini@923 | 193 | } |
ksrini@923 | 194 | } finally { |
ksrini@923 | 195 | Utils.deleteFile(largeJar); |
ksrini@923 | 196 | } |
ksrini@923 | 197 | } |
ksrini@923 | 198 | |
ksrini@923 | 199 | // a jar with an enormous file + a class file for the existential test |
ksrini@936 | 200 | public static void testScenarioB(String... args) throws IOException { |
ksrini@923 | 201 | final File largeJar = new File("huge.jar"); |
ksrini@923 | 202 | final File javaFile = new File("Foo.java"); |
ksrini@923 | 203 | |
ksrini@923 | 204 | final Path path = largeJar.getAbsoluteFile().getParentFile().toPath(); |
ksrini@923 | 205 | final long available = Files.getFileStore(path).getUsableSpace(); |
ksrini@923 | 206 | final long MAX_VALUE = 0xFFFF_FFFFL; |
ksrini@923 | 207 | |
ksrini@923 | 208 | final long absolute = MAX_VALUE + 1L; |
ksrini@923 | 209 | final long required = (long)(absolute * 1.1); // pad for sundries |
ksrini@923 | 210 | System.out.println("\tavailable: " + available / GIGA + " GB"); |
ksrini@936 | 211 | System.out.println("\trequired: " + required / GIGA + " GB"); |
ksrini@923 | 212 | |
ksrini@923 | 213 | if (available > required) { |
ksrini@923 | 214 | createJarWithLargeFile(largeJar, javaFile, absolute); |
ksrini@923 | 215 | File testFile = new File("Bar.java"); |
ksrini@923 | 216 | Utils.createJavaFile(testFile, javaFile); |
ksrini@923 | 217 | try { |
ksrini@923 | 218 | if (!Utils.compile("-doe", "-verbose", "-cp", |
ksrini@923 | 219 | largeJar.getAbsolutePath(), testFile.getAbsolutePath())) { |
ksrini@923 | 220 | throw new IOException("test failed"); |
ksrini@923 | 221 | } |
ksrini@923 | 222 | } finally { |
ksrini@923 | 223 | Utils.deleteFile(largeJar); |
ksrini@923 | 224 | } |
ksrini@923 | 225 | } else { |
ksrini@936 | 226 | System.out.println("Warning: testScenarioB passes vacuously," + |
ksrini@936 | 227 | " requirements exceeds available space"); |
ksrini@923 | 228 | } |
ksrini@923 | 229 | } |
ksrini@923 | 230 | |
ksrini@923 | 231 | public static void main(String... args) throws IOException { |
ksrini@936 | 232 | testScenarioA(); |
ksrini@936 | 233 | System.out.println("testScenarioA: PASS"); |
ksrini@936 | 234 | if (Boolean.getBoolean("T6836682.testScenarioB")) { |
ksrini@936 | 235 | testScenarioB(); |
ksrini@936 | 236 | System.out.println("testScenarioB: PASS"); |
ksrini@936 | 237 | } else { |
ksrini@936 | 238 | System.out.println("Warning: testScenarioB, large file test skipped"); |
ksrini@936 | 239 | } |
ksrini@923 | 240 | } |
ksrini@923 | 241 | } |