test/tools/javac/file/zip/T6836682.java

Wed, 16 Mar 2011 09:41:30 -0700

author
ksrini
date
Wed, 16 Mar 2011 09:41:30 -0700
changeset 936
f2f04935ef3f
parent 924
4fd20d5b7295
child 2525
2eb010b6cb22
permissions
-rw-r--r--

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 }

mercurial