From ba0558addb281ef4f3e16fd39b8567071dd7113b Mon Sep 17 00:00:00 2001 From: Brian Burkhalter <bpb@openjdk.org> Date: Tue, 9 Aug 2016 07:43:48 -0700 Subject: [PATCH 01/15] 8163431: probeContentType/Basic.java fails after changes for JDK-8146215 Allow multiple legal MIME type interpretations for certain extensions. Reviewed-by: chegar --- .../file/Files/probeContentType/Basic.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/jdk/test/java/nio/file/Files/probeContentType/Basic.java b/jdk/test/java/nio/file/Files/probeContentType/Basic.java index bb48ca71995..5e0d0c94c62 100644 --- a/jdk/test/java/nio/file/Files/probeContentType/Basic.java +++ b/jdk/test/java/nio/file/Files/probeContentType/Basic.java @@ -95,7 +95,7 @@ public class Basic { return 0; } - static int checkContentTypes(String[] extensions, String[] expectedTypes) + static int checkContentTypes(String[] extensions, String[][] expectedTypes) throws IOException { if (extensions.length != expectedTypes.length) { System.err.println("Parameter array lengths differ"); @@ -113,9 +113,24 @@ public class Basic { + " cannot be determined"); failures++; } else { - if (!type.equals(expectedTypes[i])) { - System.err.println("Content type: " + type - + "; expected: " + expectedTypes[i]); + boolean isTypeFound = false; + for (String s : expectedTypes[i]) { + if (type.equals(s)) { + isTypeFound = true; + break; + } + } + if (!isTypeFound) { + System.err.printf("Content type: %s; expected: ", type); + int j = 0; + for (String s : expectedTypes[i]) { + if (j++ == 0) { + System.err.printf("%s", s); + } else { + System.err.printf(", or %s", s); + } + } + System.err.println(); failures++; } } @@ -159,11 +174,24 @@ public class Basic { // Verify that certain media extensions are mapped to the correct type. String[] extensions = new String[]{ - "aac", "flac", "jpg", "mp3", "mp4", "pdf", "png", "webm" + "aac", + "flac", + "jpg", + "mp3", + "mp4", + "pdf", + "png", + "webm" }; - String[] expectedTypes = new String[]{ - "audio/aac", "audio/flac", "image/jpeg", "audio/mpeg", - "video/mp4", "application/pdf", "image/png", "video/webm" + String[][] expectedTypes = new String[][] { + {"audio/aac", "audio/x-aac"}, + {"audio/flac", "audio/x-flac"}, + {"image/jpeg"}, + {"audio/mpeg"}, + {"video/mp4"}, + {"application/pdf"}, + {"image/png"}, + {"video/webm"} }; failures += checkContentTypes(extensions, expectedTypes); From 911dda4ee1afddd214271b07ae879315c33aeff9 Mon Sep 17 00:00:00 2001 From: Brian Burkhalter <bpb@openjdk.org> Date: Tue, 9 Aug 2016 07:50:26 -0700 Subject: [PATCH 02/15] 8163305: Add some print instrumentation to java/nio/channels/Selector/RacyDeregister Perform more iterations on Windows, and on all platforms if the test enters the failure branch, poll for an extra period of time to determine whether it might have succeeded with a longer timeout Reviewed-by: chegar --- .../nio/channels/Selector/RacyDeregister.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/jdk/test/java/nio/channels/Selector/RacyDeregister.java b/jdk/test/java/nio/channels/Selector/RacyDeregister.java index 5a72df18107..c0b98190fab 100644 --- a/jdk/test/java/nio/channels/Selector/RacyDeregister.java +++ b/jdk/test/java/nio/channels/Selector/RacyDeregister.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,11 @@ import java.nio.channels.SocketChannel; */ public class RacyDeregister { + // FIXME: numOuterLoopIterations should be reverted to the hard-coded value + // 15 when JDK-8161083 is resolved as either a bug or a non-issue. + static final int numOuterLoopIterations = + System.getProperty("os.name").startsWith("Windows") ? 150 : 15; + static boolean notified; static final Object selectorLock = new Object(); static final Object notifyLock = new Object(); @@ -77,7 +82,7 @@ public class RacyDeregister { public void run() { try { - for (int k = 0; k < 15; k++) { + for (int k = 0; k < numOuterLoopIterations; k++) { for (int i = 0; i < 10000; i++) { synchronized (notifyLock) { synchronized (selectorLock) { @@ -94,6 +99,17 @@ public class RacyDeregister { } long endTime = System.currentTimeMillis(); if (endTime - beginTime > 5000) { + for (int j = 0; j < 60; j++) { + Thread.sleep(1000); + if (notified) { + long t = + System.currentTimeMillis(); + System.out.printf + ("Notified after %d ms%n", + t - beginTime); + break; + } + } succTermination = false; // wake up main thread doing select() sel.wakeup(); From def15478ebc213eeff8eb4da9178f8bac4c72604 Mon Sep 17 00:00:00 2001 From: Steve Drach <sdrach@openjdk.org> Date: Fri, 29 Jul 2016 09:58:28 -0700 Subject: [PATCH 03/15] 8158295: Add a multi-release jar validation mechanism to jar tool Reviewed-by: ogb, psandoz --- .../java.base/share/classes/module-info.java | 1 + .../classes/sun/tools/jar/FingerPrint.java | 324 ++++++++++++++++++ .../share/classes/sun/tools/jar/Main.java | 223 +++++++----- .../classes/sun/tools/jar/Validator.java | 242 +++++++++++++ .../sun/tools/jar/resources/jar.properties | 24 ++ jdk/test/tools/jar/multiRelease/Basic.java | 264 +++++++++++++- .../data/test04/v9/version/Version.java | 14 + .../data/test05/v9/version/Extra.java | 13 + .../data/test06/v9/version/Extra.java | 13 + .../data/test10/base/version/Nested.java | 17 + .../data/test10/v9/version/Nested.java | 14 + 11 files changed, 1069 insertions(+), 80 deletions(-) create mode 100644 jdk/src/jdk.jartool/share/classes/sun/tools/jar/FingerPrint.java create mode 100644 jdk/src/jdk.jartool/share/classes/sun/tools/jar/Validator.java create mode 100644 jdk/test/tools/jar/multiRelease/data/test04/v9/version/Version.java create mode 100644 jdk/test/tools/jar/multiRelease/data/test05/v9/version/Extra.java create mode 100644 jdk/test/tools/jar/multiRelease/data/test06/v9/version/Extra.java create mode 100644 jdk/test/tools/jar/multiRelease/data/test10/base/version/Nested.java create mode 100644 jdk/test/tools/jar/multiRelease/data/test10/v9/version/Nested.java diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java index a6446ac111c..044f43b2877 100644 --- a/jdk/src/java.base/share/classes/module-info.java +++ b/jdk/src/java.base/share/classes/module-info.java @@ -128,6 +128,7 @@ module java.base { exports jdk.internal.logger to java.logging; exports jdk.internal.org.objectweb.asm to + jdk.jartool, jdk.jlink, jdk.scripting.nashorn, jdk.vm.ci; diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/FingerPrint.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/FingerPrint.java new file mode 100644 index 00000000000..5ae52909e81 --- /dev/null +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/FingerPrint.java @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.tools.jar; + +import jdk.internal.org.objectweb.asm.*; + +import java.io.IOException; +import java.io.InputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * A FingerPrint is an abstract representation of a JarFile entry that contains + * information to determine if the entry represents a class or a + * resource, and whether two entries are identical. If the FingerPrint represents + * a class, it also contains information to (1) describe the public API; + * (2) compare the public API of this class with another class; (3) determine + * whether or not it's a nested class and, if so, the name of the associated + * top level class; and (4) for an canonically ordered set of classes determine + * if the class versions are compatible. A set of classes is canonically + * ordered if the classes in the set have the same name, and the base class + * precedes the versioned classes and if each versioned class with version + * {@code n} precedes classes with versions {@code > n} for all versions + * {@code n}. + */ +final class FingerPrint { + private static final MessageDigest MD; + + private final byte[] sha1; + private final ClassAttributes attrs; + private final boolean isClassEntry; + private final String entryName; + + static { + try { + MD = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException x) { + // log big problem? + throw new RuntimeException(x); + } + } + + public FingerPrint(String entryName,byte[] bytes) throws IOException { + this.entryName = entryName; + if (entryName.endsWith(".class") && isCafeBabe(bytes)) { + isClassEntry = true; + sha1 = sha1(bytes, 8); // skip magic number and major/minor version + attrs = getClassAttributes(bytes); + } else { + isClassEntry = false; + sha1 = sha1(bytes); + attrs = new ClassAttributes(); // empty class + } + } + + public boolean isClass() { + return isClassEntry; + } + + public boolean isNestedClass() { + return attrs.nestedClass; + } + + public boolean isPublicClass() { + return attrs.publicClass; + } + + public boolean isIdentical(FingerPrint that) { + if (that == null) return false; + if (this == that) return true; + return isEqual(this.sha1, that.sha1); + } + + public boolean isCompatibleVersion(FingerPrint that) { + return attrs.version >= that.attrs.version; + } + + public boolean isSameAPI(FingerPrint that) { + if (that == null) return false; + return attrs.equals(that.attrs); + } + + public String name() { + String name = attrs.name; + return name == null ? entryName : name; + } + + public String topLevelName() { + String name = attrs.topLevelName; + return name == null ? name() : name; + } + + private byte[] sha1(byte[] entry) { + MD.update(entry); + return MD.digest(); + } + + private byte[] sha1(byte[] entry, int offset) { + MD.update(entry, offset, entry.length - offset); + return MD.digest(); + } + + private boolean isEqual(byte[] sha1_1, byte[] sha1_2) { + return MessageDigest.isEqual(sha1_1, sha1_2); + } + + private static final byte[] cafeBabe = {(byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe}; + + private boolean isCafeBabe(byte[] bytes) { + if (bytes.length < 4) return false; + for (int i = 0; i < 4; i++) { + if (bytes[i] != cafeBabe[i]) { + return false; + } + } + return true; + } + + private ClassAttributes getClassAttributes(byte[] bytes) { + ClassReader rdr = new ClassReader(bytes); + ClassAttributes attrs = new ClassAttributes(); + rdr.accept(attrs, 0); + return attrs; + } + + private static final class Field { + private final int access; + private final String name; + private final String desc; + + Field(int access, String name, String desc) { + this.access = access; + this.name = name; + this.desc = desc; + } + + @Override + public boolean equals(Object that) { + if (that == null) return false; + if (this == that) return true; + if (!(that instanceof Field)) return false; + Field field = (Field)that; + return (access == field.access) && name.equals(field.name) + && desc.equals(field.desc); + } + + @Override + public int hashCode() { + int result = 17; + result = 37 * result + access; + result = 37 * result + name.hashCode(); + result = 37 * result + desc.hashCode(); + return result; + } + } + + private static final class Method { + private final int access; + private final String name; + private final String desc; + private final Set<String> exceptions; + + Method(int access, String name, String desc, Set<String> exceptions) { + this.access = access; + this.name = name; + this.desc = desc; + this.exceptions = exceptions; + } + + @Override + public boolean equals(Object that) { + if (that == null) return false; + if (this == that) return true; + if (!(that instanceof Method)) return false; + Method method = (Method)that; + return (access == method.access) && name.equals(method.name) + && desc.equals(method.desc) + && exceptions.equals(method.exceptions); + } + + @Override + public int hashCode() { + int result = 17; + result = 37 * result + access; + result = 37 * result + name.hashCode(); + result = 37 * result + desc.hashCode(); + result = 37 * result + exceptions.hashCode(); + return result; + } + } + + private static final class ClassAttributes extends ClassVisitor { + private String name; + private String topLevelName; + private String superName; + private int version; + private int access; + private boolean publicClass; + private boolean nestedClass; + private final Set<Field> fields = new HashSet<>(); + private final Set<Method> methods = new HashSet<>(); + + public ClassAttributes() { + super(Opcodes.ASM5); + } + + private boolean isPublic(int access) { + return ((access & Opcodes.ACC_PUBLIC) == Opcodes.ACC_PUBLIC) + || ((access & Opcodes.ACC_PROTECTED) == Opcodes.ACC_PROTECTED); + } + + @Override + public void visit(int version, int access, String name, String signature, + String superName, String[] interfaces) { + this.version = version; + this.access = access; + this.name = name; + this.nestedClass = name.contains("$"); + this.superName = superName; + this.publicClass = isPublic(access); + } + + @Override + public void visitOuterClass(String owner, String name, String desc) { + if (!this.nestedClass) return; + this.topLevelName = owner; + } + + @Override + public void visitInnerClass(String name, String outerName, String innerName, + int access) { + if (!this.nestedClass) return; + if (outerName == null) return; + if (!this.name.equals(name)) return; + if (this.topLevelName == null) this.topLevelName = outerName; + } + + @Override + public FieldVisitor visitField(int access, String name, String desc, + String signature, Object value) { + if (isPublic(access)) { + fields.add(new Field(access, name, desc)); + } + return null; + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, + String signature, String[] exceptions) { + if (isPublic(access)) { + Set<String> exceptionSet = new HashSet<>(); + if (exceptions != null) { + for (String e : exceptions) { + exceptionSet.add(e); + } + } + // treat type descriptor as a proxy for signature because signature + // is usually null, need to strip off the return type though + int n; + if (desc != null && (n = desc.lastIndexOf(')')) != -1) { + desc = desc.substring(0, n + 1); + methods.add(new Method(access, name, desc, exceptionSet)); + } + } + return null; + } + + @Override + public void visitEnd() { + this.nestedClass = this.topLevelName != null; + } + + @Override + public boolean equals(Object that) { + if (that == null) return false; + if (this == that) return true; + if (!(that instanceof ClassAttributes)) return false; + ClassAttributes clsAttrs = (ClassAttributes)that; + boolean superNameOkay = superName != null + ? superName.equals(clsAttrs.superName) : true; + return access == clsAttrs.access + && superNameOkay + && fields.equals(clsAttrs.fields) + && methods.equals(clsAttrs.methods); + } + + @Override + public int hashCode() { + int result = 17; + result = 37 * result + access; + result = 37 * result + superName != null ? superName.hashCode() : 0; + result = 37 * result + fields.hashCode(); + result = 37 * result + methods.hashCode(); + return result; + } + } +} diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java index f33bcf711ce..00796dee41e 100644 --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java @@ -42,6 +42,7 @@ import java.nio.ByteBuffer; import java.nio.file.Path; import java.nio.file.Files; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; @@ -278,23 +279,20 @@ class Main { } } } + if (cflag) { Manifest manifest = null; - InputStream in = null; - if (!Mflag) { if (mname != null) { - in = new FileInputStream(mname); - manifest = new Manifest(new BufferedInputStream(in)); + try (InputStream in = new FileInputStream(mname)) { + manifest = new Manifest(new BufferedInputStream(in)); + } } else { manifest = new Manifest(); } addVersion(manifest); addCreatedBy(manifest); if (isAmbiguousMainClass(manifest)) { - if (in != null) { - in.close(); - } return false; } if (ename != null) { @@ -304,11 +302,13 @@ class Main { addMultiRelease(manifest); } } + Map<String,Path> moduleInfoPaths = new HashMap<>(); for (int version : filesMap.keySet()) { String[] files = filesMap.get(version); expand(null, files, false, moduleInfoPaths, version); } + Map<String,byte[]> moduleInfos = new LinkedHashMap<>(); if (!moduleInfoPaths.isEmpty()) { if (!checkModuleInfos(moduleInfoPaths)) @@ -332,84 +332,61 @@ class Main { return false; } - OutputStream out; - if (fname != null) { - out = new FileOutputStream(fname); - } else { - out = new FileOutputStream(FileDescriptor.out); - if (vflag) { - // Disable verbose output so that it does not appear - // on stdout along with file data - // error("Warning: -v option ignored"); - vflag = false; - } + if (vflag && fname == null) { + // Disable verbose output so that it does not appear + // on stdout along with file data + // error("Warning: -v option ignored"); + vflag = false; } - File tmpfile = null; - final OutputStream finalout = out; + final String tmpbase = (fname == null) ? "tmpjar" : fname.substring(fname.indexOf(File.separatorChar) + 1); - if (nflag) { - tmpfile = createTemporaryFile(tmpbase, ".jar"); - out = new FileOutputStream(tmpfile); - } - create(new BufferedOutputStream(out, 4096), manifest, moduleInfos); + File tmpfile = createTemporaryFile(tmpbase, ".jar"); - if (in != null) { - in.close(); + try (OutputStream out = new FileOutputStream(tmpfile)) { + create(new BufferedOutputStream(out, 4096), manifest, moduleInfos); } - out.close(); + if (nflag) { - JarFile jarFile = null; - File packFile = null; - JarOutputStream jos = null; + File packFile = createTemporaryFile(tmpbase, ".pack"); try { Packer packer = Pack200.newPacker(); Map<String, String> p = packer.properties(); p.put(Packer.EFFORT, "1"); // Minimal effort to conserve CPU - jarFile = new JarFile(tmpfile.getCanonicalPath()); - packFile = createTemporaryFile(tmpbase, ".pack"); - out = new FileOutputStream(packFile); - packer.pack(jarFile, out); - jos = new JarOutputStream(finalout); - Unpacker unpacker = Pack200.newUnpacker(); - unpacker.unpack(packFile, jos); - } catch (IOException ioe) { - fatalError(ioe); - } finally { - if (jarFile != null) { - jarFile.close(); + try ( + JarFile jarFile = new JarFile(tmpfile.getCanonicalPath()); + OutputStream pack = new FileOutputStream(packFile) + ) { + packer.pack(jarFile, pack); } - if (out != null) { - out.close(); - } - if (jos != null) { - jos.close(); - } - if (tmpfile != null && tmpfile.exists()) { + if (tmpfile.exists()) { tmpfile.delete(); } - if (packFile != null && packFile.exists()) { - packFile.delete(); + tmpfile = createTemporaryFile(tmpbase, ".jar"); + try ( + OutputStream out = new FileOutputStream(tmpfile); + JarOutputStream jos = new JarOutputStream(out) + ) { + Unpacker unpacker = Pack200.newUnpacker(); + unpacker.unpack(packFile, jos); } + } finally { + Files.deleteIfExists(packFile.toPath()); } } + + validateAndClose(tmpfile); + } else if (uflag) { File inputFile = null, tmpFile = null; - FileInputStream in; - FileOutputStream out; if (fname != null) { inputFile = new File(fname); tmpFile = createTempFileInSameDirectoryAs(inputFile); - in = new FileInputStream(inputFile); - out = new FileOutputStream(tmpFile); } else { - in = new FileInputStream(FileDescriptor.in); - out = new FileOutputStream(FileDescriptor.out); vflag = false; + tmpFile = createTemporaryFile("tmpjar", ".jar"); } - InputStream manifest = (!Mflag && (mname != null)) ? - (new FileInputStream(mname)) : null; Map<String,Path> moduleInfoPaths = new HashMap<>(); for (int version : filesMap.keySet()) { @@ -421,8 +398,19 @@ class Main { for (Map.Entry<String,Path> e : moduleInfoPaths.entrySet()) moduleInfos.put(e.getKey(), readModuleInfo(e.getValue())); - boolean updateOk = update(in, new BufferedOutputStream(out), - manifest, moduleInfos, null); + try ( + FileInputStream in = (fname != null) ? new FileInputStream(inputFile) + : new FileInputStream(FileDescriptor.in); + FileOutputStream out = new FileOutputStream(tmpFile); + InputStream manifest = (!Mflag && (mname != null)) ? + (new FileInputStream(mname)) : null; + ) { + boolean updateOk = update(in, new BufferedOutputStream(out), + manifest, moduleInfos, null); + if (ok) { + ok = updateOk; + } + } // Consistency checks for modular jars. if (!moduleInfos.isEmpty()) { @@ -430,23 +418,8 @@ class Main { return false; } - if (ok) { - ok = updateOk; - } - in.close(); - out.close(); - if (manifest != null) { - manifest.close(); - } - if (ok && fname != null) { - // on Win32, we need this delete - inputFile.delete(); - if (!tmpFile.renameTo(inputFile)) { - tmpFile.delete(); - throw new IOException(getMsg("error.write.file")); - } - tmpFile.delete(); - } + validateAndClose(tmpFile); + } else if (tflag) { replaceFSC(filesMap); // For the "list table contents" action, access using the @@ -520,6 +493,28 @@ class Main { return ok; } + private void validateAndClose(File tmpfile) throws IOException { + if (ok && isMultiRelease) { + ok = validate(tmpfile.getCanonicalPath()); + if (!ok) { + error(formatMsg("error.validator.jarfile.invalid", fname)); + } + } + + Path path = tmpfile.toPath(); + try { + if (ok) { + if (fname != null) { + Files.move(path, Paths.get(fname), StandardCopyOption.REPLACE_EXISTING); + } else { + Files.copy(path, new FileOutputStream(FileDescriptor.out)); + } + } + } finally { + Files.deleteIfExists(path); + } + } + private String[] filesMapToFiles(Map<Integer,String[]> filesMap) { if (filesMap.isEmpty()) return null; return filesMap.entrySet() @@ -534,6 +529,76 @@ class Main { .map(f -> (new EntryName(f, version)).entryName); } + // sort base entries before versioned entries, and sort entry classes with + // nested classes so that the top level class appears before the associated + // nested class + private Comparator<JarEntry> entryComparator = (je1, je2) -> { + String s1 = je1.getName(); + String s2 = je2.getName(); + if (s1.equals(s2)) return 0; + boolean b1 = s1.startsWith(VERSIONS_DIR); + boolean b2 = s2.startsWith(VERSIONS_DIR); + if (b1 && !b2) return 1; + if (!b1 && b2) return -1; + int n = 0; // starting char for String compare + if (b1 && b2) { + // normally strings would be sorted so "10" goes before "9", but + // version number strings need to be sorted numerically + n = VERSIONS_DIR.length(); // skip the common prefix + int i1 = s1.indexOf('/', n); + int i2 = s1.indexOf('/', n); + if (i1 == -1) throw new InvalidJarException(s1); + if (i2 == -1) throw new InvalidJarException(s2); + // shorter version numbers go first + if (i1 != i2) return i1 - i2; + // otherwise, handle equal length numbers below + } + int l1 = s1.length(); + int l2 = s2.length(); + int lim = Math.min(l1, l2); + for (int k = n; k < lim; k++) { + char c1 = s1.charAt(k); + char c2 = s2.charAt(k); + if (c1 != c2) { + // change natural ordering so '.' comes before '$' + // i.e. top level classes come before nested classes + if (c1 == '$' && c2 == '.') return 1; + if (c1 == '.' && c2 == '$') return -1; + return c1 - c2; + } + } + return l1 - l2; + }; + + private boolean validate(String fname) { + boolean valid; + + try (JarFile jf = new JarFile(fname)) { + Validator validator = new Validator(this, jf); + jf.stream() + .filter(e -> !e.isDirectory()) + .filter(e -> !e.getName().equals(MANIFEST_NAME)) + .filter(e -> !e.getName().endsWith(MODULE_INFO)) + .sorted(entryComparator) + .forEachOrdered(validator); + valid = validator.isValid(); + } catch (IOException e) { + error(formatMsg2("error.validator.jarfile.exception", fname, e.getMessage())); + valid = false; + } catch (InvalidJarException e) { + error(formatMsg("error.validator.bad.entry.name", e.getMessage())); + valid = false; + } + return valid; + } + + private static class InvalidJarException extends RuntimeException { + private static final long serialVersionUID = -3642329147299217726L; + InvalidJarException(String msg) { + super(msg); + } + } + /** * Parses command line arguments. */ diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Validator.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Validator.java new file mode 100644 index 00000000000..bf4fa8bf702 --- /dev/null +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Validator.java @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.tools.jar; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +final class Validator implements Consumer<JarEntry> { + private final static boolean DEBUG = Boolean.getBoolean("jar.debug"); + private final Map<String,FingerPrint> fps = new HashMap<>(); + private final int vdlen = Main.VERSIONS_DIR.length(); + private final Main main; + private final JarFile jf; + private int oldVersion = -1; + private String currentTopLevelName; + private boolean isValid = true; + + Validator(Main main, JarFile jf) { + this.main = main; + this.jf = jf; + } + + boolean isValid() { + return isValid; + } + + /* + * Validator has state and assumes entries provided to accept are ordered + * from base entries first and then through the versioned entries in + * ascending version order. Also, to find isolated nested classes, + * classes must be ordered so that the top level class is before the associated + * nested class(es). + */ + public void accept(JarEntry je) { + String entryName = je.getName(); + + // directories are always accepted + if (entryName.endsWith("/")) { + debug("%s is a directory", entryName); + return; + } + + // figure out the version and basename from the JarEntry + int version; + String basename; + if (entryName.startsWith(Main.VERSIONS_DIR)) { + int n = entryName.indexOf("/", vdlen); + if (n == -1) { + main.error(Main.formatMsg("error.validator.version.notnumber", entryName)); + isValid = false; + return; + } + String v = entryName.substring(vdlen, n); + try { + version = Integer.parseInt(v); + } catch (NumberFormatException x) { + main.error(Main.formatMsg("error.validator.version.notnumber", entryName)); + isValid = false; + return; + } + if (n == entryName.length()) { + main.error(Main.formatMsg("error.validator.entryname.tooshort", entryName)); + isValid = false; + return; + } + basename = entryName.substring(n + 1); + } else { + version = 0; + basename = entryName; + } + debug("\n===================\nversion %d %s", version, entryName); + + if (oldVersion != version) { + oldVersion = version; + currentTopLevelName = null; + } + + // analyze the entry, keeping key attributes + FingerPrint fp; + try (InputStream is = jf.getInputStream(je)) { + fp = new FingerPrint(basename, is.readAllBytes()); + } catch (IOException x) { + main.error(x.getMessage()); + isValid = false; + return; + } + String internalName = fp.name(); + + // process a base entry paying attention to nested classes + if (version == 0) { + debug("base entry found"); + if (fp.isNestedClass()) { + debug("nested class found"); + if (fp.topLevelName().equals(currentTopLevelName)) { + fps.put(internalName, fp); + return; + } + main.error(Main.formatMsg("error.validator.isolated.nested.class", entryName)); + isValid = false; + return; + } + // top level class or resource entry + if (fp.isClass()) { + currentTopLevelName = fp.topLevelName(); + if (!checkInternalName(entryName, basename, internalName)) { + isValid = false; + return; + } + } + fps.put(internalName, fp); + return; + } + + // process a versioned entry, look for previous entry with same name + FingerPrint matchFp = fps.get(internalName); + debug("looking for match"); + if (matchFp == null) { + debug("no match found"); + if (fp.isClass()) { + if (fp.isNestedClass()) { + if (!checkNestedClass(version, entryName, internalName, fp)) { + isValid = false; + } + return; + } + if (fp.isPublicClass()) { + main.error(Main.formatMsg("error.validator.new.public.class", entryName)); + isValid = false; + return; + } + debug("%s is a non-public class entry", entryName); + fps.put(internalName, fp); + currentTopLevelName = fp.topLevelName(); + return; + } + debug("%s is a resource entry"); + fps.put(internalName, fp); + return; + } + debug("match found"); + + // are the two classes/resources identical? + if (fp.isIdentical(matchFp)) { + main.error(Main.formatMsg("error.validator.identical.entry", entryName)); + return; // it's okay, just takes up room + } + debug("sha1 not equal -- different bytes"); + + // ok, not identical, check for compatible class version and api + if (fp.isClass()) { + if (fp.isNestedClass()) { + if (!checkNestedClass(version, entryName, internalName, fp)) { + isValid = false; + } + return; + } + debug("%s is a class entry", entryName); + if (!fp.isCompatibleVersion(matchFp)) { + main.error(Main.formatMsg("error.validator.incompatible.class.version", entryName)); + isValid = false; + return; + } + if (!fp.isSameAPI(matchFp)) { + main.error(Main.formatMsg("error.validator.different.api", entryName)); + isValid = false; + return; + } + if (!checkInternalName(entryName, basename, internalName)) { + isValid = false; + return; + } + debug("fingerprints same -- same api"); + fps.put(internalName, fp); + currentTopLevelName = fp.topLevelName(); + return; + } + debug("%s is a resource", entryName); + + main.error(Main.formatMsg("error.validator.resources.with.same.name", entryName)); + fps.put(internalName, fp); + return; + } + + private boolean checkInternalName(String entryName, String basename, String internalName) { + String className = className(basename); + if (internalName.equals(className)) { + return true; + } + main.error(Main.formatMsg2("error.validator.names.mismatch", + entryName, internalName.replace("/", "."))); + return false; + } + + private boolean checkNestedClass(int version, String entryName, String internalName, FingerPrint fp) { + debug("%s is a nested class entry in top level class %s", entryName, fp.topLevelName()); + if (fp.topLevelName().equals(currentTopLevelName)) { + debug("%s (top level class) was accepted", fp.topLevelName()); + fps.put(internalName, fp); + return true; + } + debug("top level class was not accepted"); + main.error(Main.formatMsg("error.validator.isolated.nested.class", entryName)); + return false; + } + + private String className(String entryName) { + return entryName.endsWith(".class") ? entryName.substring(0, entryName.length() - 6) : null; + } + + private void debug(String fmt, Object... args) { + if (DEBUG) System.err.format(fmt, args); + } +} + diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties index e00ee76610d..9c570c7ded8 100644 --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties @@ -85,6 +85,30 @@ error.release.value.notnumber=\ release {0} not valid error.release.value.toosmall=\ release {0} not valid, must be >= 9 +error.validator.jarfile.exception=\ + can not validate {0}: {1} +error.validator.jarfile.invalid=\ + invalid multi-release jar file {0} deleted +error.validator.bad.entry.name=\ + entry name malformed, {0} +error.validator.version.notnumber=\ + entry name: {0}, does not have a version number +error.validator.entryname.tooshort=\ + entry name: {0}, too short, not a directory +error.validator.isolated.nested.class=\ + entry: {0}, is an isolated nested class +error.validator.new.public.class=\ + entry: {0}, contains a new public class not found in base entries +error.validator.identical.entry=\ + warning - entry: {0} contains a class that is identical to an entry already in the jar +error.validator.incompatible.class.version=\ + entry: {0}, has a class version incompatible with an earlier version +error.validator.different.api=\ + entry: {0}, contains a class with different api from earlier version +error.validator.resources.with.same.name=\ + warning - entry: {0}, multiple resources with same name +error.validator.names.mismatch=\ + entry: {0}, contains a class with internal name {1}, names do not match out.added.manifest=\ added manifest out.added.module-info=\ diff --git a/jdk/test/tools/jar/multiRelease/Basic.java b/jdk/test/tools/jar/multiRelease/Basic.java index cd5c195a169..589615ad1e9 100644 --- a/jdk/test/tools/jar/multiRelease/Basic.java +++ b/jdk/test/tools/jar/multiRelease/Basic.java @@ -43,6 +43,7 @@ import java.util.stream.Stream; import java.util.zip.*; import jdk.test.lib.JDKToolFinder; +import jdk.test.lib.Utils; import static java.lang.String.format; import static java.lang.System.out; @@ -198,6 +199,262 @@ public class Basic { deleteDir(Paths.get(usr, "classes")); } + /* + * The following tests exercise the jar validator + */ + + @Test + // META-INF/versions/9 class has different api than base class + public void test04() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // replace the v9 class + Path source = Paths.get(src, "data", "test04", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Version.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertFailure() + .resultChecker(r -> + assertTrue(r.output.contains("different api from earlier"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // META-INF/versions/9 contains an extra public class + public void test05() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add the new v9 class + Path source = Paths.get(src, "data", "test05", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Extra.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertFailure() + .resultChecker(r -> + assertTrue(r.output.contains("contains a new public class"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // META-INF/versions/9 contains an extra package private class -- this is okay + public void test06() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add the new v9 class + Path source = Paths.get(src, "data", "test06", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Extra.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertSuccess(); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // META-INF/versions/9 contains an identical class to base entry class + // this is okay but produces warning + public void test07() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add the new v9 class + Path source = Paths.get(src, "data", "test01", "base", "version"); + javac(classes.resolve("v9"), source.resolve("Version.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertSuccess() + .resultChecker(r -> + assertTrue(r.output.contains("contains a class that is identical"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // resources with same name in different versions + // this is okay but produces warning + public void test08() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add a resource to the base + Path source = Paths.get(src, "data", "test01", "base", "version"); + Files.copy(source.resolve("Version.java"), classes.resolve("base") + .resolve("version").resolve("Version.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertSuccess() + .resultChecker(r -> + assertTrue(r.output.isEmpty(), r.output) + ); + + // now add a different resource with same name to META-INF/version/9 + Files.copy(source.resolve("Main.java"), classes.resolve("v9") + .resolve("version").resolve("Version.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertSuccess() + .resultChecker(r -> + assertTrue(r.output.contains("multiple resources with same name"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // a class with an internal name different from the external name + public void test09() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + Path base = classes.resolve("base").resolve("version"); + + Files.copy(base.resolve("Main.class"), base.resolve("Foo.class")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertFailure() + .resultChecker(r -> + assertTrue(r.output.contains("names do not match"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // assure that basic nested classes are acceptable + public void test10() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add a base class with a nested class + Path source = Paths.get(src, "data", "test10", "base", "version"); + javac(classes.resolve("base"), source.resolve("Nested.java")); + + // add a versioned class with a nested class + source = Paths.get(src, "data", "test10", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Nested.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertSuccess(); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // a base entry contains a nested class that doesn't have a matching top level class + public void test11() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add a base class with a nested class + Path source = Paths.get(src, "data", "test10", "base", "version"); + javac(classes.resolve("base"), source.resolve("Nested.java")); + + // remove the top level class, thus isolating the nested class + Files.delete(classes.resolve("base").resolve("version").resolve("Nested.class")); + + // add a versioned class with a nested class + source = Paths.get(src, "data", "test10", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Nested.java")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertFailure() + .resultChecker(r -> { + String[] msg = r.output.split("\\R"); + // There should be 3 error messages, cascading from the first. Once we + // remove the base top level class, the base nested class becomes isolated, + // also the versioned top level class becomes a new public class, thus ignored + // for subsequent checks, leading to the associated versioned nested class + // becoming an isolated nested class + assertTrue(msg.length == 4); + assertTrue(msg[0].contains("an isolated nested class"), msg[0]); + assertTrue(msg[1].contains("contains a new public class"), msg[1]); + assertTrue(msg[2].contains("an isolated nested class"), msg[2]); + assertTrue(msg[3].contains("invalid multi-release jar file"), msg[3]); + }); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + + @Test + // a versioned entry contains a nested class that doesn't have a matching top level class + public void test12() throws IOException { + String jarfile = "test.jar"; + + compile("test01"); //use same data as test01 + + Path classes = Paths.get("classes"); + + // add a base class with a nested class + Path source = Paths.get(src, "data", "test10", "base", "version"); + javac(classes.resolve("base"), source.resolve("Nested.java")); + + // add a versioned class with a nested class + source = Paths.get(src, "data", "test10", "v9", "version"); + javac(classes.resolve("v9"), source.resolve("Nested.java")); + + // remove the top level class, thus isolating the nested class + Files.delete(classes.resolve("v9").resolve("version").resolve("Nested.class")); + + jar("cf", jarfile, "-C", classes.resolve("base").toString(), ".", + "--release", "9", "-C", classes.resolve("v9").toString(), ".") + .assertFailure() + .resultChecker(r -> + assertTrue(r.output.contains("an isolated nested class"), r.output) + ); + + delete(jarfile); + deleteDir(Paths.get(usr, "classes")); + } + /* * Test Infrastructure */ @@ -243,7 +500,7 @@ public class Basic { } private void delete(String name) throws IOException { - Files.delete(Paths.get(usr, name)); + Files.deleteIfExists(Paths.get(usr, name)); } private void deleteDir(Path dir) throws IOException { @@ -271,6 +528,10 @@ public class Basic { List<String> commands = new ArrayList<>(); commands.add(javac); + String opts = System.getProperty("test.compiler.opts"); + if (!opts.isEmpty()) { + commands.addAll(Arrays.asList(opts.split(" +"))); + } commands.add("-d"); commands.add(dest.toString()); Stream.of(sourceFiles).map(Object::toString).forEach(x -> commands.add(x)); @@ -282,6 +543,7 @@ public class Basic { String jar = JDKToolFinder.getJDKTool("jar"); List<String> commands = new ArrayList<>(); commands.add(jar); + commands.addAll(Utils.getForwardVmOptions()); Stream.of(args).forEach(x -> commands.add(x)); ProcessBuilder p = new ProcessBuilder(commands); if (stdinSource != null) diff --git a/jdk/test/tools/jar/multiRelease/data/test04/v9/version/Version.java b/jdk/test/tools/jar/multiRelease/data/test04/v9/version/Version.java new file mode 100644 index 00000000000..c4731163178 --- /dev/null +++ b/jdk/test/tools/jar/multiRelease/data/test04/v9/version/Version.java @@ -0,0 +1,14 @@ +package version; + +public class Version { + public int getVersion() { + return 9; + } + + protected void doNothing() { + } + + // extra publc method + public void anyName() { + } +} diff --git a/jdk/test/tools/jar/multiRelease/data/test05/v9/version/Extra.java b/jdk/test/tools/jar/multiRelease/data/test05/v9/version/Extra.java new file mode 100644 index 00000000000..83ef985c410 --- /dev/null +++ b/jdk/test/tools/jar/multiRelease/data/test05/v9/version/Extra.java @@ -0,0 +1,13 @@ +package version; + +public class Extra { + public int getVersion() { + return 9; + } + + protected void doNothing() { + } + + private void anyName() { + } +} diff --git a/jdk/test/tools/jar/multiRelease/data/test06/v9/version/Extra.java b/jdk/test/tools/jar/multiRelease/data/test06/v9/version/Extra.java new file mode 100644 index 00000000000..f2d7862aad3 --- /dev/null +++ b/jdk/test/tools/jar/multiRelease/data/test06/v9/version/Extra.java @@ -0,0 +1,13 @@ +package version; + +class Extra { + public int getVersion() { + return 9; + } + + protected void doNothing() { + } + + private void anyName() { + } +} diff --git a/jdk/test/tools/jar/multiRelease/data/test10/base/version/Nested.java b/jdk/test/tools/jar/multiRelease/data/test10/base/version/Nested.java new file mode 100644 index 00000000000..88f3d93d19c --- /dev/null +++ b/jdk/test/tools/jar/multiRelease/data/test10/base/version/Nested.java @@ -0,0 +1,17 @@ +package version; + +public class Nested { + public int getVersion() { + return 9; + } + + protected void doNothing() { + } + + private void anyName() { + } + + class nested { + int save; + } +} diff --git a/jdk/test/tools/jar/multiRelease/data/test10/v9/version/Nested.java b/jdk/test/tools/jar/multiRelease/data/test10/v9/version/Nested.java new file mode 100644 index 00000000000..7e3d0c6b16e --- /dev/null +++ b/jdk/test/tools/jar/multiRelease/data/test10/v9/version/Nested.java @@ -0,0 +1,14 @@ +package version; + +public class Nested { + public int getVersion() { + return 9; + } + + protected void doNothing() { + } + + class nested { + int save = getVersion(); + } +} From ebf98a1654939d977cd10f20fbc57e2c42176643 Mon Sep 17 00:00:00 2001 From: Weijun Wang <weijun@openjdk.org> Date: Wed, 10 Aug 2016 11:21:01 +0800 Subject: [PATCH 04/15] 8163489: Avoid using Utils.getFreePort() in TsacertOptionTest.java test Reviewed-by: chegar --- .../tools/jarsigner/TsacertOptionTest.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java index 3481e43b3ef..71aef388ed3 100644 --- a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java +++ b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java @@ -77,11 +77,6 @@ public class TsacertOptionTest { Utils.createFiles(FILENAME); JarUtils.createJar(UNSIGNED_JARFILE, FILENAME); - // look for free network port for TSA service - int port = jdk.testlibrary.Utils.getFreePort(); - String host = "127.0.0.1"; - String tsaUrl = "http://" + host + ":" + port; - // create key pair for jar signing ProcessTools.executeCommand(KEYTOOL, "-genkey", @@ -126,24 +121,30 @@ public class TsacertOptionTest { "-keypass", PASSWORD, "-file", "cert").shouldHaveExitValue(0); - // create key pair for TSA service - // SubjectInfoAccess extension contains URL to TSA service - ProcessTools.executeCommand(KEYTOOL, - "-genkey", - "-v", - "-alias", TSA_KEY_ALIAS, - "-keyalg", KEY_ALG, - "-keysize", Integer.toString(KEY_SIZE), - "-keystore", KEYSTORE, - "-storepass", PASSWORD, - "-keypass", PASSWORD, - "-dname", "CN=TSA", - "-ext", "ExtendedkeyUsage:critical=timeStamping", - "-ext", "SubjectInfoAccess=timeStamping:URI:" + tsaUrl, - "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); - try (TimestampCheck.Handler tsa = TimestampCheck.Handler.init(port, - KEYSTORE);) { + try (TimestampCheck.Handler tsa = TimestampCheck.Handler.init(0, + KEYSTORE)) { + + // look for free network port for TSA service + int port = tsa.getPort(); + String host = "127.0.0.1"; + String tsaUrl = "http://" + host + ":" + port; + + // create key pair for TSA service + // SubjectInfoAccess extension contains URL to TSA service + ProcessTools.executeCommand(KEYTOOL, + "-genkey", + "-v", + "-alias", TSA_KEY_ALIAS, + "-keyalg", KEY_ALG, + "-keysize", Integer.toString(KEY_SIZE), + "-keystore", KEYSTORE, + "-storepass", PASSWORD, + "-keypass", PASSWORD, + "-dname", "CN=TSA", + "-ext", "ExtendedkeyUsage:critical=timeStamping", + "-ext", "SubjectInfoAccess=timeStamping:URI:" + tsaUrl, + "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // start TSA tsa.start(); From 359795c50d67528f9a881f4fd45f62afd9ffa908 Mon Sep 17 00:00:00 2001 From: Weijun Wang <weijun@openjdk.org> Date: Wed, 10 Aug 2016 11:30:53 +0800 Subject: [PATCH 05/15] 8162739: Create new keytool option to access cacerts file Reviewed-by: erikj, vinnie, mullan --- jdk/make/copy/Copy-java.base.gmk | 2 +- .../sun/security/tools/KeyStoreUtil.java | 28 +++--- .../sun/security/tools/keytool/Main.java | 39 ++++--- .../sun/security/tools/keytool/Resources.java | 6 ++ .../share/{conf => lib}/security/cacerts | Bin .../security/tools/keytool/CacertsOption.java | 95 ++++++++++++++++++ 6 files changed, 141 insertions(+), 29 deletions(-) rename jdk/src/java.base/share/{conf => lib}/security/cacerts (100%) create mode 100644 jdk/test/sun/security/tools/keytool/CacertsOption.java diff --git a/jdk/make/copy/Copy-java.base.gmk b/jdk/make/copy/Copy-java.base.gmk index e2061e35c33..5fb26d4b4d2 100644 --- a/jdk/make/copy/Copy-java.base.gmk +++ b/jdk/make/copy/Copy-java.base.gmk @@ -203,7 +203,7 @@ TARGETS += $(DEF_POLICY_DST) ################################################################################ ifeq ($(CACERTS_FILE), ) - CACERTS_FILE := $(JDK_TOPDIR)/src/java.base/share/conf/security/cacerts + CACERTS_FILE := $(JDK_TOPDIR)/src/java.base/share/lib/security/cacerts endif CACERTS_DST := $(LIB_DST_DIR)/security/cacerts diff --git a/jdk/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java b/jdk/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java index 7c33d0753f6..0aca1f39bd5 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java @@ -63,8 +63,6 @@ public class KeyStoreUtil { // this class is not meant to be instantiated } - private static final String JKS = "jks"; - private static final Collator collator = Collator.getInstance(); static { // this is for case insensitive string comparisons @@ -112,25 +110,25 @@ public class KeyStoreUtil { } } + /** + * Returns the file name of the keystore with the configured CA certificates. + */ + public static String getCacerts() { + String sep = File.separator; + return System.getProperty("java.home") + sep + + "lib" + sep + "security" + sep + + "cacerts"; + } + /** * Returns the keystore with the configured CA certificates. */ - public static KeyStore getCacertsKeyStore() - throws Exception - { - String sep = File.separator; - File file = new File(System.getProperty("java.home") + sep - + "lib" + sep + "security" + sep - + "cacerts"); + public static KeyStore getCacertsKeyStore() throws Exception { + File file = new File(getCacerts()); if (!file.exists()) { return null; } - KeyStore caks = null; - try (FileInputStream fis = new FileInputStream(file)) { - caks = KeyStore.getInstance(JKS); - caks.load(fis, null); - } - return caks; + return KeyStore.getInstance(file, (char[])null); } public static char[] getPassWithModifier(String modifier, String arg, diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java index e48f12b592e..12b5041ea41 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java @@ -153,6 +153,7 @@ public final class Main { private boolean trustcacerts = false; private boolean protectedPath = false; private boolean srcprotectedPath = false; + private boolean cacerts = false; private CertificateFactory cf = null; private KeyStore caks = null; // "cacerts" keystore private char[] srcstorePass = null; @@ -169,15 +170,15 @@ public final class Main { STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), CHANGEALIAS("Changes.an.entry.s.alias", - ALIAS, DESTALIAS, KEYPASS, KEYSTORE, STOREPASS, + ALIAS, DESTALIAS, KEYPASS, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), DELETE("Deletes.an.entry", - ALIAS, KEYSTORE, STOREPASS, STORETYPE, + ALIAS, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), EXPORTCERT("Exports.certificate", - RFC, ALIAS, FILEOUT, KEYSTORE, STOREPASS, + RFC, ALIAS, FILEOUT, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), GENKEYPAIR("Generates.a.key.pair", @@ -196,7 +197,7 @@ public final class Main { PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), IMPORTCERT("Imports.a.certificate.or.a.certificate.chain", NOPROMPT, TRUSTCACERTS, PROTECTED, ALIAS, FILEIN, - KEYPASS, KEYSTORE, STOREPASS, STORETYPE, + KEYPASS, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V), IMPORTPASS("Imports.a.password", @@ -215,7 +216,7 @@ public final class Main { STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V), LIST("Lists.entries.in.a.keystore", - RFC, ALIAS, KEYSTORE, STOREPASS, STORETYPE, + RFC, ALIAS, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V, PROTECTED), PRINTCERT("Prints.the.content.of.a.certificate", @@ -225,7 +226,7 @@ public final class Main { PRINTCRL("Prints.the.content.of.a.CRL.file", FILEIN, V), STOREPASSWD("Changes.the.store.password.of.a.keystore", - NEW, KEYSTORE, STOREPASS, STORETYPE, PROVIDERNAME, + NEW, KEYSTORE, CACERTS, STOREPASS, STORETYPE, PROVIDERNAME, ADDPROVIDER, PROVIDERCLASS, PROVIDERPATH, V), // Undocumented start here, KEYCLONE is used a marker in -help; @@ -306,6 +307,7 @@ public final class Main { KEYPASS("keypass", "<arg>", "key.password"), KEYSIZE("keysize", "<size>", "key.bit.size"), KEYSTORE("keystore", "<keystore>", "keystore.name"), + CACERTS("cacerts", null, "access.the.cacerts.keystore"), NEW("new", "<arg>", "new.password"), NOPROMPT("noprompt", null, "do.not.prompt"), OUTFILE("outfile", "<file>", "output.file.name"), @@ -472,14 +474,16 @@ public final class Main { help = true; } else if (collator.compare(flags, "-conf") == 0) { i++; - } - - /* - * specifiers - */ - else if (collator.compare(flags, "-keystore") == 0 || - collator.compare(flags, "-destkeystore") == 0) { + } else if (collator.compare(flags, "-keystore") == 0) { ksfname = args[++i]; + if (new File(ksfname).getCanonicalPath().equals( + new File(KeyStoreUtil.getCacerts()).getCanonicalPath())) { + System.err.println(rb.getString("warning.cacerts.option")); + } + } else if (collator.compare(flags, "-destkeystore") == 0) { + ksfname = args[++i]; + } else if (collator.compare(flags, "-cacerts") == 0) { + cacerts = true; } else if (collator.compare(flags, "-storepass") == 0 || collator.compare(flags, "-deststorepass") == 0) { storePass = getPass(modifier, args[++i]); @@ -636,6 +640,15 @@ public final class Main { * Execute the commands. */ void doCommands(PrintStream out) throws Exception { + + if (cacerts) { + if (ksfname != null || storetype != null) { + throw new IllegalArgumentException(rb.getString + ("the.keystore.or.storetype.option.cannot.be.used.with.the.cacerts.option")); + } + ksfname = KeyStoreUtil.getCacerts(); + } + if (storetype == null) { storetype = KeyStore.getDefaultType(); } diff --git a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java index 2f755677dfc..8ede53992d8 100644 --- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java +++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Resources.java @@ -127,6 +127,10 @@ public class Resources extends java.util.ListResourceBundle { "key bit size"}, //-keysize {"keystore.name", "keystore name"}, //-keystore + {"access.the.cacerts.keystore", + "access the cacerts keystore"}, // -cacerts + {"warning.cacerts.option", + "Warning: use -cacerts option to access cacerts keystore"}, {"new.password", "new password"}, //-new {"do.not.prompt", @@ -194,6 +198,8 @@ public class Resources extends java.util.ListResourceBundle { {"Command.option.flag.needs.an.argument.", "Command option {0} needs an argument."}, {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", "Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified {0} value."}, + {"the.keystore.or.storetype.option.cannot.be.used.with.the.cacerts.option", + "The -keystore or -storetype option cannot be used with the -cacerts option"}, {".keystore.must.be.NONE.if.storetype.is.{0}", "-keystore must be NONE if -storetype is {0}"}, {"Too.many.retries.program.terminated", diff --git a/jdk/src/java.base/share/conf/security/cacerts b/jdk/src/java.base/share/lib/security/cacerts similarity index 100% rename from jdk/src/java.base/share/conf/security/cacerts rename to jdk/src/java.base/share/lib/security/cacerts diff --git a/jdk/test/sun/security/tools/keytool/CacertsOption.java b/jdk/test/sun/security/tools/keytool/CacertsOption.java new file mode 100644 index 00000000000..23e118fb606 --- /dev/null +++ b/jdk/test/sun/security/tools/keytool/CacertsOption.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8162739 + * @summary Create new keytool option to access cacerts file + * @modules java.base/sun.security.tools.keytool + * java.base/sun.security.tools + * @run main/othervm -Duser.language=en -Duser.country=US CacertsOption + */ + +import sun.security.tools.KeyStoreUtil; +import sun.security.tools.keytool.Main; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.PrintStream; +import java.security.KeyStore; +import java.util.Collections; + +public class CacertsOption { + + public static void main(String[] args) throws Exception { + + run("-help -list"); + if (!msg.contains("-cacerts")) { + throw new Exception("No cacerts in help:\n" + msg); + } + + String cacerts = KeyStoreUtil.getCacerts(); + + run("-list -keystore " + cacerts); + if (!msg.contains("Warning:")) { + throw new Exception("No warning in output:\n" + msg); + } + + run("-list -cacerts"); + KeyStore ks = KeyStore.getInstance(new File(cacerts), (char[])null); + for (String alias: Collections.list(ks.aliases())) { + if (!msg.contains(alias)) { + throw new Exception(alias + " not found in\n" + msg); + } + } + + try { + run("-list -cacerts -storetype jks"); + throw new Exception("Should fail"); + } catch (IllegalArgumentException iae) { + if (!msg.contains("cannot be used with")) { + throw new Exception("Bad error msg\n" + msg); + } + } + } + + private static String msg = null; + + private static void run(String cmd) throws Exception { + msg = null; + cmd += " -storepass changeit -debug"; + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(bout); + PrintStream oldOut = System.out; + PrintStream oldErr = System.err; + try { + System.setOut(ps); + System.setErr(ps); + Main.main(cmd.split(" ")); + } finally { + System.setErr(oldErr); + System.setOut(oldOut); + msg = new String(bout.toByteArray()); + } + } +} From b6e6759ba9b1a1fcfbb9c8dbdc7cd5eec6cd6124 Mon Sep 17 00:00:00 2001 From: Jamil Nimeh <jnimeh@openjdk.org> Date: Tue, 9 Aug 2016 22:31:41 -0700 Subject: [PATCH 06/15] 8132943: ServerHandshaker may select non-empty OCSPStatusRequest structures when Responder ID Select only OCSPStatusRequest objects that have no responder IDs in them when deciding whether to do OCSP stapling and what form of stapling. Reviewed-by: xuelei --- .../sun/security/ssl/ServerHandshaker.java | 78 +- .../ssl/StatusStapling/RunStatReqSelect.java | 33 + .../sun/security/ssl/StatusReqSelection.java | 899 ++++++++++++++++++ 3 files changed, 990 insertions(+), 20 deletions(-) create mode 100644 jdk/test/sun/security/ssl/StatusStapling/RunStatReqSelect.java create mode 100644 jdk/test/sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java index 10df67d2eaa..c68e7431053 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java @@ -1994,7 +1994,7 @@ final class ServerHandshaker extends Handshaker { private StaplingParameters processStapling(ClientHello mesg) { StaplingParameters params = null; - ExtensionType ext; + ExtensionType ext = null; StatusRequestType type = null; StatusRequest req = null; Map<X509Certificate, byte[]> responses; @@ -2012,33 +2012,40 @@ final class ServerHandshaker extends Handshaker { CertStatusReqListV2Extension statReqExtV2 = (CertStatusReqListV2Extension)mesg.extensions.get( ExtensionType.EXT_STATUS_REQUEST_V2); - // Keep processing only if either status_request or status_request_v2 - // has been sent in the ClientHello. - if (statReqExt == null && statReqExtV2 == null) { - return null; - } // Determine which type of stapling we are doing and assert the // proper extension in the server hello. // Favor status_request_v2 over status_request and ocsp_multi // over ocsp. // If multiple ocsp or ocsp_multi types exist, select the first - // instance of a given type - ext = ExtensionType.EXT_STATUS_REQUEST; + // instance of a given type. Also since we don't support ResponderId + // selection yet, only accept a request if the ResponderId field + // is empty. if (statReqExtV2 != null) { // RFC 6961 stapling ext = ExtensionType.EXT_STATUS_REQUEST_V2; List<CertStatusReqItemV2> reqItems = statReqExtV2.getRequestItems(); int ocspIdx = -1; int ocspMultiIdx = -1; - for (int pos = 0; pos < reqItems.size(); pos++) { + for (int pos = 0; (pos < reqItems.size() && + (ocspIdx == -1 || ocspMultiIdx == -1)); pos++) { CertStatusReqItemV2 item = reqItems.get(pos); - if (ocspIdx < 0 && item.getType() == - StatusRequestType.OCSP) { - ocspIdx = pos; - } else if (ocspMultiIdx < 0 && item.getType() == - StatusRequestType.OCSP_MULTI) { - ocspMultiIdx = pos; + StatusRequestType curType = item.getType(); + if (ocspIdx < 0 && curType == StatusRequestType.OCSP) { + OCSPStatusRequest ocspReq = + (OCSPStatusRequest)item.getRequest(); + if (ocspReq.getResponderIds().isEmpty()) { + ocspIdx = pos; + } + } else if (ocspMultiIdx < 0 && + curType == StatusRequestType.OCSP_MULTI) { + // If the type is OCSP, then the request + // is guaranteed to be OCSPStatusRequest + OCSPStatusRequest ocspReq = + (OCSPStatusRequest)item.getRequest(); + if (ocspReq.getResponderIds().isEmpty()) { + ocspMultiIdx = pos; + } } } if (ocspMultiIdx >= 0) { @@ -2047,16 +2054,47 @@ final class ServerHandshaker extends Handshaker { } else if (ocspIdx >= 0) { type = reqItems.get(ocspIdx).getType(); req = reqItems.get(ocspIdx).getRequest(); + } else { + if (debug != null && Debug.isOn("handshake")) { + System.out.println("Warning: No suitable request " + + "found in the status_request_v2 extension."); + } + } + } + + // Only attempt to process a status_request extension if: + // * The status_request extension is set AND + // * either the status_request_v2 extension is not present OR + // * none of the underlying OCSPStatusRequest structures is suitable + // for stapling. + // If either of the latter two bullet items is true the ext, type and + // req variables should all be null. If any are null we will try + // processing an asserted status_request. + if ((statReqExt != null) && + (ext == null || type == null || req == null)) { + ext = ExtensionType.EXT_STATUS_REQUEST; + type = statReqExt.getType(); + if (type == StatusRequestType.OCSP) { + // If the type is OCSP, then the request is guaranteed + // to be OCSPStatusRequest + OCSPStatusRequest ocspReq = + (OCSPStatusRequest)statReqExt.getRequest(); + if (ocspReq.getResponderIds().isEmpty()) { + req = ocspReq; + } else { + if (debug != null && Debug.isOn("handshake")) { + req = null; + System.out.println("Warning: No suitable request " + + "found in the status_request extension."); + } + } } - } else { // RFC 6066 stapling - type = StatusRequestType.OCSP; - req = statReqExt.getRequest(); } // If, after walking through the extensions we were unable to // find a suitable StatusRequest, then stapling is disabled. - // Both statReqType and statReqData must have been set to continue. - if (type == null || req == null) { + // The ext, type and req variables must have been set to continue. + if (type == null || req == null || ext == null) { return null; } diff --git a/jdk/test/sun/security/ssl/StatusStapling/RunStatReqSelect.java b/jdk/test/sun/security/ssl/StatusStapling/RunStatReqSelect.java new file mode 100644 index 00000000000..625731cdcf6 --- /dev/null +++ b/jdk/test/sun/security/ssl/StatusStapling/RunStatReqSelect.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8132943 + * @library ../../../../java/security/testlibrary + * @build CertificateBuilder SimpleOCSPServer + * @run main/othervm java.base/sun.security.ssl.StatusReqSelection + * @summary ServerHandshaker may select non-empty OCSPStatusRequest + * structures when Responder ID selection is not supported + */ + diff --git a/jdk/test/sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java b/jdk/test/sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java new file mode 100644 index 00000000000..72acaac55c1 --- /dev/null +++ b/jdk/test/sun/security/ssl/StatusStapling/java.base/sun/security/ssl/StatusReqSelection.java @@ -0,0 +1,899 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. + +// See ../../../../RunStatReqSelect.java for the jtreg header + +package sun.security.ssl; + +import javax.net.ssl.*; +import javax.net.ssl.SSLEngineResult.*; +import javax.security.auth.x500.X500Principal; +import java.io.*; +import java.math.BigInteger; +import java.security.*; +import java.nio.*; +import java.security.cert.X509Certificate; +import java.security.cert.Extension; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import sun.security.provider.certpath.OCSPNonceExtension; +import sun.security.provider.certpath.ResponderId; +import sun.security.testlibrary.SimpleOCSPServer; +import sun.security.testlibrary.CertificateBuilder; + +public class StatusReqSelection { + + /* + * Enables logging of the SSLEngine operations. + */ + private static final boolean logging = true; + + /* + * Enables the JSSE system debugging system property: + * + * -Djavax.net.debug=all + * + * This gives a lot of low-level information about operations underway, + * including specific handshake messages, and might be best examined + * after gaining some familiarity with this application. + */ + private static final boolean debug = false; + + // The following items are used to set up the keystores. + private static final String passwd = "passphrase"; + private static final String ROOT_ALIAS = "root"; + private static final String INT_ALIAS = "intermediate"; + private static final String SSL_ALIAS = "ssl"; + + // PKI and server components we will need for this test + private static KeyManagerFactory kmf; + private static TrustManagerFactory tmf; + private static KeyStore rootKeystore; // Root CA Keystore + private static KeyStore intKeystore; // Intermediate CA Keystore + private static KeyStore serverKeystore; // SSL Server Keystore + private static KeyStore trustStore; // SSL Client trust store + private static SimpleOCSPServer rootOcsp; // Root CA OCSP Responder + private static int rootOcspPort; // Port for root OCSP + private static SimpleOCSPServer intOcsp; // Intermediate CA OCSP server + private static int intOcspPort; // Port for intermediate OCSP + private static SSLContext ctxStaple; // SSLContext for all tests + + // Some useful objects we will need for test purposes + private static final SecureRandom RNG = new SecureRandom(); + + // We'll be using these objects repeatedly to make hello messages + private static final ProtocolVersion VER_1_0 = ProtocolVersion.TLS10; + private static final ProtocolVersion VER_1_2 = ProtocolVersion.TLS12; + private static final CipherSuiteList SUITES = new CipherSuiteList( + CipherSuite.valueOf("TLS_RSA_WITH_AES_128_GCM_SHA256")); + private static final SessionId SID = new SessionId(new byte[0]); + private static final HelloExtension RNIEXT = + new RenegotiationInfoExtension(new byte[0], new byte[0]); + private static final List<SignatureAndHashAlgorithm> algList = + new ArrayList<SignatureAndHashAlgorithm>() {{ + add(SignatureAndHashAlgorithm.valueOf(4, 1, 0)); + }}; // List with only SHA256withRSA + private static final SignatureAlgorithmsExtension SIGALGEXT = + new SignatureAlgorithmsExtension(algList); + + /* + * Main entry point for this test. + */ + public static void main(String args[]) throws Exception { + int testsPassed = 0; + + if (debug) { + System.setProperty("javax.net.debug", "ssl"); + } + + // All tests will have stapling enabled on the server side + System.setProperty("jdk.tls.server.enableStatusRequestExtension", + "true"); + + // Create a single SSLContext that we can use for all tests + ctxStaple = SSLContext.getInstance("TLS"); + + // Create the PKI we will use for the test and start the OCSP servers + createPKI(); + + // Set up the KeyManagerFactory and TrustManagerFactory + kmf = KeyManagerFactory.getInstance("PKIX"); + kmf.init(serverKeystore, passwd.toCharArray()); + tmf = TrustManagerFactory.getInstance("PKIX"); + tmf.init(trustStore); + + List<TestCase> testList = new ArrayList<TestCase>() {{ + add(new TestCase("ClientHello: No stapling extensions", + makeHelloNoStaplingExts(), false, false)); + add(new TestCase("ClientHello: Default status_request only", + makeDefaultStatReqOnly(), true, false)); + add(new TestCase("ClientHello: Default status_request_v2 only", + makeDefaultStatReqV2Only(), false, true)); + add(new TestCase("ClientHello: Both status_request exts, default", + makeDefaultStatReqBoth(), false, true)); + add(new TestCase( + "ClientHello: Hello with status_request and responder IDs", + makeStatReqWithRid(), false, false)); + add(new TestCase( + "ClientHello: Hello with status_request using no " + + "responder IDs but provides the OCSP nonce extension", + makeStatReqNoRidNonce(), true, false)); + add(new TestCase("ClientHello with default status_request and " + + "status_request_v2 with ResponderIds", + makeStatReqDefV2WithRid(), true, false)); + add(new TestCase("ClientHello with default status_request and " + + "status_request_v2 (OCSP_MULTI with ResponderId, " + + "OCSP as a default request)", + makeStatReqDefV2MultiWithRidSingleDef(), false, true)); + add(new TestCase("ClientHello with status_request and " + + "status_request_v2 and all OCSPStatusRequests use " + + "Responder IDs", + makeStatReqAllWithRid(), false, false)); + add(new TestCase("ClientHello with default status_request and " + + "status_request_v2 that has a default OCSP item and " + + "multiple OCSP_MULTI items, only one is default", + makeHelloMultiV2andSingle(), false, true)); + }}; + + // Run the client and server property tests + for (TestCase test : testList) { + try { + log("*** Test: " + test.testName); + if (runTest(test)) { + log("PASS: status_request: " + test.statReqEnabled + + ", status_request_v2: " + test.statReqV2Enabled); + testsPassed++; + } + } catch (Exception e) { + // If we get an exception, we'll count it as a failure + log("Test failure due to exception: " + e); + } + log(""); + } + + // Summary + if (testsPassed != testList.size()) { + throw new RuntimeException(testList.size() - testsPassed + + " tests failed out of " + testList.size() + " total."); + } else { + log("Total tests: " + testList.size() + ", all passed"); + } + } + + private static boolean runTest(TestCase test) throws Exception { + SSLEngineResult serverResult; + + // Create a Server SSLEngine to receive our customized ClientHello + ctxStaple.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + SSLEngine engine = ctxStaple.createSSLEngine(); + engine.setUseClientMode(false); + engine.setNeedClientAuth(false); + + SSLSession session = engine.getSession(); + ByteBuffer serverOut = ByteBuffer.wrap("I'm a Server".getBytes()); + ByteBuffer serverIn = + ByteBuffer.allocate(session.getApplicationBufferSize() + 50); + ByteBuffer sTOc = + ByteBuffer.allocateDirect(session.getPacketBufferSize()); + + // Send the ClientHello ByteBuffer in the test case + if (debug) { + System.out.println("Sending Client Hello:\n" + + dumpHexBytes(test.data)); + } + + // Consume the client hello + serverResult = engine.unwrap(test.data, serverIn); + if (debug) { + log("server unwrap: ", serverResult); + } + if (serverResult.getStatus() != SSLEngineResult.Status.OK) { + throw new SSLException("Server unwrap got status: " + + serverResult.getStatus()); + } else if (serverResult.getHandshakeStatus() != + SSLEngineResult.HandshakeStatus.NEED_TASK) { + throw new SSLException("Server unwrap expected NEED_TASK, got: " + + serverResult.getHandshakeStatus()); + } + runDelegatedTasks(serverResult, engine); + if (engine.getHandshakeStatus() != + SSLEngineResult.HandshakeStatus.NEED_WRAP) { + throw new SSLException("Expected NEED_WRAP, got: " + + engine.getHandshakeStatus()); + } + + // Generate a TLS record with the ServerHello + serverResult = engine.wrap(serverOut, sTOc); + if (debug) { + log("client wrap: ", serverResult); + } + if (serverResult.getStatus() != SSLEngineResult.Status.OK) { + throw new SSLException("Client wrap got status: " + + serverResult.getStatus()); + } + sTOc.flip(); + + if (debug) { + log("Server Response:\n" + dumpHexBytes(sTOc)); + } + + return checkServerHello(sTOc, test.statReqEnabled, + test.statReqV2Enabled); + } + + /** + * Make a TLSv1.2 ClientHello with only RNI and no stapling extensions + */ + private static ByteBuffer makeHelloNoStaplingExts() throws IOException { + // Craft the ClientHello byte buffer + HelloExtensions exts = new HelloExtensions(); + exts.add(RNIEXT); + exts.add(SIGALGEXT); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a TLSv1.2 ClientHello with the RNI and Status Request extensions + */ + private static ByteBuffer makeDefaultStatReqOnly() throws IOException { + // Craft the ClientHello byte buffer + HelloExtensions exts = new HelloExtensions(); + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a TLSv1.2 ClientHello with the RNI and Status Request V2 extension + */ + private static ByteBuffer makeDefaultStatReqV2Only() throws IOException { + // Craft the ClientHello byte buffer + HelloExtensions exts = new HelloExtensions(); + OCSPStatusRequest osr = new OCSPStatusRequest(); + List<CertStatusReqItemV2> itemList = new ArrayList<>(2); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + osr)); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, osr)); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + /** + * Make a TLSv1.2 ClientHello with Status Request and Status Request V2 + * extensions. + */ + private static ByteBuffer makeDefaultStatReqBoth() throws IOException { + // Craft the ClientHello byte buffer + HelloExtensions exts = new HelloExtensions(); + OCSPStatusRequest osr = new OCSPStatusRequest(); + List<CertStatusReqItemV2> itemList = new ArrayList<>(2); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + osr)); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, osr)); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a ClientHello using a status_request that has a single + * responder ID in it. + */ + private static ByteBuffer makeStatReqWithRid() throws IOException { + HelloExtensions exts = new HelloExtensions(); + exts.add(RNIEXT); + exts.add(SIGALGEXT); + List<ResponderId> rids = new ArrayList<ResponderId>() {{ + add(new ResponderId(new X500Principal("CN=Foo"))); + }}; + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(rids, null))); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a ClientHello using a status_request that has no + * responder IDs but does provide the nonce extension. + */ + private static ByteBuffer makeStatReqNoRidNonce() throws IOException { + HelloExtensions exts = new HelloExtensions(); + exts.add(RNIEXT); + exts.add(SIGALGEXT); + List<Extension> ocspExts = new ArrayList<Extension>() {{ + add(new OCSPNonceExtension(16)); + }}; + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, ocspExts))); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a ClientHello using a default status_request and a + * status_request_v2 that has a single responder ID in it. + */ + private static ByteBuffer makeStatReqDefV2WithRid() throws IOException { + HelloExtensions exts = new HelloExtensions(); + List<ResponderId> rids = new ArrayList<ResponderId>() {{ + add(new ResponderId(new X500Principal("CN=Foo"))); + }}; + List<CertStatusReqItemV2> itemList = new ArrayList<>(2); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(rids, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, + new OCSPStatusRequest(rids, null))); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a ClientHello using a default status_request and a + * status_request_v2 that has a single responder ID in it for the + * OCSP_MULTI request item and a default OCSP request item. + */ + private static ByteBuffer makeStatReqDefV2MultiWithRidSingleDef() + throws IOException { + HelloExtensions exts = new HelloExtensions(); + List<ResponderId> rids = new ArrayList<ResponderId>() {{ + add(new ResponderId(new X500Principal("CN=Foo"))); + }}; + List<CertStatusReqItemV2> itemList = new ArrayList<>(2); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(rids, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a ClientHello using status_request and status_request_v2 where + * all underlying OCSPStatusRequests use responder IDs. + */ + private static ByteBuffer makeStatReqAllWithRid() throws IOException { + HelloExtensions exts = new HelloExtensions(); + List<ResponderId> rids = new ArrayList<ResponderId>() {{ + add(new ResponderId(new X500Principal("CN=Foo"))); + }}; + List<CertStatusReqItemV2> itemList = new ArrayList<>(2); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(rids, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, + new OCSPStatusRequest(rids, null))); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(rids, null))); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Make a TLSv1.2 ClientHello multiple CertStatusReqItemV2s of different + * types. One of the middle items should be acceptable while the others + * have responder IDs. The status_request (v1) should also be acceptable + * but should be overridden in favor of the status_request_v2. + */ + private static ByteBuffer makeHelloMultiV2andSingle() throws IOException { + // Craft the ClientHello byte buffer + HelloExtensions exts = new HelloExtensions(); + List<ResponderId> fooRid = Collections.singletonList( + new ResponderId(new X500Principal("CN=Foo"))); + List<ResponderId> barRid = Collections.singletonList( + new ResponderId(new X500Principal("CN=Bar"))); + List<CertStatusReqItemV2> itemList = new ArrayList<>(); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(fooRid, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(null, null))); + itemList.add(new CertStatusReqItemV2(StatusRequestType.OCSP_MULTI, + new OCSPStatusRequest(barRid, null))); + + exts.add(RNIEXT); + exts.add(SIGALGEXT); + exts.add(new CertStatusReqExtension(StatusRequestType.OCSP, + new OCSPStatusRequest(null, null))); + exts.add(new CertStatusReqListV2Extension(itemList)); + return createTlsRecord(Record.ct_handshake, VER_1_2, + createClientHelloMsg(VER_1_2, SID, SUITES, exts)); + } + + /** + * Wrap a TLS content message into a TLS record header + * + * @param contentType a byte containing the content type value + * @param pv the protocol version for this record + * @param data a byte buffer containing the message data + * @return + */ + private static ByteBuffer createTlsRecord(byte contentType, + ProtocolVersion pv, ByteBuffer data) { + int msgLen = (data != null) ? data.limit() : 0; + + // Allocate enough space to hold the TLS record header + the message + ByteBuffer recordBuf = ByteBuffer.allocate(msgLen + 5); + recordBuf.put(contentType); + recordBuf.putShort((short)pv.v); + recordBuf.putShort((short)msgLen); + if (msgLen > 0) { + recordBuf.put(data); + } + + recordBuf.flip(); + return recordBuf; + } + + /** + * Craft and encode a ClientHello message as a byte array. + * + * @param pv the protocol version asserted in the hello message. + * @param sessId the session ID for this hello message. + * @param suites a list consisting of one or more cipher suite objects + * @param extensions a list of HelloExtension objects + * + * @return a byte array containing the encoded ClientHello message. + */ + private static ByteBuffer createClientHelloMsg(ProtocolVersion pv, + SessionId sessId, CipherSuiteList suites, + HelloExtensions extensions) throws IOException { + ByteBuffer msgBuf; + + HandshakeOutStream hsos = + new HandshakeOutStream(new SSLEngineOutputRecord()); + + // Construct the client hello object from the first 3 parameters + HandshakeMessage.ClientHello cHello = + new HandshakeMessage.ClientHello(RNG, pv, sessId, suites, + false); + + // Use the HelloExtensions provided by the caller + if (extensions != null) { + cHello.extensions = extensions; + } + + cHello.send(hsos); + msgBuf = ByteBuffer.allocate(hsos.size() + 4); + + // Combine the handshake type with the length + msgBuf.putInt((HandshakeMessage.ht_client_hello << 24) | + (hsos.size() & 0x00FFFFFF)); + msgBuf.put(hsos.toByteArray()); + msgBuf.flip(); + return msgBuf; + } + + /* + * If the result indicates that we have outstanding tasks to do, + * go ahead and run them in this thread. + */ + private static void runDelegatedTasks(SSLEngineResult result, + SSLEngine engine) throws Exception { + + if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) { + Runnable runnable; + while ((runnable = engine.getDelegatedTask()) != null) { + if (debug) { + log("\trunning delegated task..."); + } + runnable.run(); + } + HandshakeStatus hsStatus = engine.getHandshakeStatus(); + if (hsStatus == HandshakeStatus.NEED_TASK) { + throw new Exception( + "handshake shouldn't need additional tasks"); + } + if (debug) { + log("\tnew HandshakeStatus: " + hsStatus); + } + } + } + + private static void log(String str, SSLEngineResult result) { + if (!logging) { + return; + } + HandshakeStatus hsStatus = result.getHandshakeStatus(); + log(str + + result.getStatus() + "/" + hsStatus + ", " + + result.bytesConsumed() + "/" + result.bytesProduced() + + " bytes"); + if (hsStatus == HandshakeStatus.FINISHED) { + log("\t...ready for application data"); + } + } + + private static void log(String str) { + if (logging) { + System.out.println(str); + } + } + + /** + * Dump a ByteBuffer as a hexdump to stdout. The dumping routine will + * start at the current position of the buffer and run to its limit. + * After completing the dump, the position will be returned to its + * starting point. + * + * @param data the ByteBuffer to dump to stdout. + * + * @return the hexdump of the byte array. + */ + private static String dumpHexBytes(ByteBuffer data) { + StringBuilder sb = new StringBuilder(); + if (data != null) { + int i = 0; + data.mark(); + while (data.hasRemaining()) { + if (i % 16 == 0 && i != 0) { + sb.append("\n"); + } + sb.append(String.format("%02X ", data.get())); + i++; + } + data.reset(); + } + + return sb.toString(); + } + + /** + * Tests the ServerHello for the presence (or not) of the status_request + * or status_request_v2 hello extension. It is assumed that the provided + * ByteBuffer has its position set at the first byte of the TLS record + * containing the ServerHello and contains the entire hello message. Upon + * successful completion of this method the ByteBuffer will have its + * position reset to the initial offset in the buffer. If an exception is + * thrown the position at the time of the exception will be preserved. + * + * @param statReqPresent true if the status_request hello extension should + * be present. + * @param statReqV2Present true if the status_request_v2 hello extension + * should be present. + * + * @return true if the ServerHello's extension set matches the presence + * booleans for status_request and status_request_v2. False if + * not, or if the TLS record or message is of the wrong type. + */ + private static boolean checkServerHello(ByteBuffer data, + boolean statReqPresent, boolean statReqV2Present) { + boolean hasV1 = false; + boolean hasV2 = false; + Objects.requireNonNull(data); + int startPos = data.position(); + data.mark(); + + // Process the TLS record header + int type = Byte.toUnsignedInt(data.get()); + int ver_major = Byte.toUnsignedInt(data.get()); + int ver_minor = Byte.toUnsignedInt(data.get()); + int recLen = Short.toUnsignedInt(data.getShort()); + + // Simple sanity checks + if (type != 22) { + log("Not a handshake: Type = " + type); + return false; + } else if (recLen > data.remaining()) { + log("Incomplete record in buffer: Record length = " + recLen + + ", Remaining = " + data.remaining()); + return false; + } + + // Grab the handshake message header. + int msgHdr = data.getInt(); + int msgType = (msgHdr >> 24) & 0x000000FF; + int msgLen = msgHdr & 0x00FFFFFF; + + // More simple sanity checks + if (msgType != 2) { + log("Not a ServerHello: Type = " + msgType); + return false; + } + + // Skip over the protocol version and server random + data.position(data.position() + 34); + + // Jump past the session ID + int sessLen = Byte.toUnsignedInt(data.get()); + if (sessLen != 0) { + data.position(data.position() + sessLen); + } + + // Skip the cipher suite and compression method + data.position(data.position() + 3); + + // Go through the extensions and look for the request extension + // expected by the caller. + int extsLen = Short.toUnsignedInt(data.getShort()); + while (data.position() < recLen + startPos + 5) { + int extType = Short.toUnsignedInt(data.getShort()); + int extLen = Short.toUnsignedInt(data.getShort()); + hasV1 |= (extType == ExtensionType.EXT_STATUS_REQUEST.id); + hasV2 |= (extType == ExtensionType.EXT_STATUS_REQUEST_V2.id); + data.position(data.position() + extLen); + } + + if (hasV1 != statReqPresent) { + log("The status_request extension is " + + "inconsistent with the expected result: expected = " + + statReqPresent + ", actual = " + hasV1); + } + if (hasV2 != statReqV2Present) { + log("The status_request_v2 extension is " + + "inconsistent with the expected result: expected = " + + statReqV2Present + ", actual = " + hasV2); + } + + // Reset the position to the initial spot at the start of this method. + data.reset(); + + return ((hasV1 == statReqPresent) && (hasV2 == statReqV2Present)); + } + + /** + * Creates the PKI components necessary for this test, including + * Root CA, Intermediate CA and SSL server certificates, the keystores + * for each entity, a client trust store, and starts the OCSP responders. + */ + private static void createPKI() throws Exception { + CertificateBuilder cbld = new CertificateBuilder(); + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(2048); + KeyStore.Builder keyStoreBuilder = + KeyStore.Builder.newInstance("PKCS12", null, + new KeyStore.PasswordProtection(passwd.toCharArray())); + + // Generate Root, IntCA, EE keys + KeyPair rootCaKP = keyGen.genKeyPair(); + log("Generated Root CA KeyPair"); + KeyPair intCaKP = keyGen.genKeyPair(); + log("Generated Intermediate CA KeyPair"); + KeyPair sslKP = keyGen.genKeyPair(); + log("Generated SSL Cert KeyPair"); + + // Set up the Root CA Cert + cbld.setSubjectName("CN=Root CA Cert, O=SomeCompany"); + cbld.setPublicKey(rootCaKP.getPublic()); + cbld.setSerialNumber(new BigInteger("1")); + // Make a 3 year validity starting from 60 days ago + long start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(60); + long end = start + TimeUnit.DAYS.toMillis(1085); + cbld.setValidity(new Date(start), new Date(end)); + addCommonExts(cbld, rootCaKP.getPublic(), rootCaKP.getPublic()); + addCommonCAExts(cbld); + // Make our Root CA Cert! + X509Certificate rootCert = cbld.build(null, rootCaKP.getPrivate(), + "SHA256withRSA"); + log("Root CA Created:\n" + certInfo(rootCert)); + + // Now build a keystore and add the keys and cert + rootKeystore = keyStoreBuilder.getKeyStore(); + java.security.cert.Certificate[] rootChain = {rootCert}; + rootKeystore.setKeyEntry(ROOT_ALIAS, rootCaKP.getPrivate(), + passwd.toCharArray(), rootChain); + + // Now fire up the OCSP responder + rootOcsp = new SimpleOCSPServer(rootKeystore, passwd, ROOT_ALIAS, null); + rootOcsp.enableLog(debug); + rootOcsp.setNextUpdateInterval(3600); + rootOcsp.start(); + + // Wait 5 seconds for server ready + for (int i = 0; (i < 100 && !rootOcsp.isServerReady()); i++) { + Thread.sleep(50); + } + if (!rootOcsp.isServerReady()) { + throw new RuntimeException("Server not ready yet"); + } + + rootOcspPort = rootOcsp.getPort(); + String rootRespURI = "http://localhost:" + rootOcspPort; + log("Root OCSP Responder URI is " + rootRespURI); + + // Now that we have the root keystore and OCSP responder we can + // create our intermediate CA. + cbld.reset(); + cbld.setSubjectName("CN=Intermediate CA Cert, O=SomeCompany"); + cbld.setPublicKey(intCaKP.getPublic()); + cbld.setSerialNumber(new BigInteger("100")); + // Make a 2 year validity starting from 30 days ago + start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(30); + end = start + TimeUnit.DAYS.toMillis(730); + cbld.setValidity(new Date(start), new Date(end)); + addCommonExts(cbld, intCaKP.getPublic(), rootCaKP.getPublic()); + addCommonCAExts(cbld); + cbld.addAIAExt(Collections.singletonList(rootRespURI)); + // Make our Intermediate CA Cert! + X509Certificate intCaCert = cbld.build(rootCert, rootCaKP.getPrivate(), + "SHA256withRSA"); + log("Intermediate CA Created:\n" + certInfo(intCaCert)); + + // Provide intermediate CA cert revocation info to the Root CA + // OCSP responder. + Map<BigInteger, SimpleOCSPServer.CertStatusInfo> revInfo = + new HashMap<>(); + revInfo.put(intCaCert.getSerialNumber(), + new SimpleOCSPServer.CertStatusInfo( + SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD)); + rootOcsp.updateStatusDb(revInfo); + + // Now build a keystore and add the keys, chain and root cert as a TA + intKeystore = keyStoreBuilder.getKeyStore(); + java.security.cert.Certificate[] intChain = {intCaCert, rootCert}; + intKeystore.setKeyEntry(INT_ALIAS, intCaKP.getPrivate(), + passwd.toCharArray(), intChain); + intKeystore.setCertificateEntry(ROOT_ALIAS, rootCert); + + // Now fire up the Intermediate CA OCSP responder + intOcsp = new SimpleOCSPServer(intKeystore, passwd, + INT_ALIAS, null); + intOcsp.enableLog(debug); + intOcsp.setNextUpdateInterval(3600); + intOcsp.start(); + + // Wait 5 seconds for server ready + for (int i = 0; (i < 100 && !intOcsp.isServerReady()); i++) { + Thread.sleep(50); + } + if (!intOcsp.isServerReady()) { + throw new RuntimeException("Server not ready yet"); + } + + intOcspPort = intOcsp.getPort(); + String intCaRespURI = "http://localhost:" + intOcspPort; + log("Intermediate CA OCSP Responder URI is " + intCaRespURI); + + // Last but not least, let's make our SSLCert and add it to its own + // Keystore + cbld.reset(); + cbld.setSubjectName("CN=SSLCertificate, O=SomeCompany"); + cbld.setPublicKey(sslKP.getPublic()); + cbld.setSerialNumber(new BigInteger("4096")); + // Make a 1 year validity starting from 7 days ago + start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7); + end = start + TimeUnit.DAYS.toMillis(365); + cbld.setValidity(new Date(start), new Date(end)); + + // Add extensions + addCommonExts(cbld, sslKP.getPublic(), intCaKP.getPublic()); + boolean[] kuBits = {true, false, true, false, false, false, + false, false, false}; + cbld.addKeyUsageExt(kuBits); + List<String> ekuOids = new ArrayList<>(); + ekuOids.add("1.3.6.1.5.5.7.3.1"); + ekuOids.add("1.3.6.1.5.5.7.3.2"); + cbld.addExtendedKeyUsageExt(ekuOids); + cbld.addSubjectAltNameDNSExt(Collections.singletonList("localhost")); + cbld.addAIAExt(Collections.singletonList(intCaRespURI)); + // Make our SSL Server Cert! + X509Certificate sslCert = cbld.build(intCaCert, intCaKP.getPrivate(), + "SHA256withRSA"); + log("SSL Certificate Created:\n" + certInfo(sslCert)); + + // Provide SSL server cert revocation info to the Intermeidate CA + // OCSP responder. + revInfo = new HashMap<>(); + revInfo.put(sslCert.getSerialNumber(), + new SimpleOCSPServer.CertStatusInfo( + SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD)); + intOcsp.updateStatusDb(revInfo); + + // Now build a keystore and add the keys, chain and root cert as a TA + serverKeystore = keyStoreBuilder.getKeyStore(); + java.security.cert.Certificate[] sslChain = {sslCert, intCaCert, rootCert}; + serverKeystore.setKeyEntry(SSL_ALIAS, sslKP.getPrivate(), + passwd.toCharArray(), sslChain); + serverKeystore.setCertificateEntry(ROOT_ALIAS, rootCert); + + // And finally a Trust Store for the client + trustStore = keyStoreBuilder.getKeyStore(); + trustStore.setCertificateEntry(ROOT_ALIAS, rootCert); + } + + private static void addCommonExts(CertificateBuilder cbld, + PublicKey subjKey, PublicKey authKey) throws IOException { + cbld.addSubjectKeyIdExt(subjKey); + cbld.addAuthorityKeyIdExt(authKey); + } + + private static void addCommonCAExts(CertificateBuilder cbld) + throws IOException { + cbld.addBasicConstraintsExt(true, true, -1); + // Set key usage bits for digitalSignature, keyCertSign and cRLSign + boolean[] kuBitSettings = {true, false, false, false, false, true, + true, false, false}; + cbld.addKeyUsageExt(kuBitSettings); + } + + /** + * Helper routine that dumps only a few cert fields rather than + * the whole toString() output. + * + * @param cert an X509Certificate to be displayed + * + * @return the String output of the issuer, subject and + * serial number + */ + private static String certInfo(X509Certificate cert) { + StringBuilder sb = new StringBuilder(); + sb.append("Issuer: ").append(cert.getIssuerX500Principal()). + append("\n"); + sb.append("Subject: ").append(cert.getSubjectX500Principal()). + append("\n"); + sb.append("Serial: ").append(cert.getSerialNumber()).append("\n"); + return sb.toString(); + } + + private static class TestCase { + public final String testName; + public final ByteBuffer data; + public final boolean statReqEnabled; + public final boolean statReqV2Enabled; + + TestCase(String name, ByteBuffer buffer, boolean srEn, boolean srv2En) { + testName = (name != null) ? name : ""; + data = Objects.requireNonNull(buffer, + "TestCase requires a non-null ByteBuffer"); + statReqEnabled = srEn; + statReqV2Enabled = srv2En; + } + } +} From 23853ed3e482278fcd44521dc463acfb0bf396a9 Mon Sep 17 00:00:00 2001 From: Sean Coffey <coffeys@openjdk.org> Date: Wed, 10 Aug 2016 11:54:12 +0100 Subject: [PATCH 07/15] 8163104: Unexpected NPE still possible on some Kerberos ticket calls Reviewed-by: weijun --- .../classes/sun/security/jgss/krb5/Krb5InitCredential.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java index aabe0a103de..28dbb189bd9 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java @@ -235,8 +235,11 @@ public class Krb5InitCredential */ public int getInitLifetime() throws GSSException { int retVal = 0; - retVal = (int)(getEndTime().getTime() - - (new Date().getTime())); + Date d = getEndTime(); + if (d == null) { + return 0; + } + retVal = (int)(d.getTime() - (new Date().getTime())); return retVal/1000; } From bb95ea61018272bc42bfd248b47e7e5eec03c6a6 Mon Sep 17 00:00:00 2001 From: Claes Redestad <redestad@openjdk.org> Date: Wed, 10 Aug 2016 13:54:38 +0200 Subject: [PATCH 08/15] 8163370: Reduce number of classes loaded by common usage of java.lang.invoke Reviewed-by: igerasim, psandoz --- .../java/lang/invoke/DirectMethodHandle.java | 2 +- .../java/lang/invoke/LambdaFormEditor.java | 98 +++--- .../classes/java/lang/invoke/MemberName.java | 4 +- .../java/lang/invoke/MethodHandles.java | 4 +- .../java/lang/invoke/StringConcatFactory.java | 280 +++++++----------- .../invoke/TypeConvertingMethodAdapter.java | 2 +- .../classes/java/lang/invoke/VarHandle.java | 93 +++--- .../sun/invoke/util/ValueConversions.java | 27 +- .../classes/sun/invoke/util/Wrapper.java | 7 +- 9 files changed, 224 insertions(+), 293 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java index c980fb80f69..17bf2d9c5e7 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java @@ -515,7 +515,7 @@ class DirectMethodHandle extends MethodHandle { // Enumerate the different field kinds using Wrapper, // with an extra case added for checked references. private static final int - FT_LAST_WRAPPER = Wrapper.values().length-1, + FT_LAST_WRAPPER = Wrapper.COUNT-1, FT_UNCHECKED_REF = Wrapper.OBJECT.ordinal(), FT_CHECKED_REF = FT_LAST_WRAPPER+1, FT_LIMIT = FT_LAST_WRAPPER+2; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java index 9d6c865eae5..cec4ff1ea54 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/LambdaFormEditor.java @@ -60,7 +60,7 @@ class LambdaFormEditor { } /** A description of a cached transform, possibly associated with the result of the transform. - * The logical content is a sequence of byte values, starting with a Kind.ordinal value. + * The logical content is a sequence of byte values, starting with a kind value. * The sequence is unterminated, ending with an indefinite number of zero bytes. * Sequences that are simple (short enough and with small enough values) pack into a 64-bit long. */ @@ -68,17 +68,22 @@ class LambdaFormEditor { final long packedBytes; final byte[] fullBytes; - private enum Kind { - NO_KIND, // necessary because ordinal must be greater than zero - BIND_ARG, ADD_ARG, DUP_ARG, - SPREAD_ARGS, - FILTER_ARG, FILTER_RETURN, FILTER_RETURN_TO_ZERO, - COLLECT_ARGS, COLLECT_ARGS_TO_VOID, COLLECT_ARGS_TO_ARRAY, - FOLD_ARGS, FOLD_ARGS_TO_VOID, - PERMUTE_ARGS, - LOCAL_TYPES - //maybe add more for guard with test, catch exception, pointwise type conversions - } + // maybe add more for guard with test, catch exception, pointwise type conversions + private static final byte + BIND_ARG = 1, + ADD_ARG = 2, + DUP_ARG = 3, + SPREAD_ARGS = 4, + FILTER_ARG = 5, + FILTER_RETURN = 6, + FILTER_RETURN_TO_ZERO = 7, + COLLECT_ARGS = 8, + COLLECT_ARGS_TO_VOID = 9, + COLLECT_ARGS_TO_ARRAY = 10, + FOLD_ARGS = 11, + FOLD_ARGS_TO_VOID = 12, + PERMUTE_ARGS = 13, + LOCAL_TYPES = 14; private static final boolean STRESS_TEST = false; // turn on to disable most packing private static final int @@ -131,20 +136,6 @@ class LambdaFormEditor { return bytes; } - private byte byteAt(int i) { - long pb = packedBytes; - if (pb == 0) { - if (i >= fullBytes.length) return 0; - return fullBytes[i]; - } - assert(fullBytes == null); - if (i > PACKED_BYTE_MAX_LENGTH) return 0; - int pos = (i * PACKED_BYTE_SIZE); - return (byte)((pb >>> pos) & PACKED_BYTE_MASK); - } - - Kind kind() { return Kind.values()[byteAt(0)]; } - private Transform(long packedBytes, byte[] fullBytes, LambdaForm result) { super(result); this.packedBytes = packedBytes; @@ -162,44 +153,39 @@ class LambdaFormEditor { assert((b & 0xFF) == b); // incoming value must fit in *unsigned* byte return (byte)b; } - private static byte bval(Kind k) { - return bval(k.ordinal()); - } - static Transform of(Kind k, int b1) { + static Transform of(byte k, int b1) { byte b0 = bval(k); if (inRange(b0 | b1)) return new Transform(packedBytes(b0, b1)); else return new Transform(fullBytes(b0, b1)); } - static Transform of(Kind k, int b1, int b2) { - byte b0 = (byte) k.ordinal(); + static Transform of(byte b0, int b1, int b2) { if (inRange(b0 | b1 | b2)) return new Transform(packedBytes(b0, b1, b2)); else return new Transform(fullBytes(b0, b1, b2)); } - static Transform of(Kind k, int b1, int b2, int b3) { - byte b0 = (byte) k.ordinal(); + static Transform of(byte b0, int b1, int b2, int b3) { if (inRange(b0 | b1 | b2 | b3)) return new Transform(packedBytes(b0, b1, b2, b3)); else return new Transform(fullBytes(b0, b1, b2, b3)); } private static final byte[] NO_BYTES = {}; - static Transform of(Kind k, int... b123) { - return ofBothArrays(k, b123, NO_BYTES); + static Transform of(byte kind, int... b123) { + return ofBothArrays(kind, b123, NO_BYTES); } - static Transform of(Kind k, int b1, byte[] b234) { - return ofBothArrays(k, new int[]{ b1 }, b234); + static Transform of(byte kind, int b1, byte[] b234) { + return ofBothArrays(kind, new int[]{ b1 }, b234); } - static Transform of(Kind k, int b1, int b2, byte[] b345) { - return ofBothArrays(k, new int[]{ b1, b2 }, b345); + static Transform of(byte kind, int b1, int b2, byte[] b345) { + return ofBothArrays(kind, new int[]{ b1, b2 }, b345); } - private static Transform ofBothArrays(Kind k, int[] b123, byte[] b456) { + private static Transform ofBothArrays(byte kind, int[] b123, byte[] b456) { byte[] fullBytes = new byte[1 + b123.length + b456.length]; int i = 0; - fullBytes[i++] = bval(k); + fullBytes[i++] = bval(kind); for (int bv : b123) { fullBytes[i++] = bval(bv); } @@ -449,7 +435,7 @@ class LambdaFormEditor { // Each editing method can (potentially) cache the edited LF so that it can be reused later. LambdaForm bindArgumentForm(int pos) { - Transform key = Transform.of(Transform.Kind.BIND_ARG, pos); + Transform key = Transform.of(Transform.BIND_ARG, pos); LambdaForm form = getInCache(key); if (form != null) { assert(form.parameterConstraint(0) == newSpeciesData(lambdaForm.parameterType(pos))); @@ -484,7 +470,7 @@ class LambdaFormEditor { } LambdaForm addArgumentForm(int pos, BasicType type) { - Transform key = Transform.of(Transform.Kind.ADD_ARG, pos, type.ordinal()); + Transform key = Transform.of(Transform.ADD_ARG, pos, type.ordinal()); LambdaForm form = getInCache(key); if (form != null) { assert(form.arity == lambdaForm.arity+1); @@ -501,7 +487,7 @@ class LambdaFormEditor { } LambdaForm dupArgumentForm(int srcPos, int dstPos) { - Transform key = Transform.of(Transform.Kind.DUP_ARG, srcPos, dstPos); + Transform key = Transform.of(Transform.DUP_ARG, srcPos, dstPos); LambdaForm form = getInCache(key); if (form != null) { assert(form.arity == lambdaForm.arity-1); @@ -530,7 +516,7 @@ class LambdaFormEditor { elementTypeKey = TYPE_LIMIT + Wrapper.forPrimitiveType(elementType).ordinal(); } } - Transform key = Transform.of(Transform.Kind.SPREAD_ARGS, pos, elementTypeKey, arrayLength); + Transform key = Transform.of(Transform.SPREAD_ARGS, pos, elementTypeKey, arrayLength); LambdaForm form = getInCache(key); if (form != null) { assert(form.arity == lambdaForm.arity - arrayLength + 1); @@ -569,9 +555,9 @@ class LambdaFormEditor { return filterArgumentForm(pos, basicType(collectorType.parameterType(0))); } byte[] newTypes = BasicType.basicTypesOrd(collectorType.parameterArray()); - Transform.Kind kind = (dropResult - ? Transform.Kind.COLLECT_ARGS_TO_VOID - : Transform.Kind.COLLECT_ARGS); + byte kind = (dropResult + ? Transform.COLLECT_ARGS_TO_VOID + : Transform.COLLECT_ARGS); if (dropResult && collectorArity == 0) pos = 1; // pure side effect Transform key = Transform.of(kind, pos, collectorArity, newTypes); LambdaForm form = getInCache(key); @@ -598,7 +584,7 @@ class LambdaFormEditor { argTypeKey = TYPE_LIMIT + Wrapper.forPrimitiveType(elementType).ordinal(); } assert(collectorType.parameterList().equals(Collections.nCopies(collectorArity, elementType))); - Transform.Kind kind = Transform.Kind.COLLECT_ARGS_TO_ARRAY; + byte kind = Transform.COLLECT_ARGS_TO_ARRAY; Transform key = Transform.of(kind, pos, collectorArity, argTypeKey); LambdaForm form = getInCache(key); if (form != null) { @@ -634,7 +620,7 @@ class LambdaFormEditor { } LambdaForm filterArgumentForm(int pos, BasicType newType) { - Transform key = Transform.of(Transform.Kind.FILTER_ARG, pos, newType.ordinal()); + Transform key = Transform.of(Transform.FILTER_ARG, pos, newType.ordinal()); LambdaForm form = getInCache(key); if (form != null) { assert(form.arity == lambdaForm.arity); @@ -710,7 +696,7 @@ class LambdaFormEditor { } LambdaForm filterReturnForm(BasicType newType, boolean constantZero) { - Transform.Kind kind = (constantZero ? Transform.Kind.FILTER_RETURN_TO_ZERO : Transform.Kind.FILTER_RETURN); + byte kind = (constantZero ? Transform.FILTER_RETURN_TO_ZERO : Transform.FILTER_RETURN); Transform key = Transform.of(kind, newType.ordinal()); LambdaForm form = getInCache(key); if (form != null) { @@ -762,11 +748,11 @@ class LambdaFormEditor { LambdaForm foldArgumentsForm(int foldPos, boolean dropResult, MethodType combinerType) { int combinerArity = combinerType.parameterCount(); - Transform.Kind kind = (dropResult ? Transform.Kind.FOLD_ARGS_TO_VOID : Transform.Kind.FOLD_ARGS); + byte kind = (dropResult ? Transform.FOLD_ARGS_TO_VOID : Transform.FOLD_ARGS); Transform key = Transform.of(kind, foldPos, combinerArity); LambdaForm form = getInCache(key); if (form != null) { - assert(form.arity == lambdaForm.arity - (kind == Transform.Kind.FOLD_ARGS ? 1 : 0)); + assert(form.arity == lambdaForm.arity - (kind == Transform.FOLD_ARGS ? 1 : 0)); return form; } form = makeArgumentCombinationForm(foldPos, combinerType, true, dropResult); @@ -786,7 +772,7 @@ class LambdaFormEditor { } assert(skip + reorder.length == lambdaForm.arity); if (nullPerm) return lambdaForm; // do not bother to cache - Transform key = Transform.of(Transform.Kind.PERMUTE_ARGS, reorder); + Transform key = Transform.of(Transform.PERMUTE_ARGS, reorder); LambdaForm form = getInCache(key); if (form != null) { assert(form.arity == skip+inTypes) : form; @@ -855,7 +841,7 @@ class LambdaFormEditor { int[] desc = BasicType.basicTypeOrds(localTypes); desc = Arrays.copyOf(desc, desc.length + 1); desc[desc.length - 1] = pos; - Transform key = Transform.of(Transform.Kind.LOCAL_TYPES, desc); + Transform key = Transform.of(Transform.LOCAL_TYPES, desc); LambdaForm form = getInCache(key); if (form != null) { return form; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java index 3b56095d438..7deb1f7d81f 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java @@ -1002,7 +1002,9 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; Collections.addAll(result, buf0); } } - result.addAll(Arrays.asList(buf).subList(0, bufCount)); + for (int i = 0; i < bufCount; i++) { + result.add(buf[i]); + } // Signature matching is not the same as type matching, since // one signature might correspond to several types. // So if matchType is a Class or MethodType, refilter the results. diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 60077a889b0..3163cdee24e 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -3115,7 +3115,7 @@ assert((int)twice.invokeExact(21) == 42); return dropArguments(zero(type.returnType()), 0, type.parameterList()); } - private static final MethodHandle[] IDENTITY_MHS = new MethodHandle[Wrapper.values().length]; + private static final MethodHandle[] IDENTITY_MHS = new MethodHandle[Wrapper.COUNT]; private static MethodHandle makeIdentity(Class<?> ptype) { MethodType mtype = methodType(ptype, ptype); LambdaForm lform = LambdaForm.identityForm(BasicType.basicType(ptype)); @@ -3133,7 +3133,7 @@ assert((int)twice.invokeExact(21) == 42); assert(btw == Wrapper.OBJECT); return makeZero(rtype); } - private static final MethodHandle[] ZERO_MHS = new MethodHandle[Wrapper.values().length]; + private static final MethodHandle[] ZERO_MHS = new MethodHandle[Wrapper.COUNT]; private static MethodHandle makeZero(Class<?> rtype) { MethodType mtype = methodType(rtype); LambdaForm lform = LambdaForm.zeroForm(BasicType.basicType(rtype)); diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java index 4702bd55ba4..fcacf1b04ea 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java @@ -281,8 +281,7 @@ public final class StringConcatFactory { if (c == TAG_CONST) { Object cnst = constants[constC++]; el.add(new RecipeElement(cnst)); - } - if (c == TAG_ARG) { + } else if (c == TAG_ARG) { el.add(new RecipeElement(argC++)); } } else { @@ -322,32 +321,30 @@ public final class StringConcatFactory { private static final class RecipeElement { private final Object value; private final int argPos; - private final Tag tag; public RecipeElement(Object cnst) { this.value = Objects.requireNonNull(cnst); this.argPos = -1; - this.tag = Tag.CONST; } public RecipeElement(int arg) { this.value = null; + assert (arg >= 0); this.argPos = arg; - this.tag = Tag.ARG; } public Object getValue() { - assert (tag == Tag.CONST); + assert (isConst()); return value; } public int getArgPos() { - assert (tag == Tag.ARG); + assert (!isConst()); return argPos; } - public Tag getTag() { - return tag; + public boolean isConst() { + return argPos == -1; } @Override @@ -357,22 +354,19 @@ public final class StringConcatFactory { RecipeElement that = (RecipeElement) o; - if (tag != that.tag) return false; - if (tag == Tag.CONST && (!value.equals(that.value))) return false; - if (tag == Tag.ARG && (argPos != that.argPos)) return false; + boolean isConst = isConst(); + if (isConst != that.isConst()) return false; + if (isConst && (!value.equals(that.value))) return false; + if (!isConst && (argPos != that.argPos)) return false; return true; } @Override public int hashCode() { - return tag.hashCode(); + return argPos; } } - private enum Tag { - CONST, ARG - } - /** * Facilitates the creation of optimized String concatenation methods, that * can be used to efficiently concatenate a known number of arguments of @@ -880,31 +874,24 @@ public final class StringConcatFactory { int off = 0; for (RecipeElement el : recipe.getElements()) { - switch (el.getTag()) { - case CONST: { - // Guaranteed non-null, no null check required. - break; + if (el.isConst()) { + // Guaranteed non-null, no null check required. + } else { + // Null-checks are needed only for String arguments, and when a previous stage + // did not do implicit null-checks. If a String is null, we eagerly replace it + // with "null" constant. Note, we omit Objects here, because we don't call + // .length() on them down below. + int ac = el.getArgPos(); + Class<?> cl = arr[ac]; + if (cl == String.class && !guaranteedNonNull[ac]) { + Label l0 = new Label(); + mv.visitIntInsn(ALOAD, off); + mv.visitJumpInsn(IFNONNULL, l0); + mv.visitLdcInsn("null"); + mv.visitIntInsn(ASTORE, off); + mv.visitLabel(l0); } - case ARG: { - // Null-checks are needed only for String arguments, and when a previous stage - // did not do implicit null-checks. If a String is null, we eagerly replace it - // with "null" constant. Note, we omit Objects here, because we don't call - // .length() on them down below. - int ac = el.getArgPos(); - Class<?> cl = arr[ac]; - if (cl == String.class && !guaranteedNonNull[ac]) { - Label l0 = new Label(); - mv.visitIntInsn(ALOAD, off); - mv.visitJumpInsn(IFNONNULL, l0); - mv.visitLdcInsn("null"); - mv.visitIntInsn(ASTORE, off); - mv.visitLabel(l0); - } - off += getParameterSize(cl); - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); + off += getParameterSize(cl); } } } @@ -925,37 +912,30 @@ public final class StringConcatFactory { mv.visitInsn(ICONST_0); for (RecipeElement el : recipe.getElements()) { - switch (el.getTag()) { - case CONST: { - Object cnst = el.getValue(); - len += cnst.toString().length(); - break; + if (el.isConst()) { + Object cnst = el.getValue(); + len += cnst.toString().length(); + } else { + /* + If an argument is String, then we can call .length() on it. Sized/Exact modes have + converted arguments for us. If an argument is primitive, we can provide a guess + for its String representation size. + */ + Class<?> cl = arr[el.getArgPos()]; + if (cl == String.class) { + mv.visitIntInsn(ALOAD, off); + mv.visitMethodInsn( + INVOKEVIRTUAL, + "java/lang/String", + "length", + "()I", + false + ); + mv.visitInsn(IADD); + } else if (cl.isPrimitive()) { + len += estimateSize(cl); } - case ARG: { - /* - If an argument is String, then we can call .length() on it. Sized/Exact modes have - converted arguments for us. If an argument is primitive, we can provide a guess - for its String representation size. - */ - Class<?> cl = arr[el.getArgPos()]; - if (cl == String.class) { - mv.visitIntInsn(ALOAD, off); - mv.visitMethodInsn( - INVOKEVIRTUAL, - "java/lang/String", - "length", - "()I", - false - ); - mv.visitInsn(IADD); - } else if (cl.isPrimitive()) { - len += estimateSize(cl); - } - off += getParameterSize(cl); - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); + off += getParameterSize(cl); } } @@ -987,23 +967,17 @@ public final class StringConcatFactory { int off = 0; for (RecipeElement el : recipe.getElements()) { String desc; - switch (el.getTag()) { - case CONST: { - Object cnst = el.getValue(); - mv.visitLdcInsn(cnst); - desc = getSBAppendDesc(cnst.getClass()); - break; - } - case ARG: { - Class<?> cl = arr[el.getArgPos()]; - mv.visitVarInsn(getLoadOpcode(cl), off); - off += getParameterSize(cl); - desc = getSBAppendDesc(cl); - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); + if (el.isConst()) { + Object cnst = el.getValue(); + mv.visitLdcInsn(cnst); + desc = getSBAppendDesc(cnst.getClass()); + } else { + Class<?> cl = arr[el.getArgPos()]; + mv.visitVarInsn(getLoadOpcode(cl), off); + off += getParameterSize(cl); + desc = getSBAppendDesc(cl); } + mv.visitMethodInsn( INVOKEVIRTUAL, "java/lang/StringBuilder", @@ -1279,26 +1253,19 @@ public final class StringConcatFactory { // call the usual String.length(). Primitive values string sizes can be estimated. int initial = 0; for (RecipeElement el : recipe.getElements()) { - switch (el.getTag()) { - case CONST: { - Object cnst = el.getValue(); - initial += cnst.toString().length(); - break; + if (el.isConst()) { + Object cnst = el.getValue(); + initial += cnst.toString().length(); + } else { + final int i = el.getArgPos(); + Class<?> type = ptypesList.get(i); + if (type.isPrimitive()) { + MethodHandle est = MethodHandles.constant(int.class, estimateSize(type)); + est = MethodHandles.dropArguments(est, 0, type); + lengthers[i] = est; + } else { + lengthers[i] = STRING_LENGTH; } - case ARG: { - final int i = el.getArgPos(); - Class<?> type = ptypesList.get(i); - if (type.isPrimitive()) { - MethodHandle est = MethodHandles.constant(int.class, estimateSize(type)); - est = MethodHandles.dropArguments(est, 0, type); - lengthers[i] = est; - } else { - lengthers[i] = STRING_LENGTH; - } - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); } } @@ -1311,26 +1278,19 @@ public final class StringConcatFactory { for (int i = elements.size() - 1; i >= 0; i--) { RecipeElement el = elements.get(i); MethodHandle appender; - switch (el.getTag()) { - case CONST: { - Object constant = el.getValue(); - MethodHandle mh = appender(adaptToStringBuilder(constant.getClass())); - appender = MethodHandles.insertArguments(mh, 1, constant); - break; - } - case ARG: { - int ac = el.getArgPos(); - appender = appender(ptypesList.get(ac)); + if (el.isConst()) { + Object constant = el.getValue(); + MethodHandle mh = appender(adaptToStringBuilder(constant.getClass())); + appender = MethodHandles.insertArguments(mh, 1, constant); + } else { + int ac = el.getArgPos(); + appender = appender(ptypesList.get(ac)); - // Insert dummy arguments to match the prefix in the signature. - // The actual appender argument will be the ac-ith argument. - if (ac != 0) { - appender = MethodHandles.dropArguments(appender, 1, ptypesList.subList(0, ac)); - } - break; + // Insert dummy arguments to match the prefix in the signature. + // The actual appender argument will be the ac-ith argument. + if (ac != 0) { + appender = MethodHandles.dropArguments(appender, 1, ptypesList.subList(0, ac)); } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); } builder = MethodHandles.foldArguments(builder, appender); } @@ -1521,19 +1481,12 @@ public final class StringConcatFactory { // *ending* index. for (RecipeElement el : recipe.getElements()) { MethodHandle prepender; - switch (el.getTag()) { - case CONST: { - Object cnst = el.getValue(); - prepender = MethodHandles.insertArguments(prepender(cnst.getClass()), 3, cnst); - break; - } - case ARG: { - int pos = el.getArgPos(); - prepender = selectArgument(prepender(ptypesList.get(pos)), 3, ptypesList, pos); - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); + if (el.isConst()) { + Object cnst = el.getValue(); + prepender = MethodHandles.insertArguments(prepender(cnst.getClass()), 3, cnst); + } else { + int pos = el.getArgPos(); + prepender = selectArgument(prepender(ptypesList.get(pos)), 3, ptypesList, pos); } // Remove "old" index from arguments @@ -1573,43 +1526,36 @@ public final class StringConcatFactory { byte initialCoder = INITIAL_CODER; int initialLen = 0; // initial length, in characters for (RecipeElement el : recipe.getElements()) { - switch (el.getTag()) { - case CONST: { - Object constant = el.getValue(); - String s = constant.toString(); - initialCoder = (byte) coderMixer(String.class).invoke(initialCoder, s); - initialLen += s.length(); - break; - } - case ARG: { - int ac = el.getArgPos(); + if (el.isConst()) { + Object constant = el.getValue(); + String s = constant.toString(); + initialCoder = (byte) coderMixer(String.class).invoke(initialCoder, s); + initialLen += s.length(); + } else { + int ac = el.getArgPos(); - Class<?> argClass = ptypesList.get(ac); - MethodHandle lm = selectArgument(lengthMixer(argClass), 1, ptypesList, ac); - lm = MethodHandles.dropArguments(lm, 0, byte.class); // (*) - lm = MethodHandles.dropArguments(lm, 2, byte.class); + Class<?> argClass = ptypesList.get(ac); + MethodHandle lm = selectArgument(lengthMixer(argClass), 1, ptypesList, ac); + lm = MethodHandles.dropArguments(lm, 0, byte.class); // (*) + lm = MethodHandles.dropArguments(lm, 2, byte.class); - MethodHandle cm = selectArgument(coderMixer(argClass), 1, ptypesList, ac); - cm = MethodHandles.dropArguments(cm, 0, int.class); // (**) + MethodHandle cm = selectArgument(coderMixer(argClass), 1, ptypesList, ac); + cm = MethodHandles.dropArguments(cm, 0, int.class); // (**) - // Read this bottom up: + // Read this bottom up: - // 4. Drop old index and coder, producing ("new-index", "new-coder", <args>) - mh = MethodHandles.dropArguments(mh, 2, int.class, byte.class); + // 4. Drop old index and coder, producing ("new-index", "new-coder", <args>) + mh = MethodHandles.dropArguments(mh, 2, int.class, byte.class); - // 3. Compute "new-index", producing ("new-index", "new-coder", "old-index", "old-coder", <args>) - // Length mixer ignores both "new-coder" and "old-coder" due to dropArguments above (*) - mh = MethodHandles.foldArguments(mh, lm); + // 3. Compute "new-index", producing ("new-index", "new-coder", "old-index", "old-coder", <args>) + // Length mixer ignores both "new-coder" and "old-coder" due to dropArguments above (*) + mh = MethodHandles.foldArguments(mh, lm); - // 2. Compute "new-coder", producing ("new-coder", "old-index", "old-coder", <args>) - // Coder mixer ignores the "old-index" arg due to dropArguments above (**) - mh = MethodHandles.foldArguments(mh, cm); + // 2. Compute "new-coder", producing ("new-coder", "old-index", "old-coder", <args>) + // Coder mixer ignores the "old-index" arg due to dropArguments above (**) + mh = MethodHandles.foldArguments(mh, cm); - // 1. The mh shape here is ("old-index", "old-coder", <args>) - break; - } - default: - throw new StringConcatException("Unhandled tag: " + el.getTag()); + // 1. The mh shape here is ("old-index", "old-coder", <args>) } } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java b/jdk/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java index 38892d07f2a..1724d827cd1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/TypeConvertingMethodAdapter.java @@ -38,7 +38,7 @@ class TypeConvertingMethodAdapter extends MethodVisitor { super(Opcodes.ASM5, mv); } - private static final int NUM_WRAPPERS = Wrapper.values().length; + private static final int NUM_WRAPPERS = Wrapper.COUNT; private static final String NAME_OBJECT = "java/lang/Object"; private static final String WRAPPER_PREFIX = "Ljava/lang/"; diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java index f8f60c3962a..5e71204b6d0 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java @@ -1057,57 +1057,11 @@ public abstract class VarHandle { Object addAndGet(Object... args); enum AccessType { - GET(Object.class) { - @Override - MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate) { - Class<?>[] ps = allocateParameters(0, receiver, intermediate); - fillParameters(ps, receiver, intermediate); - return MethodType.methodType(value, ps); - } - }, - SET(void.class) { - @Override - MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate) { - Class<?>[] ps = allocateParameters(1, receiver, intermediate); - int i = fillParameters(ps, receiver, intermediate); - ps[i] = value; - return MethodType.methodType(void.class, ps); - } - }, - COMPARE_AND_SWAP(boolean.class) { - @Override - MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate) { - Class<?>[] ps = allocateParameters(2, receiver, intermediate); - int i = fillParameters(ps, receiver, intermediate); - ps[i++] = value; - ps[i] = value; - return MethodType.methodType(boolean.class, ps); - } - }, - COMPARE_AND_EXCHANGE(Object.class) { - @Override - MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate) { - Class<?>[] ps = allocateParameters(2, receiver, intermediate); - int i = fillParameters(ps, receiver, intermediate); - ps[i++] = value; - ps[i] = value; - return MethodType.methodType(value, ps); - } - }, - GET_AND_UPDATE(Object.class) { - @Override - MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate) { - Class<?>[] ps = allocateParameters(1, receiver, intermediate); - int i = fillParameters(ps, receiver, intermediate); - ps[i] = value; - return MethodType.methodType(value, ps); - } - }; + GET(Object.class), + SET(void.class), + COMPARE_AND_SWAP(boolean.class), + COMPARE_AND_EXCHANGE(Object.class), + GET_AND_UPDATE(Object.class); final Class<?> returnType; final boolean isMonomorphicInReturnType; @@ -1117,8 +1071,41 @@ public abstract class VarHandle { isMonomorphicInReturnType = returnType != Object.class; } - abstract MethodType accessModeType(Class<?> receiver, Class<?> value, - Class<?>... intermediate); + MethodType accessModeType(Class<?> receiver, Class<?> value, + Class<?>... intermediate) { + Class<?>[] ps; + int i; + switch (this) { + case GET: + ps = allocateParameters(0, receiver, intermediate); + fillParameters(ps, receiver, intermediate); + return MethodType.methodType(value, ps); + case SET: + ps = allocateParameters(1, receiver, intermediate); + i = fillParameters(ps, receiver, intermediate); + ps[i] = value; + return MethodType.methodType(void.class, ps); + case COMPARE_AND_SWAP: + ps = allocateParameters(2, receiver, intermediate); + i = fillParameters(ps, receiver, intermediate); + ps[i++] = value; + ps[i] = value; + return MethodType.methodType(boolean.class, ps); + case COMPARE_AND_EXCHANGE: + ps = allocateParameters(2, receiver, intermediate); + i = fillParameters(ps, receiver, intermediate); + ps[i++] = value; + ps[i] = value; + return MethodType.methodType(value, ps); + case GET_AND_UPDATE: + ps = allocateParameters(1, receiver, intermediate); + i = fillParameters(ps, receiver, intermediate); + ps[i] = value; + return MethodType.methodType(value, ps); + default: + throw new InternalError("Unknown AccessType"); + } + } private static Class<?>[] allocateParameters(int values, Class<?> receiver, Class<?>... intermediate) { diff --git a/jdk/src/java.base/share/classes/sun/invoke/util/ValueConversions.java b/jdk/src/java.base/share/classes/sun/invoke/util/ValueConversions.java index 52ca7026c05..1a9580dcc14 100644 --- a/jdk/src/java.base/share/classes/sun/invoke/util/ValueConversions.java +++ b/jdk/src/java.base/share/classes/sun/invoke/util/ValueConversions.java @@ -29,27 +29,32 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; import java.lang.invoke.MethodType; -import java.util.EnumMap; +import jdk.internal.vm.annotation.Stable; public class ValueConversions { private static final Class<?> THIS_CLASS = ValueConversions.class; private static final Lookup IMPL_LOOKUP = MethodHandles.lookup(); - /** Thread-safe canonicalized mapping from Wrapper to MethodHandle + /** + * Thread-safe canonicalized mapping from Wrapper to MethodHandle * with unsynchronized reads and synchronized writes. - * It's safe to publish MethodHandles by data race because they are immutable. */ + * It's safe to publish MethodHandles by data race because they are immutable. + */ private static class WrapperCache { - /** EnumMap uses preconstructed array internally, which is constant during it's lifetime. */ - private final EnumMap<Wrapper, MethodHandle> map = new EnumMap<>(Wrapper.class); + @Stable + private final MethodHandle[] map = new MethodHandle[Wrapper.COUNT]; public MethodHandle get(Wrapper w) { - return map.get(w); + return map[w.ordinal()]; } public synchronized MethodHandle put(final Wrapper w, final MethodHandle mh) { - // Simulate CAS to avoid racy duplication - MethodHandle prev = map.putIfAbsent(w, mh); - if (prev != null) return prev; - return mh; + MethodHandle prev = map[w.ordinal()]; + if (prev != null) { + return prev; + } else { + map[w.ordinal()] = mh; + return mh; + } } } @@ -623,7 +628,7 @@ public class ValueConversions { return (x ? (byte)1 : (byte)0); } - private static final WrapperCache[] CONVERT_PRIMITIVE_FUNCTIONS = newWrapperCaches(Wrapper.values().length); + private static final WrapperCache[] CONVERT_PRIMITIVE_FUNCTIONS = newWrapperCaches(Wrapper.COUNT); public static MethodHandle convertPrimitive(Wrapper wsrc, Wrapper wdst) { WrapperCache cache = CONVERT_PRIMITIVE_FUNCTIONS[wsrc.ordinal()]; diff --git a/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java b/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java index a6054924ff5..f22eda0ea45 100644 --- a/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java +++ b/jdk/src/java.base/share/classes/sun/invoke/util/Wrapper.java @@ -42,6 +42,8 @@ public enum Wrapper { VOID ( Void.class, void.class, 'V', null, Format.other( 0)), ; + public static final int COUNT = 10; + private final Class<?> wrapperType; private final Class<?> primitiveType; private final char basicTypeChar; @@ -160,7 +162,10 @@ public enum Wrapper { return true; } - static { assert(checkConvertibleFrom()); } + static { + assert(checkConvertibleFrom()); + assert(COUNT == Wrapper.values().length); + } private static boolean checkConvertibleFrom() { // Check the matrix for correct classification of widening conversions. for (Wrapper w : values()) { From 0e13ad60ad0cb31467f20f0c1cea3a481f152ee0 Mon Sep 17 00:00:00 2001 From: Volker Simonis <simonis@openjdk.org> Date: Wed, 10 Aug 2016 17:55:08 +0200 Subject: [PATCH 09/15] 8163408: Fix wrong prototype of getNativeScaleFactor() in systemScale.h Reviewed-by: serb --- .../unix/native/common/awt/systemscale/systemScale.h | 2 +- .../java.desktop/unix/native/libsplashscreen/splashscreen_sys.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.h b/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.h index 697a8bd33d3..b9c2b4f3f65 100644 --- a/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.h +++ b/jdk/src/java.desktop/unix/native/common/awt/systemscale/systemScale.h @@ -26,7 +26,7 @@ #include <signal.h> #include <stdlib.h> -double getNativeScaleFactor(); +double getNativeScaleFactor(char *output_name); #endif diff --git a/jdk/src/java.desktop/unix/native/libsplashscreen/splashscreen_sys.c b/jdk/src/java.desktop/unix/native/libsplashscreen/splashscreen_sys.c index 11b979f4264..30739f03a4e 100644 --- a/jdk/src/java.desktop/unix/native/libsplashscreen/splashscreen_sys.c +++ b/jdk/src/java.desktop/unix/native/libsplashscreen/splashscreen_sys.c @@ -806,7 +806,7 @@ SplashGetScaledImageName(const char* jarName, const char* fileName, #ifndef __linux__ return JNI_FALSE; #endif - *scaleFactor = getNativeScaleFactor(); + *scaleFactor = getNativeScaleFactor(NULL); if (*scaleFactor == 2.0) { size_t length = 0; char *stringToAppend = ".java-scale2x"; From 73b11dc1d0806b7b67c1d24195198329b0ceb791 Mon Sep 17 00:00:00 2001 From: Claes Redestad <redestad@openjdk.org> Date: Wed, 10 Aug 2016 21:55:25 +0200 Subject: [PATCH 10/15] 8163373: Rewrite GenerateJLIClassesPlugin to avoid reflective calls into java.lang.invoke Reviewed-by: vlivanov, mchung --- .../java/lang/invoke/BoundMethodHandle.java | 21 +---------- .../java/lang/invoke/DirectMethodHandle.java | 16 +------- .../lang/invoke/InvokerBytecodeGenerator.java | 32 ++-------------- .../classes/java/lang/invoke/MemberName.java | 26 ------------- .../java/lang/invoke/MethodHandleImpl.java | 36 ++++++++++++++++++ .../internal/misc/JavaLangInvokeAccess.java | 29 +++++++++++++-- .../jdk/internal/misc/SharedSecrets.java | 2 +- .../plugins/GenerateJLIClassesPlugin.java | 37 +++++-------------- 8 files changed, 78 insertions(+), 121 deletions(-) diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java index a5db25507cb..16f0970a4c5 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/BoundMethodHandle.java @@ -587,26 +587,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; return bmhClass; } - /** - * @implNote this method is used by GenerateBMHClassesPlugin to enable - * ahead-of-time generation of BMH classes at link time. It does - * added validation since this string may be user provided. - */ - static Map.Entry<String, byte[]> generateConcreteBMHClassBytes( - final String types) { - for (char c : types.toCharArray()) { - if ("LIJFD".indexOf(c) < 0) { - throw new IllegalArgumentException("All characters must " - + "correspond to a basic field type: LIJFD"); - } - } - String shortTypes = LambdaForm.shortenSignature(types); - final String className = speciesInternalClassName(shortTypes); - return Map.entry(className, - generateConcreteBMHClassBytes(shortTypes, types, className)); - } - - private static String speciesInternalClassName(String shortTypes) { + static String speciesInternalClassName(String shortTypes) { return SPECIES_PREFIX_PATH + shortTypes; } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java index 17bf2d9c5e7..bf00ab7f55a 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java @@ -186,7 +186,7 @@ class DirectMethodHandle extends MethodHandle { return mtype.form().setCachedLambdaForm(which, lform); } - private static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) { + static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) { boolean needsInit = (which == LF_INVSTATIC_INIT); boolean doesAlloc = (which == LF_NEWINVSPECIAL); String linkerName, lambdaName; @@ -248,20 +248,6 @@ class DirectMethodHandle extends MethodHandle { return lform; } - /* - * NOTE: This method acts as an API hook for use by the - * GenerateJLIClassesPlugin to generate a class wrapping DirectMethodHandle - * methods for an array of method types. - */ - static byte[] generateDMHClassBytes(String className, MethodType[] methodTypes, int[] types) { - LambdaForm[] forms = new LambdaForm[methodTypes.length]; - for (int i = 0; i < forms.length; i++) { - forms[i] = makePreparedLambdaForm(methodTypes[i], types[i]); - methodTypes[i] = forms[i].methodType(); - } - return InvokerBytecodeGenerator.generateCodeBytesForMultiple(className, forms, methodTypes); - } - static Object findDirectMethodHandle(Name name) { if (name.function == NF_internalMemberName || name.function == NF_internalMemberNameEnsureInit || diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java index 507bcdb4c61..46f29fd6fb8 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java @@ -70,7 +70,7 @@ class InvokerBytecodeGenerator { private static final String LLV_SIG = "(L" + OBJ + ";L" + OBJ + ";)V"; /** Name of its super class*/ - private static final String INVOKER_SUPER_NAME = OBJ; + static final String INVOKER_SUPER_NAME = OBJ; /** Name of new class */ private final String className; @@ -124,7 +124,7 @@ class InvokerBytecodeGenerator { } /** For generating customized code for a single LambdaForm. */ - private InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) { + InvokerBytecodeGenerator(String className, LambdaForm form, MethodType invokerType) { this(form, form.names.length, className, form.debugName, invokerType); // Create an array to map name indexes to locals indexes. @@ -655,35 +655,11 @@ class InvokerBytecodeGenerator { return classFile; } - /* - * NOTE: This is used from GenerateJLIClassesPlugin via - * DirectMethodHandle::generateDMHClassBytes. - * - * Generate customized code for a set of LambdaForms of specified types into - * a class with a specified name. - */ - static byte[] generateCodeBytesForMultiple(String className, - LambdaForm[] forms, MethodType[] types) { - assert(forms.length == types.length); - - ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); - cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, - className, null, INVOKER_SUPER_NAME, null); - cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null); - for (int i = 0; i < forms.length; i++) { - InvokerBytecodeGenerator g - = new InvokerBytecodeGenerator(className, forms[i], types[i]); - g.setClassWriter(cw); - g.addMethod(); - } - return cw.toByteArray(); - } - - private void setClassWriter(ClassWriter cw) { + void setClassWriter(ClassWriter cw) { this.cw = cw; } - private void addMethod() { + void addMethod() { methodPrologue(); // Suppress this method in backtraces displayed to the user. diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java index 7deb1f7d81f..a0a1465cbac 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MemberName.java @@ -25,8 +25,6 @@ package java.lang.invoke; -import jdk.internal.misc.JavaLangInvokeAccess; -import jdk.internal.misc.SharedSecrets; import sun.invoke.util.BytecodeDescriptor; import sun.invoke.util.VerifyAccess; @@ -37,7 +35,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Module; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -1152,27 +1149,4 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError; return buf; } } - - static { - // StackFrameInfo stores Member and this provides the shared secrets - // for stack walker to access MemberName information. - SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() { - @Override - public Object newMemberName() { - return new MemberName(); - } - - @Override - public String getName(Object mname) { - MemberName memberName = (MemberName)mname; - return memberName.getName(); - } - - @Override - public boolean isNative(Object mname) { - MemberName memberName = (MemberName)mname; - return memberName.isNative(); - } - }); - } } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java index 6702a89f0ce..1d4b3115aa1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java @@ -25,6 +25,8 @@ package java.lang.invoke; +import jdk.internal.misc.JavaLangInvokeAccess; +import jdk.internal.misc.SharedSecrets; import jdk.internal.org.objectweb.asm.AnnotationVisitor; import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.MethodVisitor; @@ -44,6 +46,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -1710,6 +1713,39 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; } catch (ReflectiveOperationException ex) { throw newInternalError(ex); } + + SharedSecrets.setJavaLangInvokeAccess(new JavaLangInvokeAccess() { + @Override + public Object newMemberName() { + return new MemberName(); + } + + @Override + public String getName(Object mname) { + MemberName memberName = (MemberName)mname; + return memberName.getName(); + } + + @Override + public boolean isNative(Object mname) { + MemberName memberName = (MemberName)mname; + return memberName.isNative(); + } + + @Override + public byte[] generateDMHClassBytes(String className, + MethodType[] methodTypes, int[] types) { + return GenerateJLIClassesHelper + .generateDMHClassBytes(className, methodTypes, types); + } + + @Override + public Map.Entry<String, byte[]> generateConcreteBMHClassBytes( + final String types) { + return GenerateJLIClassesHelper + .generateConcreteBMHClassBytes(types); + } + }); } /** Result unboxing: ValueConversions.unbox() OR ValueConversions.identity() OR ValueConversions.ignore(). */ diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java index 5e2c4d28e93..e514e5c95c0 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangInvokeAccess.java @@ -25,19 +25,42 @@ package jdk.internal.misc; +import java.lang.invoke.MethodType; +import java.util.Map; + public interface JavaLangInvokeAccess { /** - * Create a new MemberName instance + * Create a new MemberName instance. Used by {@see StackFrameInfo}. */ Object newMemberName(); /** - * Returns the name for the given MemberName + * Returns the name for the given MemberName. Used by {@see StackFrameInfo}. */ String getName(Object mname); /** - * Returns {@code true} if the given MemberName is a native method + * Returns {@code true} if the given MemberName is a native method. Used by + * {@see StackFrameInfo}. */ boolean isNative(Object mname); + + /** + * Returns a {@code byte[]} containing the bytecode for a class implementing + * DirectMethodHandle of each pairwise combination of {@code MethodType} and + * an {@code int} representing method type. Used by + * GenerateJLIClassesPlugin to generate such a class during the jlink phase. + */ + byte[] generateDMHClassBytes(String className, MethodType[] methodTypes, + int[] types); + + /** + * Returns a {@code byte[]} containing the bytecode for a BoundMethodHandle + * species class implementing the signature defined by {@code types}. Used + * by GenerateBMHClassesPlugin to enable generation of such classes during + * the jlink phase. Should do some added validation since this string may be + * user provided. + */ + Map.Entry<String, byte[]> generateConcreteBMHClassBytes( + final String types); } diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java b/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java index 5e3fb126b58..fed1b694548 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java @@ -95,7 +95,7 @@ public class SharedSecrets { public static JavaLangInvokeAccess getJavaLangInvokeAccess() { if (javaLangInvokeAccess == null) { try { - Class<?> c = Class.forName("java.lang.invoke.MemberName"); + Class<?> c = Class.forName("java.lang.invoke.MethodHandleImpl"); unsafe.ensureClassInitialized(c); } catch (ClassNotFoundException e) {}; } diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java index c50860aa517..1697e988b53 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin.java @@ -25,7 +25,6 @@ package jdk.tools.jlink.internal.plugins; import java.lang.invoke.MethodType; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.EnumSet; import java.util.HashMap; @@ -33,6 +32,8 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import jdk.internal.misc.SharedSecrets; +import jdk.internal.misc.JavaLangInvokeAccess; import jdk.tools.jlink.plugin.ResourcePoolEntry; import jdk.tools.jlink.plugin.PluginException; import jdk.tools.jlink.plugin.ResourcePool; @@ -54,9 +55,6 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DESCRIPTION = PluginsResourceBundle.getDescription(NAME); - private static final String BMH = "java/lang/invoke/BoundMethodHandle"; - private static final Method BMH_FACTORY_METHOD; - private static final String DMH = "java/lang/invoke/DirectMethodHandle$Holder"; private static final String DMH_INVOKE_VIRTUAL = "invokeVirtual"; private static final String DMH_INVOKE_STATIC = "invokeStatic"; @@ -64,7 +62,9 @@ public final class GenerateJLIClassesPlugin implements Plugin { private static final String DMH_NEW_INVOKE_SPECIAL = "newInvokeSpecial"; private static final String DMH_INVOKE_INTERFACE = "invokeInterface"; private static final String DMH_INVOKE_STATIC_INIT = "invokeStaticInit"; - private static final Method DMH_FACTORY_METHOD; + + private static final JavaLangInvokeAccess JLIA + = SharedSecrets.getJavaLangInvokeAccess(); List<String> speciesTypes; @@ -232,8 +232,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { private void generateBMHClass(String types, ResourcePoolBuilder out) { try { // Generate class - Map.Entry<String, byte[]> result = (Map.Entry<String, byte[]>) - BMH_FACTORY_METHOD.invoke(null, types); + Map.Entry<String, byte[]> result = + JLIA.generateConcreteBMHClassBytes(types); String className = result.getKey(); byte[] bytes = result.getValue(); @@ -264,11 +264,8 @@ public final class GenerateJLIClassesPlugin implements Plugin { } } try { - byte[] bytes = (byte[])DMH_FACTORY_METHOD - .invoke(null, - DMH, - methodTypes, - dmhTypes); + byte[] bytes = + JLIA.generateDMHClassBytes(DMH, methodTypes, dmhTypes); ResourcePoolEntry ndata = ResourcePoolEntry.create(DMH_ENTRY, bytes); out.add(ndata); } catch (Exception ex) { @@ -277,22 +274,6 @@ public final class GenerateJLIClassesPlugin implements Plugin { } private static final String DMH_ENTRY = "/java.base/" + DMH + ".class"; - static { - try { - Class<?> BMHFactory = Class.forName("java.lang.invoke.BoundMethodHandle$Factory"); - BMH_FACTORY_METHOD = BMHFactory.getDeclaredMethod("generateConcreteBMHClassBytes", - String.class); - BMH_FACTORY_METHOD.setAccessible(true); - - Class<?> DMHFactory = Class.forName("java.lang.invoke.DirectMethodHandle"); - DMH_FACTORY_METHOD = DMHFactory.getDeclaredMethod("generateDMHClassBytes", - String.class, MethodType[].class, int[].class); - DMH_FACTORY_METHOD.setAccessible(true); - } catch (Exception e) { - throw new PluginException(e); - } - } - // Convert LL -> LL, L3 -> LLL private static String expandSignature(String signature) { StringBuilder sb = new StringBuilder(); From 855893cb3b2b74468839a0cd307f157382615df2 Mon Sep 17 00:00:00 2001 From: Claes Redestad <redestad@openjdk.org> Date: Wed, 10 Aug 2016 22:49:05 +0200 Subject: [PATCH 11/15] 8163814: JDK build has been failing after 8163373 Reviewed-by: mchung --- .../lang/invoke/GenerateJLIClassesHelper.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java new file mode 100644 index 00000000000..5edf33c8c60 --- /dev/null +++ b/jdk/src/java.base/share/classes/java/lang/invoke/GenerateJLIClassesHelper.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang.invoke; + +import java.util.Map; +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.Opcodes; + +/** + * Helper class to assist the GenerateJLIClassesPlugin to get access to + * generate classes ahead of time. + */ +class GenerateJLIClassesHelper { + + static byte[] generateDMHClassBytes(String className, + MethodType[] methodTypes, int[] types) { + LambdaForm[] forms = new LambdaForm[methodTypes.length]; + for (int i = 0; i < forms.length; i++) { + forms[i] = DirectMethodHandle.makePreparedLambdaForm(methodTypes[i], + types[i]); + methodTypes[i] = forms[i].methodType(); + } + return generateCodeBytesForLFs(className, forms, methodTypes); + } + + /* + * Generate customized code for a set of LambdaForms of specified types into + * a class with a specified name. + */ + private static byte[] generateCodeBytesForLFs(String className, + LambdaForm[] forms, MethodType[] types) { + assert(forms.length == types.length); + + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + ClassWriter.COMPUTE_FRAMES); + cw.visit(Opcodes.V1_8, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL + Opcodes.ACC_SUPER, + className, null, InvokerBytecodeGenerator.INVOKER_SUPER_NAME, null); + cw.visitSource(className.substring(className.lastIndexOf('/') + 1), null); + for (int i = 0; i < forms.length; i++) { + InvokerBytecodeGenerator g + = new InvokerBytecodeGenerator(className, forms[i], types[i]); + g.setClassWriter(cw); + g.addMethod(); + } + return cw.toByteArray(); + } + + static Map.Entry<String, byte[]> generateConcreteBMHClassBytes( + final String types) { + for (char c : types.toCharArray()) { + if ("LIJFD".indexOf(c) < 0) { + throw new IllegalArgumentException("All characters must " + + "correspond to a basic field type: LIJFD"); + } + } + String shortTypes = LambdaForm.shortenSignature(types); + final String className = + BoundMethodHandle.Factory.speciesInternalClassName(shortTypes); + return Map.entry(className, + BoundMethodHandle.Factory.generateConcreteBMHClassBytes( + shortTypes, types, className)); + } +} From 521206523514b8c60ff234b11bd42d457a552da7 Mon Sep 17 00:00:00 2001 From: Pavel Rappo <prappo@openjdk.org> Date: Wed, 10 Aug 2016 22:48:25 +0100 Subject: [PATCH 12/15] 8163586: java.net.http.RawChannel has been made public by mistake Reviewed-by: chegar --- .../java.httpclient/share/classes/java/net/http/RawChannel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java b/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java index 3086d7a50b9..fb73eb6b082 100644 --- a/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java +++ b/jdk/src/java.httpclient/share/classes/java/net/http/RawChannel.java @@ -31,7 +31,7 @@ import java.nio.ByteBuffer; /* * I/O abstraction used to implement WebSocket. */ -public interface RawChannel { +interface RawChannel { interface RawEvent { From e2a0ff3e0d3332ac91f815a74f2fcf303eb35e6a Mon Sep 17 00:00:00 2001 From: Mandy Chung <mchung@openjdk.org> Date: Wed, 10 Aug 2016 15:51:25 -0700 Subject: [PATCH 13/15] 8136930: Simplify use of module-system options by custom launchers Reviewed-by: alanb, ksrini, henryjen, sundar --- jdk/make/GenerateModuleSummary.gmk | 2 +- jdk/make/ModuleTools.gmk | 4 +- jdk/make/Tools.gmk | 4 +- jdk/make/gendata/GendataBreakIterator.gmk | 10 +- jdk/make/launcher/Launcher-java.desktop.gmk | 2 +- jdk/make/launcher/Launcher-java.scripting.gmk | 2 +- jdk/make/launcher/Launcher-jdk.compiler.gmk | 2 +- jdk/make/launcher/Launcher-jdk.javadoc.gmk | 2 +- jdk/make/launcher/Launcher-jdk.jlink.gmk | 2 +- .../Launcher-jdk.scripting.nashorn.shell.gmk | 2 +- .../build/tools/jigsaw/ModuleSummary.java | 6 +- .../share/classes/java/lang/System.java | 11 +- .../java/lang/module/ModuleReference.java | 2 +- .../java/lang/module/ModuleReferences.java | 2 +- .../java/lang/module/SystemModuleFinder.java | 2 +- .../jdk/internal/module/ModuleBootstrap.java | 51 ++- .../jdk/internal/module/ModulePatcher.java | 34 +- .../classes/sun/launcher/LauncherHelper.java | 4 +- .../launcher/resources/launcher.properties | 51 ++- jdk/src/java.base/share/native/libjli/args.c | 29 +- jdk/src/java.base/share/native/libjli/java.c | 423 ++++++++++++------ jdk/src/java.base/share/native/libjli/java.h | 1 + .../sun/tools/jar/GNUStyleOptions.java | 4 +- .../sun/tools/jar/resources/jar.properties | 10 +- .../classes/jdk/tools/jimage/JImageTask.java | 4 +- .../tools/jimage/resources/jimage.properties | 8 +- .../jdk/tools/jlink/internal/JlinkTask.java | 19 +- .../jdk/tools/jlink/internal/TaskHelper.java | 2 +- .../tools/jlink/resources/jlink.properties | 25 +- .../tools/jlink/resources/plugins.properties | 6 +- .../classes/jdk/tools/jmod/JmodTask.java | 10 +- .../jdk/tools/jmod/resources/jmod.properties | 2 +- jdk/test/ProblemList.txt | 3 + jdk/test/TEST.ROOT | 8 +- .../com/sun/corba/5036554/TestCorbaBug.sh | 4 +- .../7130985/CorbaExceptionsCompileTest.java | 4 +- .../corba/se/impl/io/HookPutFieldsTest.java | 4 +- .../corba/se/impl/orb/SetDefaultORBTest.java | 4 +- jdk/test/com/sun/jdi/ImmutableResourceTest.sh | 4 +- .../com/sun/jndi/cosnaming/CNNameParser.java | 1 + .../com/sun/jndi/cosnaming/IiopUrlIPv6.java | 1 + .../HotSpotDiagnosticMXBean/CheckOrigin.java | 2 +- .../Gtk/GtkVersionTest/GtkVersionTest.java | 2 +- .../WrappedToolkitTest/WrappedToolkitTest.sh | 36 +- .../java/awt/xembed/server/RunTestXEmbed.java | 9 +- .../xembed/server/TestXEmbedServerJava.java | 8 +- .../8028054/TestConstructorFinder.java | 2 +- .../XMLDecoder/8028054/TestMethodFinder.java | 2 +- .../Class/forName/modules/TestDriver.java | 18 +- .../FieldSetAccessibleTest.java | 4 +- .../lang/Class/getResource/ResourcesTest.java | 12 +- .../getResource/modules/ResourcesTest.java | 14 +- .../modules/CustomSecurityManager.sh | 6 +- .../String/concat/WithSecurityManager.java | 14 +- jdk/test/java/lang/instrument/MakeJAR2.sh | 2 +- .../modules/ModuleAccessControlTest.java | 4 +- .../reflect/Layer/LayerAndLoadersTest.java | 4 +- .../reflect/Layer/src/m1/module-info.java | 2 +- .../lang/reflect/Module/AddExportsTest.java | 27 +- .../reflect/Module/access/AccessTest.java | 4 +- .../reflect/Proxy/ProxyClassAccessTest.java | 4 +- .../lang/reflect/Proxy/ProxyLayerTest.java | 2 +- .../reflect/Proxy/ProxyModuleMapping.java | 2 +- .../java/lang/reflect/Proxy/ProxyTest.java | 4 +- jdk/test/java/net/Authenticator/B4933582.sh | 2 +- .../java/net/SocketOption/OptionsTest.java | 2 +- .../SocketOption/UnsupportedOptionsTest.java | 2 +- .../net/httpclient/http2/HpackDriver.java | 14 +- .../DatagramChannel/SocketOptionTests.java | 2 +- .../SocketOptionTests.java | 2 +- .../SocketChannel/SocketOptionTests.java | 2 +- .../inheritedChannel/run_tests.sh | 2 +- .../Activatable/extLoadedImpl/ext.sh | 8 +- .../DownloadActivationGroup.java | 11 +- .../StubClassesPermitted.java | 10 +- .../InheritedChannelNotServerSocket.java | 2 +- .../RmidViaInheritedChannel.java | 2 +- jdk/test/java/rmi/module/ModuleTest.java | 14 +- .../java/rmi/registry/readTest/readTest.sh | 8 +- .../rmi/transport/checkFQDN/CheckFQDN.java | 8 +- .../transport/dgcDeadLock/DGCDeadLock.java | 8 +- .../Provider/SecurityProviderModularTest.java | 2 +- .../java/security/modules/ModularTest.java | 2 +- jdk/test/java/security/testlibrary/Proc.java | 13 +- .../util/Calendar/GenericTimeZoneNamesTest.sh | 2 +- jdk/test/java/util/Formatter/Basic.sh | 2 +- jdk/test/java/util/Locale/LocaleProviders.sh | 4 +- .../java/util/PluggableLocale/ExecTest.sh | 4 +- .../util/ResourceBundle/Bug6299235Test.sh | 2 +- .../modules/appbasic/appbasic.sh | 6 +- .../modules/appbasic2/appbasic2.sh | 6 +- .../ResourceBundle/modules/basic/basic.sh | 8 +- .../modules/modlocal/modlocal.sh | 6 +- .../modules/security/TestPermission.java | 4 +- .../ResourceBundle/modules/simple/simple.sh | 6 +- .../modules/visibility/visibility.sh | 66 +-- .../modules/xmlformat/xmlformat.sh | 6 +- .../ServiceLoader/modules/ServicesTest.java | 8 +- .../modules/GetResourceBundleTest.java | 12 +- .../crypto/Cipher/CipherStreamClose.java | 4 +- .../TestClassPathPlugin.sh | 4 +- .../stream/StreamCloserLeak/run_test.sh | 4 +- jdk/test/javax/naming/module/basic.sh | 16 +- .../8146975/RmiIiopReturnValueTest.java | 11 +- .../ConcurrentHashMapTest.java | 10 +- .../login/modules/JaasModularClientTest.java | 2 +- .../JaasModularDefaultHandlerTest.java | 2 +- .../javax/smartcardio/CommandAPDUTest.java | 4 +- .../javax/smartcardio/HistoricalBytes.java | 4 +- .../javax/smartcardio/ResponseAPDUTest.java | 4 +- jdk/test/javax/smartcardio/Serialize.java | 4 +- .../smartcardio/TerminalFactorySpiTest.java | 4 +- .../javax/smartcardio/TestCardPermission.java | 4 +- .../javax/smartcardio/TestCommandAPDU.java | 4 +- jdk/test/javax/transaction/testng/Driver.java | 10 +- .../JAXBContextWithAbstractFactory.java | 4 +- .../JAXBContextWithLegacyFactory.java | 4 +- .../JAXBContextWithSubclassedFactory.java | 4 +- .../jxc/8073872/SchemagenStackOverflow.java | 3 +- .../bind/marshal/8134111/UnmarshalTest.java | 5 +- .../xjc/8032884/XjcOptionalPropertyTest.java | 2 +- .../bind/xjc/8145039/JaxbMarshallTest.java | 2 +- jdk/test/javax/xml/jaxp/common/8035437/run.sh | 4 +- jdk/test/javax/xml/soap/XmlTest.java | 4 +- .../javax/xml/soap/spi/SAAJFactoryTest.java | 23 +- jdk/test/javax/xml/ws/8043129/MailTest.java | 3 +- .../javax/xml/ws/clientjar/TestWsImport.java | 4 +- jdk/test/javax/xml/ws/publish/WSTest.java | 3 +- jdk/test/javax/xml/ws/xsanymixed/Test.java | 3 +- .../internal/misc/VM/RuntimeArguments.java | 31 +- .../reflect/Reflection/GetCallerClassTest.sh | 2 +- .../modules/etc/VerifyModuleDelegation.java | 12 +- .../RunWithAutomaticModules.java | 12 +- .../scenarios/container/ContainerTest.java | 6 +- .../OverlappingPackagesTest.java | 14 +- .../sun/awt/shell/ShellFolderMemoryLeak.java | 2 +- .../bootstrap/CustomLauncherTest.java | 2 +- .../bootstrap/LocalManagementTest.java | 2 +- .../jmxremote/bootstrap/RmiBootstrapTest.sh | 4 +- .../bootstrap/RmiSslBootstrapTest.sh | 4 +- .../bootstrap/RmiSslNoKeyStoreTest.sh | 4 +- .../https/HttpsURLConnection/PostThruProxy.sh | 2 +- .../PostThruProxyWithAuth.sh | 2 +- .../net/www/protocol/jrt/OtherResources.java | 2 +- .../net/www/protocol/jrt/other_resources.sh | 4 +- .../rmic/iiopCompilation/IIOPCompilation.java | 3 +- .../runtime/Log/6409194/NoConsoleOutput.java | 8 +- .../sun/security/krb5/ccache/EmptyCC.java | 3 +- jdk/test/sun/security/krb5/tools/ktcheck.sh | 4 +- .../sun/security/mscapi/PublicKeyInterop.sh | 4 +- .../sun/security/mscapi/ShortRSAKey1024.sh | 4 +- .../security/provider/PolicyFile/Modules.java | 6 +- .../security/tools/jarsigner/AltProvider.java | 10 +- jdk/test/sun/security/tools/jarsigner/ts.sh | 8 +- .../sun/security/tools/keytool/autotest.sh | 6 +- .../sun/security/tools/keytool/standard.sh | 6 +- .../sun/security/validator/certreplace.sh | 2 +- jdk/test/sun/security/validator/samedn.sh | 2 +- .../sun/text/IntHashtable/Bug4170614Test.sh | 2 +- jdk/test/sun/tools/java/CFCTest.java | 4 +- .../sun/util/locale/provider/Bug8038436.java | 4 +- jdk/test/tools/jar/modularJar/Basic.java | 24 +- jdk/test/tools/jimage/VerifyJimage.java | 2 +- jdk/test/tools/jlink/CustomPluginTest.java | 3 +- jdk/test/tools/jlink/JLinkNegativeTest.java | 2 +- jdk/test/tools/jlink/JLinkTest.java | 4 +- jdk/test/tools/jlink/basic/BasicTest.java | 4 +- .../UserModuleTest.java | 6 +- jdk/test/tools/jmod/JmodNegativeTest.java | 12 +- jdk/test/tools/jmod/hashes/HashesTest.java | 16 +- jdk/test/tools/launcher/MiscTests.java | 2 +- jdk/test/tools/launcher/ToolsOpts.java | 2 +- .../modules/addexports/AddExportsTest.java | 60 +-- .../launcher/modules/addmods/AddModsTest.java | 62 +-- .../addmods/src/logger/logger/Logger.java | 2 +- .../modules/addmods/src/test/test/Main.java | 2 +- .../modules/addreads/AddReadsTest.java | 70 +-- .../launcher/modules/basic/BasicTest.java | 127 +++--- .../launcher/modules/dryrun/DryRunTest.java | 34 +- .../modules/limitmods/LimitModsTest.java | 54 +-- .../modules/listmods/ListModsTest.java | 38 +- .../modules/patch/basic/PatchTest.java | 40 +- .../patch/basic/src/test/jdk/test/Main.java | 2 +- .../systemmodules/PatchSystemModules.java | 30 +- .../jdk/internal/modules/SystemModules.java | 2 +- .../UpgradeModulePathTest.java | 20 +- jdk/test/tools/lib/tests/Helper.java | 2 +- jdk/test/tools/lib/tests/JImageGenerator.java | 16 +- jdk/test/tools/pack200/Utils.java | 4 +- .../pack200/pack200-verifier/make/build.xml | 2 +- 190 files changed, 1189 insertions(+), 1008 deletions(-) diff --git a/jdk/make/GenerateModuleSummary.gmk b/jdk/make/GenerateModuleSummary.gmk index 285de739088..171183886a2 100644 --- a/jdk/make/GenerateModuleSummary.gmk +++ b/jdk/make/GenerateModuleSummary.gmk @@ -42,6 +42,6 @@ $(GENGRAPHS_DIR)/technology-summary.html: $(TOOLS_MODULE_SRCDIR)/technology-summ $(GENGRAPHS_DIR)/module-summary.html: $(BUILD_JIGSAW_TOOLS) $(GENGRAPHS_DIR)/technology-summary.html $(MKDIR) -p $(@D) - $(TOOL_MODULESUMMARY) -o $@ -mp $(IMAGES_OUTPUTDIR)/jmods + $(TOOL_MODULESUMMARY) -o $@ --module-path $(IMAGES_OUTPUTDIR)/jmods all: $(GENGRAPHS_DIR)/jdk.dot $(GENGRAPHS_DIR)/module-summary.html diff --git a/jdk/make/ModuleTools.gmk b/jdk/make/ModuleTools.gmk index 2943b9c8d21..289f3e67bb7 100644 --- a/jdk/make/ModuleTools.gmk +++ b/jdk/make/ModuleTools.gmk @@ -36,12 +36,12 @@ $(eval $(call SetupJavaCompilation,BUILD_JIGSAW_TOOLS, \ INCLUDES := build/tools/deps \ build/tools/jigsaw, \ BIN := $(TOOLS_CLASSES_DIR), \ - ADD_JAVAC_FLAGS := -XaddExports:jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED )) + ADD_JAVAC_FLAGS := --add-exports jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED )) TOOL_GENGRAPHS := $(BUILD_JAVA) -esa -ea -cp $(TOOLS_CLASSES_DIR) \ build.tools.jigsaw.GenGraphs TOOL_MODULESUMMARY := $(BUILD_JAVA) -esa -ea -cp $(TOOLS_CLASSES_DIR) \ - -XaddExports:jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED \ + --add-exports jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED \ build.tools.jigsaw.ModuleSummary diff --git a/jdk/make/Tools.gmk b/jdk/make/Tools.gmk index 384ca5931de..1034d34e15b 100644 --- a/jdk/make/Tools.gmk +++ b/jdk/make/Tools.gmk @@ -38,7 +38,7 @@ BUILD_TOOLS_JDK := $(call SetupJavaCompilationCompileTarget, \ ################################################################################ ifeq ($(BOOT_JDK_MODULAR), true) - COMPILEFONTCONFIG_ADD_EXPORTS := -XaddExports:java.desktop/sun.awt=ALL-UNNAMED + COMPILEFONTCONFIG_ADD_EXPORTS := --add-exports java.desktop/sun.awt=ALL-UNNAMED endif TOOL_COMPILEFONTCONFIG = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ @@ -94,7 +94,7 @@ TOOL_SPP = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes build.too # Nimbus is used somewhere in the swing build. ifeq ($(BOOT_JDK_MODULAR), true) - COMPILENIMBUS_ADD_MODS := -addmods java.xml.bind + COMPILENIMBUS_ADD_MODS := --add-modules java.xml.bind endif TOOL_GENERATENIMBUS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ diff --git a/jdk/make/gendata/GendataBreakIterator.gmk b/jdk/make/gendata/GendataBreakIterator.gmk index 06d3c2ac490..a68786a413b 100644 --- a/jdk/make/gendata/GendataBreakIterator.gmk +++ b/jdk/make/gendata/GendataBreakIterator.gmk @@ -63,11 +63,11 @@ $(eval $(call SetupJavaCompilation,BUILD_BREAKITERATOR_LD, \ ifeq ($(BOOT_JDK_MODULAR), true) BREAK_ITERATOR_BOOTCLASSPATH := \ - -Xpatch:java.base=$(BREAK_ITERATOR_CLASSES)/java.base \ - -Xpatch:jdk.localedata=$(BREAK_ITERATOR_CLASSES)/jdk.localedata \ - -XaddExports:java.base/sun.text=ALL-UNNAMED \ - -XaddExports:java.base/sun.text.resources=ALL-UNNAMED \ - -XaddExports:jdk.localedata/sun.text.resources.ext=ALL-UNNAMED \ + --patch-module java.base=$(BREAK_ITERATOR_CLASSES)/java.base \ + --patch-module jdk.localedata=$(BREAK_ITERATOR_CLASSES)/jdk.localedata \ + --add-exports java.base/sun.text=ALL-UNNAMED \ + --add-exports java.base/sun.text.resources=ALL-UNNAMED \ + --add-exports jdk.localedata/sun.text.resources.ext=ALL-UNNAMED \ # else BREAK_ITERATOR_BOOTCLASSPATH := -Xbootclasspath/p:$(call PathList, \ diff --git a/jdk/make/launcher/Launcher-java.desktop.gmk b/jdk/make/launcher/Launcher-java.desktop.gmk index b6b95cb24ed..f9fa7d16c22 100644 --- a/jdk/make/launcher/Launcher-java.desktop.gmk +++ b/jdk/make/launcher/Launcher-java.desktop.gmk @@ -31,7 +31,7 @@ $(eval $(call IncludeCustomExtension, jdk, launcher/Launcher-java.desktop.gmk)) ifndef BUILD_HEADLESS_ONLY $(eval $(call SetupBuildLauncher, appletviewer, \ MAIN_CLASS := sun.applet.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ LIBS_unix := $(X_LIBS), \ )) endif diff --git a/jdk/make/launcher/Launcher-java.scripting.gmk b/jdk/make/launcher/Launcher-java.scripting.gmk index 6f3f59da268..18b8ad46d45 100644 --- a/jdk/make/launcher/Launcher-java.scripting.gmk +++ b/jdk/make/launcher/Launcher-java.scripting.gmk @@ -27,5 +27,5 @@ include LauncherCommon.gmk $(eval $(call SetupBuildLauncher, jrunscript, \ MAIN_CLASS := com.sun.tools.script.shell.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ )) diff --git a/jdk/make/launcher/Launcher-jdk.compiler.gmk b/jdk/make/launcher/Launcher-jdk.compiler.gmk index 0259eb0ff8c..9c85acecdcc 100644 --- a/jdk/make/launcher/Launcher-jdk.compiler.gmk +++ b/jdk/make/launcher/Launcher-jdk.compiler.gmk @@ -27,7 +27,7 @@ include LauncherCommon.gmk $(eval $(call SetupBuildLauncher, javac, \ MAIN_CLASS := com.sun.tools.javac.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ )) diff --git a/jdk/make/launcher/Launcher-jdk.javadoc.gmk b/jdk/make/launcher/Launcher-jdk.javadoc.gmk index 365443618f2..04bc99baf7e 100644 --- a/jdk/make/launcher/Launcher-jdk.javadoc.gmk +++ b/jdk/make/launcher/Launcher-jdk.javadoc.gmk @@ -27,7 +27,7 @@ include LauncherCommon.gmk $(eval $(call SetupBuildLauncher, javadoc, \ MAIN_CLASS := jdk.javadoc.internal.tool.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ )) diff --git a/jdk/make/launcher/Launcher-jdk.jlink.gmk b/jdk/make/launcher/Launcher-jdk.jlink.gmk index b1edcbc93c0..bd270b0dc0a 100644 --- a/jdk/make/launcher/Launcher-jdk.jlink.gmk +++ b/jdk/make/launcher/Launcher-jdk.jlink.gmk @@ -32,7 +32,7 @@ $(eval $(call SetupBuildLauncher, jimage,\ $(eval $(call SetupBuildLauncher, jlink,\ MAIN_CLASS := jdk.tools.jlink.internal.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ CFLAGS := -DENABLE_ARG_FILES \ -DEXPAND_CLASSPATH_WILDCARDS \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ diff --git a/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk b/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk index b6349b56365..5cb872ae5cf 100644 --- a/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk +++ b/jdk/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk @@ -27,6 +27,6 @@ include LauncherCommon.gmk $(eval $(call SetupBuildLauncher, jjs, \ MAIN_CLASS := jdk.nashorn.tools.jjs.Main, \ - JAVA_ARGS := -addmods ALL-DEFAULT, \ + JAVA_ARGS := --add-modules ALL-DEFAULT, \ CFLAGS := -DENABLE_ARG_FILES, \ )) diff --git a/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java b/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java index f274afdc709..7fb8679a7e0 100644 --- a/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java +++ b/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java @@ -51,7 +51,7 @@ import static build.tools.jigsaw.ModuleSummary.HtmlDocument.Selector.*; import static build.tools.jigsaw.ModuleSummary.HtmlDocument.Division.*; public class ModuleSummary { - private static final String USAGE = "Usage: ModuleSummary -mp <dir> -o <outfile> [-root mn]*"; + private static final String USAGE = "Usage: ModuleSummary --module-path <dir> -o <outfile> [--root mn]*"; public static void main(String[] args) throws Exception { int i=0; @@ -61,13 +61,13 @@ public class ModuleSummary { while (i < args.length && args[i].startsWith("-")) { String arg = args[i++]; switch (arg) { - case "-mp": + case "--module-path": modpath = Paths.get(args[i++]); break; case "-o": outfile = Paths.get(args[i++]); break; - case "-root": + case "--root": roots.add(args[i++]); default: System.err.println(USAGE); diff --git a/jdk/src/java.base/share/classes/java/lang/System.java b/jdk/src/java.base/share/classes/java/lang/System.java index f3ec4911131..4bce8bbb48d 100644 --- a/jdk/src/java.base/share/classes/java/lang/System.java +++ b/jdk/src/java.base/share/classes/java/lang/System.java @@ -644,23 +644,20 @@ public final class System { * <code>getProperties</code> operation, it may choose to permit the * {@link #getProperty(String)} operation. * - * @implNote In addition to the standard system properties, the {@code - * java} launcher may create the Java Virtual Machine with system - * properties that have the following keys: + * @implNote In addition to the standard system properties, the system + * properties may include the following keys: * <table summary="Shows property keys and associated values"> * <tr><th>Key</th> * <th>Description of Associated Value</th></tr> * <tr><td>{@code jdk.module.path}</td> - * <td>Application module path</td></tr> - * <tr><td>{@code jdk.upgrade.module.path}</td> + * <td>The application module path</td></tr> + * <tr><td>{@code jdk.module.upgrade.path}</td> * <td>The upgrade module path</td></tr> * <tr><td>{@code jdk.module.main}</td> * <td>The module name of the initial/main module</td></tr> * <tr><td>{@code jdk.module.main.class}</td> * <td>The main class name of the initial module</td></tr> * </table> - * These properties may also be set by custom launchers that use the JNI - * invocation API to create the Java Virtual Machine. * * @return the system properties * @exception SecurityException if a security manager exists and its diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java index 10cce789949..34d13639736 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReference.java @@ -169,7 +169,7 @@ public final class ModuleReference { /** - * Returns {@code true} if this module has been patched via -Xpatch. + * Returns {@code true} if this module has been patched via --patch-module. */ boolean isPatched() { return patched; diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java index 18caa15d71c..de245656364 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleReferences.java @@ -68,7 +68,7 @@ class ModuleReferences { /** * Creates a ModuleReference to a module or to patched module when - * creating modules for the boot Layer and -Xpatch is specified. + * creating modules for the boot Layer and --patch-module is specified. */ private static ModuleReference newModule(ModuleDescriptor md, URI uri, diff --git a/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java index 9dd6694267c..cf750edbece 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java +++ b/jdk/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java @@ -178,7 +178,7 @@ class SystemModuleFinder implements ModuleFinder { ModuleReference mref = new ModuleReference(md, uri, readerSupplier, hash); - // may need a reference to a patched module if -Xpatch specified + // may need a reference to a patched module if --patch-module specified mref = ModulePatcher.interposeIfNeeded(mref); return mref; diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java index 52d951250d4..b9b93b275ef 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java @@ -56,8 +56,8 @@ import jdk.internal.perf.PerfCounter; * The {@link #boot() boot} method is called early in the startup to initialize * the module system. In summary, the boot method creates a Configuration by * resolving a set of module names specified via the launcher (or equivalent) - * -m and -addmods options. The modules are located on a module path that is - * constructed from the upgrade module path, system modules, and application + * -m and --add-modules options. The modules are located on a module path that + * is constructed from the upgrade module path, system modules, and application * module path. The Configuration is instantiated as the boot Layer with each * module in the the configuration defined to one of the built-in class loaders. */ @@ -127,16 +127,16 @@ public final class ModuleBootstrap { long t2 = System.nanoTime(); - // -upgrademodulepath option specified to launcher + // --upgrade-module-path option specified to launcher ModuleFinder upgradeModulePath - = createModulePathFinder("jdk.upgrade.module.path"); + = createModulePathFinder("jdk.module.upgrade.path"); if (upgradeModulePath != null) systemModules = ModuleFinder.compose(upgradeModulePath, systemModules); - // -modulepath option specified to the launcher + // --module-path option specified to the launcher ModuleFinder appModulePath = createModulePathFinder("jdk.module.path"); - // The module finder: [-upgrademodulepath] system [-modulepath] + // The module finder: [--upgrade-module-path] system [--module-path] ModuleFinder finder = systemModules; if (appModulePath != null) finder = ModuleFinder.compose(finder, appModulePath); @@ -149,11 +149,11 @@ public final class ModuleBootstrap { if (mainModule != null) roots.add(mainModule); - // additional module(s) specified by -addmods + // additional module(s) specified by --add-modules boolean addAllDefaultModules = false; boolean addAllSystemModules = false; boolean addAllApplicationModules = false; - String propValue = System.getProperty("jdk.launcher.addmods"); + String propValue = getAndRemoveProperty("jdk.module.addmods"); if (propValue != null) { for (String mod: propValue.split(",")) { switch (mod) { @@ -172,8 +172,8 @@ public final class ModuleBootstrap { } } - // -limitmods - propValue = System.getProperty("jdk.launcher.limitmods"); + // --limit-modules + propValue = getAndRemoveProperty("jdk.module.limitmods"); if (propValue != null) { Set<String> mods = new HashSet<>(); for (String mod: propValue.split(",")) { @@ -216,7 +216,7 @@ public final class ModuleBootstrap { } } - // If `-addmods ALL-SYSTEM` is specified then all observable system + // If `--add-modules ALL-SYSTEM` is specified then all observable system // modules will be resolved. if (addAllSystemModules) { ModuleFinder f = finder; // observable modules @@ -228,9 +228,9 @@ public final class ModuleBootstrap { .forEach(mn -> roots.add(mn)); } - // If `-addmods ALL-MODULE-PATH` is specified then all observable + // If `--add-modules ALL-MODULE-PATH` is specified then all observable // modules on the application module path will be resolved. - if (appModulePath != null && addAllApplicationModules) { + if (appModulePath != null && addAllApplicationModules) { ModuleFinder f = finder; // observable modules appModulePath.findAll() .stream() @@ -250,7 +250,7 @@ public final class ModuleBootstrap { if (baseUri.getScheme().equals("jrt") // toLowerCase not needed here && (upgradeModulePath == null) && (appModulePath == null) - && (System.getProperty("jdk.launcher.patch.0") == null)) { + && (!ModulePatcher.isBootLayerPatched())) { needPostResolutionChecks = false; } @@ -317,7 +317,7 @@ public final class ModuleBootstrap { PerfCounters.loadModulesTime.addElapsedTimeFrom(t5); - // -XaddReads and -XaddExports + // --add-reads and --add-exports addExtraReads(bootLayer); addExtraExports(bootLayer); @@ -394,13 +394,13 @@ public final class ModuleBootstrap { /** - * Process the -XaddReads options to add any additional read edges that + * Process the --add-reads options to add any additional read edges that * are specified on the command-line. */ private static void addExtraReads(Layer bootLayer) { // decode the command line options - Map<String, Set<String>> map = decode("jdk.launcher.addreads."); + Map<String, Set<String>> map = decode("jdk.module.addreads."); for (Map.Entry<String, Set<String>> e : map.entrySet()) { @@ -431,13 +431,13 @@ public final class ModuleBootstrap { /** - * Process the -XaddExports options to add any additional read edges that + * Process the --add-exports options to add any additional read edges that * are specified on the command-line. */ private static void addExtraExports(Layer bootLayer) { // decode the command line options - Map<String, Set<String>> map = decode("jdk.launcher.addexports."); + Map<String, Set<String>> map = decode("jdk.module.addexports."); for (Map.Entry<String, Set<String>> e : map.entrySet()) { @@ -483,13 +483,14 @@ public final class ModuleBootstrap { /** - * Decodes the values of -XaddReads or -XaddExports options + * Decodes the values of --add-reads or --add-exports options * * The format of the options is: $KEY=$MODULE(,$MODULE)* */ private static Map<String, Set<String>> decode(String prefix) { int index = 0; - String value = System.getProperty(prefix + index); + // the system property is removed after decoding + String value = getAndRemoveProperty(prefix + index); if (value == null) return Collections.emptyMap(); @@ -522,12 +523,18 @@ public final class ModuleBootstrap { } index++; - value = System.getProperty(prefix + index); + value = getAndRemoveProperty(prefix + index); } return map; } + /** + * Gets and remove the named system property + */ + private static String getAndRemoveProperty(String key) { + return (String)System.getProperties().remove(key); + } /** * Throws a RuntimeException with the given message diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java index 49104d8c242..ebc7d85a5e8 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java @@ -58,7 +58,7 @@ import sun.net.www.ParseUtil; /** - * Provides support for patching modules in the boot layer with -Xpatch. + * Provides support for patching modules in the boot layer with --patch-module. */ public final class ModulePatcher { @@ -66,28 +66,27 @@ public final class ModulePatcher { private static final JavaLangModuleAccess JLMA = SharedSecrets.getJavaLangModuleAccess(); - // the prefix of the system properties that encode the value of -Xpatch - private static final String PATCH_PROPERTY_PREFIX = "jdk.launcher.patch."; + // the prefix of the system properties that encode the value of --patch-module + private static final String PATCH_PROPERTY_PREFIX = "jdk.module.patch."; // module name -> sequence of patches (directories or JAR files) private static final Map<String, List<Path>> PATCH_MAP = decodeProperties(); private ModulePatcher() { } - /** - * Decodes the values of -Xpatch options, returning a Map of module name to - * list of file paths. + * Decodes the values of --patch-module options, returning a Map of module + * name to list of file paths. * * @throws IllegalArgumentException if the the module name is missing or - * -Xpatch is used more than once to patch the same module + * --patch-module is used more than once to patch the same module */ private static Map<String, List<Path>> decodeProperties() { int index = 0; - String value = System.getProperty(PATCH_PROPERTY_PREFIX + index); + String value = getAndRemoveProperty(PATCH_PROPERTY_PREFIX + index); if (value == null) - return Collections.emptyMap(); // -Xpatch not specified + return Collections.emptyMap(); // --patch-module not specified Map<String, List<Path>> map = new HashMap<>(); while (value != null) { @@ -115,13 +114,21 @@ public final class ModulePatcher { } index++; - value = System.getProperty(PATCH_PROPERTY_PREFIX + index); + value = getAndRemoveProperty(PATCH_PROPERTY_PREFIX + index); } return map; } + /** + * Returns {@code true} is --patch-module is specified to patch modules + * in the boot layer. + */ + static boolean isBootLayerPatched() { + return !PATCH_MAP.isEmpty(); + } + /** * Returns a module reference that interposes on the given module if * needed. If there are no patches for the given module then the module @@ -536,6 +543,13 @@ public final class ModulePatcher { } } + /** + * Gets and remove the named system property + */ + private static String getAndRemoveProperty(String key) { + return (String)System.getProperties().remove(key); + } + /** * Derives a package name from the name of an entry in a JAR file. */ diff --git a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java index aff3778c7ff..f19ed371e52 100644 --- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java +++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java @@ -60,8 +60,6 @@ import java.nio.charset.Charset; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.text.Normalizer; import java.text.MessageFormat; import java.util.ResourceBundle; @@ -905,7 +903,7 @@ public final class LauncherHelper { ModuleFinder finder = jdk.internal.module.ModuleBootstrap.finder(); - int colon = optionFlag.indexOf(':'); + int colon = optionFlag.indexOf('='); if (colon == -1) { finder.findAll().stream() .sorted(Comparator.comparing(ModuleReference::descriptor)) diff --git a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties index 73cfc8af252..23fcac28865 100644 --- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties +++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties @@ -27,7 +27,7 @@ java.launcher.opt.header = Usage: {0} [options] class [args...]\n\ \ (to execute a class)\n or {0} [options] -jar jarfile [args...]\n\ \ (to execute a jar file)\n\ -\ or {0} [options] -mp <modulepath> -m <modulename>[/<mainclass>] [args...]\n\ +\ or {0} [options] -p <modulepath> -m <modulename>[/<mainclass>] [args...]\n\ \ (to execute the main class in a module)\n\ where options include:\n @@ -41,24 +41,28 @@ java.launcher.ergo.message2 =\ because you are running on a se # Translators please note do not translate the options themselves java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\n\ \ -classpath <class search path of directories and zip/jar files>\n\ +\ --class-path <class search path of directories and zip/jar files>\n\ \ A {0} separated list of directories, JAR archives,\n\ \ and ZIP archives to search for class files.\n\ -\ -mp <module path>\n\ -\ -modulepath <module path>...\n\ +\ -p <module path>\n\ +\ --module-path <module path>...\n\ \ A {0} separated list of directories, each directory\n\ \ is a directory of modules.\n\ -\ -upgrademodulepath <module path>...\n\ +\ --upgrade-module-path <module path>...\n\ \ A {0} separated list of directories, each directory\n\ \ is a directory of modules that replace upgradeable\n\ \ modules in the runtime image\n\ -\ -m <modulename>[/<mainclass>]\n\ +\ -m <module>[/<mainclass>]\n\ +\ --module <modulename>[/<mainclass>]\n\ \ the initial module to resolve, and the name of the main class\n\ \ to execute if not specified by the module\n\ -\ -addmods <modulename>[,<modulename>...]\n\ -\ root modules to resolve in addition to the initial module\n\ -\ -limitmods <modulename>[,<modulename>...]\n\ +\ --add-modules <modulename>[,<modulename>...]\n\ +\ root modules to resolve in addition to the initial module.\n\ +\ <modulename> can also be ALL-DEFAULT, ALL-SYSTEM,\n\ +\ ALL-MODULE-PATH.\n\ +\ --limit-modules <modulename>[,<modulename>...]\n\ \ limit the universe of observable modules\n\ -\ -listmods[:<modulename>[,<modulename>...]]\n\ +\ --list-modules [<modulename>[,<modulename>...]]\n\ \ list the observable modules and exit\n\ \ --dry-run create VM but do not execute main method.\n\ \ This --dry-run option may be useful for validating the\n\ @@ -69,7 +73,8 @@ java.launcher.opt.footer =\ -cp <class search path of directories and zip \ enable verbose output\n\ \ -version print product version and exit\n\ \ -showversion print product version and continue\n\ -\ -? -help print this help message\n\ +\ -? -help --help\n\ +\ print this help message\n\ \ -X print help on non-standard options\n\ \ -ea[:<packagename>...|:<classname>]\n\ \ -enableassertions[:<packagename>...|:<classname>]\n\ @@ -91,6 +96,8 @@ java.launcher.opt.footer =\ -cp <class search path of directories and zip \ -splash:<imagepath>\n\ \ show splash screen with specified image\n\ \ @<filepath> read options from the specified file\n\ +\To specify an argument for a long option, you can use --<name>=<value> or\n\ +\--<name> <value>.\n\ See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details. @@ -123,17 +130,21 @@ java.launcher.X.usage=\ \ show all property settings and continue\n\ \ -XshowSettings:locale\n\ \ show all locale related settings and continue\n\ -\ -XaddReads:<module>=<other-module>(,<other-module>)*\n\ -\ <module> reads other modules,\n\ -\ regardless of module declaration\n\ -\ -XaddExports:<module>/<package>=<other-module>(,<other-module>)*\n\ -\ <module> exports <package> to other modules,\n\ -\ regardless of module declaration\n\ -\ -Xpatch:<module>=<file>({0}<file>)*\n\ +\ -Xdisable-@files disable further argument file expansion\n\ +\ --add-reads <module>=<target-module>(,<target-module>)*\n\ +\ updates <module> to read <target-module>, regardless\n\ +\ of module declaration. \n\ +\ <target-module> can be ALL-UNNAMED to read all unnamed\n\ +\ modules.\n\ +\ --add-exports <module>/<package>=<target-module>(,<target-module>)*\n\ +\ updates <module> to export <package> to <target-module>,\n\ +\ regardless of module declaration.\n\ +\ <target-module> can be ALL-UNNAMED to export to all\n\ +\ unnamed modules.\n\ +\ --patch-module <module>=<file>({0}<file>)*\n\ \ Override or augment a module with classes and resources\n\ -\ in JAR files or directories\n\ -\ -Xdisable-@files disable further argument file expansion\n\n\ -The -X options are non-standard and subject to change without notice.\n +\ in JAR files or directories.\n\n\ +These options are non-standard and subject to change without notice.\n # Translators please note do not translate the options themselves java.launcher.X.macosx.usage=\ diff --git a/jdk/src/java.base/share/native/libjli/args.c b/jdk/src/java.base/share/native/libjli/args.c index 55f67f355ce..ac8774e08af 100644 --- a/jdk/src/java.base/share/native/libjli/args.c +++ b/jdk/src/java.base/share/native/libjli/args.c @@ -102,24 +102,21 @@ static void checkArg(const char *arg) { // All arguments arrive here must be a launcher argument, // ie. by now, all argfile expansions must have been performed. - if (*arg++ == '-') { + if (*arg == '-') { expectingNoDashArg = JNI_FALSE; - if (JLI_StrCmp(arg, "cp") == 0 || - JLI_StrCmp(arg, "classpath") == 0 || - JLI_StrCmp(arg, "addmods") == 0 || - JLI_StrCmp(arg, "limitmods") == 0 || - JLI_StrCmp(arg, "mp") == 0 || - JLI_StrCmp(arg, "modulepath") == 0 || - JLI_StrCmp(arg, "upgrademodulepath") == 0) { + if (IsWhiteSpaceOption(arg)) { + // expect an argument expectingNoDashArg = JNI_TRUE; - } else if (JLI_StrCmp(arg, "jar") == 0 || - JLI_StrCmp(arg, "m") == 0) { - // This is tricky, we do expect NoDashArg - // But that is considered main class to stop expansion - expectingNoDashArg = JNI_FALSE; - // We can not just update the idx here because if -jar @file - // still need expansion of @file to get the argument for -jar - } else if (JLI_StrCmp(arg, "Xdisable-@files") == 0) { + + if (JLI_StrCmp(arg, "-jar") == 0 || + JLI_StrCmp(arg, "-m") == 0) { + // This is tricky, we do expect NoDashArg + // But that is considered main class to stop expansion + expectingNoDashArg = JNI_FALSE; + // We can not just update the idx here because if -jar @file + // still need expansion of @file to get the argument for -jar + } + } else if (JLI_StrCmp(arg, "-Xdisable-@files") == 0) { stopExpansion = JNI_TRUE; } } else { diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index 5a5e8deac23..12ca2b2c656 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -69,7 +69,7 @@ static jboolean showVersion = JNI_FALSE; /* print but continue */ static jboolean printUsage = JNI_FALSE; /* print and exit*/ static jboolean printXUsage = JNI_FALSE; /* print and exit*/ static jboolean dryRun = JNI_FALSE; /* initialize VM and exit */ -static char *showSettings = NULL; /* print but continue */ +static char *showSettings = NULL; /* print but continue */ static char *listModules = NULL; static const char *_program_name; @@ -99,17 +99,9 @@ static int numOptions, maxOptions; * Prototypes for functions internal to launcher. */ static void SetClassPath(const char *s); -static void SetModulePath(const char *s); -static void SetUpgradeModulePath(const char *s); static void SetMainModule(const char *s); -static void SetAddModulesProp(const char *mods); -static void SetLimitModulesProp(const char *mods); -static void SetAddReadsProp(const jint n, const char *s); -static void SetAddExportsProp(const jint n, const char *s); -static void SetPatchProp(const jint n, const char *s); static void SelectVersion(int argc, char **argv, char **main_class); static void SetJvmEnvironment(int argc, char **argv); -static jboolean IsWhiteSpaceOptionArgument(const char* name); static jboolean ParseArguments(int *pargc, char ***pargv, int *pmode, char **pwhat, int *pret, const char *jrepath); @@ -133,6 +125,18 @@ static void SetPaths(int argc, char **argv); static void DumpState(); static jboolean RemovableOption(char *option); +enum OptionKind { + LAUNCHER_OPTION = 0, + LAUNCHER_OPTION_WITH_ARGUMENT, + LAUNCHER_MAIN_OPTION, + VM_LONG_OPTION, + VM_LONG_OPTION_WITH_ARGUMENT, + VM_OPTION +}; + +static int GetOpt(int *pargc, char ***pargv, char **poption, char **pvalue); +static jboolean IsOptionWithArgument(int argc, char **argv); + /* Maximum supported entries from jvm.cfg. */ #define INIT_MAX_KNOWN_VMS 10 @@ -162,6 +166,19 @@ static int KnownVMIndex(const char* name); static void FreeKnownVMs(); static jboolean IsWildCardEnabled(); +/* + * This reports error. VM will not be created and no usage is printed. + */ +#define REPORT_ERROR(AC_ok, AC_failure_message, AC_questionable_arg) \ + do { \ + if (!AC_ok) { \ + JLI_ReportErrorMessage(AC_failure_message, AC_questionable_arg); \ + printUsage = JNI_FALSE; \ + *pret = 1; \ + return JNI_FALSE; \ + } \ + } while (JNI_FALSE) + #define ARG_CHECK(AC_arg_count, AC_failure_message, AC_questionable_arg) \ do { \ if (AC_arg_count < 1) { \ @@ -511,17 +528,73 @@ JavaMain(void * _args) } /* - * Test if the given option name has a whitespace separated argument. + * Test if the given name is one of the class path options. */ -jboolean -IsWhiteSpaceOptionArgument(const char* name) { +static jboolean +IsClassPathOption(const char* name) { return JLI_StrCmp(name, "-classpath") == 0 || JLI_StrCmp(name, "-cp") == 0 || - JLI_StrCmp(name, "-modulepath") == 0 || - JLI_StrCmp(name, "-mp") == 0 || - JLI_StrCmp(name, "-upgrademodulepath") == 0 || - JLI_StrCmp(name, "-addmods") == 0 || - JLI_StrCmp(name, "-limitmods") == 0; + JLI_StrCmp(name, "--class-path") == 0; +} + +/* + * Test if the given name is a launcher option taking the main entry point. + */ +static jboolean +IsLauncherMainOption(const char* name) { + return JLI_StrCmp(name, "--module") == 0 || + JLI_StrCmp(name, "-m") == 0; +} + +/* + * Test if the given name is a white-space launcher option. + */ +static jboolean +IsLauncherOption(const char* name) { + return IsClassPathOption(name) || + IsLauncherMainOption(name) || + JLI_StrCmp(name, "--list-modules") == 0; +} + +#ifndef OLD_MODULE_OPTIONS +/* + * Old module options for transition + */ +static jboolean +IsOldModuleOption(const char* name) { + return JLI_StrCmp(name, "-modulepath") == 0 || + JLI_StrCmp(name, "-mp") == 0 || + JLI_StrCmp(name, "-upgrademodulepath") == 0 || + JLI_StrCmp(name, "-addmods") == 0 || + JLI_StrCmp(name, "-limitmods") == 0; +} +#endif + +/* + * Test if the given name is a module-system white-space option that + * will be passed to the VM with its corresponding long-form option + * name and "=" delimiter. + */ +static jboolean +IsModuleOption(const char* name) { + return JLI_StrCmp(name, "--module-path") == 0 || + JLI_StrCmp(name, "-p") == 0 || + JLI_StrCmp(name, "--upgrade-module-path") == 0 || + JLI_StrCmp(name, "--add-modules") == 0 || + JLI_StrCmp(name, "--limit-modules") == 0 || + JLI_StrCmp(name, "--add-exports") == 0 || + JLI_StrCmp(name, "--add-reads") == 0 || + JLI_StrCmp(name, "--patch-module") == 0 || + IsOldModuleOption(name); +} + +/* + * Test if the given name has a white space option. + */ +jboolean +IsWhiteSpaceOption(const char* name) { + return IsModuleOption(name) || + IsLauncherOption(name); } /* @@ -559,7 +632,7 @@ CheckJvmType(int *pargc, char ***argv, jboolean speculative) { continue; } } else { - if (IsWhiteSpaceOptionArgument(arg)) { + if (IsWhiteSpaceOption(arg)) { newArgv[newArgvIdx++] = arg; argi++; if (argi < argc) { @@ -701,7 +774,7 @@ SetJvmEnvironment(int argc, char **argv) { if (i > 0) { char *prev = argv[i - 1]; // skip non-dash arg preceded by class path specifiers - if (*arg != '-' && IsWhiteSpaceOptionArgument(prev)) { + if (*arg != '-' && IsWhiteSpaceOption(prev)) { continue; } @@ -709,6 +782,7 @@ SetJvmEnvironment(int argc, char **argv) { || JLI_StrCmp(arg, "-version") == 0 || JLI_StrCmp(arg, "-fullversion") == 0 || JLI_StrCmp(arg, "-help") == 0 + || JLI_StrCmp(arg, "--help") == 0 || JLI_StrCmp(arg, "-?") == 0 || JLI_StrCmp(arg, "-jar") == 0 || JLI_StrCmp(arg, "-X") == 0) { @@ -882,39 +956,16 @@ SetClassPath(const char *s) } static void -SetModulePath(const char *s) +AddLongFormOption(const char *option, const char *arg) { + static const char format[] = "%s=%s"; char *def; - const char *orig = s; - static const char format[] = "-Djdk.module.path=%s"; - if (s == NULL) - return; - s = JLI_WildcardExpandClasspath(s); - def = JLI_MemAlloc(sizeof(format) - - 2 /* strlen("%s") */ - + JLI_StrLen(s)); - sprintf(def, format, s); - AddOption(def, NULL); - if (s != orig) - JLI_MemFree((char *) s); -} + size_t def_len; -static void -SetUpgradeModulePath(const char *s) -{ - char *def; - const char *orig = s; - static const char format[] = "-Djdk.upgrade.module.path=%s"; - if (s == NULL) - return; - s = JLI_WildcardExpandClasspath(s); - def = JLI_MemAlloc(sizeof(format) - - 2 /* strlen("%s") */ - + JLI_StrLen(s)); - sprintf(def, format, s); + def_len = JLI_StrLen(option) + 1 + JLI_StrLen(arg) + 1; + def = JLI_MemAlloc(def_len); + JLI_Snprintf(def, def_len, format, option, arg); AddOption(def, NULL); - if (s != orig) - JLI_MemFree((char *) s); } static void @@ -939,46 +990,6 @@ SetMainModule(const char *s) AddOption(def, NULL); } -static void -SetAddModulesProp(const char *mods) { - size_t buflen = JLI_StrLen(mods) + 40; - char *prop = (char *)JLI_MemAlloc(buflen); - JLI_Snprintf(prop, buflen, "-Djdk.launcher.addmods=%s", mods); - AddOption(prop, NULL); -} - -static void -SetLimitModulesProp(const char *mods) { - size_t buflen = JLI_StrLen(mods) + 40; - char *prop = (char *)JLI_MemAlloc(buflen); - JLI_Snprintf(prop, buflen, "-Djdk.launcher.limitmods=%s", mods); - AddOption(prop, NULL); -} - -static void -SetAddReadsProp(const jint n, const char *s) { - size_t buflen = JLI_StrLen(s) + 40; - char *prop = (char *)JLI_MemAlloc(buflen); - JLI_Snprintf(prop, buflen, "-Djdk.launcher.addreads.%d=%s", n, s); - AddOption(prop, NULL); -} - -static void -SetAddExportsProp(const jint n, const char *s) { - size_t buflen = JLI_StrLen(s) + 40; - char *prop = (char *)JLI_MemAlloc(buflen); - JLI_Snprintf(prop, buflen, "-Djdk.launcher.addexports.%d=%s", n, s); - AddOption(prop, NULL); -} - -static void -SetPatchProp(const jint n, const char *s) { - size_t buflen = JLI_StrLen(s) + 40; - char *prop = (char *)JLI_MemAlloc(buflen); - JLI_Snprintf(prop, buflen, "-Djdk.launcher.patch.%d=%s", n, s); - AddOption(prop, NULL); -} - /* * The SelectVersion() routine ensures that an appropriate version of * the JRE is running. The specification for the appropriate version @@ -1003,6 +1014,7 @@ SelectVersion(int argc, char **argv, char **main_class) char *splash_jar_name = NULL; char *env_in; int res; + jboolean has_arg; /* * If the version has already been selected, set *main_class @@ -1033,9 +1045,11 @@ SelectVersion(int argc, char **argv, char **main_class) * This capability is no longer available with JRE versions 1.9 and later. * These command line options are reported as errors. */ + argc--; argv++; while ((arg = *argv) != 0 && *arg == '-') { + has_arg = IsOptionWithArgument(argc, argv); if (JLI_StrCCmp(arg, "-version:") == 0) { JLI_ReportErrorMessage(SPC_ERROR1); } else if (JLI_StrCmp(arg, "-jre-restrict-search") == 0) { @@ -1045,10 +1059,12 @@ SelectVersion(int argc, char **argv, char **main_class) } else { if (JLI_StrCmp(arg, "-jar") == 0) jarflag = 1; - if (IsWhiteSpaceOptionArgument(arg) && (argc >= 2)) { - argc--; - argv++; - arg = *argv; + if (IsWhiteSpaceOption(arg)) { + if (has_arg) { + argc--; + argv++; + arg = *argv; + } } /* @@ -1139,6 +1155,108 @@ SelectVersion(int argc, char **argv, char **main_class) } +/* + * Test if the current argv is an option, i.e. with a leading `-` + * and followed with an argument without a leading `-`. + */ +static jboolean +IsOptionWithArgument(int argc, char** argv) { + char* option; + char* arg; + + if (argc <= 1) + return JNI_FALSE; + + option = *argv; + arg = *(argv+1); + return *option == '-' && *arg != '-'; +} + +/* + * Gets the option, and its argument if the option has an argument. + * It will update *pargc, **pargv to the next option. + */ +static int +GetOpt(int *pargc, char ***pargv, char **poption, char **pvalue) { + int argc = *pargc; + char** argv = *pargv; + char* arg = *argv; + + char* option = arg; + char* value = NULL; + char* equals = NULL; + int kind = LAUNCHER_OPTION; + jboolean has_arg = JNI_FALSE; + + // check if this option may be a white-space option with an argument + has_arg = IsOptionWithArgument(argc, argv); + + argv++; --argc; + if (IsLauncherOption(arg)) { + if (has_arg) { + value = *argv; + argv++; --argc; + } + kind = IsLauncherMainOption(arg) ? LAUNCHER_MAIN_OPTION + : LAUNCHER_OPTION_WITH_ARGUMENT; + } else if (IsModuleOption(arg)) { + kind = VM_LONG_OPTION_WITH_ARGUMENT; + if (has_arg) { + value = *argv; + argv++; --argc; + } + + /* + * Support short form alias + */ + if (JLI_StrCmp(arg, "-p") == 0) { + option = "--module-path"; + } + + } else if (JLI_StrCCmp(arg, "--") == 0 && (equals = JLI_StrChr(arg, '=')) != NULL) { + value = equals+1; + if (JLI_StrCCmp(arg, "--list-modules=") == 0 || + JLI_StrCCmp(arg, "--module=") == 0 || + JLI_StrCCmp(arg, "--class-path=") == 0) { + kind = LAUNCHER_OPTION_WITH_ARGUMENT; + } else { + kind = VM_LONG_OPTION; + } + } + +#ifndef OLD_MODULE_OPTIONS + // for transition to support both old and new syntax + if (JLI_StrCmp(arg, "-modulepath") == 0 || + JLI_StrCmp(arg, "-mp") == 0) { + option = "--module-path"; + } else if (JLI_StrCmp(arg, "-upgrademodulepath") == 0) { + option = "--upgrade-module-path"; + } else if (JLI_StrCmp(arg, "-addmods") == 0) { + option = "--add-modules"; + } else if (JLI_StrCmp(arg, "-limitmods") == 0) { + option = "--limit-modules"; + } else if (JLI_StrCCmp(arg, "-XaddExports:") == 0) { + option = "--add-exports"; + value = arg + 13; + kind = VM_LONG_OPTION_WITH_ARGUMENT; + } else if (JLI_StrCCmp(arg, "-XaddReads:") == 0) { + option = "--add-reads"; + value = arg + 11; + kind = VM_LONG_OPTION_WITH_ARGUMENT; + } else if (JLI_StrCCmp(arg, "-Xpatch:") == 0) { + option = "--patch-module"; + value = arg + 8; + kind = VM_LONG_OPTION_WITH_ARGUMENT; + } +#endif + + *pargc = argc; + *pargv = argv; + *poption = option; + *pvalue = value; + return kind; +} + /* * Parses command line arguments. Returns JNI_FALSE if launcher * should exit without starting vm, returns JNI_TRUE if vm needs @@ -1158,52 +1276,85 @@ ParseArguments(int *pargc, char ***pargv, *pret = 0; while ((arg = *argv) != 0 && *arg == '-') { - argv++; --argc; - if (JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) { - ARG_CHECK (argc, ARG_ERROR1, arg); - SetClassPath(*argv); - mode = LM_CLASS; - argv++; --argc; - } else if (JLI_StrCmp(arg, "-modulepath") == 0 || JLI_StrCmp(arg, "-mp") == 0) { - ARG_CHECK (argc, ARG_ERROR4, arg); - SetModulePath(*argv); - argv++; --argc; - } else if (JLI_StrCmp(arg, "-upgrademodulepath") == 0) { - ARG_CHECK (argc, ARG_ERROR4, arg); - SetUpgradeModulePath(*argv); - argv++; --argc; - } else if (JLI_StrCmp(arg, "-jar") == 0) { - ARG_CHECK (argc, ARG_ERROR2, arg); + char *option = NULL; + char *value = NULL; + int kind = GetOpt(&argc, &argv, &option, &value); + jboolean has_arg = value != NULL; + +/* + * Option to set main entry point + */ + if (JLI_StrCmp(arg, "-jar") == 0) { + ARG_CHECK(argc, ARG_ERROR2, arg); mode = LM_JAR; - } else if (JLI_StrCmp(arg, "-m") == 0) { - ARG_CHECK (argc, ARG_ERROR5, arg); - SetMainModule(*argv); + } else if (JLI_StrCmp(arg, "--module") == 0 || + JLI_StrCCmp(arg, "--module=") == 0 || + JLI_StrCmp(arg, "-m") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR5, arg); + SetMainModule(value); mode = LM_MODULE; - } else if (JLI_StrCmp(arg, "-addmods") == 0) { - ARG_CHECK (argc, ARG_ERROR6, arg); - SetAddModulesProp(*argv); - argv++; --argc; - } else if (JLI_StrCmp(arg, "-limitmods") == 0) { - ARG_CHECK (argc, ARG_ERROR6, arg); - SetLimitModulesProp(*argv); - argv++; --argc; - } else if (JLI_StrCmp(arg, "-listmods") == 0 || - JLI_StrCCmp(arg, "-listmods:") == 0) { + if (has_arg) { + *pwhat = value; + break; + } + } else if (JLI_StrCmp(arg, "--class-path") == 0 || + JLI_StrCCmp(arg, "--class-path=") == 0 || + JLI_StrCmp(arg, "-classpath") == 0 || + JLI_StrCmp(arg, "-cp") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR1, arg); + SetClassPath(value); + mode = LM_CLASS; + } else if (JLI_StrCmp(arg, "--list-modules") == 0 || + JLI_StrCCmp(arg, "--list-modules=") == 0) { listModules = arg; + + // set listModules to --list-modules=<module-names> if argument is specified + if (JLI_StrCmp(arg, "--list-modules") == 0 && has_arg) { + static const char format[] = "%s=%s"; + size_t buflen = JLI_StrLen(option) + 2 + JLI_StrLen(value); + listModules = JLI_MemAlloc(buflen); + JLI_Snprintf(listModules, buflen, format, option, value); + } return JNI_TRUE; - } else if (JLI_StrCCmp(arg, "-XaddReads:") == 0) { - static jint n; - char *value = arg + 11; - SetAddReadsProp(n++, value); - } else if (JLI_StrCCmp(arg, "-XaddExports:") == 0) { - static jint n; - char *value = arg + 13; - SetAddExportsProp(n++, value); - } else if (JLI_StrCCmp(arg, "-Xpatch:") == 0) { - static jint n; - char *value = arg + 8; - SetPatchProp(n++, value); - } else if (JLI_StrCmp(arg, "-help") == 0 || +/* + * Parse white-space options + */ + } else if (has_arg) { + if (kind == VM_LONG_OPTION) { + AddOption(option, NULL); + } else if (kind == VM_LONG_OPTION_WITH_ARGUMENT) { + AddLongFormOption(option, value); + } +/* + * Error missing argument + */ + } else if (!has_arg && IsWhiteSpaceOption(arg)) { + if (JLI_StrCmp(arg, "--module-path") == 0 || + JLI_StrCmp(arg, "-p") == 0 || + JLI_StrCmp(arg, "--upgrade-module-path") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR4, arg); + } else if (JLI_StrCmp(arg, "--add-modules") == 0 || + JLI_StrCmp(arg, "--limit-modules") == 0 || + JLI_StrCmp(arg, "--add-exports") == 0 || + JLI_StrCmp(arg, "--add-reads") == 0 || + JLI_StrCmp(arg, "--patch-module") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR6, arg); + } +#ifndef OLD_MODULE_OPTIONS + else if (JLI_StrCmp(arg, "-modulepath") == 0 || + JLI_StrCmp(arg, "-mp") == 0 || + JLI_StrCmp(arg, "-upgrademodulepath") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR4, arg); + } else if (JLI_StrCmp(arg, "-addmods") == 0 || + JLI_StrCmp(arg, "-limitmods") == 0) { + REPORT_ERROR (has_arg, ARG_ERROR6, arg); + } +#endif +/* + * The following cases will cause the argument parsing to stop + */ + } else if (JLI_StrCmp(arg, "--help") == 0 || + JLI_StrCmp(arg, "-help") == 0 || JLI_StrCmp(arg, "-h") == 0 || JLI_StrCmp(arg, "-?") == 0) { printUsage = JNI_TRUE; @@ -1282,7 +1433,7 @@ ParseArguments(int *pargc, char ***pargv, } } - if (--argc >= 0) { + if (*pwhat == NULL && --argc >= 0) { *pwhat = *argv++; } @@ -1692,7 +1843,7 @@ static void ListModules(JNIEnv *env, char *optString) { jmethodID listModulesID; - jstring joptString; + jstring joptString = NULL; jclass cls = GetLauncherHelperClass(env); NULL_CHECK(cls); NULL_CHECK(listModulesID = (*env)->GetStaticMethodID(env, cls, diff --git a/jdk/src/java.base/share/native/libjli/java.h b/jdk/src/java.base/share/native/libjli/java.h index a4cecaa5545..c18c66e5b51 100644 --- a/jdk/src/java.base/share/native/libjli/java.h +++ b/jdk/src/java.base/share/native/libjli/java.h @@ -161,6 +161,7 @@ void SetJavaLauncherProp(void); jint ReadKnownVMs(const char *jvmcfg, jboolean speculative); char *CheckJvmType(int *argc, char ***argv, jboolean speculative); void AddOption(char *str, void *info); +jboolean IsWhiteSpaceOption(const char* name); enum ergo_policy { DEFAULT_POLICY = 0, diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java index 49781d7561d..165a424d9ca 100644 --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java @@ -91,7 +91,7 @@ class GNUStyleOptions { tool.xflag = true; } }, - new Option(false, OptionType.MAIN_OPERATION, "--print-module-descriptor", "-p") { + new Option(false, OptionType.MAIN_OPERATION, "--print-module-descriptor", "-d") { void process(Main tool, String opt, String arg) throws BadArgs { if (tool.cflag || tool.iflag || tool.tflag || tool.uflag || tool.xflag) throw new BadArgs("error.multiple.main.operations").showUsage(true); @@ -145,7 +145,7 @@ class GNUStyleOptions { } } }, - new Option(true, OptionType.CREATE_UPDATE, "--modulepath", "--mp") { + new Option(true, OptionType.CREATE_UPDATE, "--module-path", "-p") { void process(Main jartool, String opt, String arg) { String[] dirs = arg.split(File.pathSeparator); Path[] paths = new Path[dirs.length]; diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties index 9c570c7ded8..783ef1570cd 100644 --- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties +++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/resources/jar.properties @@ -201,7 +201,7 @@ main.help.opt.main.update=\ main.help.opt.main.extract=\ \ -x, --extract Extract named (or all) files from the archive main.help.opt.main.print-module-descriptor=\ -\ -p, --print-module-descriptor Print the module descriptor +\ -d, --print-module-descriptor Print the module descriptor main.help.opt.any=\ \ Operation modifiers valid in any mode:\n\ \n\ @@ -232,8 +232,8 @@ main.help.opt.create.update.hash-modules=\ \ matched by the given pattern and that depend upon\n\ \ directly or indirectly on a modular jar being\n\ \ created or a non-modular jar being updated -main.help.opt.create.update.modulepath=\ -\ --modulepath Location of module dependence for generating +main.help.opt.create.update.module-path=\ +\ -p, --module-path Location of module dependence for generating\n\ \ the hash main.help.opt.create.update.index=\ \ Operation modifiers valid only in create, update, and generate-index mode:\n @@ -250,7 +250,7 @@ main.help.postopt=\ \ located in the root of the given directories, or the root of the jar archive\n\ \ itself. The following operations are only valid when creating a modular jar,\n\ \ or updating an existing non-modular jar: '--module-version',\n\ -\ '--hash-modules', and '--modulepath'.\n\ +\ '--hash-modules', and '--module-path'.\n\ \n\ \ Mandatory or optional arguments to long options are also mandatory or optional\n\ -\ for any corresponding short options. \ No newline at end of file +\ for any corresponding short options. diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java index 2069b0774cb..5b19b2e3e2b 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/JImageTask.java @@ -61,11 +61,11 @@ class JImageTask { new Option<JImageTask>(false, (task, option, arg) -> { task.options.fullVersion = true; - }, true, "--fullversion"), + }, true, "--full-version"), new Option<JImageTask>(false, (task, option, arg) -> { task.options.help = true; - }, "--help"), + }, "--help", "-h"), new Option<JImageTask>(false, (task, option, arg) -> { task.options.verbose = true; diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties index b429a11c9dd..24bffe3e1a5 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jimage/resources/jimage.properties @@ -25,7 +25,7 @@ main.usage.summary=\ Usage: {0} <extract | info | list | verify> <options> jimage...\n\ -use --help for a list of possible options. +use -h or --help for a list of possible options. main.usage=\ Usage: {0} <extract | info | list | verify> <options> jimage...\n\ @@ -76,11 +76,11 @@ main.opt.footer=\ \ used, one pattern per line\n\ -main.opt.fullversion=\ -\ --fullversion Print full version information +main.opt.full-version=\ +\ --full-version Print full version information main.opt.help=\ -\ --help Print usage message +\ -h, --help Print usage message main.opt.verbose=\ \ --verbose Listing prints entry size and offset attributes diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java index 0e973677376..1190a64abd7 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java @@ -84,31 +84,32 @@ public class JlinkTask { private static final Option<?>[] recognizedOptions = { new Option<JlinkTask>(false, (task, opt, arg) -> { task.options.help = true; - }, "--help"), + }, "--help", "-h"), new Option<JlinkTask>(true, (task, opt, arg) -> { String[] dirs = arg.split(File.pathSeparator); + int i = 0; Arrays.stream(dirs) .map(Paths::get) .forEach(task.options.modulePath::add); - }, "--modulepath", "--mp"), + }, "--module-path", "-p"), new Option<JlinkTask>(true, (task, opt, arg) -> { for (String mn : arg.split(",")) { if (mn.isEmpty()) { throw taskHelper.newBadArgs("err.mods.must.be.specified", - "--limitmods"); + "--limit-modules"); } task.options.limitMods.add(mn); } - }, "--limitmods"), + }, "--limit-modules"), new Option<JlinkTask>(true, (task, opt, arg) -> { for (String mn : arg.split(",")) { if (mn.isEmpty()) { throw taskHelper.newBadArgs("err.mods.must.be.specified", - "--addmods"); + "--add-modules"); } task.options.addMods.add(mn); } - }, "--addmods"), + }, "--add-modules"), new Option<JlinkTask>(true, (task, opt, arg) -> { Path path = Paths.get(arg); task.options.output = path; @@ -134,10 +135,10 @@ public class JlinkTask { }, true, "--keep-packaged-modules"), new Option<JlinkTask>(true, (task, opt, arg) -> { task.options.saveoptsfile = arg; - }, "--saveopts"), + }, "--save-opts"), new Option<JlinkTask>(false, (task, opt, arg) -> { task.options.fullVersion = true; - }, true, "--fullversion"),}; + }, true, "--full-version"),}; private static final String PROGNAME = "jlink"; private final OptionsValues options = new OptionsValues(); @@ -294,7 +295,7 @@ public class JlinkTask { try { options.addMods = checkAddMods(options.addMods); } catch (IllegalArgumentException ex) { - throw taskHelper.newBadArgs("err.mods.must.be.specified", "--addmods") + throw taskHelper.newBadArgs("err.mods.must.be.specified", "--add-modules") .showUsage(true); } // First create the image provider diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java index 01c15f5ec2e..4524f199725 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java @@ -196,7 +196,7 @@ public final class TaskHelper { // This option is handled prior // to have the options parsed. }, - "--plugins-modulepath")); + "--plugin-module-path")); mainOptions.add(new PlugOption(true, (task, opt, arg) -> { Path path = Paths.get(arg); if (!Files.exists(path) || !Files.isDirectory(path)) { diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties index e7714e6e884..832304b48bb 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/jlink.properties @@ -24,30 +24,31 @@ # main.usage.summary=\ -Usage: {0} <options> --modulepath <modulepath> --addmods <mods> --output <path>\n\ +Usage: {0} <options> --module-path <modulepath> --add-modules <mods> --output <path>\n\ use --help for a list of possible options main.usage=\ -Usage: {0} <options> --modulepath <modulepath> --addmods <mods> --output <path>\n\ +Usage: {0} <options> --module-path <modulepath> --add-modules <mods> --output <path>\n\ \Possible options include: error.prefix=Error: warn.prefix=Warning: main.opt.help=\ -\ --help Print this help message +\ -h, --help Print this help message main.opt.version=\ \ --version Version information -main.opt.modulepath=\ -\ --modulepath <modulepath> Module path +main.opt.module-path=\ +\ -p <modulepath>\n\ +\ --module-path <modulepath> Module path -main.opt.addmods=\ -\ --addmods <mod>[,<mod>...] Root modules to resolve +main.opt.add-modules=\ +\ --add-modules <mod>[,<mod>...] Root modules to resolve -main.opt.limitmods=\ -\ --limitmods <mod>[,<mod>...] Limit the universe of observable modules +main.opt.limit-modules=\ +\ --limit-modules <mod>[,<mod>...] Limit the universe of observable modules main.opt.output=\ \ --output <path> Location of output path @@ -58,8 +59,8 @@ main.command.files=\ main.opt.endian=\ \ --endian <little|big> Byte order of generated jimage (default:native) -main.opt.saveopts=\ -\ --saveopts <filename> Save jlink options in the given file +main.opt.save-opts=\ +\ --save-opts <filename> Save jlink options in the given file main.msg.bug=\ An exception has occurred in jlink. \ @@ -83,7 +84,7 @@ main.extended.help.footer=\ err.unknown.byte.order:unknown byte order {0} err.output.must.be.specified:--output must be specified -err.modulepath.must.be.specified:--modulepath must be specified +err.modulepath.must.be.specified:--module-path must be specified err.mods.must.be.specified:no modules specified to {0} err.path.not.found=path not found: {0} err.path.not.valid=invalid path: {0} diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties index 285600e2c77..50b958fa85d 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/resources/plugins.properties @@ -115,7 +115,7 @@ include-locales.invalidtag=\ Invalid language tag: %s include-locales.localedatanotfound=\ -jdk.localedata module was not specified with --addmods option +jdk.localedata module was not specified with --add-modules option main.status.ok=Functional. @@ -133,8 +133,8 @@ plugin.opt.post-process-path=\ plugin.opt.resources-last-sorter=\ \ --resources-last-sorter <name> The last plugin allowed to sort resources -plugin.opt.plugins-modulepath=\ -\ --plugin-module-path <modulepath> Custom plugins module path +plugin.opt.plugin-module-path=\ +\ --plugin-module-path <modulepath> Custom plugin module path plugin.opt.c=\ \ -c, --compress=2 Enable compression of resources (level 2) diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java index 9a50cbbe542..a799ce3ebd3 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java @@ -1181,7 +1181,7 @@ public class JmodTask { } } - private final OptionParser parser = new OptionParser(); + private final OptionParser parser = new OptionParser("hp"); private void handleOptions(String[] args) { parser.formatHelpWith(new JmodHelpFormatter()); @@ -1218,7 +1218,7 @@ public class JmodTask { .withValuesConvertedBy(new PatternConverter()); OptionSpec<Void> help - = parser.accepts("help", getMessage("main.opt.help")) + = parser.acceptsAll(Set.of("h", "help"), getMessage("main.opt.help")) .forHelp(); OptionSpec<Path> libs @@ -1232,9 +1232,9 @@ public class JmodTask { .withRequiredArg() .describedAs(getMessage("main.opt.main-class.arg")); - OptionSpec<Path> modulePath // TODO: short version of --mp ?? - = parser.acceptsAll(Arrays.asList("mp", "modulepath"), - getMessage("main.opt.modulepath")) + OptionSpec<Path> modulePath + = parser.acceptsAll(Set.of("p", "module-path"), + getMessage("main.opt.module-path")) .withRequiredArg() .withValuesSeparatedBy(File.pathSeparatorChar) .withValuesConvertedBy(DirPathConverter.INSTANCE); diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties index 301037e264d..d6531f70ca4 100644 --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties @@ -63,7 +63,7 @@ main.opt.os-arch=Operating system architecture main.opt.os-arch.arg=os-arch main.opt.os-version=Operating system version main.opt.os-version.arg=os-version -main.opt.modulepath=Module path +main.opt.module-path=Module path main.opt.hash-modules=Compute and record hashes to tie a packaged module\ \ with modules matching the given <regex-pattern> and depending upon it directly\ \ or indirectly. The hashes are recorded in the JMOD file being created, or\ diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index a6af75c47bb..657e62cc0e7 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -343,6 +343,9 @@ com/sun/jdi/GetLocalVariables4Test.sh 8067354 windows- com/sun/jdi/sde/SourceDebugExtensionTest.java 8158066 windows-all +com/sun/jdi/ClassesByName2Test.java 8160833 generic-all +com/sun/jdi/RedefineCrossEvent.java 8160833 generic-all + ############################################################################ # jdk_time diff --git a/jdk/test/TEST.ROOT b/jdk/test/TEST.ROOT index 3c75542592c..8a4164133fe 100644 --- a/jdk/test/TEST.ROOT +++ b/jdk/test/TEST.ROOT @@ -26,12 +26,12 @@ groups=TEST.groups [closed/TEST.groups] # Allow querying of various System properties in @requires clauses requires.properties=sun.arch.data.model java.runtime.name -# Tests using jtreg 4.2 b02 features -requiredVersion=4.2 b02 +# Tests using jtreg 4.2 b03 features +requiredVersion=4.2 b03 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them external.lib.roots = ../../ -# Use new form of -Xpatch -useNewXpatch=true +# Use new module options +useNewOptions=true diff --git a/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh b/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh index 0ecd30a4de5..214b6e1fb65 100644 --- a/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh +++ b/jdk/test/com/sun/corba/5036554/TestCorbaBug.sh @@ -81,9 +81,9 @@ cp ${TESTSRC}${FS}JavaBug.java bug chmod -fR 777 bug -${COMPILEJAVA}${FS}bin${FS}javac -addmods java.corba -d . bug${FS}*.java +${COMPILEJAVA}${FS}bin${FS}javac --add-modules java.corba -d . bug${FS}*.java -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -addmods java.corba -cp . bug/JavaBug > test.out 2>&1 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} --add-modules java.corba -cp . bug/JavaBug > test.out 2>&1 grep "NullPointerException" test.out diff --git a/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java index ccc84df74bc..15397206330 100644 --- a/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java +++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java @@ -27,8 +27,8 @@ * @summary Four helper classes missing in Sun JDK * @library /lib/testlibrary * @build jdk.testlibrary.* - * @compile -addmods java.corba CorbaExceptionsCompileTest.java - * @run main/othervm -addmods java.corba CorbaExceptionsCompileTest + * @modules java.corba + * @run main CorbaExceptionsCompileTest */ import java.io.*; diff --git a/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java b/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java index 4791c63f2ef..73592c4287d 100644 --- a/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java +++ b/jdk/test/com/sun/corba/se/impl/io/HookPutFieldsTest.java @@ -25,8 +25,8 @@ * @test * @bug 7095856 * @summary OutputStreamHook doesn't handle null values - * @compile -addmods java.corba HookPutFieldsTest.java - * @run main/othervm -addmods java.corba HookPutFieldsTest + * @modules java.corba + * @run main HookPutFieldsTest */ import java.net.InetAddress; diff --git a/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java b/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java index 49b0a5d9f6f..1ed35fbc677 100644 --- a/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java +++ b/jdk/test/com/sun/corba/se/impl/orb/SetDefaultORBTest.java @@ -25,8 +25,8 @@ * @test * @bug 8028215 * @summary SetDefaultORBTest setting ORB impl via properties test - * @compile -addmods java.corba SetDefaultORBTest.java - * @run main/othervm -addmods java.corba SetDefaultORBTest + * @modules java.corba + * @run main SetDefaultORBTest * */ diff --git a/jdk/test/com/sun/jdi/ImmutableResourceTest.sh b/jdk/test/com/sun/jdi/ImmutableResourceTest.sh index b38e538b431..133925e4b19 100644 --- a/jdk/test/com/sun/jdi/ImmutableResourceTest.sh +++ b/jdk/test/com/sun/jdi/ImmutableResourceTest.sh @@ -99,11 +99,11 @@ env set -vx # # Compile test class -${TESTJAVA}/bin/javac -XaddExports:jdk.jdi/com.sun.tools.example.debug.tty=ALL-UNNAMED \ +${TESTJAVA}/bin/javac --add-exports jdk.jdi/com.sun.tools.example.debug.tty=ALL-UNNAMED \ -d "${TESTCLASSES}" ${CP} -g "${TESTSRC}"/"${TARGETCLASS}".java # # Run the test class, again with the classpath we need: -${TESTJAVA}/bin/java -XaddExports:jdk.jdi/com.sun.tools.example.debug.tty=ALL-UNNAMED \ +${TESTJAVA}/bin/java --add-exports jdk.jdi/com.sun.tools.example.debug.tty=ALL-UNNAMED \ ${CP} ${TARGETCLASS} status=$? echo "test status was: $status" diff --git a/jdk/test/com/sun/jndi/cosnaming/CNNameParser.java b/jdk/test/com/sun/jndi/cosnaming/CNNameParser.java index 1c429b29100..4d18093317e 100644 --- a/jdk/test/com/sun/jndi/cosnaming/CNNameParser.java +++ b/jdk/test/com/sun/jndi/cosnaming/CNNameParser.java @@ -26,6 +26,7 @@ * @summary Tests that JNDI/COS naming parser supports the syntax * defined in the new INS standard. * @modules java.corba/com.sun.jndi.cosnaming + * @run main/othervm CNNameParser */ import javax.naming.*; diff --git a/jdk/test/com/sun/jndi/cosnaming/IiopUrlIPv6.java b/jdk/test/com/sun/jndi/cosnaming/IiopUrlIPv6.java index ebaf6d8761c..a23d419e247 100644 --- a/jdk/test/com/sun/jndi/cosnaming/IiopUrlIPv6.java +++ b/jdk/test/com/sun/jndi/cosnaming/IiopUrlIPv6.java @@ -25,6 +25,7 @@ * @bug 5042453 * @summary Ipv6 address throws Non-numeric port number error * @modules java.corba/com.sun.jndi.cosnaming + * @run main/othervm IiopUrlIPv6 */ import com.sun.jndi.cosnaming.*; diff --git a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java index 546bf8a7051..1f98e2b6709 100644 --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java @@ -61,7 +61,7 @@ public class CheckOrigin { ProcessBuilder pb = ProcessTools. createJavaProcessBuilder( - "-XaddExports:jdk.attach/sun.tools.attach=ALL-UNNAMED", + "--add-exports", "jdk.attach/sun.tools.attach=ALL-UNNAMED", "-XX:+UseConcMarkSweepGC", // this will cause UseParNewGC to be FLAG_SET_ERGO "-XX:+UseCodeAging", "-XX:+UseCerealGC", // Should be ignored. diff --git a/jdk/test/java/awt/Gtk/GtkVersionTest/GtkVersionTest.java b/jdk/test/java/awt/Gtk/GtkVersionTest/GtkVersionTest.java index cc327e34e12..8dc6a46d659 100644 --- a/jdk/test/java/awt/Gtk/GtkVersionTest/GtkVersionTest.java +++ b/jdk/test/java/awt/Gtk/GtkVersionTest/GtkVersionTest.java @@ -55,7 +55,7 @@ public class GtkVersionTest { "/bin/java " + (version == null ? "" : "-Djdk.gtk.version=" + version) + " -Djdk.gtk.verbose=true " + - "-XaddExports:java.desktop/sun.awt=ALL-UNNAMED " + + "--add-exports=java.desktop/sun.awt=ALL-UNNAMED " + "-cp " + System.getProperty("java.class.path", ".") + " GtkVersionTest$LoadGtk"); p.waitFor(); diff --git a/jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh b/jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh index b1930f0a728..1683ba94a58 100644 --- a/jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh +++ b/jdk/test/java/awt/Toolkit/Headless/WrappedToolkitTest/WrappedToolkitTest.sh @@ -113,8 +113,8 @@ fi case "$OS" in Windows* | CYGWIN* ) ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ *.java status=$? if [ ! $status -eq "0" ]; then @@ -124,8 +124,8 @@ case "$OS" in SunOS | Linux ) ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ *.java status=$? if [ ! $status -eq "0" ]; then @@ -135,8 +135,8 @@ case "$OS" in Darwin) ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ *.java status=$? if [ ! $status -eq "0" ]; then @@ -154,16 +154,16 @@ chmod 777 ./* case "$OS" in Windows* | CYGWIN* ) ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ TestWrapped sun.awt.windows.WToolkit status=$? if [ ! $status -eq "0" ]; then fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.windows.WToolkit"; fi ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED ${CP} \ -Dawt.toolkit=sun.awt.windows.WToolkit \ TestWrapped sun.awt.windows.WToolkit status=$? @@ -174,8 +174,8 @@ case "$OS" in SunOS | Linux ) ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ -Dawt.toolkit=sun.awt.X11.XToolkit \ TestWrapped sun.awt.X11.XToolkit status=$? @@ -183,8 +183,8 @@ case "$OS" in fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.awt.xawt.XToolkit"; fi AWT_TOOLKIT=XToolkit ${TESTJAVA}/bin/java ${TESTVMOPTS} \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED ${CP} \ -Djava.awt.headless=true \ TestWrapped sun.awt.X11.XToolkit status=$? @@ -195,16 +195,16 @@ case "$OS" in Darwin) ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ TestWrapped sun.lwawt.macosx.LWCToolkit status=$? if [ ! $status -eq "0" ]; then fail "Test FAILED: toolkit wrapped into HeadlessToolkit is not an instance of sun.lwawt.macosx.LWCToolkit"; fi ${TESTJAVA}/bin/java ${TESTVMOPTS} -Djava.awt.headless=true \ - -XaddExports:java.desktop/sun.awt=ALL-UNNAMED \ - -XaddExports:java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ + --add-exports java.desktop/sun.awt=ALL-UNNAMED \ + --add-exports java.desktop/sun.lwawt.macosx=ALL-UNNAMED ${CP} \ -Dawt.toolkit=sun.lwawt.macosx.LWCToolkit \ TestWrapped sun.lwawt.macosx.LWCToolkit status=$? diff --git a/jdk/test/java/awt/xembed/server/RunTestXEmbed.java b/jdk/test/java/awt/xembed/server/RunTestXEmbed.java index fb8314bc679..97179a073a6 100644 --- a/jdk/test/java/awt/xembed/server/RunTestXEmbed.java +++ b/jdk/test/java/awt/xembed/server/RunTestXEmbed.java @@ -73,10 +73,11 @@ public class RunTestXEmbed extends TestXEmbedServer { enva[ind++] = "AWT_TOOLKIT=sun.awt.X11.XToolkit"; } } - Process proc = Runtime.getRuntime().exec(java_home + - "/bin/java -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED -Dawt.toolkit=sun.awt.X11.XToolkit TesterClient " - + test.getName() + " " + window + buf, - enva); + Process proc = Runtime.getRuntime(). + exec(java_home + + "/bin/java --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED -Dawt.toolkit=sun.awt.X11.XToolkit TesterClient " + + test.getName() + " " + window + buf, + enva); System.err.println("Test for " + test.getName() + " has started."); log.fine("Test for " + test.getName() + " has started."); new InputReader(proc.getInputStream()); diff --git a/jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java b/jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java index 8e0c3d6774e..8a953c3acf7 100644 --- a/jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java +++ b/jdk/test/java/awt/xembed/server/TestXEmbedServerJava.java @@ -84,11 +84,11 @@ public class TestXEmbedServerJava extends TestXEmbedServer { } if (hasModules) { System.out.println(java_home + - "/bin/java -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED "+ - "-XaddExports:java.desktop/sun.awt=ALL-UNNAMED JavaClient " + window); + "/bin/java --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED "+ + "--add-exports java.desktop/sun.awt=ALL-UNNAMED JavaClient " + window); return Runtime.getRuntime().exec(java_home + - "/bin/java -XaddExports:java.desktop/sun.awt.X11=ALL-UNNAMED "+ - "-XaddExports:java.desktop/sun.awt=ALL-UNNAMED JavaClient " + window); + "/bin/java --add-exports java.desktop/sun.awt.X11=ALL-UNNAMED "+ + "--add-exports java.desktop/sun.awt=ALL-UNNAMED JavaClient " + window); }else{ System.out.println(java_home + "/bin/java JavaClient " + window); return Runtime.getRuntime().exec(java_home + "/bin/java JavaClient " + window); diff --git a/jdk/test/java/beans/XMLDecoder/8028054/TestConstructorFinder.java b/jdk/test/java/beans/XMLDecoder/8028054/TestConstructorFinder.java index 1609bb1486f..5a97ade252a 100644 --- a/jdk/test/java/beans/XMLDecoder/8028054/TestConstructorFinder.java +++ b/jdk/test/java/beans/XMLDecoder/8028054/TestConstructorFinder.java @@ -39,7 +39,7 @@ import java.util.List; * java.corba * java.xml.bind * @compile -XDignore.symbol.file TestConstructorFinder.java - * @run main/othervm -addmods java.activation -addmods java.transaction -addmods java.corba -addmods java.xml.bind TestConstructorFinder + * @run main/othervm --add-modules=java.activation,java.transaction,java.corba,java.xml.bind TestConstructorFinder */ public class TestConstructorFinder { diff --git a/jdk/test/java/beans/XMLDecoder/8028054/TestMethodFinder.java b/jdk/test/java/beans/XMLDecoder/8028054/TestMethodFinder.java index ad7ca0bd944..8dfbd202c69 100644 --- a/jdk/test/java/beans/XMLDecoder/8028054/TestMethodFinder.java +++ b/jdk/test/java/beans/XMLDecoder/8028054/TestMethodFinder.java @@ -39,7 +39,7 @@ import java.util.List; * java.corba * java.xml.bind * @compile -XDignore.symbol.file TestMethodFinder.java - * @run main/othervm -addmods java.activation -addmods java.transaction -addmods java.corba -addmods java.xml.bind TestMethodFinder + * @run main/othervm --add-modules=java.activation,java.transaction,java.corba,java.xml.bind TestMethodFinder */ public class TestMethodFinder { diff --git a/jdk/test/java/lang/Class/forName/modules/TestDriver.java b/jdk/test/java/lang/Class/forName/modules/TestDriver.java index 690849b7c2a..7ab1f636c9e 100644 --- a/jdk/test/java/lang/Class/forName/modules/TestDriver.java +++ b/jdk/test/java/lang/Class/forName/modules/TestDriver.java @@ -65,7 +65,7 @@ public class TestDriver { public void setup() throws Exception { assertTrue(CompilerUtils.compile( MOD_SRC_DIR, MOD_DEST_DIR, - "-modulesourcepath", + "--module-source-path", MOD_SRC_DIR.toString())); copyDirectories(MOD_DEST_DIR.resolve("m1"), Paths.get("mods1")); @@ -76,8 +76,8 @@ public class TestDriver { public void test() throws Exception { String[] options = new String[] { "-cp", TEST_CLASSES, - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "-m", "m2/p2.test.Main" }; runTest(options); @@ -87,8 +87,8 @@ public class TestDriver { public void testUnnamedModule() throws Exception { String[] options = new String[] { "-cp", TEST_CLASSES, - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "TestMain" }; runTest(options); @@ -107,8 +107,8 @@ public class TestDriver { @Test public void testDeniedClassLoaderAccess() throws Exception { String[] options = new String[] { - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "-m", "m3/p3.NoGetClassLoaderAccess" }; assertTrue(executeTestJava(options) @@ -124,8 +124,8 @@ public class TestDriver { String[] options = new String[] { "-Djava.security.manager", "-Djava.security.policy=" + policyFile.toString(), - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "-m", "m3/p3.NoAccess" }; assertTrue(executeTestJava(options) diff --git a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java index 9052737aad5..5f4dcea191e 100644 --- a/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java +++ b/jdk/test/java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java @@ -63,8 +63,8 @@ import jdk.internal.module.Modules; * loads all the classes in the BCL, get their declared fields, * and call setAccessible(false) followed by setAccessible(true); * @modules java.base/jdk.internal.module - * @run main/othervm -Djdk.launcher.addmods=ALL-SYSTEM FieldSetAccessibleTest UNSECURE - * @run main/othervm -Djdk.launcher.addmods=ALL-SYSTEM FieldSetAccessibleTest SECURE + * @run main/othervm --add-modules=ALL-SYSTEM FieldSetAccessibleTest UNSECURE + * @run main/othervm --add-modules=ALL-SYSTEM FieldSetAccessibleTest SECURE * * @author danielfuchs */ diff --git a/jdk/test/java/lang/Class/getResource/ResourcesTest.java b/jdk/test/java/lang/Class/getResource/ResourcesTest.java index a78e3353f45..97fdae6f575 100644 --- a/jdk/test/java/lang/Class/getResource/ResourcesTest.java +++ b/jdk/test/java/lang/Class/getResource/ResourcesTest.java @@ -60,15 +60,15 @@ public class ResourcesTest { compiled = CompilerUtils .compile(SRC_DIR, MODS_DIR, - "-modulesourcepath", SRC_DIR.toString()); + "--module-source-path", SRC_DIR.toString()); assertTrue(compiled); - // javac -mp mods -d classes Main.java + // javac --module-path mods -d classes Main.java compiled = CompilerUtils .compile(Paths.get(TEST_SRC, "Main.java"), CLASSES_DIR, - "-mp", MODS_DIR.toString(), - "-addmods", "m1,m2,m3"); + "--module-path", MODS_DIR.toString(), + "--add-modules", "m1,m2,m3"); assertTrue(compiled); } @@ -79,8 +79,8 @@ public class ResourcesTest { public void runTest() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "m1,m2,m3", + = executeTestJava("--module-path", MODS_DIR.toString(), + "--add-modules", "m1,m2,m3", "-cp", CLASSES_DIR.toString(), "Main") .outputTo(System.out) diff --git a/jdk/test/java/lang/ClassLoader/getResource/modules/ResourcesTest.java b/jdk/test/java/lang/ClassLoader/getResource/modules/ResourcesTest.java index c6e1bcf764d..3eafa822766 100644 --- a/jdk/test/java/lang/ClassLoader/getResource/modules/ResourcesTest.java +++ b/jdk/test/java/lang/ClassLoader/getResource/modules/ResourcesTest.java @@ -56,19 +56,19 @@ public class ResourcesTest { public void compileAll() throws Exception { boolean compiled; - // javac -modulesource mods -d mods src/** + // javac --module-source-path mods -d mods src/** compiled = CompilerUtils .compile(SRC_DIR, MODS_DIR, - "-modulesourcepath", SRC_DIR.toString()); + "--module-source-path", SRC_DIR.toString()); assertTrue(compiled); - // javac -mp mods -d classes Main.java + // javac --module-path mods -d classes Main.java compiled = CompilerUtils .compile(Paths.get(TEST_SRC, "Main.java"), CLASSES_DIR, - "-mp", MODS_DIR.toString(), - "-addmods", "m1,m2,m3"); + "--module-path", MODS_DIR.toString(), + "--add-modules", "m1,m2,m3"); assertTrue(compiled); } @@ -77,8 +77,8 @@ public class ResourcesTest { */ public void runTest() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "m1,m2,m3", + = executeTestJava("--module-path", MODS_DIR.toString(), + "--add-modules", "m1,m2,m3", "-cp", CLASSES_DIR.toString(), "Main") .outputTo(System.out) diff --git a/jdk/test/java/lang/SecurityManager/modules/CustomSecurityManager.sh b/jdk/test/java/lang/SecurityManager/modules/CustomSecurityManager.sh index e722677fd3f..37b527e34d3 100644 --- a/jdk/test/java/lang/SecurityManager/modules/CustomSecurityManager.sh +++ b/jdk/test/java/lang/SecurityManager/modules/CustomSecurityManager.sh @@ -51,15 +51,15 @@ JAVAC="$COMPILEJAVA/bin/javac" JAVA="$TESTJAVA/bin/java ${TESTVMOPTS}" mkdir -p mods -$JAVAC -d mods -modulesourcepath ${TESTSRC} `find ${TESTSRC}/m -name "*.java"` +$JAVAC -d mods --module-source-path ${TESTSRC} `find ${TESTSRC}/m -name "*.java"` mkdir -p classes $JAVAC -d classes ${TESTSRC}/Test.java -$JAVA -cp classes -mp mods -addmods m \ +$JAVA -cp classes --module-path mods --add-modules m \ -Djava.security.manager \ -Djava.security.policy=${TESTSRC}/test.policy Test -$JAVA -cp classes -mp mods -addmods m \ +$JAVA -cp classes --module-path mods --add-modules m \ -Djava.security.manager=p.CustomSecurityManager \ -Djava.security.policy=${TESTSRC}/test.policy Test diff --git a/jdk/test/java/lang/String/concat/WithSecurityManager.java b/jdk/test/java/lang/String/concat/WithSecurityManager.java index d4aaeeaf131..9359d29fbb1 100644 --- a/jdk/test/java/lang/String/concat/WithSecurityManager.java +++ b/jdk/test/java/lang/String/concat/WithSecurityManager.java @@ -38,13 +38,13 @@ import java.security.Permission; * @run main/othervm -Xverify:all -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager * @run main/othervm -Xverify:all -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager * - * @run main/othervm -Xverify:all -limitmods java.base WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=BC_SB WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager - * @run main/othervm -Xverify:all -limitmods java.base -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=BC_SB_SIZED_EXACT WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_SB_SIZED_EXACT WithSecurityManager + * @run main/othervm -Xverify:all --limit-modules=java.base -Djava.lang.invoke.stringConcat=MH_INLINE_SIZED_EXACT WithSecurityManager */ public class WithSecurityManager { public static void main(String[] args) throws Throwable { diff --git a/jdk/test/java/lang/instrument/MakeJAR2.sh b/jdk/test/java/lang/instrument/MakeJAR2.sh index ec76b820472..9568be6eda4 100644 --- a/jdk/test/java/lang/instrument/MakeJAR2.sh +++ b/jdk/test/java/lang/instrument/MakeJAR2.sh @@ -87,7 +87,7 @@ ${JAVAC} ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} bootreporter/*.java cd .. ${JAVAC} ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ - -XaddExports:java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED ${AGENT}.java asmlib/*.java + --add-exports java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED ${AGENT}.java asmlib/*.java ${JAVAC} ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -classpath .${PATHSEP}bootpath ${APP}.java echo "Manifest-Version: 1.0" > ${AGENT}.mf diff --git a/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java b/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java index d76513e17a7..32adfd9d5e0 100644 --- a/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java +++ b/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java @@ -60,7 +60,7 @@ public class ModuleAccessControlTest { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); assertTrue(CompilerUtils - .compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + .compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } } @@ -69,7 +69,7 @@ public class ModuleAccessControlTest { */ @Test public void runTest() throws Exception { - int exitValue = executeTestJava("-mp", MODS_DIR.toString(), + int exitValue = executeTestJava("--module-path", MODS_DIR.toString(), "-m", "m1/p1.Main") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java index a7dea9961cc..a3305d521ac 100644 --- a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java +++ b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java @@ -63,9 +63,9 @@ public class LayerAndLoadersTest { @BeforeTest public void setup() throws Exception { - // javac -d mods -modulesourcepath src src/** + // javac -d mods --module-source-path src src/** assertTrue(CompilerUtils.compile(SRC_DIR, MODS_DIR, - "-modulesourcepath", SRC_DIR.toString())); + "--module-source-path", SRC_DIR.toString())); } diff --git a/jdk/test/java/lang/reflect/Layer/src/m1/module-info.java b/jdk/test/java/lang/reflect/Layer/src/m1/module-info.java index d989339e3f9..1cfeb4bf177 100644 --- a/jdk/test/java/lang/reflect/Layer/src/m1/module-info.java +++ b/jdk/test/java/lang/reflect/Layer/src/m1/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/reflect/Module/AddExportsTest.java b/jdk/test/java/lang/reflect/Module/AddExportsTest.java index 0ac990677a4..3f4453614e8 100644 --- a/jdk/test/java/lang/reflect/Module/AddExportsTest.java +++ b/jdk/test/java/lang/reflect/Module/AddExportsTest.java @@ -23,29 +23,44 @@ /** * @test - * @modules java.desktop - * @run main/othervm -XaddExports:java.desktop/sun.awt=java.base AddExportsTest - * @run main/othervm -XaddExports:java.desktop/sun.awt=ALL-UNNAMED AddExportsTest + * @modules java.base/jdk.internal.misc + * java.desktop + * @run main/othervm --add-exports=java.desktop/sun.awt=java.base AddExportsTest + * @run main/othervm --add-exports=java.desktop/sun.awt=ALL-UNNAMED AddExportsTest * @summary Test Module isExported methods with exports changed by -AddExportsTest */ import java.lang.reflect.Layer; import java.lang.reflect.Module; import java.util.Optional; +import java.util.stream.Stream; + +import jdk.internal.misc.VM; public class AddExportsTest { + /* + * jtreg sets -Dtest.modules system property to the internal APIs + * specified at @modules tag. The test will exclude --add-exports set + * for @modules. + */ + private static final String TEST_MODULES = System.getProperty("test.modules"); public static void main(String[] args) { - String addExports = System.getProperty("jdk.launcher.addexports.0"); - assertTrue(addExports != null, "Expected to be run with -XaddExports"); + Optional<String> oaddExports = Stream.of(VM.getRuntimeArguments()) + .filter(arg -> arg.startsWith("--add-exports=")) + .filter(arg -> !arg.equals("--add-exports=" + TEST_MODULES + "=ALL-UNNAMED")) + .map(arg -> arg.substring("--add-exports=".length(), arg.length())) + .findFirst(); + + assertTrue(oaddExports.isPresent()); Layer bootLayer = Layer.boot(); Module unnamedModule = AddExportsTest.class.getModule(); assertFalse(unnamedModule.isNamed()); - for (String expr : addExports.split(",")) { + for (String expr : oaddExports.get().split(",")) { String[] s = expr.split("="); assertTrue(s.length == 2); diff --git a/jdk/test/java/lang/reflect/Module/access/AccessTest.java b/jdk/test/java/lang/reflect/Module/access/AccessTest.java index 5e5ee037156..1e6e98a2cc6 100644 --- a/jdk/test/java/lang/reflect/Module/access/AccessTest.java +++ b/jdk/test/java/lang/reflect/Module/access/AccessTest.java @@ -72,8 +72,8 @@ public class AccessTest { */ public void runTest() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "target", + = executeTestJava("--module-path", MODS_DIR.toString(), + "--add-modules", "target", "-m", "test/test.Main") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java b/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java index fcc673909fa..55e11f1b3ec 100644 --- a/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java +++ b/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java @@ -64,7 +64,7 @@ public class ProxyClassAccessTest { public void compileAll() throws Exception { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); - assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } } @@ -73,7 +73,7 @@ public class ProxyClassAccessTest { */ @Test public void runTest() throws Exception { - int exitValue = executeTestJava("-mp", MODS_DIR.toString(), + int exitValue = executeTestJava("--module-path", MODS_DIR.toString(), "-m", "test/jdk.test.ProxyClassAccess") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java b/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java index 37c0bd59b23..5b04c93596b 100644 --- a/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java +++ b/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java @@ -65,7 +65,7 @@ public class ProxyLayerTest { public void compileAll() throws Exception { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); - assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } } diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyModuleMapping.java b/jdk/test/java/lang/reflect/Proxy/ProxyModuleMapping.java index db3af7d5e6f..bd8d1b042b3 100644 --- a/jdk/test/java/lang/reflect/Proxy/ProxyModuleMapping.java +++ b/jdk/test/java/lang/reflect/Proxy/ProxyModuleMapping.java @@ -38,7 +38,7 @@ public class ProxyModuleMapping { Module unnamed = ld.getUnnamedModule(); new ProxyModuleMapping(unnamed, Runnable.class).test(); - // unnamed module gets access to sun.invoke package (e.g. via -XaddExports) + // unnamed module gets access to sun.invoke package (e.g. via --add-exports) new ProxyModuleMapping(sun.invoke.WrapperInstance.class).test(); Class<?> modulePrivateIntf = Class.forName("sun.net.ProgressListener"); diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyTest.java b/jdk/test/java/lang/reflect/Proxy/ProxyTest.java index 80c8b76ae9a..2a7945bb5e9 100644 --- a/jdk/test/java/lang/reflect/Proxy/ProxyTest.java +++ b/jdk/test/java/lang/reflect/Proxy/ProxyTest.java @@ -61,7 +61,7 @@ public class ProxyTest { public void compileAll() throws Exception { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); - assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } } @@ -71,7 +71,7 @@ public class ProxyTest { @Test public void runTest() throws Exception { int exitValue = executeTestJava("-cp", CPATH_DIR.toString(), - "-mp", MODS_DIR.toString(), + "--module-path", MODS_DIR.toString(), "-m", "test/jdk.test.Main") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/java/net/Authenticator/B4933582.sh b/jdk/test/java/net/Authenticator/B4933582.sh index a9cff3e6a62..e1cca0200b6 100644 --- a/jdk/test/java/net/Authenticator/B4933582.sh +++ b/jdk/test/java/net/Authenticator/B4933582.sh @@ -44,7 +44,7 @@ case "$OS" in ;; esac -EXTRAOPTS="-XaddExports:java.base/sun.net.www=ALL-UNNAMED -XaddExports:java.base/sun.net.www.protocol.http=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED --add-exports java.base/sun.net.www.protocol.http=ALL-UNNAMED" export EXTRAOPTS ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . \ diff --git a/jdk/test/java/net/SocketOption/OptionsTest.java b/jdk/test/java/net/SocketOption/OptionsTest.java index f1309f11b50..232873372ee 100644 --- a/jdk/test/java/net/SocketOption/OptionsTest.java +++ b/jdk/test/java/net/SocketOption/OptionsTest.java @@ -26,7 +26,7 @@ * @bug 8036979 8072384 8044773 * @run main/othervm -Xcheck:jni OptionsTest * @run main/othervm -Xcheck:jni -Djava.net.preferIPv4Stack=true OptionsTest - * @run main/othervm -limitmods java.base OptionsTest + * @run main/othervm --limit-modules=java.base OptionsTest */ import java.lang.reflect.Method; diff --git a/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java b/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java index 488960c4bb3..5af84fdfdd9 100644 --- a/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java +++ b/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java @@ -33,7 +33,7 @@ import java.util.List; * @summary Test checks that UnsupportedOperationException for unsupported * SOCKET_OPTIONS is thrown by both getOption() and setOption() methods. * @run main UnsupportedOptionsTest - * @run main/othervm -limitmods java.base UnsupportedOptionsTest + * @run main/othervm --limit-modules=java.base UnsupportedOptionsTest */ public class UnsupportedOptionsTest { diff --git a/jdk/test/java/net/httpclient/http2/HpackDriver.java b/jdk/test/java/net/httpclient/http2/HpackDriver.java index 3bf1bc39a4b..366b04c3c97 100644 --- a/jdk/test/java/net/httpclient/http2/HpackDriver.java +++ b/jdk/test/java/net/httpclient/http2/HpackDriver.java @@ -29,12 +29,12 @@ * @compile/module=java.httpclient sun/net/httpclient/hpack/SpecHelper.java * @compile/module=java.httpclient sun/net/httpclient/hpack/TestHelper.java * @compile/module=java.httpclient sun/net/httpclient/hpack/BuffersTestingKit.java - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.BinaryPrimitivesTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.CircularBufferTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.DecoderTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.EncoderTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.HeaderTableTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.HuffmanTest - * @run testng/othervm -XaddReads:java.httpclient=ALL-UNNAMED java.httpclient/sun.net.httpclient.hpack.TestHelper + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.BinaryPrimitivesTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.CircularBufferTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.DecoderTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.EncoderTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.HeaderTableTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.HuffmanTest + * @run testng/othervm java.httpclient/sun.net.httpclient.hpack.TestHelper */ public class HpackDriver { } diff --git a/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java index 270efce9126..abb8b174979 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java @@ -25,7 +25,7 @@ * @bug 4640544 8044773 * @summary Unit test for setOption/getOption/options methods * @run main SocketOptionTests - * @run main/othervm -limitmods java.base SocketOptionTests + * @run main/othervm --limit-modules=java.base SocketOptionTests */ import java.nio.*; diff --git a/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java index b8c7c327bcb..1687b73f04a 100644 --- a/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java @@ -26,7 +26,7 @@ * @summary Unit test for ServerSocketChannel setOption/getOption/options * methods. * @run main SocketOptionTests - * @run main/othervm -limitmods java.base SocketOptionTests + * @run main/othervm --limit-modules=java.base SocketOptionTests */ import java.nio.*; diff --git a/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java index 38a4e9c170e..5e75ad9a93a 100644 --- a/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java @@ -26,7 +26,7 @@ * @summary Unit test to check SocketChannel setOption/getOption/options * methods. * @run main SocketOptionTests - * @run main/othervm -limitmods java.base SocketOptionTests + * @run main/othervm --limit-modules=java.base SocketOptionTests */ import java.nio.*; diff --git a/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh index 371b62fa5f7..46ecc310161 100644 --- a/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh +++ b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh @@ -109,7 +109,7 @@ failures=0 go() { echo '' - sh -xc "$JAVA ${TESTVMOPTS} -XaddExports:java.base/sun.nio.ch=ALL-UNNAMED $DFLAG \ + sh -xc "$JAVA ${TESTVMOPTS} --add-exports java.base/sun.nio.ch=ALL-UNNAMED $DFLAG \ $1 $2 $3 $4 $5 $6 $7 $8" 2>&1 if [ $? != 0 ]; then failures=`expr $failures + 1`; fi } diff --git a/jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh b/jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh index ce870264855..546d693b962 100644 --- a/jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh +++ b/jdk/test/java/rmi/activation/Activatable/extLoadedImpl/ext.sh @@ -52,9 +52,9 @@ mkdir -p ext $COMPILEJAVA/bin/jar ${TESTTOOLVMOPTS} cf ext/ext.jar -C $TESTCLASSES ExtLoadedImpl.class -C $TESTCLASSES ExtLoadedImpl_Stub.class -C $TESTCLASSES CheckLoader.class TESTVMOPTS="${TESTVMOPTS} \ - -XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + --add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.transport=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" $TESTJAVA/bin/java ${TESTVMOPTS} -cp classes -Dtest.src=$TESTSRC -Dtest.classes=$TESTCLASSES -Djava.security.policy=$TESTSRC/security.policy -Djava.ext.dirs=ext ExtLoadedImplTest diff --git a/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java b/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java index 8560b070c0c..815bb22e17b 100644 --- a/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java +++ b/jdk/test/java/rmi/activation/ActivationGroup/downloadActivationGroup/DownloadActivationGroup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ /* * @test * @bug 4510355 - * @key intermittent * @summary ActivationGroup implementations cannot be downloaded by default; * Creates a custom activation group without setting a security manager * in activation group's descriptor. The custom activation group @@ -140,10 +139,10 @@ public class DownloadActivationGroup CommandEnvironment cmd = new ActivationGroupDesc.CommandEnvironment( null, new String[] { - "-XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" }); + "--add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" }); ActivationGroupDesc groupDesc = new ActivationGroupDesc("MyActivationGroupImpl", diff --git a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java index 393db7ee6fc..5099ab175bf 100644 --- a/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java +++ b/jdk/test/java/rmi/activation/ActivationSystem/stubClassesPermitted/StubClassesPermitted.java @@ -121,11 +121,11 @@ public class StubClassesPermitted System.err.println("Create activation group, in a new VM"); CommandEnvironment cmd = new ActivationGroupDesc.CommandEnvironment(null, new String[] { - "-XaddExports:java.base/sun.security.provider=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED", - "-XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" }); + "--add-exports=java.base/sun.security.provider=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED", + "--add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" }); ActivationGroupDesc groupDesc = new ActivationGroupDesc(p, cmd); diff --git a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java index 72911b95b67..721ecf84f6f 100644 --- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java +++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/InheritedChannelNotServerSocket.java @@ -106,7 +106,7 @@ public class InheritedChannelNotServerSocket { rmid = RMID.createRMID(System.out, System.err, true, true, TestLibrary.INHERITEDCHANNELNOTSERVERSOCKET_ACTIVATION_PORT); rmid.addOptions( - "-XaddExports:java.base/sun.nio.ch=ALL-UNNAMED", + "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED", "-Djava.nio.channels.spi.SelectorProvider=InheritedChannelNotServerSocket$SP"); rmid.start(); diff --git a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java index 25018495faa..272f9f42321 100644 --- a/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java +++ b/jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java @@ -93,7 +93,7 @@ public class RmidViaInheritedChannel implements Callback { rmid = RMID.createRMID(System.out, System.err, true, false, TestLibrary.RMIDVIAINHERITEDCHANNEL_ACTIVATION_PORT); rmid.addOptions( - "-XaddExports:java.base/sun.nio.ch=ALL-UNNAMED", + "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED", "-Djava.nio.channels.spi.SelectorProvider=RmidViaInheritedChannel$RmidSelectorProvider"); if (System.getProperty("os.name").startsWith("Windows") && System.getProperty("os.version").startsWith("5.")) diff --git a/jdk/test/java/rmi/module/ModuleTest.java b/jdk/test/java/rmi/module/ModuleTest.java index ad19a71b9f4..be0b2184d28 100644 --- a/jdk/test/java/rmi/module/ModuleTest.java +++ b/jdk/test/java/rmi/module/ModuleTest.java @@ -97,8 +97,8 @@ public class ModuleTest { */ @Test public void testAllInModule() throws Exception { - assertEquals(executeTestJava("-mp", pathJoin(MTEST_JAR, CLIENT_JAR, SERVER_JAR), - "-addmods", "mclient,mserver", + assertEquals(executeTestJava("--module-path", pathJoin(MTEST_JAR, CLIENT_JAR, SERVER_JAR), + "--add-modules", "mclient,mserver", "-m", "mtest/" + DUMMY_MAIN) .outputTo(System.out) .errorTo(System.out) @@ -113,7 +113,7 @@ public class ModuleTest { */ @Test public void testAppInModule() throws Exception { - assertEquals(executeTestJava("-mp", MTEST_JAR, + assertEquals(executeTestJava("--module-path", MTEST_JAR, "-cp", pathJoin(CLIENT_JAR, SERVER_JAR), "-m", "mtest/" + DUMMY_MAIN) .outputTo(System.out) @@ -129,8 +129,8 @@ public class ModuleTest { */ @Test public void testAppInUnnamedModule() throws Exception { - assertEquals(executeTestJava("-mp", pathJoin(CLIENT_JAR, SERVER_JAR), - "-addmods", "mclient,mserver", + assertEquals(executeTestJava("--module-path", pathJoin(CLIENT_JAR, SERVER_JAR), + "--add-modules", "mclient,mserver", "-cp", MTEST_JAR, DUMMY_MAIN) .outputTo(System.out) @@ -146,8 +146,8 @@ public class ModuleTest { */ @Test public void testClientInUnamedModule() throws Exception { - assertEquals(executeTestJava("-mp", pathJoin(MTEST_JAR, SERVER_JAR), - "-addmods", "mserver", + assertEquals(executeTestJava("--module-path", pathJoin(MTEST_JAR, SERVER_JAR), + "--add-modules", "mserver", "-cp", CLIENT_JAR, "-m", "mtest/" + DUMMY_MAIN) .outputTo(System.out) diff --git a/jdk/test/java/rmi/registry/readTest/readTest.sh b/jdk/test/java/rmi/registry/readTest/readTest.sh index 3bee78b65e4..8e4a8339cd7 100644 --- a/jdk/test/java/rmi/registry/readTest/readTest.sh +++ b/jdk/test/java/rmi/registry/readTest/readTest.sh @@ -99,10 +99,10 @@ case "$OS" in esac # trailing / after code base is important for rmi codebase property. TESTVMOPTS="${TESTVMOPTS} \ - -XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED \ - -XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + --add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.transport=ALL-UNNAMED \ + --add-exports java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" ${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -cp $TEST_CLASSPATH ${ARGS} -Djava.rmi.server.codebase=${FILEURL}$CODEBASE/ readTest > OUT.TXT 2>&1 & TEST_PID=$! #bulk of testcase - let it run for a while diff --git a/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java b/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java index 289772a3782..19d4d6cc808 100644 --- a/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java +++ b/jdk/test/java/rmi/transport/checkFQDN/CheckFQDN.java @@ -123,10 +123,10 @@ public class CheckFQDN extends UnicastRemoteObject propOption + property + equal + propertyValue + extraProp + - " -XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + " -Drmi.registry.port=" + REGISTRY_PORT, ""); diff --git a/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java b/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java index 07ff7e8368b..181b1d0256e 100644 --- a/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java +++ b/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java @@ -75,10 +75,10 @@ public class DGCDeadLock implements Runnable { try { String options = " -Djava.security.policy=" + TestParams.defaultPolicy + - " -XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED" + - " -XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + + " --add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED" + + " --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED" + + " --add-exports java.rmi/sun.rmi.transport=ALL-UNNAMED" + + " --add-exports java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + " -Djava.rmi.dgc.leaseValue=500000" + " -Dsun.rmi.dgc.checkInterval=" + (HOLD_TARGET_TIME - 5000) + diff --git a/jdk/test/java/security/Provider/SecurityProviderModularTest.java b/jdk/test/java/security/Provider/SecurityProviderModularTest.java index 7a2e7ecbff6..d35162ba4f9 100644 --- a/jdk/test/java/security/Provider/SecurityProviderModularTest.java +++ b/jdk/test/java/security/Provider/SecurityProviderModularTest.java @@ -317,7 +317,7 @@ public class SecurityProviderModularTest extends ModularTest { vmArgs.put("-Duser.language=", "en"); vmArgs.put("-Duser.region=", "US"); if (addModName != null && sModuletype == MODULE_TYPE.AUTO) { - vmArgs.put("-addmods ", addModName); + vmArgs.put("--add-modules=", addModName); } // If mechanism selected to find the provider through // Security.getProvider() then use providerName/ProviderClassName based diff --git a/jdk/test/java/security/modules/ModularTest.java b/jdk/test/java/security/modules/ModularTest.java index 227f8d47f2f..356bb0882cd 100644 --- a/jdk/test/java/security/modules/ModularTest.java +++ b/jdk/test/java/security/modules/ModularTest.java @@ -137,7 +137,7 @@ public abstract class ModularTest { final StringJoiner command = new StringJoiner(SPACE, SPACE, SPACE); vmArgs.forEach((key, value) -> command.add(key + value)); if (modulePath != null) { - command.add("-mp").add(modulePath.toFile().getCanonicalPath()); + command.add("--module-path").add(modulePath.toFile().getCanonicalPath()); } if (classPath != null && classPath.length() > 0) { command.add("-cp").add(classPath); diff --git a/jdk/test/java/security/testlibrary/Proc.java b/jdk/test/java/security/testlibrary/Proc.java index 6f9fa5d6b2d..92efc7fdba8 100644 --- a/jdk/test/java/security/testlibrary/Proc.java +++ b/jdk/test/java/security/testlibrary/Proc.java @@ -25,19 +25,19 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.Permission; import java.util.ArrayList; +import java.util.Arrays; import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Stream; /** * This is a test library that makes writing a Java test that spawns multiple @@ -184,12 +184,9 @@ public class Proc { "java").getPath()); } - int n = 0; - String addexports; - while ((addexports = System.getProperty("jdk.launcher.addexports." + n)) != null) { - prop("jdk.launcher.addexports." + n, addexports); - n++; - } + Stream.of(jdk.internal.misc.VM.getRuntimeArguments()) + .filter(arg -> arg.startsWith("--add-exports=")) + .forEach(cmd::add); Collections.addAll(cmd, splitProperty("test.vm.opts")); Collections.addAll(cmd, splitProperty("test.java.opts")); diff --git a/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.sh b/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.sh index 5d722c3dd55..24e6a25da37 100644 --- a/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.sh +++ b/jdk/test/java/util/Calendar/GenericTimeZoneNamesTest.sh @@ -31,7 +31,7 @@ # This test is locale data-dependent and assumes that both JRE and CLDR # have the same geneic time zone names in English. -EXTRAOPTS="-XaddExports:java.base/sun.util.locale.provider=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.util.locale.provider=ALL-UNNAMED" STATUS=0 echo "Locale providers: default" if ! ${TESTJAVA}/bin/java -esa ${TESTVMOPTS} ${EXTRAOPTS} -cp "${TESTCLASSES}" GenericTimeZoneNamesTest en-US; then diff --git a/jdk/test/java/util/Formatter/Basic.sh b/jdk/test/java/util/Formatter/Basic.sh index 0bf4162f17b..b0fe162a5f6 100644 --- a/jdk/test/java/util/Formatter/Basic.sh +++ b/jdk/test/java/util/Formatter/Basic.sh @@ -23,7 +23,7 @@ # -EXTRAOPTS="-XaddExports:java.base/jdk.internal.math=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/jdk.internal.math=ALL-UNNAMED" ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -cp ${TESTSRC} -d . \ ${TESTSRC}/Basic.java diff --git a/jdk/test/java/util/Locale/LocaleProviders.sh b/jdk/test/java/util/Locale/LocaleProviders.sh index 07f8f00eae2..cb8a7c6b9fd 100644 --- a/jdk/test/java/util/Locale/LocaleProviders.sh +++ b/jdk/test/java/util/Locale/LocaleProviders.sh @@ -122,8 +122,8 @@ tznp tznp8013086 EOF -EXTRAOPTS="-XaddExports:java.base/sun.util.locale=ALL-UNNAMED \ - -XaddExports:java.base/sun.util.locale.provider=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.util.locale=ALL-UNNAMED \ + --add-exports java.base/sun.util.locale.provider=ALL-UNNAMED" ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} -d ${SPIDIR}${FS}dest \ ${SPIDIR}${FS}src${FS}tznp.java \ diff --git a/jdk/test/java/util/PluggableLocale/ExecTest.sh b/jdk/test/java/util/PluggableLocale/ExecTest.sh index 643895ed75f..7c7df1ceec2 100644 --- a/jdk/test/java/util/PluggableLocale/ExecTest.sh +++ b/jdk/test/java/util/PluggableLocale/ExecTest.sh @@ -93,8 +93,8 @@ case "$1" in esac -EXTRA_OPTS="-XaddExports:java.base/sun.util.locale.provider=ALL-UNNAMED \ - -XaddExports:java.base/sun.util.resources=ALL-UNNAMED" +EXTRA_OPTS="--add-exports java.base/sun.util.locale.provider=ALL-UNNAMED \ + --add-exports java.base/sun.util.resources=ALL-UNNAMED" # compile cp ${TESTSRC}${FS}ProviderTest.java . diff --git a/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh index c2ce46ec3c3..354093c4f4b 100644 --- a/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh +++ b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh @@ -68,7 +68,7 @@ cd ${PATCHDIR}/java.desktop ${TESTJAVA}/bin/jar xf ${TESTSRC}/awtres.jar echo -${TESTJAVA}/bin/java ${TESTVMOPTS} -Xpatch:java.desktop=${PATCHDIR}/java.desktop \ +${TESTJAVA}/bin/java ${TESTVMOPTS} --patch-module java.desktop=${PATCHDIR}/java.desktop \ -cp ${TESTCLASSES} Bug6299235Test if [ $? -ne 0 ] diff --git a/jdk/test/java/util/ResourceBundle/modules/appbasic/appbasic.sh b/jdk/test/java/util/ResourceBundle/modules/appbasic/appbasic.sh index a22b825318a..634324be4e8 100644 --- a/jdk/test/java/util/ResourceBundle/modules/appbasic/appbasic.sh +++ b/jdk/test/java/util/ResourceBundle/modules/appbasic/appbasic.sh @@ -47,7 +47,7 @@ do mkdir -p mods/$B CLASSES="`find $TESTSRC/src/$B -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src -cp mods/test $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src -cp mods/test $CLASSES fi PROPS="`(cd $TESTSRC/src/$B; find . -name '*.properties')`" if [ "x$PROPS" != x ]; then @@ -61,8 +61,8 @@ do done mkdir -p mods/test -$JAVAC -g -d mods -modulesourcepath $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` +$JAVAC -g -d mods --module-source-path $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` -$JAVA -mp mods -m test/jdk.test.Main de fr ja zh-tw en de +$JAVA -p mods -m test/jdk.test.Main de fr ja zh-tw en de exit $? diff --git a/jdk/test/java/util/ResourceBundle/modules/appbasic2/appbasic2.sh b/jdk/test/java/util/ResourceBundle/modules/appbasic2/appbasic2.sh index 51c0f4a15d2..d6096833ebf 100644 --- a/jdk/test/java/util/ResourceBundle/modules/appbasic2/appbasic2.sh +++ b/jdk/test/java/util/ResourceBundle/modules/appbasic2/appbasic2.sh @@ -47,7 +47,7 @@ do mkdir -p mods/$B CLASSES="`find $TESTSRC/src/$B -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src -cp mods/test $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src -cp mods/test $CLASSES fi PROPS="`(cd $TESTSRC/src/$B; find . -name '*.properties')`" if [ "x$PROPS" != x ]; then @@ -61,8 +61,8 @@ do done mkdir -p mods/test -$JAVAC -g -d mods -modulesourcepath $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` +$JAVAC -g -d mods --module-source-path $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` -$JAVA -mp mods -m test/jdk.test.Main de fr ja zh-tw en de +$JAVA -p mods -m test/jdk.test.Main de fr ja zh-tw en de exit $? diff --git a/jdk/test/java/util/ResourceBundle/modules/basic/basic.sh b/jdk/test/java/util/ResourceBundle/modules/basic/basic.sh index 86fd0fde0cc..95f0c5bd0ad 100644 --- a/jdk/test/java/util/ResourceBundle/modules/basic/basic.sh +++ b/jdk/test/java/util/ResourceBundle/modules/basic/basic.sh @@ -52,7 +52,7 @@ do mkdir -p mods/$B CLASSES="`find $TESTSRC/src/$B -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src $CP $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src $CP $CLASSES fi PROPS="`(cd $TESTSRC/src/$B; find . -name '*.properties')`" if [ "x$PROPS" != x ]; then @@ -67,7 +67,7 @@ do done mkdir -p mods/test -$JAVAC -g -cp mods/mainbundles -d mods -modulesourcepath $TESTSRC/src \ +$JAVAC -g -cp mods/mainbundles -d mods --module-source-path $TESTSRC/src \ `find $TESTSRC/src/test -name "*.java"` # Create a jar to be added to the class path. Expected only properties files are @@ -81,9 +81,9 @@ $JAR -cf extra.jar -C classes jdk/test/resources/eu \ STATUS=0 echo "jdk.test.Main should load bundles using ResourceBundleProviders." -$JAVA -mp mods -m test/jdk.test.Main de fr ja ja-jp zh-tw en de ja-jp || STATUS=1 +$JAVA -p mods -m test/jdk.test.Main de fr ja ja-jp zh-tw en de ja-jp || STATUS=1 echo "jdk.test.Main should NOT load bundles from the jar file specified by the class-path." -$JAVA -cp extra.jar -mp mods -m test/jdk.test.Main es vi && STATUS=1 +$JAVA -cp extra.jar -p mods -m test/jdk.test.Main es vi && STATUS=1 exit $STATUS diff --git a/jdk/test/java/util/ResourceBundle/modules/modlocal/modlocal.sh b/jdk/test/java/util/ResourceBundle/modules/modlocal/modlocal.sh index e87e05c4f5a..e4a58121087 100644 --- a/jdk/test/java/util/ResourceBundle/modules/modlocal/modlocal.sh +++ b/jdk/test/java/util/ResourceBundle/modules/modlocal/modlocal.sh @@ -57,7 +57,7 @@ if [ "x$PROPS" != x ]; then done fi -$JAVAC -g -d mods -modulesourcepath $TESTSRC/src \ +$JAVAC -g -d mods --module-source-path $TESTSRC/src \ -cp mods/bundles `find $TESTSRC/src/test -name "*.java"` # Create a jar to be added to the class path. Expected properties files are @@ -69,9 +69,9 @@ $JAR -cf extra.jar -C $TESTSRC/src/extra jdk/test/resources STATUS=0 echo 'jdk.test.Main should load bundles local to named module "test".' -$JAVA -mp mods -m test/jdk.test.Main de fr ja zh-tw en de || STATUS=1 +$JAVA -p mods -m test/jdk.test.Main de fr ja zh-tw en de || STATUS=1 echo "jdk.test.Main should NOT load bundles from the jar file specified by the class-path." -$JAVA -cp extra.jar -mp mods -m test/jdk.test.Main vi && STATUS=1 +$JAVA -cp extra.jar -p mods -m test/jdk.test.Main vi && STATUS=1 exit $STATUS diff --git a/jdk/test/java/util/ResourceBundle/modules/security/TestPermission.java b/jdk/test/java/util/ResourceBundle/modules/security/TestPermission.java index 68eb09ec928..4e68a347af8 100644 --- a/jdk/test/java/util/ResourceBundle/modules/security/TestPermission.java +++ b/jdk/test/java/util/ResourceBundle/modules/security/TestPermission.java @@ -59,7 +59,7 @@ public class TestPermission { public void compileAll() throws Exception { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); - assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } } @@ -68,7 +68,7 @@ public class TestPermission { */ @Test public void runTest() throws Exception { - int exitValue = executeTestJava("-mp", MODS_DIR.toString(), + int exitValue = executeTestJava("--module-path", MODS_DIR.toString(), "-m", "test/jdk.test.Main") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/java/util/ResourceBundle/modules/simple/simple.sh b/jdk/test/java/util/ResourceBundle/modules/simple/simple.sh index 9975d1caf5c..08f3a945ce6 100644 --- a/jdk/test/java/util/ResourceBundle/modules/simple/simple.sh +++ b/jdk/test/java/util/ResourceBundle/modules/simple/simple.sh @@ -50,7 +50,7 @@ B=bundles mkdir -p mods/$B CLASSES="`find $TESTSRC/src/$B -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src $CLASSES fi PROPS="`(cd $TESTSRC/src/$B; find . -name '*.properties')`" if [ "x$PROPS" != x ]; then @@ -62,9 +62,9 @@ if [ "x$PROPS" != x ]; then done fi -$JAVAC -g -d mods -modulesourcepath $TESTSRC/src \ +$JAVAC -g -d mods --module-source-path $TESTSRC/src \ -cp mods/bundles `find $TESTSRC/src/test -name "*.java"` -$JAVA -mp mods -m test/jdk.test.Main de fr ja zh-tw en de +$JAVA -p mods -m test/jdk.test.Main de fr ja zh-tw en de exit $? diff --git a/jdk/test/java/util/ResourceBundle/modules/visibility/visibility.sh b/jdk/test/java/util/ResourceBundle/modules/visibility/visibility.sh index 02ca3c43793..c37949e0255 100644 --- a/jdk/test/java/util/ResourceBundle/modules/visibility/visibility.sh +++ b/jdk/test/java/util/ResourceBundle/modules/visibility/visibility.sh @@ -57,7 +57,7 @@ do mkdir -p mods/$M CLASSES="`find $TESTSRC/src/$M -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src $CLASSES fi PROPS="`(cd $TESTSRC/src/$M; find . -name '*.properties')`" if [ "x$PROPS" != x ]; then @@ -96,23 +96,23 @@ done # jdk.test.resources.{classes,props}.* are available only to named module "test" # by ResourceBundleProvider. -runJava -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.classes.MyResources true -runJava -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.props.MyResources true -runJava -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.classes.MyResources false -runJava -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.props.MyResources false # Add mods/named.bundles to the class path. -runJava -cp mods/named.bundles -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -cp mods/named.bundles -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.classes.MyResources true -runJava -cp mods/named.bundles -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -cp mods/named.bundles -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.props.MyResources true -runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -cp mods/named.bundles -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.classes.MyResources false -runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -cp mods/named.bundles -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.props.MyResources false # Tests using jdk.test.TestWithUnnamedModuleArg and jdk.embargo.TestWithUnnamedModuleArg @@ -120,37 +120,37 @@ runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithNoModuleA # jdk.test.resources.classes is exported to named module "test". # IllegalAccessException is thrown in ResourceBundle.Control.newBundle(). -runJava -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.classes.MyResources false # jdk.test.resources.props is exported to named module "test". # loader.getResource() doesn't find jdk.test.resources.props.MyResources. -runJava -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.props.MyResources false # IllegalAccessException is thrown in ResourceBundle.Control.newBundle(). -runJava -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.classes.MyResources false # jdk.test.resources.props is exported to named module "test". # loader.getResource() doesn't find jdk.test.resources.props.MyResources. -runJava -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.props.MyResources false # Add mods/named.bundles to the class path # IllegalAccessException is thrown in ResourceBundle.Control.newBundle(). -runJava -cp mods/named.bundles -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -cp mods/named.bundles -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.classes.MyResources false # loader.getResource() finds jdk.test.resources.exported.props.MyResources. -runJava -cp mods/named.bundles -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -cp mods/named.bundles -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.props.MyResources true # jdk.test.resources.exported.classes.MyResources is treated # as if the class is in an unnamed module. -runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -cp mods/named.bundles -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.classes.MyResources true # loader.getResource() finds jdk.test.resources.exported.props.MyResources. -runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -cp mods/named.bundles -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.props.MyResources true ################################################# @@ -160,23 +160,23 @@ runJava -cp mods/named.bundles -mp mods -m embargo/jdk.embargo.TestWithUnnamedMo # neither of which specifies an unnamed module with ResourceBundle.getBundle. # None of jdk.test.resources.exported.** is available to the named modules. -runJava -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.exported.classes.MyResources false -runJava -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.exported.props.MyResources false -runJava -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.exported.classes.MyResources false -runJava -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.exported.props.MyResources false # Add mods/exported.named.bundles to the class path. -runJava -cp mods/exported.named.bundles -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.exported.classes.MyResources false -runJava -cp mods/exported.named.bundles -mp mods -m test/jdk.test.TestWithNoModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m test/jdk.test.TestWithNoModuleArg \ jdk.test.resources.exported.props.MyResources false -runJava -cp mods/exported.named.bundles -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.exported.classes.MyResources false -runJava -cp mods/exported.named.bundles -mp mods -m embargo/jdk.embargo.TestWithNoModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m embargo/jdk.embargo.TestWithNoModuleArg \ jdk.test.resources.exported.props.MyResources false # Tests using jdk.test.TestWithUnnamedModuleArg and jdk.embargo.TestWithUnnamedModuleArg @@ -184,36 +184,36 @@ runJava -cp mods/exported.named.bundles -mp mods -m embargo/jdk.embargo.TestWith # loader.loadClass() doesn't find jdk.test.resources.exported.classes.MyResources # and throws a ClassNotFoundException. -runJava -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.exported.classes.MyResources false # The properties files in jdk.test.resources.exported.props are not found with loader.getResource(). -runJava -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.exported.props.MyResources false # loader.loadClass() doesn't find jdk.test.resources.exported.classes.MyResources # and throws a ClassNotFoundException. -runJava -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.exported.classes.MyResources false # The properties files in jdk.test.resources.exported.props are not found # with loader.getResource(). -runJava -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.exported.props.MyResources false # Add mods/exported.named.bundles to the class path. # jdk.test.resources.exported.classes.MyResources.getModule().isNamed() returns false. -runJava -cp mods/exported.named.bundles -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.exported.classes.MyResources true # loader.getResource() finds jdk.test.resources.exported.props.MyResources. -runJava -cp mods/exported.named.bundles -mp mods -m test/jdk.test.TestWithUnnamedModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m test/jdk.test.TestWithUnnamedModuleArg \ jdk.test.resources.exported.props.MyResources true # jdk.test.resources.exported.classes.MyResources.getModule().isNamed() returns false. -runJava -cp mods/exported.named.bundles -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.exported.classes.MyResources true # loader.getResource() finds jdk.test.resources.exported.props.MyResources. -runJava -cp mods/exported.named.bundles -mp mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ +runJava -cp mods/exported.named.bundles -p mods -m embargo/jdk.embargo.TestWithUnnamedModuleArg \ jdk.test.resources.exported.props.MyResources true ####################################### diff --git a/jdk/test/java/util/ResourceBundle/modules/xmlformat/xmlformat.sh b/jdk/test/java/util/ResourceBundle/modules/xmlformat/xmlformat.sh index 849523229a5..4c5c7b13843 100644 --- a/jdk/test/java/util/ResourceBundle/modules/xmlformat/xmlformat.sh +++ b/jdk/test/java/util/ResourceBundle/modules/xmlformat/xmlformat.sh @@ -48,7 +48,7 @@ B=bundles mkdir -p mods/$B CLASSES="`find $TESTSRC/src/$B -name '*.java'`" if [ "x$CLASSES" != x ]; then - $JAVAC -g -d mods -modulesourcepath $TESTSRC/src $CLASSES + $JAVAC -g -d mods --module-source-path $TESTSRC/src $CLASSES fi PROPS="`(cd $TESTSRC/src/$B; find . -name '*.xml')`" if [ "x$PROPS" != x ]; then @@ -60,9 +60,9 @@ if [ "x$PROPS" != x ]; then done fi -$JAVAC -g -d mods -modulesourcepath $TESTSRC/src \ +$JAVAC -g -d mods --module-source-path $TESTSRC/src \ -cp mods/bundles `find $TESTSRC/src/test -name "*.java"` -$JAVA -mp mods -m test/jdk.test.Main de fr ja zh-tw en de +$JAVA -p mods -m test/jdk.test.Main de fr ja zh-tw en de exit $? diff --git a/jdk/test/java/util/ServiceLoader/modules/ServicesTest.java b/jdk/test/java/util/ServiceLoader/modules/ServicesTest.java index 55d4c2f1453..a9084f3437b 100644 --- a/jdk/test/java/util/ServiceLoader/modules/ServicesTest.java +++ b/jdk/test/java/util/ServiceLoader/modules/ServicesTest.java @@ -105,13 +105,13 @@ public class ServicesTest { /** - * Run test with -modulepath. + * Run test with --module-path. * * BananaScriptEngine should be found. */ public void runWithModulePath() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), + = executeTestJava("--module-path", MODS_DIR.toString(), "-m", "test/test.Main", "BananaScriptEngine") .outputTo(System.out) @@ -123,13 +123,13 @@ public class ServicesTest { /** - * Run test with -modulepath and -classpath. + * Run test with --module-path and -classpath. * * Both BananaScriptEngine and PearScriptEngine should be found */ public void runWithModulePathAndClassPath() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), + = executeTestJava("--module-path", MODS_DIR.toString(), "-cp", CLASSES_DIR.toString(), "-m", "test/test.Main", "BananaScriptEngine", "PearScriptEngine") diff --git a/jdk/test/java/util/logging/modules/GetResourceBundleTest.java b/jdk/test/java/util/logging/modules/GetResourceBundleTest.java index c049613e552..8bf01eb654d 100644 --- a/jdk/test/java/util/logging/modules/GetResourceBundleTest.java +++ b/jdk/test/java/util/logging/modules/GetResourceBundleTest.java @@ -66,10 +66,10 @@ public class GetResourceBundleTest { for (String mn : modules) { Path msrc = MOD_SRC_DIR.resolve(mn); assertTrue(CompilerUtils.compile(msrc, MOD_DEST_DIR, - "-modulesourcepath", MOD_SRC_DIR.toString())); + "--module-source-path", MOD_SRC_DIR.toString())); } assertTrue(CompilerUtils.compile(PKG_SRC_DIR, PKG_DEST_DIR, - "-modulepath", MOD_DEST_DIR.toString(), "-addmods", String.join(",", modules))); + "--module-path", MOD_DEST_DIR.toString(), "--add-modules", String.join(",", modules))); // copy resource files String[] files = { "m1/p1/resource/p.properties", "m2/p2/resource/p.properties" }; @@ -84,8 +84,8 @@ public class GetResourceBundleTest { public void runWithoutSecurityManager() throws Exception { int exitValue = executeTestJava( "-cp", PKG_DEST_DIR.toString(), - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "p3.test.ResourceBundleTest") .outputTo(System.out) .errorTo(System.err) @@ -98,8 +98,8 @@ public class GetResourceBundleTest { int exitValue = executeTestJava( "-Djava.security.manager", "-cp", PKG_DEST_DIR.toString(), - "-mp", MOD_DEST_DIR.toString(), - "-addmods", String.join(",", modules), + "--module-path", MOD_DEST_DIR.toString(), + "--add-modules", String.join(",", modules), "p3.test.ResourceBundleTest") .outputTo(System.out) .errorTo(System.err) diff --git a/jdk/test/javax/crypto/Cipher/CipherStreamClose.java b/jdk/test/javax/crypto/Cipher/CipherStreamClose.java index 304c887dea1..98f45b08bfe 100644 --- a/jdk/test/javax/crypto/Cipher/CipherStreamClose.java +++ b/jdk/test/javax/crypto/Cipher/CipherStreamClose.java @@ -27,8 +27,8 @@ * @summary Make sure Cipher IO streams doesn't call extra doFinal if close() * is called multiple times. Additionally, verify the input and output streams * match with encryption and decryption with non-stream crypto. - * @compile -addmods java.xml.bind CipherStreamClose.java - * @run main/othervm -addmods java.xml.bind CipherStreamClose + * @modules java.xml.bind + * @run main CipherStreamClose */ import java.io.*; diff --git a/jdk/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh b/jdk/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh index 60e8fc04b2a..e11e0957b12 100644 --- a/jdk/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh +++ b/jdk/test/javax/imageio/plugins/external_plugin_tests/TestClassPathPlugin.sh @@ -86,7 +86,7 @@ fi # expect to find SimpReader on module path echo "Test modular jar .. " -$JAVA -mp $PLUGINDIR -cp $TESTDIR simptest.TestSIMPPlugin +$JAVA --module-path $PLUGINDIR -cp $TESTDIR simptest.TestSIMPPlugin if [ $? -ne 0 ]; then exception=1 @@ -94,7 +94,7 @@ if [ $? -ne 0 ]; then fi echo "Test modular jar with security manager .." -$JAVA -Djava.security.manager -mp $PLUGINDIR -cp $TESTDIR simptest.TestSIMPPlugin +$JAVA -Djava.security.manager --module-path $PLUGINDIR -cp $TESTDIR simptest.TestSIMPPlugin if [ $? -ne 0 ]; then exception=1 echo "modular jar with security manager test failed: exception thrown!" diff --git a/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh index 071550eed45..16ccd27f363 100644 --- a/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh +++ b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh @@ -199,14 +199,14 @@ if [ $? -ne 0 ] ; then fi # Verify that all classloaders are destroyed -${TESTJAVA}/bin/java -XaddExports:java.desktop/sun.awt=ALL-UNNAMED ${TESTVMOPTS} -cp Test.jar test.Main +${TESTJAVA}/bin/java --add-exports java.desktop/sun.awt=ALL-UNNAMED ${TESTVMOPTS} -cp Test.jar test.Main if [ $? -ne 0 ] ; then fail "Test FAILED: some classloaders weren't destroyed." fi # Verify that ImageIO shutdown hook works correcly -${TESTJAVA}/bin/java -XaddExports:java.desktop/sun.awt=ALL-UNNAMED ${TESTVMOPTS} \ +${TESTJAVA}/bin/java --add-exports java.desktop/sun.awt=ALL-UNNAMED ${TESTVMOPTS} \ -cp Test.jar -DforgetSomeStreams=true test.Main if [ $? -ne 0 ] ; then fail "Test FAILED: some classloaders weren't destroyed of shutdown hook failed." diff --git a/jdk/test/javax/naming/module/basic.sh b/jdk/test/javax/naming/module/basic.sh index b48fefb4daa..6f7d672b5db 100644 --- a/jdk/test/javax/naming/module/basic.sh +++ b/jdk/test/javax/naming/module/basic.sh @@ -78,27 +78,27 @@ $JAVAC -d mods/ldapv4 `find $TESTSRC/src/ldapv4 -name "*.java"` echo "\nPreparing the 'test' module..." mkdir -p mods/test -$JAVAC -d mods -modulesourcepath $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` +$JAVAC -d mods --module-source-path $TESTSRC/src `find $TESTSRC/src/test -name "*.java"` echo "\nRunning with the 'java.desktop' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.StoreObject ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.StoreObject ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'person' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.StorePerson ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.StorePerson ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'fruit' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.StoreFruit ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.StoreFruit ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'hello' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.StoreRemote ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.StoreRemote ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'foo' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.ConnectWithFoo ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.ConnectWithFoo ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'authz' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.ConnectWithAuthzId ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.ConnectWithAuthzId ldap://localhost/dc=ie,dc=oracle,dc=com echo "\nRunning with the 'ldapv4' module..." -$JAVA -Dtest.src=${TESTSRC} -mp mods -m test/test.ReadByUrl ldap://localhost/dc=ie,dc=oracle,dc=com +$JAVA -Dtest.src=${TESTSRC} -p mods -m test/test.ReadByUrl ldap://localhost/dc=ie,dc=oracle,dc=com diff --git a/jdk/test/javax/rmi/PortableRemoteObject/8146975/RmiIiopReturnValueTest.java b/jdk/test/javax/rmi/PortableRemoteObject/8146975/RmiIiopReturnValueTest.java index 147fcd14e72..87f5d866507 100644 --- a/jdk/test/javax/rmi/PortableRemoteObject/8146975/RmiIiopReturnValueTest.java +++ b/jdk/test/javax/rmi/PortableRemoteObject/8146975/RmiIiopReturnValueTest.java @@ -25,18 +25,19 @@ * @test * @bug 8146975 * @summary test RMI-IIOP with value object return + * @modules java.corba * @library /lib/testlibrary * @build jdk.testlibrary.* - * @compile -addmods java.corba Test.java Test3.java Test4.java + * @compile Test.java Test3.java Test4.java * HelloInterface.java HelloServer.java * HelloClient.java HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java * RmiIiopReturnValueTest.java - * @run main/othervm -addmods java.corba + * @run main/othervm * -Djava.naming.provider.url=iiop://localhost:5050 * -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory * RmiIiopReturnValueTest -port 5049 * @run main/othervm/secure=java.lang.SecurityManager/policy=jtreg.test.policy - * -addmods java.corba -Djava.naming.provider.url=iiop://localhost:5050 + * -Djava.naming.provider.url=iiop://localhost:5050 * -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory * RmiIiopReturnValueTest -port 5049 */ @@ -102,12 +103,12 @@ public class RmiIiopReturnValueTest { static void startRmiIiopServer() throws Exception { System.out.println("\nStarting RmiIiopServer"); - // java -addmods java.corba -cp . + // java --add-modules java.corba -cp . // -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory // -Djava.naming.provider.url=iiop://localhost:5050 HelloServer -port 5049 List<String> commands = new ArrayList<>(); commands.add(RmiIiopReturnValueTest.JAVA); - commands.add("-addmods"); + commands.add("--add-modules"); commands.add("java.corba"); commands.add("-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory"); commands.add("-Djava.naming.provider.url=iiop://localhost:5050"); diff --git a/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java index 2155d646543..4d2d279c995 100644 --- a/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java +++ b/jdk/test/javax/rmi/PortableRemoteObject/ConcurrentHashMapTest.java @@ -28,12 +28,12 @@ * @library /lib/testlibrary * @modules java.corba * @build jdk.testlibrary.* - * @compile -addmods java.corba Test.java HelloInterface.java HelloServer.java HelloClient.java + * @compile Test.java HelloInterface.java HelloServer.java HelloClient.java * HelloImpl.java _HelloImpl_Tie.java _HelloInterface_Stub.java ConcurrentHashMapTest.java - * @run main/othervm -addmods java.corba -Djava.naming.provider.url=iiop://localhost:1050 + * @run main/othervm -Djava.naming.provider.url=iiop://localhost:1050 * -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest * @run main/othervm/secure=java.lang.SecurityManager/policy=jtreg.test.policy - * -addmods java.corba -Djava.naming.provider.url=iiop://localhost:1050 + * -Djava.naming.provider.url=iiop://localhost:1050 * -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory ConcurrentHashMapTest * @key intermittent */ @@ -98,12 +98,12 @@ public class ConcurrentHashMapTest { static void startRmiIiopServer() throws Exception { System.out.println("\nStarting RmiServer"); - // java -cp . -addmods java.corba + // java -cp . --add-modules java.corba // -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory // -Djava.naming.provider.url=iiop://localhost:1050 HelloServer List<String> commands = new ArrayList<>(); commands.add(ConcurrentHashMapTest.JAVA); - commands.add("-addmods"); + commands.add("--add-modules"); commands.add("java.corba"); commands.add("-Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory"); commands.add("-Djava.naming.provider.url=iiop://localhost:1050"); diff --git a/jdk/test/javax/security/auth/login/modules/JaasModularClientTest.java b/jdk/test/javax/security/auth/login/modules/JaasModularClientTest.java index ff5225f6df7..20763ba4e45 100644 --- a/jdk/test/javax/security/auth/login/modules/JaasModularClientTest.java +++ b/jdk/test/javax/security/auth/login/modules/JaasModularClientTest.java @@ -291,7 +291,7 @@ public class JaasModularClientTest extends ModularTest { vmArgs.put("-Djava.security.auth.login.config=", SRC.resolve( "jaas.conf").toFile().getCanonicalPath()); if (addModName != null && sModuletype == MODULE_TYPE.AUTO) { - vmArgs.put("-addmods ", addModName); + vmArgs.put("--add-modules ", addModName); } return vmArgs; } diff --git a/jdk/test/javax/security/auth/login/modules/JaasModularDefaultHandlerTest.java b/jdk/test/javax/security/auth/login/modules/JaasModularDefaultHandlerTest.java index 83a77f3177a..14dc31e14db 100644 --- a/jdk/test/javax/security/auth/login/modules/JaasModularDefaultHandlerTest.java +++ b/jdk/test/javax/security/auth/login/modules/JaasModularDefaultHandlerTest.java @@ -247,7 +247,7 @@ public class JaasModularDefaultHandlerTest extends ModularTest { if (addModName != null && !(cModuleType == MODULE_TYPE.EXPLICIT && sModuletype == MODULE_TYPE.EXPLICIT)) { - vmArgs.put("-addmods ", addModName); + vmArgs.put("--add-modules=", addModName); } return vmArgs; } diff --git a/jdk/test/javax/smartcardio/CommandAPDUTest.java b/jdk/test/javax/smartcardio/CommandAPDUTest.java index 72c5a474590..f34a2ea381a 100644 --- a/jdk/test/javax/smartcardio/CommandAPDUTest.java +++ b/jdk/test/javax/smartcardio/CommandAPDUTest.java @@ -26,8 +26,8 @@ * @bug 8049021 * @summary Test different constructors for CommandAPDU and check CLA,INS,NC,NE, * P1,and P2 - * @compile -addmods java.smartcardio CommandAPDUTest.java - * @run testng/othervm -addmods java.smartcardio CommandAPDUTest + * @compile --add-modules=java.smartcardio CommandAPDUTest.java + * @run testng/othervm --add-modules=java.smartcardio CommandAPDUTest */ import java.nio.ByteBuffer; import javax.smartcardio.CommandAPDU; diff --git a/jdk/test/javax/smartcardio/HistoricalBytes.java b/jdk/test/javax/smartcardio/HistoricalBytes.java index eebaf8dd671..c44bbe0c681 100644 --- a/jdk/test/javax/smartcardio/HistoricalBytes.java +++ b/jdk/test/javax/smartcardio/HistoricalBytes.java @@ -26,8 +26,8 @@ * @bug 6445367 * @summary Verify that ATR.getHistoricalBytes() works * @author Andreas Sterbenz - * @compile -addmods java.smartcardio HistoricalBytes.java - * @run main/othervm -addmods java.smartcardio HistoricalBytes + * @compile --add-modules=java.smartcardio HistoricalBytes.java + * @run main/othervm --add-modules=java.smartcardio HistoricalBytes */ import java.util.Arrays; diff --git a/jdk/test/javax/smartcardio/ResponseAPDUTest.java b/jdk/test/javax/smartcardio/ResponseAPDUTest.java index c885c2b827c..470002d23f0 100644 --- a/jdk/test/javax/smartcardio/ResponseAPDUTest.java +++ b/jdk/test/javax/smartcardio/ResponseAPDUTest.java @@ -25,8 +25,8 @@ * @test * @bug 8049021 * @summary Construct ResponseAPDU from byte array and check NR< SW, SW1 and SW2 - * @compile -addmods java.smartcardio ResponseAPDUTest.java - * @run testng/othervm -addmods java.smartcardio ResponseAPDUTest + * @compile --add-modules=java.smartcardio ResponseAPDUTest.java + * @run testng/othervm --add-modules=java.smartcardio ResponseAPDUTest */ import javax.smartcardio.ResponseAPDU; import static org.testng.Assert.*; diff --git a/jdk/test/javax/smartcardio/Serialize.java b/jdk/test/javax/smartcardio/Serialize.java index a7eac0e242c..7becee4dd9d 100644 --- a/jdk/test/javax/smartcardio/Serialize.java +++ b/jdk/test/javax/smartcardio/Serialize.java @@ -26,8 +26,8 @@ * @bug 6445367 * @summary make sure serialization works * @author Andreas Sterbenz - * @compile -addmods java.smartcardio Serialize.java - * @run main/othervm -addmods java.smartcardio Serialize + * @compile --add-modules=java.smartcardio Serialize.java + * @run main/othervm --add-modules=java.smartcardio Serialize */ import java.io.*; diff --git a/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java b/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java index 692f111e24d..853ce2dd1ce 100644 --- a/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java +++ b/jdk/test/javax/smartcardio/TerminalFactorySpiTest.java @@ -25,8 +25,8 @@ * @test * @bug 8049021 * @summary Test if we can write new provider for smart card - * @compile -addmods java.smartcardio TerminalFactorySpiTest.java - * @run main/othervm/java.security.policy=policy -addmods java.smartcardio TerminalFactorySpiTest + * @compile --add-modules=java.smartcardio TerminalFactorySpiTest.java + * @run main/othervm/java.security.policy=policy --add-modules=java.smartcardio TerminalFactorySpiTest */ import java.security.Provider; import java.security.Security; diff --git a/jdk/test/javax/smartcardio/TestCardPermission.java b/jdk/test/javax/smartcardio/TestCardPermission.java index 7c31da6a9d7..b737722dceb 100644 --- a/jdk/test/javax/smartcardio/TestCardPermission.java +++ b/jdk/test/javax/smartcardio/TestCardPermission.java @@ -26,8 +26,8 @@ * @bug 6293767 * @summary Test for the CardPermission class * @author Andreas Sterbenz - * @compile -addmods java.smartcardio TestCardPermission.java - * @run main/othervm -addmods java.smartcardio TestCardPermission + * @compile --add-modules=java.smartcardio TestCardPermission.java + * @run main/othervm --add-modules=java.smartcardio TestCardPermission */ import javax.smartcardio.*; diff --git a/jdk/test/javax/smartcardio/TestCommandAPDU.java b/jdk/test/javax/smartcardio/TestCommandAPDU.java index 34421590dcb..d8374e17671 100644 --- a/jdk/test/javax/smartcardio/TestCommandAPDU.java +++ b/jdk/test/javax/smartcardio/TestCommandAPDU.java @@ -27,8 +27,8 @@ * @summary Test for the CommandAPDU class * @author Andreas Sterbenz * @key randomness - * @compile -addmods java.smartcardio TestCommandAPDU.java - * @run main/othervm -addmods java.smartcardio TestCommandAPDU + * @compile --add-modules=java.smartcardio TestCommandAPDU.java + * @run main/othervm --add-modules=java.smartcardio TestCommandAPDU */ import java.util.*; diff --git a/jdk/test/javax/transaction/testng/Driver.java b/jdk/test/javax/transaction/testng/Driver.java index 1a890651bfb..08cb2d9f325 100644 --- a/jdk/test/javax/transaction/testng/Driver.java +++ b/jdk/test/javax/transaction/testng/Driver.java @@ -24,14 +24,14 @@ /** * @test * @modules java.sql java.transaction - * @compile -addmods java.transaction + * @compile * test/transaction/InvalidTransactionExceptionTests.java * test/transaction/TransactionRequiredExceptionTests.java * test/transaction/TransactionRolledbackExceptionTests.java * test/transaction/XAExceptionTests.java * util/SerializedTransactionExceptions.java - * @run testng/othervm -addmods java.transaction test.transaction.InvalidTransactionExceptionTests - * @run testng/othervm -addmods java.transaction test.transaction.TransactionRequiredExceptionTests - * @run testng/othervm -addmods java.transaction test.transaction.TransactionRolledbackExceptionTests - * @run testng/othervm -addmods java.transaction util.SerializedTransactionExceptions + * @run testng/othervm test.transaction.InvalidTransactionExceptionTests + * @run testng/othervm test.transaction.TransactionRequiredExceptionTests + * @run testng/othervm test.transaction.TransactionRolledbackExceptionTests + * @run testng/othervm util.SerializedTransactionExceptions */ diff --git a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java index f442875b55f..9407fbf526b 100644 --- a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java +++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithAbstractFactory.java @@ -33,8 +33,8 @@ import javax.xml.bind.JAXBException; * @bug 8150173 * @summary Verifies that a factory which inherit its createContext method * from an abstract subclass of JAXBContextFactory can be instantiated. - * @compile -addmods java.xml.bind JAXBContextWithAbstractFactory.java - * @run main/othervm -addmods java.xml.bind JAXBContextWithAbstractFactory + * @modules java.xml.bind + * @run main/othervm JAXBContextWithAbstractFactory */ public class JAXBContextWithAbstractFactory { private static JAXBContext tmp; diff --git a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java index aa886ef9c7d..972e5fae573 100644 --- a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java +++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithLegacyFactory.java @@ -35,8 +35,8 @@ import javax.xml.bind.Validator; * @bug 8150173 * @summary Verifies that a JAXBContext can be created with a legacy * factory class that has static createContext methods. - * @compile -addmods java.xml.bind JAXBContextWithLegacyFactory.java - * @run main/othervm -addmods java.xml.bind JAXBContextWithLegacyFactory + * @modules java.xml.bind + * @run main/othervm JAXBContextWithLegacyFactory */ public class JAXBContextWithLegacyFactory { private static JAXBContext tmp; diff --git a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java index 6ab7520eea3..a9c7066d7c7 100644 --- a/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java +++ b/jdk/test/javax/xml/bind/JAXBContext/JAXBContextWithSubclassedFactory.java @@ -36,8 +36,8 @@ import javax.xml.bind.Validator; * @bug 8150173 * @summary Verifies that a factory which inherit its createContext method * from a concrete subclass of JAXBContextFactory is be instantiated. - * @compile -addmods java.xml.bind JAXBContextWithSubclassedFactory.java - * @run main/othervm -addmods java.xml.bind JAXBContextWithSubclassedFactory + * @modules java.xml.bind + * @run main/othervm JAXBContextWithSubclassedFactory */ public class JAXBContextWithSubclassedFactory { static JAXBContext tmp; diff --git a/jdk/test/javax/xml/bind/jxc/8073872/SchemagenStackOverflow.java b/jdk/test/javax/xml/bind/jxc/8073872/SchemagenStackOverflow.java index f1f143de529..82ed2025636 100644 --- a/jdk/test/javax/xml/bind/jxc/8073872/SchemagenStackOverflow.java +++ b/jdk/test/javax/xml/bind/jxc/8073872/SchemagenStackOverflow.java @@ -26,9 +26,8 @@ * @bug 8073872 * @summary test that stackoverflow is not observable when element * references containing class - * @modules java.xml * @modules java.xml.bind - * @compile Foo.java + * @compile SchemagenStackOverflow.java Foo.java * @run testng/othervm SchemagenStackOverflow */ diff --git a/jdk/test/javax/xml/bind/marshal/8134111/UnmarshalTest.java b/jdk/test/javax/xml/bind/marshal/8134111/UnmarshalTest.java index c95f85bb0e0..a068445f30d 100644 --- a/jdk/test/javax/xml/bind/marshal/8134111/UnmarshalTest.java +++ b/jdk/test/javax/xml/bind/marshal/8134111/UnmarshalTest.java @@ -26,9 +26,10 @@ * @bug 8134111 * @summary test that elements without namespace is ignored by unmarshaller * when elementFormDefault is set to QUALIFIED. - * @compile testTypes/package-info.java testTypes/Root.java - * testTypes/WhenType.java testTypes/ObjectFactory.java * @modules java.xml.bind + * @compile UnmarshalTest.java + * testTypes/package-info.java testTypes/Root.java + * testTypes/WhenType.java testTypes/ObjectFactory.java * @run testng/othervm UnmarshalTest */ diff --git a/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java index 9cc57cfcdae..5c5e8706a81 100644 --- a/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java +++ b/jdk/test/javax/xml/bind/xjc/8032884/XjcOptionalPropertyTest.java @@ -100,7 +100,7 @@ public class XjcOptionalPropertyTest { // Compile java classes with javac tool void compileXjcGeneratedClasses() throws Exception { JDKToolLauncher javacLauncher = JDKToolLauncher.createUsingTestJDK("javac"); - javacLauncher.addToolArg("-addmods"); + javacLauncher.addToolArg("--add-modules"); javacLauncher.addToolArg("java.xml.bind"); javacLauncher.addToolArg(xjcResultDir.resolve("Foo.java").toString()); System.out.println("Compiling xjc generated class: " + Arrays.asList(javacLauncher.getCommand())); diff --git a/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java b/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java index cc1be256343..c7abbac9176 100644 --- a/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java +++ b/jdk/test/javax/xml/bind/xjc/8145039/JaxbMarshallTest.java @@ -127,7 +127,7 @@ public class JaxbMarshallTest { // Compile java classes with javac tool void compileXjcGeneratedClasses() throws Exception { JDKToolLauncher javacLauncher = JDKToolLauncher.createUsingTestJDK("javac"); - javacLauncher.addToolArg("-addmods"); + javacLauncher.addToolArg("--add-modules"); javacLauncher.addToolArg("java.xml.bind"); javacLauncher.addToolArg(xjcResultDir.resolve("ObjectFactory.java").toString()); javacLauncher.addToolArg(xjcResultDir.resolve("TypesLongList.java").toString()); diff --git a/jdk/test/javax/xml/jaxp/common/8035437/run.sh b/jdk/test/javax/xml/jaxp/common/8035437/run.sh index 5dbcff7f18a..ea377c67281 100644 --- a/jdk/test/javax/xml/jaxp/common/8035437/run.sh +++ b/jdk/test/javax/xml/jaxp/common/8035437/run.sh @@ -34,12 +34,12 @@ $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ -d compile/java.xml -Xmodule:java.xml $TESTSRC/Document.java $TESTSRC/Node.java || exit 1 $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ - -d exec/java.xml -Xpatch:java.xml=compile/java.xml -Xmodule:java.xml $TESTSRC/DocumentImpl.java || exit 2 + -d exec/java.xml --patch-module java.xml=compile/java.xml -Xmodule:java.xml $TESTSRC/DocumentImpl.java || exit 2 $COMPILEJAVA/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ $TESTSRC/AbstractMethodErrorTest.java -d exec || exit 3 -$TESTJAVA/bin/java ${TESTVMOPTS} -Xpatch:java.xml=exec -cp exec AbstractMethodErrorTest || exit 4 +$TESTJAVA/bin/java ${TESTVMOPTS} --patch-module java.xml=exec -cp exec AbstractMethodErrorTest || exit 4 exit 0 diff --git a/jdk/test/javax/xml/soap/XmlTest.java b/jdk/test/javax/xml/soap/XmlTest.java index 37aed906037..c99f5d6a2ae 100644 --- a/jdk/test/javax/xml/soap/XmlTest.java +++ b/jdk/test/javax/xml/soap/XmlTest.java @@ -38,8 +38,8 @@ import java.util.Iterator; /* * @test - * @compile -addmods java.xml.ws XmlTest.java - * @run main/othervm -addmods java.xml.ws XmlTest + * @modules java.xml.ws + * @run main XmlTest * @summary tests JAF DataHandler can be instantiated; test serialize and * deserialize SOAP message containing xml attachment */ diff --git a/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java b/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java index 07f66dcbc51..e9c81180416 100644 --- a/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java +++ b/jdk/test/javax/xml/soap/spi/SAAJFactoryTest.java @@ -50,28 +50,28 @@ import java.nio.file.StandardOpenOption; * scenario14 javax.xml.soap.MessageFactory=saaj.factory.Valid saaj.factory.Valid2 - * * @modules java.xml.ws - * @compile -addmods java.xml.ws saaj/factory/Invalid.java saaj/factory/Valid.java + * @compile saaj/factory/Invalid.java saaj/factory/Valid.java * saaj/factory/Valid2.java saaj/factory/Valid3.java SAAJFactoryTest.java * - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl - scenario2 - - - * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.Valid + * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.Valid * SAAJFactoryTest saaj.factory.Valid - scenario5 - - - * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.NonExisting + * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.NonExisting * SAAJFactoryTest - javax.xml.soap.SOAPException scenario6 - - - * @run main/othervm -addmods java.xml.ws -Djavax.xml.soap.MessageFactory=saaj.factory.Invalid + * @run main/othervm -Djavax.xml.soap.MessageFactory=saaj.factory.Invalid * SAAJFactoryTest - javax.xml.soap.SOAPException scenario7 - - - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest saaj.factory.Valid - scenario8 - saaj.factory.Valid - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest saaj.factory.Valid - scenario9 - saaj.factory.Valid - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest - javax.xml.soap.SOAPException scenario10 - saaj.factory.NonExisting - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest - javax.xml.soap.SOAPException scenario11 - saaj.factory.Invalid scenario11 - saaj.factory.Invalid - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl - scenario12 - - - * @run main/othervm -addmods java.xml.ws + * @run main/othervm * SAAJFactoryTest saaj.factory.Valid - scenario15 - saaj.factory.Valid */ public class SAAJFactoryTest { @@ -207,4 +207,3 @@ public class SAAJFactoryTest { } } - diff --git a/jdk/test/javax/xml/ws/8043129/MailTest.java b/jdk/test/javax/xml/ws/8043129/MailTest.java index c65247a9edc..1884316e667 100644 --- a/jdk/test/javax/xml/ws/8043129/MailTest.java +++ b/jdk/test/javax/xml/ws/8043129/MailTest.java @@ -28,8 +28,7 @@ * @author mkos * @library javax.mail.jar * @modules java.xml.ws - * @compile -addmods java.xml.ws MailTest.java - * @run main/othervm -addmods java.xml.ws MailTest + * @run main MailTest */ import javax.activation.CommandMap; diff --git a/jdk/test/javax/xml/ws/clientjar/TestWsImport.java b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java index bc048e84b08..05f9d67dc40 100644 --- a/jdk/test/javax/xml/ws/clientjar/TestWsImport.java +++ b/jdk/test/javax/xml/ws/clientjar/TestWsImport.java @@ -25,8 +25,8 @@ * @test * @bug 8016271 8026405 * @summary wsimport -clientjar does not create portable jar on windows due to hardcoded '\' - * @compile -addmods java.xml.ws TestWsImport.java - * @run main/othervm -addmods java.xml.ws TestWsImport + * @modules java.xml.ws + * @run main TestWsImport */ import javax.xml.namespace.QName; diff --git a/jdk/test/javax/xml/ws/publish/WSTest.java b/jdk/test/javax/xml/ws/publish/WSTest.java index 8d15a739d9d..34ea7674bd8 100644 --- a/jdk/test/javax/xml/ws/publish/WSTest.java +++ b/jdk/test/javax/xml/ws/publish/WSTest.java @@ -26,8 +26,7 @@ * @bug 8146086 * @summary Publishing two webservices on same port fails with "java.net.BindException: Address already in use" * @modules java.xml.ws - * @compile -addmods java.xml.ws WSTest.java - * @run main/othervm -addmods java.xml.ws WSTest + * @run main/othervm WSTest */ import javax.jws.WebMethod; import javax.jws.WebService; diff --git a/jdk/test/javax/xml/ws/xsanymixed/Test.java b/jdk/test/javax/xml/ws/xsanymixed/Test.java index d62f03ae425..a3f8157c692 100644 --- a/jdk/test/javax/xml/ws/xsanymixed/Test.java +++ b/jdk/test/javax/xml/ws/xsanymixed/Test.java @@ -28,8 +28,7 @@ * no white space changes and no changes to namespace prefixes * @modules java.xml.ws * @run shell compile-wsdl.sh - * @compile -addmods java.xml.ws Test.java - * @run main/othervm -addmods java.xml.ws Test + * @run main/othervm Test */ import com.sun.net.httpserver.HttpServer; diff --git a/jdk/test/jdk/internal/misc/VM/RuntimeArguments.java b/jdk/test/jdk/internal/misc/VM/RuntimeArguments.java index cde316e58a4..754b2ada4ee 100644 --- a/jdk/test/jdk/internal/misc/VM/RuntimeArguments.java +++ b/jdk/test/jdk/internal/misc/VM/RuntimeArguments.java @@ -26,6 +26,8 @@ * @summary Basic test of VM::getRuntimeArguments * @library /lib/testlibrary * @modules java.base/jdk.internal.misc + * java.compact3 + * jdk.zipfs * @run testng RuntimeArguments */ @@ -45,21 +47,28 @@ public class RuntimeArguments { public Object[][] options() { return new Object[][] { { // CLI options - List.of("-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", - "-XaddExports:java.base/jdk.internal.perf=ALL-UNNAMED", - "-addmods", "jdk.zipfs"), + List.of("--add-exports", + "java.base/jdk.internal.misc=ALL-UNNAMED", + "--add-exports", + "java.base/jdk.internal.perf=ALL-UNNAMED", + "--add-modules", + "jdk.zipfs"), // expected runtime arguments - List.of("-Djdk.launcher.addexports.0=java.base/jdk.internal.misc=ALL-UNNAMED", - "-Djdk.launcher.addexports.1=java.base/jdk.internal.perf=ALL-UNNAMED", - "-Djdk.launcher.addmods=jdk.zipfs") + List.of("--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", + "--add-exports=java.base/jdk.internal.perf=ALL-UNNAMED", + "--add-modules=jdk.zipfs") }, { // CLI options - List.of("-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", - "-addmods", "jdk.zipfs", - "-limitmods", "java.compact3"), + List.of("--add-exports", + "java.base/jdk.internal.misc=ALL-UNNAMED", + "--add-modules", + "jdk.zipfs", + "--limit-modules", + "java.compact3"), // expected runtime arguments - List.of("-Djdk.launcher.addexports.0=java.base/jdk.internal.misc=ALL-UNNAMED", - "-Djdk.launcher.addmods=jdk.zipfs", "-Djdk.launcher.limitmods=java.compact3") + List.of("--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED", + "--add-modules=jdk.zipfs", + "--limit-modules=java.compact3"), }, }; }; diff --git a/jdk/test/jdk/internal/reflect/Reflection/GetCallerClassTest.sh b/jdk/test/jdk/internal/reflect/Reflection/GetCallerClassTest.sh index e2aa6f9f8d9..51ebb10b381 100644 --- a/jdk/test/jdk/internal/reflect/Reflection/GetCallerClassTest.sh +++ b/jdk/test/jdk/internal/reflect/Reflection/GetCallerClassTest.sh @@ -55,7 +55,7 @@ BCP=${TESTCLASSES}/bcp rm -rf ${BCP} mkdir ${BCP} -EXTRAOPTS="-XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/jdk.internal.reflect=ALL-UNNAMED" # Compile GetCallerClass in bootclasspath ${COMPILEJAVA}/bin/javac ${TESTTOOLVMOPTS} ${EXTRAOPTS} \ diff --git a/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java b/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java index 4c40455cf62..613a854faa2 100644 --- a/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java +++ b/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java @@ -26,7 +26,7 @@ * @summary Verify the defining class loader of each module never delegates * to its child class loader. Also sanity check java.compact2 * requires. - * @run testng/othervm -Djdk.launcher.addmods=ALL-SYSTEM VerifyModuleDelegation + * @run testng/othervm --add-modules=ALL-SYSTEM VerifyModuleDelegation */ import java.lang.module.ModuleDescriptor; @@ -51,11 +51,11 @@ public class VerifyModuleDelegation { private static final ModuleDescriptor COMPACT2 = new ModuleDescriptor.Builder(JAVA_COMPACT2) - .requires(MANDATED, JAVA_BASE) - .requires(PUBLIC, JAVA_COMPACT1) - .requires(PUBLIC, "java.rmi") - .requires(PUBLIC, "java.sql") - .requires(PUBLIC, "java.xml") + .requires(Set.of(MANDATED), JAVA_BASE) + .requires(Set.of(PUBLIC), JAVA_COMPACT1) + .requires(Set.of(PUBLIC), "java.rmi") + .requires(Set.of(PUBLIC), "java.sql") + .requires(Set.of(PUBLIC), "java.xml") .build(); private static final Set<ModuleReference> MREFS diff --git a/jdk/test/jdk/modules/scenarios/automaticmodules/RunWithAutomaticModules.java b/jdk/test/jdk/modules/scenarios/automaticmodules/RunWithAutomaticModules.java index 4d1ebcf322d..56bd84b154d 100644 --- a/jdk/test/jdk/modules/scenarios/automaticmodules/RunWithAutomaticModules.java +++ b/jdk/test/jdk/modules/scenarios/automaticmodules/RunWithAutomaticModules.java @@ -100,15 +100,15 @@ public class RunWithAutomaticModules { compiled = CompilerUtils .compile(SRC_DIR.resolve(testModule), MODS_DIR.resolve(testModule), - "-mp", MODS_DIR.toString()); + "--module-path", MODS_DIR.toString()); assertTrue(compiled); - // launch the test. Need -addmods because nothing explicitly depends on logging + // launch the test. Need --add-mdoules because nothing explicitly depends on logging int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "logging", + = executeTestJava("--module-path", MODS_DIR.toString(), + "--add-modules", "logging", "-m", testModule + "/" + mainClass) .outputTo(System.out) .errorTo(System.out) @@ -159,7 +159,7 @@ public class RunWithAutomaticModules { compiled = CompilerUtils .compile(SRC_DIR.resolve(testModule), MODS_DIR.resolve(testModule), - "-mp", MODS_DIR.toString()); + "--module-path", MODS_DIR.toString()); assertTrue(compiled); @@ -167,7 +167,7 @@ public class RunWithAutomaticModules { // launch the test int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), + = executeTestJava("--module-path", MODS_DIR.toString(), "-m", testModule + "/" + mainClass) .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/jdk/modules/scenarios/container/ContainerTest.java b/jdk/test/jdk/modules/scenarios/container/ContainerTest.java index 36a7ac2c219..1ad5f352080 100644 --- a/jdk/test/jdk/modules/scenarios/container/ContainerTest.java +++ b/jdk/test/jdk/modules/scenarios/container/ContainerTest.java @@ -98,7 +98,7 @@ public class ContainerTest { compiled = CompilerUtils.compile(SRC_DIR.resolve("app1"), dir.resolve("app1"), - "-upgrademodulepath", dir.toString()); + "--upgrade-module-path", dir.toString()); assertTrue(compiled); } @@ -116,7 +116,7 @@ public class ContainerTest { compiled = CompilerUtils.compile(SRC_DIR.resolve("app2"), dir.resolve("app2"), - "-mp", dir.toString()); + "--module-path", dir.toString()); assertTrue(compiled); } @@ -134,7 +134,7 @@ public class ContainerTest { public void testContainer() throws Exception { int exitValue - = executeTestJava("-mp", MLIB_DIR.toString(), + = executeTestJava("--module-path", MLIB_DIR.toString(), "-m", CONTAINER_MODULE) .outputTo(System.out) .errorTo(System.err) diff --git a/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java b/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java index 529996e8e7d..8dc2060bfee 100644 --- a/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java +++ b/jdk/test/jdk/modules/scenarios/overlappingpackages/OverlappingPackagesTest.java @@ -74,7 +74,7 @@ public class OverlappingPackagesTest { */ public void testNoOverlappingPackages() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), + = executeTestJava("--module-path", MODS_DIR.toString(), "-m", "test/test.Main") .outputTo(System.out) .errorTo(System.err) @@ -85,13 +85,13 @@ public class OverlappingPackagesTest { /** - * Run the test with "-addmods misc", the misc module has package + * Run the test with "--add-modules misc", the misc module has package * jdk.internal.misc and so should overlap with the base module. */ public void testOverlapWithBaseModule() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "misc", + = executeTestJava("--module-path", MODS_DIR.toString(), + "-add-modules", "misc", "-m", "test/test.Main") .outputTo(System.out) .errorTo(System.err) @@ -101,12 +101,12 @@ public class OverlappingPackagesTest { } /** - * Run the test with "-addmods m1,m2". Both modules have package p. + * Run the test with "--add-modules m1,m2". Both modules have package p. */ public void testOverlap() throws Exception { int exitValue - = executeTestJava("-mp", MODS_DIR.toString(), - "-addmods", "m1,m2", + = executeTestJava("--module-path", MODS_DIR.toString(), + "--add-modules", "m1,m2", "-m", "test/test.Main") .outputTo(System.out) .errorTo(System.err) diff --git a/jdk/test/sun/awt/shell/ShellFolderMemoryLeak.java b/jdk/test/sun/awt/shell/ShellFolderMemoryLeak.java index 69b39bfb7e7..148b8e043bd 100644 --- a/jdk/test/sun/awt/shell/ShellFolderMemoryLeak.java +++ b/jdk/test/sun/awt/shell/ShellFolderMemoryLeak.java @@ -93,7 +93,7 @@ public class ShellFolderMemoryLeak { String command = javaPath + File.separator + "bin" + File.separator + "java -Xmx256M" + arg1 + " -cp " + classPathDir - + " -XaddExports:java.desktop/sun.awt.shell=ALL-UNNAMED" + + " --add-exports=java.desktop/sun.awt.shell=ALL-UNNAMED" + " ShellFolderMemoryLeak " + arg2; process = Runtime.getRuntime().exec(command); BufferedReader input = null; diff --git a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java index 75f3cdbba08..482e93e9128 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java +++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java @@ -150,7 +150,7 @@ public class CustomLauncherTest { ProcessBuilder client = ProcessTools.createJavaProcessBuilder( "-cp", TEST_CLASSPATH, - "-XaddExports:java.management/sun.management=ALL-UNNAMED", + "--add-exports", "java.management/sun.management=ALL-UNNAMED", "TestManager", String.valueOf(serverPrc.getPid()), port.get(), diff --git a/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java b/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java index 2dd35555af1..28f5cb34661 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java +++ b/jdk/test/sun/management/jmxremote/bootstrap/LocalManagementTest.java @@ -131,7 +131,7 @@ public class LocalManagementTest { ProcessBuilder client = ProcessTools.createJavaProcessBuilder( "-cp", TEST_CLASSPATH, - "-XaddExports:java.management/sun.management=ALL-UNNAMED", + "--add-exports", "java.management/sun.management=ALL-UNNAMED", "TestManager", String.valueOf(serverPrc.getPid()), port.get(), diff --git a/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh b/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh index f0a93a6f78a..5b564809d08 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiBootstrapTest.sh @@ -51,8 +51,8 @@ chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" export DEBUGOPTIONS -EXTRAOPTIONS="-XaddExports:java.management/sun.management=ALL-UNNAMED \ - -XaddExports:java.management/sun.management.jmxremote=ALL-UNNAMED" +EXTRAOPTIONS="--add-exports java.management/sun.management=ALL-UNNAMED \ + --add-exports java.management/sun.management.jmxremote=ALL-UNNAMED" export EXTRAOPTIONS # Call the common generic test diff --git a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh index 30f3a179149..539328e659a 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslBootstrapTest.sh @@ -49,8 +49,8 @@ chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" export DEBUGOPTIONS -EXTRAOPTIONS="-XaddExports:java.management/sun.management=ALL-UNNAMED \ - -XaddExports:java.management/sun.management.jmxremote=ALL-UNNAMED" +EXTRAOPTIONS="--add-exports java.management/sun.management=ALL-UNNAMED \ + --add-exports java.management/sun.management.jmxremote=ALL-UNNAMED" export EXTRAOPTIONS # Call the common generic test diff --git a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh index 8cccc837ba0..6152efc59e1 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh +++ b/jdk/test/sun/management/jmxremote/bootstrap/RmiSslNoKeyStoreTest.sh @@ -48,8 +48,8 @@ chmod -R 777 ${TESTCLASSES}/ssl DEBUGOPTIONS="" export DEBUGOPTIONS -EXTRAOPTIONS="-XaddExports:java.management/sun.management=ALL-UNNAMED \ - -XaddExports:java.management/sun.management.jmxremote=ALL-UNNAMED" +EXTRAOPTIONS="--add-exports java.management/sun.management=ALL-UNNAMED \ + --add-exports java.management/sun.management.jmxremote=ALL-UNNAMED" export EXTRAOPTIONS # Call the common generic test diff --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh index c3b45f10a64..f079dac88ea 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh @@ -51,7 +51,7 @@ case "$OS" in ;; esac -EXTRAOPTS="-XaddExports:java.base/sun.net.www=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . \ ${TESTSRC}${FS}OriginServer.java \ diff --git a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh index 79b99f0478e..1726d7092f0 100644 --- a/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh +++ b/jdk/test/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh @@ -51,7 +51,7 @@ case "$OS" in ;; esac -EXTRAOPTS="-XaddExports:java.base/sun.net.www=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.net.www=ALL-UNNAMED" ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} \ -d . ${TESTSRC}${FS}OriginServer.java \ ${TESTSRC}${FS}ProxyTunnelServer.java \ diff --git a/jdk/test/sun/net/www/protocol/jrt/OtherResources.java b/jdk/test/sun/net/www/protocol/jrt/OtherResources.java index 9717d4dd4c2..4ba707dd05e 100644 --- a/jdk/test/sun/net/www/protocol/jrt/OtherResources.java +++ b/jdk/test/sun/net/www/protocol/jrt/OtherResources.java @@ -36,7 +36,7 @@ public class OtherResources { // check that java.desktop is not in the set of readable modules try { Class.forName("java.awt.Component"); - throw new RuntimeException("Need to run with -limitmods java.base"); + throw new RuntimeException("Need to run with --limit-modules java.base"); } catch (ClassNotFoundException expected) { } // access resource in the java.desktop module diff --git a/jdk/test/sun/net/www/protocol/jrt/other_resources.sh b/jdk/test/sun/net/www/protocol/jrt/other_resources.sh index 260891cf519..79903759092 100644 --- a/jdk/test/sun/net/www/protocol/jrt/other_resources.sh +++ b/jdk/test/sun/net/www/protocol/jrt/other_resources.sh @@ -26,7 +26,7 @@ # @run shell other_resources.sh # @summary Access a jrt:/ resource in an observable module that is not in # the boot layer and hence not known to the built-in class loaders. This -# test is a shell test because the run tag doesn't support -limitmods. +# test is a shell test because the run tag doesn't support --limit-modules. set -e @@ -39,7 +39,7 @@ if [ -z "$TESTJAVA" ]; then fi JAVA="$TESTJAVA/bin/java ${TESTVMOPTS}" -$JAVA -limitmods java.base -cp $TESTCLASSES OtherResources +$JAVA --limit-modules java.base -cp $TESTCLASSES OtherResources exit 0 diff --git a/jdk/test/sun/rmi/rmic/iiopCompilation/IIOPCompilation.java b/jdk/test/sun/rmi/rmic/iiopCompilation/IIOPCompilation.java index eb591a5443d..96f30e96e15 100644 --- a/jdk/test/sun/rmi/rmic/iiopCompilation/IIOPCompilation.java +++ b/jdk/test/sun/rmi/rmic/iiopCompilation/IIOPCompilation.java @@ -30,8 +30,9 @@ * java.rmi/sun.rmi.transport * java.rmi/sun.rmi.transport.tcp * @build TestLibrary - * @summary Compiles a PortableRemoteObject with rmic -iiop and ensures that stub and tie classes are generated. * @run main IIOPCompilation + * + * @summary Compiles a PortableRemoteObject with rmic -iiop and ensures that stub and tie classes are generated. * @author Felix Yang * */ diff --git a/jdk/test/sun/rmi/runtime/Log/6409194/NoConsoleOutput.java b/jdk/test/sun/rmi/runtime/Log/6409194/NoConsoleOutput.java index a75a0420678..2c89e2b16b3 100644 --- a/jdk/test/sun/rmi/runtime/Log/6409194/NoConsoleOutput.java +++ b/jdk/test/sun/rmi/runtime/Log/6409194/NoConsoleOutput.java @@ -68,10 +68,10 @@ public class NoConsoleOutput { // (neither on standard output, nor on standard err streams). JavaVM vm = new JavaVM( DoRMIStuff.class.getName(), - "-XaddExports:java.rmi/sun.rmi.registry=ALL-UNNAMED" - + " -XaddExports:java.rmi/sun.rmi.server=ALL-UNNAMED" - + " -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED" - + " -XaddExports:java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + "--add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED" + + " --add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" + " -Djava.util.logging.config.file=" + loggingPropertiesFile, "", out, err); vm.execute(); diff --git a/jdk/test/sun/security/krb5/ccache/EmptyCC.java b/jdk/test/sun/security/krb5/ccache/EmptyCC.java index 28281584f16..d5cfc4d557f 100644 --- a/jdk/test/sun/security/krb5/ccache/EmptyCC.java +++ b/jdk/test/sun/security/krb5/ccache/EmptyCC.java @@ -27,7 +27,8 @@ * @bug 8001208 * @summary NPE in sun.security.krb5.Credentials.acquireDefaultCreds() * @library ../../../../java/security/testlibrary/ - * @modules java.security.jgss/sun.security.krb5 + * @modules java.base/jdk.internal.misc + * java.security.jgss/sun.security.krb5 * java.security.jgss/sun.security.krb5.internal.ccache * @compile -XDignore.symbol.file EmptyCC.java * @run main EmptyCC tmpcc diff --git a/jdk/test/sun/security/krb5/tools/ktcheck.sh b/jdk/test/sun/security/krb5/tools/ktcheck.sh index e7077b42e89..a2759b72c2e 100644 --- a/jdk/test/sun/security/krb5/tools/ktcheck.sh +++ b/jdk/test/sun/security/krb5/tools/ktcheck.sh @@ -61,8 +61,8 @@ rm $KEYTAB EXTRA_OPTIONS="-Djava.security.krb5.conf=${TESTSRC}${FS}onlythree.conf" KTAB="${TESTJAVA}${FS}bin${FS}ktab -J${EXTRA_OPTIONS} -k $KEYTAB -f" CHECK="${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} ${TESTVMOPTS} ${EXTRA_OPTIONS} \ - -XaddExports:java.security.jgss/sun.security.krb5.internal.ktab=ALL-UNNAMED \ - -XaddExports:java.security.jgss/sun.security.krb5=ALL-UNNAMED \ + --add-exports java.security.jgss/sun.security.krb5.internal.ktab=ALL-UNNAMED \ + --add-exports java.security.jgss/sun.security.krb5=ALL-UNNAMED \ KtabCheck $KEYTAB" echo ${EXTRA_OPTIONS} diff --git a/jdk/test/sun/security/mscapi/PublicKeyInterop.sh b/jdk/test/sun/security/mscapi/PublicKeyInterop.sh index 5110a4b50c5..fc1550f9ab4 100644 --- a/jdk/test/sun/security/mscapi/PublicKeyInterop.sh +++ b/jdk/test/sun/security/mscapi/PublicKeyInterop.sh @@ -62,9 +62,9 @@ case "$OS" in echo echo "Running the test..." - ${TESTJAVA}/bin/javac -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ + ${TESTJAVA}/bin/javac --add-exports java.base/sun.security.util=ALL-UNNAMED \ ${TESTTOOLVMOPTS} ${TESTJAVACOPTS} -d . ${TESTSRC}\\PublicKeyInterop.java - ${TESTJAVA}/bin/java -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ + ${TESTJAVA}/bin/java --add-exports java.base/sun.security.util=ALL-UNNAMED \ ${TESTVMOPTS} PublicKeyInterop rc=$? diff --git a/jdk/test/sun/security/mscapi/ShortRSAKey1024.sh b/jdk/test/sun/security/mscapi/ShortRSAKey1024.sh index 091f3d9ba34..6cad1821ff6 100644 --- a/jdk/test/sun/security/mscapi/ShortRSAKey1024.sh +++ b/jdk/test/sun/security/mscapi/ShortRSAKey1024.sh @@ -88,10 +88,10 @@ case "$OS" in echo echo "Running the test..." - ${TESTJAVA}${FS}bin${FS}javac -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ + ${TESTJAVA}${FS}bin${FS}javac --add-exports java.base/sun.security.util=ALL-UNNAMED \ ${TESTTOOLVMOPTS} ${TESTJAVACOPTS} -d . \ ${TESTSRC}${FS}ShortRSAKeyWithinTLS.java - ${TESTJAVA}${FS}bin${FS}java -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ + ${TESTJAVA}${FS}bin${FS}java --add-exports java.base/sun.security.util=ALL-UNNAMED \ ${TESTVMOPTS} ShortRSAKeyWithinTLS 7106773.$BITS $BITS \ TLSv1.2 TLS_DHE_RSA_WITH_AES_128_CBC_SHA diff --git a/jdk/test/sun/security/provider/PolicyFile/Modules.java b/jdk/test/sun/security/provider/PolicyFile/Modules.java index 914ef05790d..fa7d33a8fd9 100644 --- a/jdk/test/sun/security/provider/PolicyFile/Modules.java +++ b/jdk/test/sun/security/provider/PolicyFile/Modules.java @@ -33,14 +33,14 @@ * java.sql * java.xml * java.xml.bind + * java.xml.ws * jdk.attach * jdk.jdi * jdk.net * jdk.security.auth * jdk.security.jgss - * @compile -addmods java.xml.ws,java.smartcardio Modules.java - * @run main/othervm/java.security.policy==modules.policy - * -addmods java.xml.ws,java.smartcardio Modules + * @compile --add-modules=java.xml.ws,java.smartcardio Modules.java + * @run main/othervm/java.security.policy==modules.policy Modules */ import java.security.AccessController; diff --git a/jdk/test/sun/security/tools/jarsigner/AltProvider.java b/jdk/test/sun/security/tools/jarsigner/AltProvider.java index 5c7e5a286c0..b93455670b9 100644 --- a/jdk/test/sun/security/tools/jarsigner/AltProvider.java +++ b/jdk/test/sun/security/tools/jarsigner/AltProvider.java @@ -55,7 +55,7 @@ public class AltProvider { // Compile the provider CompilerUtils.compile( MOD_SRC_DIR, MOD_DEST_DIR, - "-modulesourcepath", + "--module-source-path", MOD_SRC_DIR.toString()); // Create a keystore @@ -102,22 +102,22 @@ public class AltProvider { 0, "loadProviderByClass: org.test.dummy.DummyProvider"); // name in a module - testBoth("-J-mp -Jmods " + + testBoth("-J--module-path=mods " + "-addprovider Dummy -providerArg full", 0, "loadProviderByName: Dummy"); // -providerClass does not work - testBoth("-J-mp -Jmods " + + testBoth("-J--module-path=mods " + "-providerClass org.test.dummy.DummyProvider -providerArg full", 1, "Provider \"org.test.dummy.DummyProvider\" not found"); // -addprovider with class does not work - testBoth("-J-mp -Jmods " + + testBoth("-J--module-path=mods " + "-addprovider org.test.dummy.DummyProvider -providerArg full", 1, "Provider named \"org.test.dummy.DummyProvider\" not found"); // -addprovider without arg does not work - testBoth("-J-mp -Jmods " + + testBoth("-J--module-path=mods " + "-addprovider Dummy", 1, "DUMMYKS not found"); } diff --git a/jdk/test/sun/security/tools/jarsigner/ts.sh b/jdk/test/sun/security/tools/jarsigner/ts.sh index 386e0507b66..925377ca999 100644 --- a/jdk/test/sun/security/tools/jarsigner/ts.sh +++ b/jdk/test/sun/security/tools/jarsigner/ts.sh @@ -94,10 +94,10 @@ $KT -alias tsbad3 -certreq | \ $KT -alias ca -gencert -ext eku:critical=cs | \ $KT -alias tsbad3 -importcert -EXTRAOPTS="-XaddExports:java.base/sun.security.pkcs=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.timestamp=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.x509=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.util=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.security.pkcs=ALL-UNNAMED \ + --add-exports java.base/sun.security.timestamp=ALL-UNNAMED \ + --add-exports java.base/sun.security.x509=ALL-UNNAMED \ + --add-exports java.base/sun.security.util=ALL-UNNAMED" $JAVAC ${EXTRAOPTS} -d . ${TESTSRC}/TimestampCheck.java $JAVA ${TESTVMOPTS} ${EXTRAOPTS} "-Dtest.tool.vm.opts=${TESTTOOLVMOPTS}" TimestampCheck diff --git a/jdk/test/sun/security/tools/keytool/autotest.sh b/jdk/test/sun/security/tools/keytool/autotest.sh index de8d94ffa5d..b97310ecc64 100644 --- a/jdk/test/sun/security/tools/keytool/autotest.sh +++ b/jdk/test/sun/security/tools/keytool/autotest.sh @@ -100,9 +100,9 @@ fi echo "Using NSS lib at $LIBNAME" -EXTRAOPTS="-XaddExports:java.base/sun.security.tools.keytool=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.x509=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.security.tools.keytool=ALL-UNNAMED \ + --add-exports java.base/sun.security.util=ALL-UNNAMED \ + --add-exports java.base/sun.security.x509=ALL-UNNAMED" ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . -XDignore.symbol.file \ ${TESTSRC}${FS}KeyToolTest.java || exit 10 diff --git a/jdk/test/sun/security/tools/keytool/standard.sh b/jdk/test/sun/security/tools/keytool/standard.sh index 3c3d86718e7..38fadb8c495 100644 --- a/jdk/test/sun/security/tools/keytool/standard.sh +++ b/jdk/test/sun/security/tools/keytool/standard.sh @@ -58,9 +58,9 @@ case "$OS" in ;; esac -EXTRAOPTS="-XaddExports:java.base/sun.security.tools.keytool=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.util=ALL-UNNAMED \ - -XaddExports:java.base/sun.security.x509=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.security.tools.keytool=ALL-UNNAMED \ + --add-exports java.base/sun.security.util=ALL-UNNAMED \ + --add-exports java.base/sun.security.x509=ALL-UNNAMED" ${COMPILEJAVA}${FS}bin${FS}javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . -XDignore.symbol.file ${TESTSRC}${FS}KeyToolTest.java || exit 10 diff --git a/jdk/test/sun/security/validator/certreplace.sh b/jdk/test/sun/security/validator/certreplace.sh index e32d638f0f9..78b27e8f99f 100644 --- a/jdk/test/sun/security/validator/certreplace.sh +++ b/jdk/test/sun/security/validator/certreplace.sh @@ -83,6 +83,6 @@ $KT -delete -alias user # 5. Build and run test -EXTRAOPTS="-XaddExports:java.base/sun.security.validator=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.security.validator=ALL-UNNAMED" $JAVAC ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . ${TESTSRC}${FS}CertReplace.java $JAVA ${TESTVMOPTS} ${EXTRAOPTS} CertReplace certreplace.jks certreplace.certs diff --git a/jdk/test/sun/security/validator/samedn.sh b/jdk/test/sun/security/validator/samedn.sh index acfa49e0914..6a30b147157 100644 --- a/jdk/test/sun/security/validator/samedn.sh +++ b/jdk/test/sun/security/validator/samedn.sh @@ -79,7 +79,7 @@ $KT -delete -alias user # 5. Build and run test. Make sure the CA certs are ignored for validity check. # Check both, one of them might be dropped out of map in old codes. -EXTRAOPTS="-XaddExports:java.base/sun.security.validator=ALL-UNNAMED" +EXTRAOPTS="--add-exports java.base/sun.security.validator=ALL-UNNAMED" $JAVAC ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} ${EXTRAOPTS} -d . ${TESTSRC}${FS}CertReplace.java $JAVA ${TESTVMOPTS} ${EXTRAOPTS} CertReplace samedn.jks samedn1.certs || exit 1 $JAVA ${TESTVMOPTS} ${EXTRAOPTS} CertReplace samedn.jks samedn2.certs || exit 2 diff --git a/jdk/test/sun/text/IntHashtable/Bug4170614Test.sh b/jdk/test/sun/text/IntHashtable/Bug4170614Test.sh index b8dad0084a6..0c31934d01c 100644 --- a/jdk/test/sun/text/IntHashtable/Bug4170614Test.sh +++ b/jdk/test/sun/text/IntHashtable/Bug4170614Test.sh @@ -63,7 +63,7 @@ ${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ -Xmodule:java.base \ -d ${TEST_JAVABASE} Bug4170614Test.java -${TESTJAVA}/bin/java ${TESTVMOPTS} -Xpatch:java.base=${TEST_JAVABASE} java.text.Bug4170614Test +${TESTJAVA}/bin/java ${TESTVMOPTS} --patch-module java.base=${TEST_JAVABASE} java.text.Bug4170614Test result=$? diff --git a/jdk/test/sun/tools/java/CFCTest.java b/jdk/test/sun/tools/java/CFCTest.java index 4dea1a57bc8..bae7d735461 100644 --- a/jdk/test/sun/tools/java/CFCTest.java +++ b/jdk/test/sun/tools/java/CFCTest.java @@ -24,9 +24,11 @@ /* * @test * @bug 8011805 - * @modules jdk.rmic/sun.tools.java jdk.rmic/sun.rmi.rmic * @summary Update sun.tools.java class file reading/writing support to include * the new constant pool entries (including invokedynamic) + * @modules jdk.rmic/sun.rmi.rmic + * jdk.rmic/sun.tools.java + * @run main CFCTest */ import java.io.DataInputStream; diff --git a/jdk/test/sun/util/locale/provider/Bug8038436.java b/jdk/test/sun/util/locale/provider/Bug8038436.java index 3f8179ba0d2..e112ed51804 100644 --- a/jdk/test/sun/util/locale/provider/Bug8038436.java +++ b/jdk/test/sun/util/locale/provider/Bug8038436.java @@ -28,7 +28,7 @@ * @modules java.base/sun.util.locale.provider * java.base/sun.util.spi * @compile -XDignore.symbol.file Bug8038436.java - * @run main/othervm -limitmods java.base Bug8038436 security + * @run main/othervm --limit-modules java.base Bug8038436 security * @run main/othervm -Djava.locale.providers=COMPAT Bug8038436 availlocs */ @@ -69,7 +69,7 @@ public class Bug8038436 { /* * Check only English/ROOT locales are returned if the jdk.localedata - * module is not loaded (implied by "-limitmods java.base"). + * module is not loaded (implied by "--limit-modules java.base"). */ List<Locale> nonEnglishLocales= (Arrays.stream(Locale.getAvailableLocales()) .filter(l -> (l != Locale.ROOT && !(l.getLanguage() == "en" && (l.getCountry() == "US" || l.getCountry() == "" )))) diff --git a/jdk/test/tools/jar/modularJar/Basic.java b/jdk/test/tools/jar/modularJar/Basic.java index 396a5fa9f8f..073eabc9896 100644 --- a/jdk/test/tools/jar/modularJar/Basic.java +++ b/jdk/test/tools/jar/modularJar/Basic.java @@ -460,7 +460,7 @@ public class Basic { "--no-manifest", "-C", barModInfo.toString(), "module-info.class") // stuff in bar's info .assertSuccess(); - jar("-p", + jar("-d", "--file=" + modularJar.toString()) .assertSuccess() .resultChecker(r -> { @@ -499,14 +499,14 @@ public class Basic { "--file=" + modularJar.toString(), "--main-class=" + FOO.mainClass, "--module-version=" + FOO.version, - "--modulepath=" + mp.toString(), + "--module-path=" + mp.toString(), "--hash-modules=" + "bar", "--no-manifest", "-C", modClasses.toString(), ".") .assertSuccess(); java(mp, BAR.moduleName + "/" + BAR.mainClass, - "-XaddExports:java.base/jdk.internal.module=bar") + "--add-exports", "java.base/jdk.internal.module=bar") .assertSuccess() .resultChecker(r -> { assertModuleData(r, BAR); @@ -535,7 +535,7 @@ public class Basic { "--file=" + fooJar.toString(), "--main-class=" + FOO.mainClass, "--module-version=" + FOO.version, - "--modulepath=" + mp.toString(), + "-p", mp.toString(), // test short-form "--hash-modules=" + "bar", "--no-manifest", "-C", fooClasses.toString(), ".").assertSuccess(); @@ -550,7 +550,7 @@ public class Basic { "-C", barClasses.toString(), ".").assertSuccess(); java(mp, BAR.moduleName + "/" + BAR.mainClass, - "-XaddExports:java.base/jdk.internal.module=bar") + "--add-exports", "java.base/jdk.internal.module=bar") .assertFailure() .resultChecker(r -> { // Expect similar output: "java.lang.module.ResolutionException: Hash @@ -684,7 +684,7 @@ public class Basic { "-C", modClasses.toString(), ".") .assertSuccess(); - for (String option : new String[] {"--print-module-descriptor", "-p" }) { + for (String option : new String[] {"--print-module-descriptor", "-d" }) { jar(option, "--file=" + modularJar.toString()) .assertSuccess() @@ -711,7 +711,7 @@ public class Basic { "-C", modClasses.toString(), ".") .assertSuccess(); - for (String option : new String[] {"--print-module-descriptor", "-p" }) { + for (String option : new String[] {"--print-module-descriptor", "-d" }) { jarWithStdin(modularJar.toFile(), option) .assertSuccess() @@ -815,10 +815,12 @@ public class Basic { } commands.add("-d"); commands.add(dest.toString()); - if (dest.toString().contains("bar")) - commands.add("-XaddExports:java.base/jdk.internal.module=bar"); + if (dest.toString().contains("bar")) { + commands.add("--add-exports"); + commands.add("java.base/jdk.internal.module=bar"); + } if (modulePath != null) { - commands.add("-mp"); + commands.add("--module-path"); commands.add(modulePath.toString()); } Stream.of(sourceFiles).map(Object::toString).forEach(x -> commands.add(x)); @@ -838,7 +840,7 @@ public class Basic { commands.addAll(Arrays.asList(JAVA_OPTIONS.split("\\s+", -1))); } Stream.of(args).forEach(x -> commands.add(x)); - commands.add("-mp"); + commands.add("--module-path"); commands.add(modulePath.toString()); commands.add("-m"); commands.add(entryPoint); diff --git a/jdk/test/tools/jimage/VerifyJimage.java b/jdk/test/tools/jimage/VerifyJimage.java index 5056e6322a5..30628ad9921 100644 --- a/jdk/test/tools/jimage/VerifyJimage.java +++ b/jdk/test/tools/jimage/VerifyJimage.java @@ -49,7 +49,7 @@ import jdk.internal.jimage.ImageLocation; * @test * @summary Verify jimage * @modules java.base/jdk.internal.jimage - * @run main/othervm -Djdk.launcher.addmods=ALL-SYSTEM VerifyJimage + * @run main/othervm --add-modules=ALL-SYSTEM VerifyJimage */ /** diff --git a/jdk/test/tools/jlink/CustomPluginTest.java b/jdk/test/tools/jlink/CustomPluginTest.java index 34e4d4b1a5e..dc7a774ca51 100644 --- a/jdk/test/tools/jlink/CustomPluginTest.java +++ b/jdk/test/tools/jlink/CustomPluginTest.java @@ -93,7 +93,8 @@ public class CustomPluginTest { String name = "customplugin"; Path src = Paths.get(System.getProperty("test.src")).resolve(name); Path classes = helper.getJmodClassesDir().resolve(name); - JImageGenerator.compile(src, classes, "-XaddExports:jdk.jlink/jdk.tools.jlink.internal=customplugin"); + JImageGenerator.compile(src, classes, + "--add-exports", "jdk.jlink/jdk.tools.jlink.internal=customplugin"); return JImageGenerator.getJModTask() .addClassPath(classes) .jmod(helper.getJmodDir().resolve(name + ".jmod")) diff --git a/jdk/test/tools/jlink/JLinkNegativeTest.java b/jdk/test/tools/jlink/JLinkNegativeTest.java index 4a1dcf117fe..9213626dfeb 100644 --- a/jdk/test/tools/jlink/JLinkNegativeTest.java +++ b/jdk/test/tools/jlink/JLinkNegativeTest.java @@ -95,7 +95,7 @@ public class JLinkNegativeTest { } public void testNotExistInAddMods() { - // cannot find jmod from --addmods + // cannot find jmod from --add-modules JImageGenerator.getJLinkTask() .modulePath(".") .addMods("not_exist") diff --git a/jdk/test/tools/jlink/JLinkTest.java b/jdk/test/tools/jlink/JLinkTest.java index 189be842854..620d5c85e84 100644 --- a/jdk/test/tools/jlink/JLinkTest.java +++ b/jdk/test/tools/jlink/JLinkTest.java @@ -118,7 +118,7 @@ public class JLinkTest { .output(helper.createNewImageDir(moduleName)) .addMods("leaf1") .option("") - .call().assertFailure("Error: no value given for --modulepath"); + .call().assertFailure("Error: no value given for --module-path"); } { @@ -250,7 +250,7 @@ public class JLinkTest { // @file { Path path = Paths.get("embedded.properties"); - Files.write(path, Collections.singletonList("--strip-debug --addmods " + + Files.write(path, Collections.singletonList("--strip-debug --add-modules " + "toto.unknown --compress UNKNOWN\n")); String[] userOptions = {"@", path.toAbsolutePath().toString()}; String moduleName = "configembeddednocompresscomposite2"; diff --git a/jdk/test/tools/jlink/basic/BasicTest.java b/jdk/test/tools/jlink/basic/BasicTest.java index 4135f4a2141..780cbca9cbc 100644 --- a/jdk/test/tools/jlink/basic/BasicTest.java +++ b/jdk/test/tools/jlink/basic/BasicTest.java @@ -106,8 +106,8 @@ public class BasicTest { private void runJlink(Path image, String modName, String... options) { List<String> args = new ArrayList<>(); Collections.addAll(args, - "--modulepath", jdkMods + File.pathSeparator + jmods, - "--addmods", modName, + "--module-path", jdkMods + File.pathSeparator + jmods, + "--add-modules", modName, "--output", image.toString()); Collections.addAll(args, options); int rc = jdk.tools.jlink.internal.Main.run(args.toArray(new String[args.size()]), new PrintWriter(System.out)); diff --git a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java index ae0a32e8436..a56da486ba0 100644 --- a/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java +++ b/jdk/test/tools/jlink/plugins/SystemModuleDescriptors/UserModuleTest.java @@ -73,7 +73,7 @@ public class UserModuleTest { for (String mn : modules) { Path msrc = SRC_DIR.resolve(mn); - assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "-modulesourcepath", SRC_DIR.toString())); + assertTrue(CompilerUtils.compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString())); } if (Files.exists(IMAGE)) { @@ -87,8 +87,8 @@ public class UserModuleTest { Path jlink = Paths.get(JAVA_HOME, "bin", "jlink"); String mp = JMODS.toString() + File.pathSeparator + MODS_DIR.toString(); assertTrue(executeProcess(jlink.toString(), "--output", outputDir.toString(), - "--addmods", Arrays.stream(modules).collect(Collectors.joining(",")), - "--modulepath", mp) + "--add-modules", Arrays.stream(modules).collect(Collectors.joining(",")), + "--module-path", mp) .outputTo(System.out) .errorTo(System.out) .getExitValue() == 0); diff --git a/jdk/test/tools/jmod/JmodNegativeTest.java b/jdk/test/tools/jmod/JmodNegativeTest.java index bb75c3cae65..317587f5fb5 100644 --- a/jdk/test/tools/jmod/JmodNegativeTest.java +++ b/jdk/test/tools/jmod/JmodNegativeTest.java @@ -314,7 +314,7 @@ public class JmodNegativeTest { jmod("create", "--class-path", cp, "--hash-modules", ".*", - "--modulepath", emptyDir.toString(), + "--module-path", emptyDir.toString(), jmod.toString()) .resultChecker(r -> assertContains(r.output, "No hashes recorded: " + @@ -335,7 +335,7 @@ public class JmodNegativeTest { jmod("create", "--class-path", cp, "--hash-modules", ".*", - "--modulepath", MODS_DIR.toString(), + "--module-path", MODS_DIR.toString(), jmod.toString()) .assertFailure(); } finally { @@ -353,7 +353,7 @@ public class JmodNegativeTest { jmod("create", "--hash-modules", ".*", - "--modulepath", file.toString(), + "--module-path", file.toString(), jmod.toString()) .assertFailure() .resultChecker(r -> @@ -370,7 +370,7 @@ public class JmodNegativeTest { List<Supplier<JmodResult>> tasks = Arrays.asList( () -> jmod("create", "--hash-modules", "anyPattern", - "--modulepath", "doesNotExist", + "--module-path", "doesNotExist", "output.jmod"), () -> jmod("create", "--class-path", "doesNotExist", @@ -418,7 +418,7 @@ public class JmodNegativeTest { List<Supplier<JmodResult>> tasks = Arrays.asList( () -> jmod("create", "--hash-modules", "anyPattern", - "--modulepath","empty" + pathSeparator + "doesNotExist", + "--module-path","empty" + pathSeparator + "doesNotExist", "output.jmod"), () -> jmod("create", "--class-path", "empty" + pathSeparator + "doesNotExist", @@ -467,7 +467,7 @@ public class JmodNegativeTest { "--class-path", "aFile.txt", "output.jmod"), () -> jmod("create", - "--modulepath", "aFile.txt", + "--module-path", "aFile.txt", "output.jmod"), () -> jmod("create", "--cmds", "aFile.txt", diff --git a/jdk/test/tools/jmod/hashes/HashesTest.java b/jdk/test/tools/jmod/hashes/HashesTest.java index 243ecbd8190..616d393b97a 100644 --- a/jdk/test/tools/jmod/hashes/HashesTest.java +++ b/jdk/test/tools/jmod/hashes/HashesTest.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,7 +88,7 @@ public class HashesTest { // build m1 compileModule("m1", modSrc); // no hash is recorded since m1 has outgoing edges - jmod("m1", "--modulepath", jmods.toString(), "--hash-modules", ".*"); + jmod("m1", "--module-path", jmods.toString(), "--hash-modules", ".*"); // compile org.bar and org.foo compileModule("org.bar", modSrc); @@ -109,17 +109,17 @@ public class HashesTest { } // hash m1 in m2 - jmod("m2", "--modulepath", jmods.toString(), "--hash-modules", "m1"); + jmod("m2", "--module-path", jmods.toString(), "--hash-modules", "m1"); checkHashes(hashes("m2").get(), "m1"); // hash m1 in m2 - jmod("m2", "--modulepath", jmods.toString(), "--hash-modules", ".*"); + jmod("m2", "--module-path", jmods.toString(), "--hash-modules", ".*"); checkHashes(hashes("m2").get(), "m1"); // create m2.jmod with no hash jmod("m2"); // run jmod hash command to hash m1 in m2 and m3 - runJmod(Arrays.asList("hash", "--modulepath", jmods.toString(), + runJmod(Arrays.asList("hash", "--module-path", jmods.toString(), "--hash-modules", ".*")); checkHashes(hashes("m2").get(), "m1"); checkHashes(hashes("m3").get(), "m1"); @@ -127,10 +127,10 @@ public class HashesTest { jmod("org.bar"); jmod("org.foo"); - jmod("org.bar", "--modulepath", jmods.toString(), "--hash-modules", "org.*"); + jmod("org.bar", "--module-path", jmods.toString(), "--hash-modules", "org.*"); checkHashes(hashes("org.bar").get(), "org.foo"); - jmod("m3", "--modulepath", jmods.toString(), "--hash-modules", ".*"); + jmod("m3", "--module-path", jmods.toString(), "--hash-modules", ".*"); checkHashes(hashes("m3").get(), "org.foo", "org.bar", "m1"); } @@ -185,7 +185,7 @@ public class HashesTest { private void compileModule(String moduleName, Path src) throws IOException { Path msrc = src.resolve(moduleName); - assertTrue(CompilerUtils.compile(msrc, mods, "-modulesourcepath", src.toString())); + assertTrue(CompilerUtils.compile(msrc, mods, "--module-source-path", src.toString())); } private void jmod(String moduleName, String... options) throws IOException { diff --git a/jdk/test/tools/launcher/MiscTests.java b/jdk/test/tools/launcher/MiscTests.java index 7b82abc4f48..e9a71e5f224 100644 --- a/jdk/test/tools/launcher/MiscTests.java +++ b/jdk/test/tools/launcher/MiscTests.java @@ -70,7 +70,7 @@ public class MiscTests extends TestHelper { final String mainClass = "Foo6856415"; final String exportOpts - = "-XaddExports:jdk.crypto.pkcs11/sun.security.pkcs11=ALL-UNNAMED"; + = "--add-exports=jdk.crypto.pkcs11/sun.security.pkcs11=ALL-UNNAMED"; List<String> scratch = new ArrayList<>(); scratch.add("public class Foo6856415 {"); diff --git a/jdk/test/tools/launcher/ToolsOpts.java b/jdk/test/tools/launcher/ToolsOpts.java index 4b4a32bde2b..f8920c6acd7 100644 --- a/jdk/test/tools/launcher/ToolsOpts.java +++ b/jdk/test/tools/launcher/ToolsOpts.java @@ -151,7 +151,7 @@ public class ToolsOpts extends TestHelper { init(); TestResult tr; int jpos = -1; - String xPatch = "-J-Xpatch:jdk.compiler=jdk.compiler"; + String xPatch = "-J--patch-module=jdk.compiler=jdk.compiler"; for (String arg[] : optionPatterns) { jpos = indexOfJoption(arg); //Build a cmd string for output in results reporting. diff --git a/jdk/test/tools/launcher/modules/addexports/AddExportsTest.java b/jdk/test/tools/launcher/modules/addexports/AddExportsTest.java index 414e0d99f1e..8142c4af193 100644 --- a/jdk/test/tools/launcher/modules/addexports/AddExportsTest.java +++ b/jdk/test/tools/launcher/modules/addexports/AddExportsTest.java @@ -27,7 +27,7 @@ * @modules jdk.compiler * @build AddExportsTest CompilerUtils jdk.testlibrary.* * @run testng AddExportsTest - * @summary Basic tests for java -XaddExports + * @summary Basic tests for java --add-exports */ import java.nio.file.Path; @@ -71,7 +71,7 @@ public class AddExportsTest { boolean compiled = CompilerUtils.compile( SRC_DIR.resolve(TEST1_MODULE), MODS_DIR.resolve(TEST1_MODULE), - "-XaddExports:java.base/jdk.internal.misc=m1"); + "--add-exports", "java.base/jdk.internal.misc=m1"); assertTrue(compiled, "module " + TEST1_MODULE + " did not compile"); // javac -d upgrademods/java.transaction src/java.transaction/** @@ -80,12 +80,12 @@ public class AddExportsTest { UPGRADE_MODS_DIRS.resolve("java.transaction")); assertTrue(compiled, "module java.transaction did not compile"); - // javac -upgrademodulepath upgrademods -d mods/m2 src/m2/** + // javac --upgrade-module-path upgrademods -d mods/m2 src/m2/** compiled = CompilerUtils.compile( SRC_DIR.resolve(TEST2_MODULE), MODS_DIR.resolve(TEST2_MODULE), - "-upgrademodulepath", UPGRADE_MODS_DIRS.toString(), - "-XaddExports:java.transaction/javax.transaction.internal=m2"); + "--upgrade-module-path", UPGRADE_MODS_DIRS.toString(), + "--add-exports", "java.transaction/javax.transaction.internal=m2"); assertTrue(compiled, "module " + TEST2_MODULE + " did not compile"); // javac -d mods/m3 src/m3/** @@ -107,7 +107,7 @@ public class AddExportsTest { public void testSanity() throws Exception { int exitValue - = executeTestJava("-XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED", + = executeTestJava("--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", "-version") .outputTo(System.out) .errorTo(System.out) @@ -122,12 +122,12 @@ public class AddExportsTest { */ public void testUnnamedModule() throws Exception { - // java -XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED \ + // java --add-exports java.base/jdk.internal.misc=ALL-UNNAMED \ // -cp mods/$TESTMODULE jdk.test.UsesUnsafe String classpath = MODS_DIR.resolve(TEST1_MODULE).toString(); int exitValue - = executeTestJava("-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED", + = executeTestJava("--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED", "-cp", classpath, TEST1_MAIN_CLASS) .outputTo(System.out) @@ -143,13 +143,13 @@ public class AddExportsTest { */ public void testNamedModule() throws Exception { - // java -XaddExports:java.base/jdk.internal.misc=test \ - // -mp mods -m $TESTMODULE/$MAIN_CLASS + // java --add-exports java.base/jdk.internal.misc=test \ + // --module-path mods -m $TESTMODULE/$MAIN_CLASS String mid = TEST1_MODULE + "/" + TEST1_MAIN_CLASS; int exitValue = - executeTestJava("-XaddExports:java.base/jdk.internal.misc=" + TEST1_MODULE, - "-mp", MODS_DIR.toString(), + executeTestJava("--add-exports", "java.base/jdk.internal.misc=" + TEST1_MODULE, + "--module-path", MODS_DIR.toString(), "-m", mid) .outputTo(System.out) .errorTo(System.out) @@ -160,17 +160,17 @@ public class AddExportsTest { /** - * Test -XaddExports with upgraded module + * Test --add-exports with upgraded module */ public void testWithUpgradedModule() throws Exception { - // java -XaddExports:java.transaction/javax.transaction.internal=m2 - // -upgrademodulepath upgrademods -mp mods -m ... + // java --add-exports java.transaction/javax.transaction.internal=m2 + // --upgrade-module-path upgrademods --module-path mods -m ... String mid = TEST2_MODULE + "/" + TEST2_MAIN_CLASS; int exitValue = executeTestJava( - "-XaddExports:java.transaction/javax.transaction.internal=m2", - "-upgrademodulepath", UPGRADE_MODS_DIRS.toString(), - "-mp", MODS_DIR.toString(), + "--add-exports", "java.transaction/javax.transaction.internal=m2", + "--upgrade-module-path", UPGRADE_MODS_DIRS.toString(), + "--module-path", MODS_DIR.toString(), "-m", mid) .outputTo(System.out) .errorTo(System.out) @@ -181,17 +181,17 @@ public class AddExportsTest { /** - * Test -XaddExports with module that is added to the set of root modules - * with -addmods. + * Test --add-exports with module that is added to the set of root modules + * with --add-modules. */ public void testWithAddMods() throws Exception { - // java -XaddExports:m4/jdk.test4=m3 -mp mods -m ... + // java --add-exports m4/jdk.test4=m3 --module-path mods -m ... String mid = TEST3_MODULE + "/" + TEST3_MAIN_CLASS; int exitValue = executeTestJava( - "-XaddExports:m4/jdk.test4=m3", - "-mp", MODS_DIR.toString(), - "-addmods", TEST4_MODULE, + "--add-exports", "m4/jdk.test4=m3", + "--module-path", MODS_DIR.toString(), + "--add-modules", TEST4_MODULE, "-m", mid) .outputTo(System.out) .errorTo(System.out) @@ -202,13 +202,13 @@ public class AddExportsTest { /** - * -XaddExports can only be specified once + * --add-exports can only be specified once */ public void testWithDuplicateOption() throws Exception { int exitValue - = executeTestJava("-XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED", - "-XaddExports:java.base/jdk.internal.reflect=ALL-UNNAMED", + = executeTestJava("--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", + "--add-exports", "java.base/jdk.internal.reflect=ALL-UNNAMED", "-version") .outputTo(System.out) .errorTo(System.out) @@ -220,14 +220,14 @@ public class AddExportsTest { /** - * Exercise -XaddExports with bad values + * Exercise --add-exports with bad values */ @Test(dataProvider = "badvalues") public void testWithBadValue(String value, String ignore) throws Exception { - // -XaddExports:$VALUE -version + // --add-exports $VALUE -version int exitValue = - executeTestJava("-XaddExports:" + value, + executeTestJava("--add-exports", value, "-version") .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/tools/launcher/modules/addmods/AddModsTest.java b/jdk/test/tools/launcher/modules/addmods/AddModsTest.java index b1fe43c9a29..3ace33457bc 100644 --- a/jdk/test/tools/launcher/modules/addmods/AddModsTest.java +++ b/jdk/test/tools/launcher/modules/addmods/AddModsTest.java @@ -28,7 +28,7 @@ * jdk.compiler * @build AddModsTest CompilerUtils jdk.testlibrary.* * @run testng AddModsTest - * @summary Basic test for java -addmods + * @summary Basic test for java --add-modules */ import java.nio.file.Path; @@ -78,15 +78,15 @@ public class AddModsTest { /** - * Basic test of -addmods ALL-DEFAULT. Module java.sql should be + * Basic test of --add-modules ALL-DEFAULT. Module java.sql should be * resolved and the types in that module should be visible. */ public void testAddDefaultModules1() throws Exception { - // java -addmods ALL-DEFAULT -mp mods1 -m test ... + // java --add-modules ALL-DEFAULT --module-path mods1 -m test ... int exitValue - = executeTestJava("-mp", MODS1_DIR.toString(), - "-addmods", "ALL-DEFAULT", + = executeTestJava("--module-path", MODS1_DIR.toString(), + "--add-modules", "ALL-DEFAULT", "-m", TEST_MID, "java.sql.Connection") .outputTo(System.out) @@ -97,16 +97,16 @@ public class AddModsTest { } /** - * Basic test of -addmods ALL-DEFAULT. Module java.annotations.common + * Basic test of --add-modules ALL-DEFAULT. Module java.annotations.common * should not resolved and so the types in that module should not be * visible. */ public void testAddDefaultModules2() throws Exception { - // java -addmods ALL-DEFAULT -mp mods1 -m test ... + // java --add-modules ALL-DEFAULT --module-path mods1 -m test ... int exitValue - = executeTestJava("-mp", MODS1_DIR.toString(), - "-addmods", "ALL-DEFAULT", + = executeTestJava("--module-path", MODS1_DIR.toString(), + "--add-modules", "ALL-DEFAULT", "-m", TEST_MID, "javax.annotation.Generated") .outputTo(System.out) @@ -118,15 +118,15 @@ public class AddModsTest { } /** - * Basic test of -addmods ALL-SYSTEM. All system modules should be resolved + * Basic test of --add-modules ALL-SYSTEM. All system modules should be resolved * and thus all types in those modules should be visible. */ public void testAddSystemModules() throws Exception { - // java -addmods ALL-SYSTEM -mp mods1 -m test ... + // java --add-modules ALL-SYSTEM --module-path mods1 -m test ... int exitValue - = executeTestJava("-mp", MODS1_DIR.toString(), - "-addmods", "ALL-SYSTEM", + = executeTestJava("--module-path", MODS1_DIR.toString(), + "--add-modules", "ALL-SYSTEM", "-m", TEST_MID, "java.sql.Connection", "javax.annotation.Generated") @@ -140,16 +140,16 @@ public class AddModsTest { /** * Run test on class path to load a type in a module on the application - * module path, uses {@code -addmods logger}. + * module path, uses {@code --add-modules logger}. */ public void testRunWithAddMods() throws Exception { - // java -mp mods -addmods logger -cp classes test.Main + // java --module-path mods --add-modules logger -cp classes test.Main String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); String modulepath = MODS2_DIR.toString(); int exitValue - = executeTestJava("-mp", modulepath, - "-addmods", LOGGER_MODULE, + = executeTestJava("--module-path", modulepath, + "--add-modules", LOGGER_MODULE, "-cp", classpath, TEST_MAIN_CLASS, "logger.Logger") @@ -162,16 +162,16 @@ public class AddModsTest { /** * Run application on class path that makes use of module on the - * application module path. Does not use -addmods and so should + * application module path. Does not use --add-modules and so should * fail at run-time. */ public void testRunMissingAddMods() throws Exception { - // java -mp mods -cp classes test.Main + // java --module-path mods -cp classes test.Main String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); String modulepath = MODS1_DIR.toString(); int exitValue - = executeTestJava("-mp", modulepath, + = executeTestJava("--module-path", modulepath, "-cp", classpath, TEST_MAIN_CLASS, "logger.Logger") @@ -186,16 +186,16 @@ public class AddModsTest { /** * Run test on class path to load a type in a module on the application - * module path, uses {@code -addmods ALL-MODULE-PATH}. + * module path, uses {@code --add-modules ALL-MODULE-PATH}. */ public void testAddAllModulePath() throws Exception { - // java -mp mods -addmods ALL-MODULE-PATH -cp classes test.Main + // java --module-path mods --add-modules ALL-MODULE-PATH -cp classes test.Main String classpath = MODS1_DIR.resolve(TEST_MODULE).toString(); String modulepath = MODS1_DIR.toString(); int exitValue - = executeTestJava("-mp", modulepath, - "-addmods", "ALL-MODULE-PATH", + = executeTestJava("--module-path", modulepath, + "--add-modules", "ALL-MODULE-PATH", "-cp", classpath, TEST_MAIN_CLASS) .outputTo(System.out) @@ -207,13 +207,13 @@ public class AddModsTest { /** - * Test {@code -addmods ALL-MODULE-PATH} without {@code -modulepath}. + * Test {@code --add-modules ALL-MODULE-PATH} without {@code --module-path}. */ public void testAddAllModulePathWithNoModulePath() throws Exception { - // java -addmods ALL-MODULE-PATH -version + // java --add-modules ALL-MODULE-PATH -version int exitValue - = executeTestJava("-addmods", "ALL-MODULE-PATH", + = executeTestJava("--add-modules", "ALL-MODULE-PATH", "-version") .outputTo(System.out) .errorTo(System.out) @@ -224,14 +224,14 @@ public class AddModsTest { /** - * Attempt to run with a bad module name specified to -addmods + * Attempt to run with a bad module name specified to --add-modules */ public void testRunWithBadAddMods() throws Exception { - // java -mp mods -addmods DoesNotExist -m test ... + // java --module-path mods --add-modules DoesNotExist -m test ... int exitValue - = executeTestJava("-mp", MODS1_DIR.toString(), - "-addmods", "DoesNotExist", + = executeTestJava("--module-path", MODS1_DIR.toString(), + "--add-modules", "DoesNotExist", "-m", TEST_MID) .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/tools/launcher/modules/addmods/src/logger/logger/Logger.java b/jdk/test/tools/launcher/modules/addmods/src/logger/logger/Logger.java index 0cb0c293263..85fffdb75ce 100644 --- a/jdk/test/tools/launcher/modules/addmods/src/logger/logger/Logger.java +++ b/jdk/test/tools/launcher/modules/addmods/src/logger/logger/Logger.java @@ -24,7 +24,7 @@ package logger; /** - * No-op user module for use by the {@code java -addmods} tests. + * No-op user module for use by the {@code java --add-modules} tests. */ public class Logger { } diff --git a/jdk/test/tools/launcher/modules/addmods/src/test/test/Main.java b/jdk/test/tools/launcher/modules/addmods/src/test/test/Main.java index c6ca7a1be1b..edbbc6d642e 100644 --- a/jdk/test/tools/launcher/modules/addmods/src/test/test/Main.java +++ b/jdk/test/tools/launcher/modules/addmods/src/test/test/Main.java @@ -24,7 +24,7 @@ package test; /** - * Invoked by tests for the {@code java -addmods} option to check that types + * Invoked by tests for the {@code java --add-modules} option to check that types * are visible. */ public class Main { diff --git a/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java b/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java index 82d0c383f7a..24e5dbbf110 100644 --- a/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java +++ b/jdk/test/tools/launcher/modules/addreads/AddReadsTest.java @@ -27,7 +27,7 @@ * @modules jdk.compiler * @build AddReadsTest CompilerUtils JarUtils jdk.testlibrary.* * @run testng AddReadsTest - * @summary Basic tests for java -XaddReads + * @summary Basic tests for java --add-reads */ import java.nio.file.Path; @@ -45,7 +45,7 @@ import static org.testng.Assert.*; * The tests consists of two modules: m1 and junit. * Code in module m1 calls into code in module junit but the module-info.java * does not have a 'requires'. Instead a read edge is added via the command - * line option -XaddReads. + * line option --add-reads. */ @Test @@ -72,7 +72,7 @@ public class AddReadsTest { .compile(SRC_DIR.resolve("m1"), MODS_DIR.resolve("m1"), "-cp", CLASSES_DIR.toString(), - "-XaddReads:m1=ALL-UNNAMED")); + "--add-reads", "m1=ALL-UNNAMED")); // jar cf mods/junit.jar -C classes . JarUtils.createJarFile(MODS_DIR.resolve("junit.jar"), CLASSES_DIR); @@ -91,11 +91,11 @@ public class AddReadsTest { */ public void testJUnitOnModulePath() throws Exception { - // java -mp mods -addmods junit -XaddReads:m1=junit -m .. + // java --module-path mods --add-modules junit --add-reads m1=junit -m .. int exitValue - = run("-mp", MODS_DIR.toString(), - "-addmods", "junit", - "-XaddReads:m1=junit", + = run("--module-path", MODS_DIR.toString(), + "--add-modules", "junit", + "--add-reads", "m1=junit", "-m", MAIN) .getExitValue(); @@ -104,17 +104,17 @@ public class AddReadsTest { /** - * Exercise -XaddReads:m1=ALL-UNNAMED by running with junit on the + * Exercise --add-reads m1=ALL-UNNAMED by running with junit on the * class path. */ public void testJUnitOnClassPath() throws Exception { - // java -mp mods -cp mods/junit.jar -XaddReads:m1=ALL-UNNAMED -m .. + // java --module-path mods -cp mods/junit.jar --add-reads m1=ALL-UNNAMED -m .. String cp = MODS_DIR.resolve("junit.jar").toString(); int exitValue - = run("-mp", MODS_DIR.toString(), + = run("--module-path", MODS_DIR.toString(), "-cp", cp, - "-XaddReads:m1=ALL-UNNAMED", + "--add-reads", "m1=ALL-UNNAMED", "-m", MAIN) .getExitValue(); @@ -123,14 +123,14 @@ public class AddReadsTest { /** - * Run with junit as a module on the module path but without -XaddReads. + * Run with junit as a module on the module path but without --add-reads. */ public void testJUnitOnModulePathMissingAddReads() throws Exception { - // java -mp mods -addmods junit -m .. + // java --module-path mods --add-modules junit --module .. int exitValue - = run("-mp", MODS_DIR.toString(), - "-addmods", "junit", - "-m", MAIN) + = run("--module-path", MODS_DIR.toString(), + "--add-modules", "junit", + "--module", MAIN) .shouldContain("IllegalAccessError") .getExitValue(); @@ -139,13 +139,13 @@ public class AddReadsTest { /** - * Run with junit on the class path but without -XaddReads. + * Run with junit on the class path but without --add-reads. */ public void testJUnitOnClassPathMissingAddReads() throws Exception { - // java -mp mods -cp mods/junit.jar -m .. + // java --module-path mods -cp mods/junit.jar -m .. String cp = MODS_DIR.resolve("junit.jar").toString(); int exitValue - = run("-mp", MODS_DIR.toString(), + = run("--module-path", MODS_DIR.toString(), "-cp", cp, "-m", MAIN) .shouldContain("IllegalAccessError") @@ -156,15 +156,15 @@ public class AddReadsTest { /** - * Exercise -XaddReads with a more than one source module. + * Exercise --add-reads with a more than one source module. */ public void testJUnitWithMultiValueOption() throws Exception { int exitValue - = run("-mp", MODS_DIR.toString(), - "-addmods", "java.xml,junit", - "-XaddReads:m1=java.xml,junit", - "-m", MAIN) + = run("--module-path", MODS_DIR.toString(), + "--add-modules", "java.xml,junit", + "--add-reads", "m1=java.xml,junit", + "--module", MAIN) .getExitValue(); assertTrue(exitValue == 0); @@ -172,31 +172,31 @@ public class AddReadsTest { /** - * Exercise -XaddReads where the target module is specified more than once + * Exercise --add-reads where the target module is specified more than once */ public void testWithTargetSpecifiedManyTimes() throws Exception { int exitValue - = run("-mp", MODS_DIR.toString(), - "-addmods", "java.xml,junit", - "-XaddReads:m1=java.xml", - "-XaddReads:m1=junit", - "-m", MAIN) - .shouldContain("specified more than once") - .getExitValue(); + = run("--module-path", MODS_DIR.toString(), + "--add-modules", "java.xml,junit", + "--add-reads", "m1=java.xml", + "--add-reads", "m1=junit", + "-m", MAIN) + .shouldContain("specified more than once") + .getExitValue(); assertTrue(exitValue != 0); } /** - * Exercise -XaddReads with bad values + * Exercise --add-reads with bad values */ @Test(dataProvider = "badvalues") public void testWithBadValue(String value, String ignore) throws Exception { - // -XaddExports:$VALUE -version - assertTrue(run("-XaddReads:" + value, "-version").getExitValue() != 0); + // --add-exports $VALUE -version + assertTrue(run("--add-reads", value, "-version").getExitValue() != 0); } @DataProvider(name = "badvalues") diff --git a/jdk/test/tools/launcher/modules/basic/BasicTest.java b/jdk/test/tools/launcher/modules/basic/BasicTest.java index 1c2cf2352c9..233fa29e00b 100644 --- a/jdk/test/tools/launcher/modules/basic/BasicTest.java +++ b/jdk/test/tools/launcher/modules/basic/BasicTest.java @@ -37,7 +37,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import static jdk.testlibrary.ProcessTools.*; +import jdk.testlibrary.ProcessTools; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -72,6 +72,16 @@ public class BasicTest { assertTrue(compiled, "test module did not compile"); } + /** + * Execute "java" with the given arguments, returning the exit code. + */ + private int exec(String... args) throws Exception { + return ProcessTools.executeTestJava(args) + .outputTo(System.out) + .errorTo(System.out) + .getExitValue(); + } + /** * The initial module is loaded from an exploded module @@ -81,20 +91,28 @@ public class BasicTest { String subdir = MODS_DIR.resolve(TEST_MODULE).toString(); String mid = TEST_MODULE + "/" + MAIN_CLASS; - // java -mp mods -m $TESTMODULE/$MAINCLASS - int exitValue - = executeTestJava("-mp", dir, "-m", mid) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); + // java --module-path mods -module $TESTMODULE/$MAINCLASS + int exitValue = exec("--module-path", dir, "--module", mid); assertTrue(exitValue == 0); - // java -mp mods/$TESTMODULE -m $TESTMODULE/$MAINCLASS - exitValue - = executeTestJava("-mp", subdir, "-m", mid) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); + // java --module-path mods/$TESTMODULE --module $TESTMODULE/$MAINCLASS + exitValue = exec("--module-path", subdir, "--module", mid); + assertTrue(exitValue == 0); + + // java --module-path=mods --module=$TESTMODULE/$MAINCLASS + exitValue = exec("--module-path=" + dir, "--module=" + mid); + assertTrue(exitValue == 0); + + // java --module-path=mods/$TESTMODULE --module=$TESTMODULE/$MAINCLASS + exitValue = exec("--module-path=" + subdir, "--module=" + mid); + assertTrue(exitValue == 0); + + // java -p mods -m $TESTMODULE/$MAINCLASS + exitValue = exec("-p", dir, "-m", mid); + assertTrue(exitValue == 0); + + // java -p mods/$TESTMODULE -m $TESTMODULE/$MAINCLASS + exitValue = exec("-p", subdir, "-m", mid); assertTrue(exitValue == 0); } @@ -119,22 +137,14 @@ public class BasicTest { .run(args); assertTrue(success); - // java -mp mlib -m $TESTMODULE - int exitValue - = executeTestJava("-mp", dir.toString(), - "-m", TEST_MODULE) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); + // java --module-path mlib -module $TESTMODULE + int exitValue = exec("--module-path", dir.toString(), + "--module", TEST_MODULE); assertTrue(exitValue == 0); - // java -mp mlib/m.jar -m $TESTMODULE - exitValue - = executeTestJava("-mp", jar.toString(), - "-m", TEST_MODULE) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); + // java --module-path mlib/m.jar -module $TESTMODULE + exitValue = exec("--module-path", jar.toString(), + "--module", TEST_MODULE); assertTrue(exitValue == 0); } @@ -157,14 +167,9 @@ public class BasicTest { jdk.tools.jmod.JmodTask task = new jdk.tools.jmod.JmodTask(); assertEquals(task.run(args), 0); - // java -mp mods -m $TESTMODULE - int exitValue - = executeTestJava("-mp", dir.toString(), - "-m", TEST_MODULE) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); - + // java --module-path mods --module $TESTMODULE + int exitValue = exec("--module-path", dir.toString(), + "--module", TEST_MODULE); assertTrue(exitValue != 0); } @@ -177,14 +182,8 @@ public class BasicTest { String mp = "DoesNotExist" + File.pathSeparator + MODS_DIR.toString(); String mid = TEST_MODULE + "/" + MAIN_CLASS; - // java -mp mods -m $TESTMODULE/$MAINCLASS - int exitValue - = executeTestJava("-mp", mp, - "-m", mid) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); - + // java --module-path mods --module $TESTMODULE/$MAINCLASS + int exitValue = exec("--module-path", mp, "--module", mid); assertTrue(exitValue == 0); } @@ -195,15 +194,8 @@ public class BasicTest { public void testTryRunWithBadModule() throws Exception { String modulepath = MODS_DIR.toString(); - // java -mp mods -m $TESTMODULE - int exitValue - = executeTestJava("-mp", modulepath, - "-m", "rhubarb") - .outputTo(System.out) - .errorTo(System.out) - .shouldContain("not found") - .getExitValue(); - + // java --module-path mods -m $TESTMODULE + int exitValue = exec("--module-path", modulepath, "-m", "rhubarb"); assertTrue(exitValue != 0); } @@ -216,14 +208,8 @@ public class BasicTest { String modulepath = MODS_DIR.toString(); String mid = TEST_MODULE + "/p.rhubarb"; - // java -mp mods -m $TESTMODULE/$MAINCLASS - int exitValue - = executeTestJava("-mp", modulepath, - "-m", mid) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); - + // java --module-path mods -m $TESTMODULE/$MAINCLASS + int exitValue = exec("--module-path", modulepath, "-m", mid); assertTrue(exitValue != 0); } @@ -248,15 +234,8 @@ public class BasicTest { .run(args); assertTrue(success); - // java -mp mods -m $TESTMODULE - int exitValue - = executeTestJava("-mp", dir.toString(), - "-m", TEST_MODULE) - .outputTo(System.out) - .errorTo(System.out) - .shouldContain("does not have a MainClass attribute") - .getExitValue(); - + // java --module-path mods -m $TESTMODULE + int exitValue = exec("--module-path", dir.toString(), "-m", TEST_MODULE); assertTrue(exitValue != 0); } @@ -269,14 +248,8 @@ public class BasicTest { String modulepath = MODS_DIR.toString(); String mid = "java.base/" + MAIN_CLASS; - // java -mp mods -m $TESTMODULE/$MAINCLASS - int exitValue - = executeTestJava("-mp", modulepath, - "-m", mid) - .outputTo(System.out) - .errorTo(System.out) - .getExitValue(); - + // java --module-path mods --module $TESTMODULE/$MAINCLASS + int exitValue = exec("--module-path", modulepath, "--module", mid); assertTrue(exitValue != 0); } diff --git a/jdk/test/tools/launcher/modules/dryrun/DryRunTest.java b/jdk/test/tools/launcher/modules/dryrun/DryRunTest.java index ca127d642d8..acf65bc1475 100644 --- a/jdk/test/tools/launcher/modules/dryrun/DryRunTest.java +++ b/jdk/test/tools/launcher/modules/dryrun/DryRunTest.java @@ -69,11 +69,11 @@ public class DryRunTest { // javac -d mods/$TESTMODULE src/$TESTMODULE/** assertTrue(CompilerUtils.compile(SRC_DIR.resolve(M_MODULE), MODS_DIR, - "-modulesourcepath", SRC_DIR.toString())); + "--module-source-path", SRC_DIR.toString())); assertTrue(CompilerUtils.compile(SRC_DIR.resolve(TEST_MODULE), MODS_DIR, - "-modulesourcepath", SRC_DIR.toString())); + "--module-source-path", SRC_DIR.toString())); Files.createDirectories(LIBS_DIR); @@ -101,7 +101,7 @@ public class DryRunTest { String mid = TEST_MODULE + "/" + MAIN_CLASS; // no resolution failure - int exitValue = exec("--dry-run", "-modulepath", dir, "-m", mid); + int exitValue = exec("--dry-run", "--module-path", dir, "-m", mid); assertTrue(exitValue == 0); } @@ -112,23 +112,23 @@ public class DryRunTest { String dir = MODS_DIR.toString(); String mid = TEST_MODULE + "/" + MAIN_CLINIT_CLASS; - int exitValue = exec("--dry-run", "-modulepath", dir, "-m", mid); + int exitValue = exec("--dry-run", "--module-path", dir, "-m", mid); assertTrue(exitValue == 0); // expect the test to fail if main class is initialized - exitValue = exec("-modulepath", dir, "-m", mid); + exitValue = exec("--module-path", dir, "-m", mid); assertTrue(exitValue != 0); } /** - * Test non-existence module in -addmods + * Test non-existence module in --add-modules */ public void testNonExistAddModules() throws Exception { String dir = MODS_DIR.toString(); String mid = TEST_MODULE + "/" + MAIN_CLASS; - int exitValue = exec("--dry-run", "-modulepath", dir, - "-addmods", "non.existence", + int exitValue = exec("--dry-run", "--module-path", dir, + "--add-modules", "non.existence", "-m", mid); assertTrue(exitValue != 0); } @@ -163,24 +163,24 @@ public class DryRunTest { LIBS_DIR.resolve(TEST_MODULE + ".jar").toString(); String mid = TEST_MODULE + "/" + MAIN_CLASS; - // test main method with and without -addmods mm - int exitValue = exec("-modulepath", LIBS_DIR.toString(), + // test main method with and without --add-modules mm + int exitValue = exec("--module-path", LIBS_DIR.toString(), "-m", mid); assertTrue(exitValue != 0); - exitValue = exec("-modulepath", LIBS_DIR.toString(), - "-addmods", M_MODULE, + exitValue = exec("--module-path", LIBS_DIR.toString(), + "--add-modules", M_MODULE, "-m", mid); assertTrue(exitValue == 0); - // test dry run with and without -addmods m + // test dry run with and without --add-modules m // no resolution failure - exitValue = exec("--dry-run", "-modulepath", LIBS_DIR.toString(), + exitValue = exec("--dry-run", "--module-path", LIBS_DIR.toString(), "-m", mid); assertTrue(exitValue == 0); - exitValue = exec("--dry-run", "-modulepath", LIBS_DIR.toString(), - "-addmods", M_MODULE, + exitValue = exec("--dry-run", "--module-path", LIBS_DIR.toString(), + "--add-modules", M_MODULE, "-m", mid); assertTrue(exitValue == 0); } @@ -193,7 +193,7 @@ public class DryRunTest { String mid = TEST_MODULE + "/" + MAIN_CLASS; // resolution failure - int exitValue = exec("--dry-run", "-modulepath", subdir, "-m", mid); + int exitValue = exec("--dry-run", "--module-path", subdir, "-m", mid); assertTrue(exitValue != 0); } diff --git a/jdk/test/tools/launcher/modules/limitmods/LimitModsTest.java b/jdk/test/tools/launcher/modules/limitmods/LimitModsTest.java index 0cafaf42e66..2618fbab45b 100644 --- a/jdk/test/tools/launcher/modules/limitmods/LimitModsTest.java +++ b/jdk/test/tools/launcher/modules/limitmods/LimitModsTest.java @@ -27,7 +27,7 @@ * @modules java.desktop java.compact1 jdk.compiler * @build LimitModsTest CompilerUtils jdk.testlibrary.* * @run testng LimitModsTest - * @summary Basic tests for java -limitmods + * @summary Basic tests for java --limit-modules */ import java.nio.file.Path; @@ -66,13 +66,13 @@ public class LimitModsTest { /** - * Basic test of -limitmods to limit which platform modules are observable. + * Basic test of --limit-modules to limit which platform modules are observable. */ public void testLimitingPlatformModules() throws Exception { int exitValue; - // java -limitmods java.base -listmods - exitValue = executeTestJava("-limitmods", "java.base", "-listmods") + // java --limit-modules java.base --list-modules + exitValue = executeTestJava("--limit-modules", "java.base", "--list-modules") .outputTo(System.out) .errorTo(System.out) .shouldContain("java.base") @@ -83,8 +83,8 @@ public class LimitModsTest { assertTrue(exitValue == 0); - // java -limitmods java.compact1 -listmods - exitValue = executeTestJava("-limitmods", "java.compact1", "-listmods") + // java --limit-modules java.compact1 --list-modules + exitValue = executeTestJava("--limit-modules", "java.compact1", "--list-modules") .outputTo(System.out) .errorTo(System.out) .shouldContain("java.base") @@ -98,15 +98,15 @@ public class LimitModsTest { /** - * Test -limitmods with -addmods + * Test --limit-modules with --add-modules */ public void testWithAddMods() throws Exception { int exitValue; - // java -limitmods java.base -addmods java.logging -listmods - exitValue = executeTestJava("-limitmods", "java.base", - "-addmods", "java.logging", - "-listmods") + // java --limit-modules java.base --add-modules java.logging --list-modules + exitValue = executeTestJava("--limit-modules", "java.base", + "--add-modules", "java.logging", + "--list-modules") .outputTo(System.out) .errorTo(System.out) .shouldContain("java.base") @@ -117,11 +117,11 @@ public class LimitModsTest { assertTrue(exitValue == 0); - // java -limitmods java.base -addmods java.sql -listmods + // java --limit-modules java.base --add-modules java.sql --list-modules // This should fail because java.sql has dependences beyond java.base - exitValue = executeTestJava("-limitmods", "java.base", - "-addmods", "java.sql", - "-listmods") + exitValue = executeTestJava("--limit-modules", "java.base", + "--add-modules", "java.sql", + "--list-modules") .outputTo(System.out) .errorTo(System.out) .getExitValue(); @@ -131,14 +131,14 @@ public class LimitModsTest { /** - * Run class path application with -limitmods + * Run class path application with --limit-modules */ public void testUnnamedModule() throws Exception { String classpath = MODS_DIR.resolve(TEST_MODULE).toString(); - // java -limitmods java.base -cp mods/$TESTMODULE ... + // java --limit-modules java.base -cp mods/$TESTMODULE ... int exitValue1 - = executeTestJava("-limitmods", "java.base", + = executeTestJava("--limit-modules", "java.base", "-cp", classpath, MAIN_CLASS) .outputTo(System.out) @@ -149,9 +149,9 @@ public class LimitModsTest { assertTrue(exitValue1 != 0); - // java -limitmods java.base -cp mods/$TESTMODULE ... + // java --limit-modules java.base -cp mods/$TESTMODULE ... int exitValue2 - = executeTestJava("-limitmods", "java.desktop", + = executeTestJava("--limit-modules", "java.desktop", "-cp", classpath, MAIN_CLASS) .outputTo(System.out) @@ -163,16 +163,16 @@ public class LimitModsTest { /** - * Run named module with -limitmods + * Run named module with --limit-modules */ public void testNamedModule() throws Exception { String modulepath = MODS_DIR.toString(); String mid = TEST_MODULE + "/" + MAIN_CLASS; - // java -limitmods java.base -mp mods -m $TESTMODULE/$MAINCLASS - int exitValue = executeTestJava("-limitmods", "java.base", - "-mp", modulepath, + // java --limit-modules java.base --module-path mods -m $TESTMODULE/$MAINCLASS + int exitValue = executeTestJava("--limit-modules", "java.base", + "--module-path", modulepath, "-m", mid) .outputTo(System.out) .errorTo(System.out) @@ -180,9 +180,9 @@ public class LimitModsTest { assertTrue(exitValue != 0); - // java -limitmods java.desktop -mp mods -m $TESTMODULE/$MAINCLASS - exitValue = executeTestJava("-limitmods", "java.desktop", - "-mp", modulepath, + // java --limit-modules java.desktop --module-path mods -m $TESTMODULE/$MAINCLASS + exitValue = executeTestJava("--limit-modules", "java.desktop", + "--module-path", modulepath, "-m", mid) .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/tools/launcher/modules/listmods/ListModsTest.java b/jdk/test/tools/launcher/modules/listmods/ListModsTest.java index bd57d38d98f..793e12efe57 100644 --- a/jdk/test/tools/launcher/modules/listmods/ListModsTest.java +++ b/jdk/test/tools/launcher/modules/listmods/ListModsTest.java @@ -27,7 +27,7 @@ * @modules java.se * @build ListModsTest CompilerUtils jdk.testlibrary.* * @run testng ListModsTest - * @summary Basic test for java -listmods + * @summary Basic test for java --list-modules */ import java.nio.file.Path; @@ -41,7 +41,7 @@ import org.testng.annotations.Test; import static org.testng.Assert.*; /** - * Basic tests for java -listmods + * Basic tests for java --list-modules */ public class ListModsTest { @@ -55,13 +55,13 @@ public class ListModsTest { public void setup() throws Exception { boolean compiled; - // javac -d mods/m1 -mp mods src/m1/** + // javac -d mods/m1 --module-path mods src/m1/** compiled = CompilerUtils.compile( SRC_DIR.resolve("m1"), MODS_DIR.resolve("m1")); assertTrue(compiled); - // javac -d upgrademods/java.transaction -mp mods src/java.transaction/** + // javac -d upgrademods/java.transaction --module-path mods src/java.transaction/** compiled = CompilerUtils.compile( SRC_DIR.resolve("java.transaction"), UPGRADEMODS_DIR.resolve("java.transaction")); @@ -73,7 +73,7 @@ public class ListModsTest { @Test public void testListAll() throws Exception { OutputAnalyzer output - = executeTestJava("-listmods") + = executeTestJava("--list-modules") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); @@ -85,7 +85,7 @@ public class ListModsTest { @Test public void testListOneModule() throws Exception { OutputAnalyzer output - = executeTestJava("-listmods:java.base") + = executeTestJava("--list-modules=java.base") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); @@ -97,7 +97,7 @@ public class ListModsTest { @Test public void testListTwoModules() throws Exception { OutputAnalyzer output - = executeTestJava("-listmods:java.base,java.xml") + = executeTestJava("--list-modules", "java.base,java.xml") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); @@ -111,7 +111,7 @@ public class ListModsTest { @Test public void testListUnknownModule() throws Exception { OutputAnalyzer output - = executeTestJava("-listmods:java.rhubarb") + = executeTestJava("--list-modules", "java.rhubarb") .outputTo(System.out) .errorTo(System.out); output.shouldNotContain("java.base"); @@ -123,7 +123,7 @@ public class ListModsTest { @Test public void testListWithModulePath() throws Exception { OutputAnalyzer output - = executeTestJava("-mp", MODS_DIR.toString(), "-listmods") + = executeTestJava("--module-path", MODS_DIR.toString(), "--list-modules") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); @@ -135,8 +135,8 @@ public class ListModsTest { @Test public void testListWithUpgradeModulePath() throws Exception { OutputAnalyzer output - = executeTestJava("-upgrademodulepath", UPGRADEMODS_DIR.toString(), - "-listmods:java.transaction") + = executeTestJava("--upgrade-module-path", UPGRADEMODS_DIR.toString(), + "--list-modules", "java.transaction") .outputTo(System.out) .errorTo(System.out); output.shouldContain("exports javax.transaction.atomic"); @@ -147,7 +147,7 @@ public class ListModsTest { @Test public void testListWithLimitMods1() throws Exception { OutputAnalyzer output - = executeTestJava("-limitmods", "java.compact1", "-listmods") + = executeTestJava("--limit-modules", "java.compact1", "--list-modules") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.compact1"); @@ -160,9 +160,9 @@ public class ListModsTest { @Test public void testListWithLimitMods2() throws Exception { OutputAnalyzer output - = executeTestJava("-mp", MODS_DIR.toString(), - "-limitmods", "java.compact1", - "-listmods") + = executeTestJava("--module-path", MODS_DIR.toString(), + "--limit-modules", "java.compact1", + "--list-modules") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); @@ -172,12 +172,12 @@ public class ListModsTest { /** - * java -version -listmods => should print version and exit + * java -version --list-modules => should print version and exit */ @Test public void testListWithPrintVersion1() throws Exception { OutputAnalyzer output - = executeTestJava("-version", "-listmods") + = executeTestJava("-version", "--list-modules") .outputTo(System.out) .errorTo(System.out); output.shouldNotContain("java.base"); @@ -187,12 +187,12 @@ public class ListModsTest { /** - * java -listmods -version => should list modules and exit + * java --list-modules -version => should list modules and exit */ @Test public void testListWithPrintVersion2() throws Exception { OutputAnalyzer output - = executeTestJava("-listmods", "-version") + = executeTestJava("--list-modules", "-version") .outputTo(System.out) .errorTo(System.out); output.shouldContain("java.base"); diff --git a/jdk/test/tools/launcher/modules/patch/basic/PatchTest.java b/jdk/test/tools/launcher/modules/patch/basic/PatchTest.java index 8b8290c7b6b..968336ae8aa 100644 --- a/jdk/test/tools/launcher/modules/patch/basic/PatchTest.java +++ b/jdk/test/tools/launcher/modules/patch/basic/PatchTest.java @@ -27,7 +27,7 @@ * @modules jdk.compiler * @build PatchTest CompilerUtils JarUtils jdk.testlibrary.* * @run testng PatchTest - * @summary Basic test for -Xpatch + * @summary Basic test for --patch-module */ import java.io.File; @@ -45,13 +45,13 @@ import static org.testng.Assert.*; /** - * Compiles and launches a test that uses -Xpatch with two directories of - * classes to override existing and add new classes to modules in the - * boot layer. + * Compiles and launches a test that uses --patch-module with two directories + * of classes to override existing classes and add new classes to modules in + * the boot layer. * - * The classes overridden or added via -Xpatch all define a public no-arg - * constructor and override toString to return "hi". This allows the launched - * test to check that the overridden classes are loaded. + * The classes overridden or added via --patch-module all define a public + * no-arg constructor and override toString to return "hi". This allows the + * launched test to check that the overridden classes are loaded. */ @Test @@ -76,7 +76,7 @@ public class PatchTest { private static final Path PATCHES_DIR = Paths.get("patches"); - // the classes overridden or added with -Xpatch + // the classes overridden or added with --patch-module private static final String[] CLASSES = { // java.base = boot loader @@ -137,15 +137,15 @@ public class PatchTest { String arg = Stream.of(CLASSES).collect(Collectors.joining(",")); int exitValue - = executeTestJava("-Xpatch:java.base=" + basePatches, - "-Xpatch:jdk.naming.dns=" + dnsPatches, - "-Xpatch:jdk.compiler=" + compilerPatches, - "-XaddExports:java.base/java.lang2=test", - "-XaddExports:jdk.naming.dns/com.sun.jndi.dns=test", - "-XaddExports:jdk.naming.dns/com.sun.jndi.dns2=test", - "-XaddExports:jdk.compiler/com.sun.tools.javac2=test", - "-addmods", "jdk.naming.dns,jdk.compiler", - "-mp", MODS_DIR.toString(), + = executeTestJava("--patch-module", "java.base=" + basePatches, + "--patch-module", "jdk.naming.dns=" + dnsPatches, + "--patch-module", "jdk.compiler=" + compilerPatches, + "--add-exports", "java.base/java.lang2=test", + "--add-exports", "jdk.naming.dns/com.sun.jndi.dns=test", + "--add-exports", "jdk.naming.dns/com.sun.jndi.dns2=test", + "--add-exports", "jdk.compiler/com.sun.tools.javac2=test", + "--add-modules", "jdk.naming.dns,jdk.compiler", + "--module-path", MODS_DIR.toString(), "-m", "test/jdk.test.Main", arg) .outputTo(System.out) .errorTo(System.out) @@ -156,7 +156,7 @@ public class PatchTest { /** - * Run test with -Xpatch and exploded patches + * Run test with ---patch-module and exploded patches */ public void testWithExplodedPatches() throws Exception { @@ -175,7 +175,7 @@ public class PatchTest { /** - * Run test with -Xpatch and patches in JAR files + * Run test with ---patch-module and patches in JAR files */ public void testWithJarPatches() throws Exception { @@ -195,7 +195,7 @@ public class PatchTest { /** - * Run test with -Xpatch and patches in JAR files and exploded patches + * Run test with ---patch-module and patches in JAR files and exploded patches */ public void testWithJarAndExplodedPatches() throws Exception { diff --git a/jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java b/jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java index 88e09856710..f274a17ad2a 100644 --- a/jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java +++ b/jdk/test/tools/launcher/modules/patch/basic/src/test/jdk/test/Main.java @@ -22,7 +22,7 @@ */ /** - * Used with -Xpatch to exercise the replacement or addition of classes + * Used with --patch-module to exercise the replacement or addition of classes * in modules that are linked into the runtime image. */ diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java b/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java index 0e5345aefb3..9a5c84cad99 100644 --- a/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/PatchSystemModules.java @@ -69,7 +69,7 @@ public class PatchSystemModules { for (String name : modules) { assertTrue(CompilerUtils.compile(src.resolve(name), MODS_DIR, - "-modulesourcepath", src.toString())); + "--module-source-path", src.toString())); } // compile patched source @@ -93,16 +93,16 @@ public class PatchSystemModules { Path home = Paths.get(JAVA_HOME); runTest(home, - "-mp", MODS_DIR.toString(), + "--module-path", MODS_DIR.toString(), "-m", "m1/p1.Main", "1"); runTest(home, - "-Xpatch:java.base=" + patchedJavaBase.toString(), - "-mp", MODS_DIR.toString(), + "--patch-module", "java.base=" + patchedJavaBase, + "--module-path", MODS_DIR.toString(), "-m", "m1/p1.Main", "1"); runTest(home, - "-Xpatch:m2=" + patchedM2.toString(), - "-mp", MODS_DIR.toString(), + "--patch-module", "m2=" + patchedM2.toString(), + "--module-path", MODS_DIR.toString(), "-m", "m1/p1.Main", "2"); } @@ -117,10 +117,10 @@ public class PatchSystemModules { runTest(IMAGE, "-m", "m1/p1.Main", "1"); runTest(IMAGE, - "-Xpatch:java.base=" + patchedJavaBase.toString(), + "--patch-module", "java.base=" + patchedJavaBase, "-m", "m1/p1.Main", "1"); runTest(IMAGE, - "-Xpatch:m2=" + patchedM2.toString(), + "--patch-module", "m2=" + patchedM2.toString(), "-m", "m1/p1.Main", "2"); } @@ -138,12 +138,12 @@ public class PatchSystemModules { // Fail to upgrade m1.jar with mismatched hash runTestWithExitCode(getJava(IMAGE), - "-upgrademodulepath", m1.toString(), + "--upgrade-module-path", m1.toString(), "-m", "m1/p1.Main"); runTestWithExitCode(getJava(IMAGE), - "-Xpatch:java.base=" + PATCH_DIR.resolve(JAVA_BASE).toString(), - "-upgrademodulepath", m1.toString(), + "--patch-module", "java.base=" + PATCH_DIR.resolve(JAVA_BASE), + "--upgrade-module-path", m1.toString(), "-m", "m1/p1.Main", "1"); } @@ -185,14 +185,14 @@ public class PatchSystemModules { jar("--create", "--file=" + m2.toString(), - "--modulepath", JARS_DIR.toString(), + "--module-path", JARS_DIR.toString(), "--hash-modules", "m1", "-C", MODS_DIR.resolve("m2").toString(), "."); String mpath = JARS_DIR.toString() + File.pathSeparator + JMODS.toString(); - execTool("jlink", "--modulepath", mpath, - "--addmods", "m1", + execTool("jlink", "--module-path", mpath, + "--add-modules", "m1", "--output", IMAGE.toString()); } @@ -216,7 +216,7 @@ public class PatchSystemModules { } static String getJava(Path image) { - boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("win"); + boolean isWindows = System.getProperty("os.name").startsWith("Windows"); Path java = image.resolve("bin").resolve(isWindows ? "java.exe" : "java"); if (Files.notExists(java)) throw new RuntimeException(java + " not found"); diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java index e30761204e1..a56c8dda67c 100644 --- a/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java +++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java @@ -24,7 +24,7 @@ package jdk.internal.module; /* - * Test -Xpatch:java.base=jdk/modules/java.base to override + * Test --patch-module java.base=jdk/modules/java.base to override * java.base with an exploded image */ public final class SystemModules { diff --git a/jdk/test/tools/launcher/modules/upgrademodulepath/UpgradeModulePathTest.java b/jdk/test/tools/launcher/modules/upgrademodulepath/UpgradeModulePathTest.java index 31351b53f8d..3655281427a 100644 --- a/jdk/test/tools/launcher/modules/upgrademodulepath/UpgradeModulePathTest.java +++ b/jdk/test/tools/launcher/modules/upgrademodulepath/UpgradeModulePathTest.java @@ -27,7 +27,7 @@ * @modules jdk.compiler * @build UpgradeModulePathTest CompilerUtils jdk.testlibrary.* * @run testng UpgradeModulePathTest - * @summary Basic test for java -upgrademodulepath + * @summary Basic test for java --upgrade-module-path */ import java.io.File; @@ -65,19 +65,19 @@ public class UpgradeModulePathTest { MODS_DIR.resolve("java.enterprise")); assertTrue(compiled); - // javac -d upgrademods/java.transaction -mp mods src/java.transaction/** + // javac -d upgrademods/java.transaction --module-path mods src/java.transaction/** compiled = CompilerUtils.compile( SRC_DIR.resolve("java.transaction"), UPGRADEDMODS_DIR.resolve("java.transaction"), - "-mp", MODS_DIR.toString()); + "--module-path", MODS_DIR.toString()); assertTrue(compiled); - // javac -d mods -upgrademodulepath upgrademods -mp mods src/test/** + // javac -d mods --upgrade-module-path upgrademods --module-path mods src/test/** compiled = CompilerUtils.compile( SRC_DIR.resolve("test"), MODS_DIR.resolve("test"), - "-upgrademodulepath", UPGRADEDMODS_DIR.toString(), - "-mp", MODS_DIR.toString()); + "--upgrade-module-path", UPGRADEDMODS_DIR.toString(), + "--module-path", MODS_DIR.toString()); assertTrue(compiled); } @@ -92,8 +92,8 @@ public class UpgradeModulePathTest { int exitValue = executeTestJava( - "-upgrademodulepath", UPGRADEDMODS_DIR.toString(), - "-mp", MODS_DIR.toString(), + "--upgrade-module-path", UPGRADEDMODS_DIR.toString(), + "--module-path", MODS_DIR.toString(), "-m", mid) .outputTo(System.out) .errorTo(System.out) @@ -116,8 +116,8 @@ public class UpgradeModulePathTest { int exitValue = executeTestJava( - "-upgrademodulepath", upgrademodulepath, - "-mp", MODS_DIR.toString(), + "--upgrade-module-path", upgrademodulepath, + "--module-path", MODS_DIR.toString(), "-m", mid) .outputTo(System.out) .errorTo(System.out) diff --git a/jdk/test/tools/lib/tests/Helper.java b/jdk/test/tools/lib/tests/Helper.java index c134cef25ac..5ab2eff8451 100644 --- a/jdk/test/tools/lib/tests/Helper.java +++ b/jdk/test/tools/lib/tests/Helper.java @@ -164,7 +164,7 @@ public class Helper { Path srcMod = src.resolve(moduleName); JImageGenerator.generateModuleInfo(srcMod, packages, dependencies); Path destination = classes.resolve(moduleName); - if (!JImageGenerator.compile(srcMod, destination, "-modulepath", modulePath, "-g")) { + if (!JImageGenerator.compile(srcMod, destination, "--module-path", modulePath, "-g")) { throw new AssertionError("Compilation failure"); } return destination; diff --git a/jdk/test/tools/lib/tests/JImageGenerator.java b/jdk/test/tools/lib/tests/JImageGenerator.java index a836e818243..ca79ba086c3 100644 --- a/jdk/test/tools/lib/tests/JImageGenerator.java +++ b/jdk/test/tools/lib/tests/JImageGenerator.java @@ -106,10 +106,10 @@ public class JImageGenerator { private static final String POST_PROCESS_OPTION = "--post-process-path"; private static final String MAIN_CLASS_OPTION = "--main-class"; private static final String CLASS_PATH_OPTION = "--class-path"; - private static final String MODULE_PATH_OPTION = "--modulepath"; - private static final String ADD_MODS_OPTION = "--addmods"; - private static final String LIMIT_MODS_OPTION = "--limitmods"; - private static final String PLUGINS_MODULE_PATH = "--plugin-module-path"; + private static final String MODULE_PATH_OPTION = "--module-path"; + private static final String ADD_MODULES_OPTION = "--add-modules"; + private static final String LIMIT_MODULES_OPTION = "--limit-modules"; + private static final String PLUGIN_MODULE_PATH = "--plugin-module-path"; private static final String CMDS_OPTION = "--cmds"; private static final String CONFIG_OPTION = "--config"; @@ -534,7 +534,7 @@ public class JImageGenerator { options.add(dir.toString()); } if (!pluginModulePath.isEmpty()) { - options.add(PLUGINS_MODULE_PATH); + options.add(PLUGIN_MODULE_PATH); options.add(toPath(pluginModulePath)); } options.addAll(this.options); @@ -632,11 +632,11 @@ public class JImageGenerator { options.add(output.toString()); } if (!addMods.isEmpty()) { - options.add(ADD_MODS_OPTION); + options.add(ADD_MODULES_OPTION); options.add(addMods.stream().collect(Collectors.joining(","))); } if (!limitMods.isEmpty()) { - options.add(LIMIT_MODS_OPTION); + options.add(LIMIT_MODULES_OPTION); options.add(limitMods.stream().collect(Collectors.joining(","))); } if (!jars.isEmpty() || !jmods.isEmpty()) { @@ -648,7 +648,7 @@ public class JImageGenerator { options.add(modulePath); } if (!pluginModulePath.isEmpty()) { - options.add(PLUGINS_MODULE_PATH); + options.add(PLUGIN_MODULE_PATH); options.add(toPath(pluginModulePath)); } options.addAll(this.options); diff --git a/jdk/test/tools/pack200/Utils.java b/jdk/test/tools/pack200/Utils.java index 45e09c37abc..20b18b6fff9 100644 --- a/jdk/test/tools/pack200/Utils.java +++ b/jdk/test/tools/pack200/Utils.java @@ -111,7 +111,7 @@ class Utils { compiler("-d", XCLASSES.getName(), - "-XaddExports:jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED", + "--add-exports=jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED", "@" + tmpFile.getAbsolutePath()); jar("cvfe", @@ -148,7 +148,7 @@ class Utils { init(); List<String> cmds = new ArrayList<String>(); cmds.add(getJavaCmd()); - cmds.add("-XaddExports:jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED"); + cmds.add("--add-exports=jdk.jdeps/com.sun.tools.classfile=ALL-UNNAMED"); cmds.add("-cp"); cmds.add(VerifierJar.getName()); cmds.add("sun.tools.pack.verify.Main"); diff --git a/jdk/test/tools/pack200/pack200-verifier/make/build.xml b/jdk/test/tools/pack200/pack200-verifier/make/build.xml index 2bb786b8e87..b0874f21306 100644 --- a/jdk/test/tools/pack200/pack200-verifier/make/build.xml +++ b/jdk/test/tools/pack200/pack200-verifier/make/build.xml @@ -27,7 +27,7 @@ destdir="${build}/classes" verbose="no" debug="on"> - <compilerarg value="-XaddExports:jdk.jdeps/com.sun.tools.classfile"/> + <compilerarg value="--add-exports=jdk.jdeps/com.sun.tools.classfile"/> </javac> </target> From a347e23de0920f99cd63e7da7d204935948109c9 Mon Sep 17 00:00:00 2001 From: Weijun Wang <weijun@openjdk.org> Date: Thu, 11 Aug 2016 13:10:54 +0800 Subject: [PATCH 14/15] 8133910: Some sun/security/tools tests failed Reviewed-by: xuelei --- .../tools/jarsigner/TimestampCheck.java | 1 + .../tools/jarsigner/TsacertOptionTest.java | 40 ++++++------------- .../tools/jarsigner/concise_jarsigner.sh | 2 + .../tools/jarsigner/default_options.sh | 2 + .../warnings/AliasNotInStoreTest.java | 15 ++++--- .../warnings/BadExtendedKeyUsageTest.java | 9 ++--- .../jarsigner/warnings/BadKeyUsageTest.java | 9 ++--- .../warnings/BadNetscapeCertTypeTest.java | 7 ++-- .../warnings/ChainNotValidatedTest.java | 18 ++++----- .../warnings/HasExpiredCertTest.java | 9 ++--- .../warnings/HasExpiringCertTest.java | 9 ++--- .../warnings/HasUnsignedEntryTest.java | 9 ++--- .../warnings/MultipleWarningsTest.java | 15 ++++--- .../jarsigner/warnings/NoTimestampTest.java | 9 ++--- .../warnings/NotSignedByAliasTest.java | 15 ++++--- .../warnings/NotYetValidCertTest.java | 9 ++--- .../tools/jarsigner/warnings/Test.java | 22 ++++++++++ .../sun/security/tools/jarsigner/weaksize.sh | 2 + .../security/tools/keytool/default_options.sh | 2 + .../security/tools/keytool/file-in-help.sh | 3 +- jdk/test/sun/security/tools/keytool/keyalg.sh | 2 + .../sun/security/tools/keytool/newhelp.sh | 3 +- 22 files changed, 110 insertions(+), 102 deletions(-) diff --git a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java index 04d6c9ec526..0c597d467f2 100644 --- a/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java +++ b/jdk/test/sun/security/tools/jarsigner/TimestampCheck.java @@ -311,6 +311,7 @@ public class TimestampCheck { cmd += " " + System.getProperty("test.tool.vm.opts") + " -J-Djava.security.egd=file:/dev/./urandom" + + " -J-Duser.language=en -J-Duser.country=US" + " -debug -keystore " + TSKS + " -storepass changeit" + " -tsa http://localhost:" + port + "/%d" + " -signedjar new_%d.jar " + JAR + " old"; diff --git a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java index 71aef388ed3..6163e6e09d2 100644 --- a/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java +++ b/jdk/test/sun/security/tools/jarsigner/TsacertOptionTest.java @@ -22,14 +22,13 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** * @test * @bug 8024302 8026037 * @summary The test signs and verifies a jar file with -tsacert option - * @library /lib/testlibrary + * @library /lib/testlibrary warnings * @modules java.base/sun.security.pkcs * java.base/sun.security.timestamp * java.base/sun.security.util @@ -37,29 +36,14 @@ import jdk.testlibrary.JarUtils; * java.management * @run main TsacertOptionTest */ -public class TsacertOptionTest { +public class TsacertOptionTest extends Test { - private static final String FS = System.getProperty("file.separator"); - private static final String JAVA_HOME = System.getProperty("java.home"); - private static final String KEYTOOL = JAVA_HOME + FS + "bin" + FS - + "keytool"; - private static final String JARSIGNER = JAVA_HOME + FS + "bin" + FS - + "jarsigner"; - private static final String UNSIGNED_JARFILE = "unsigned.jar"; - private static final String SIGNED_JARFILE = "signed.jar"; private static final String FILENAME = TsacertOptionTest.class.getName() + ".txt"; - private static final String PASSWORD = "changeit"; - private static final String KEYSTORE = "ks.jks"; - private static final String CA_KEY_ALIAS = "ca"; private static final String SIGNING_KEY_ALIAS = "sign_alias"; private static final String TSA_KEY_ALIAS = "ts"; - private static final String KEY_ALG = "RSA"; - private static final int KEY_SIZE = 2048; - private static final int VALIDITY = 365; - private static final String WARNING = "Warning:"; - private static final String JAR_SIGNED = "jar signed."; - private static final String JAR_VERIFIED = "jar verified."; + + private static final String PASSWORD = "changeit"; /** * The test signs and verifies a jar file with -tsacert option, @@ -78,7 +62,7 @@ public class TsacertOptionTest { JarUtils.createJar(UNSIGNED_JARFILE, FILENAME); // create key pair for jar signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", CA_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -88,7 +72,7 @@ public class TsacertOptionTest { "-keypass", PASSWORD, "-dname", "CN=CA", "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", SIGNING_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -97,14 +81,14 @@ public class TsacertOptionTest { "-storepass", PASSWORD, "-keypass", PASSWORD, "-dname", "CN=Test").shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-certreq", "-alias", SIGNING_KEY_ALIAS, "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, "-file", "certreq").shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-gencert", "-alias", CA_KEY_ALIAS, "-keystore", KEYSTORE, @@ -113,7 +97,7 @@ public class TsacertOptionTest { "-validity", Integer.toString(VALIDITY), "-infile", "certreq", "-outfile", "cert").shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-importcert", "-alias", SIGNING_KEY_ALIAS, "-keystore", KEYSTORE, @@ -132,7 +116,7 @@ public class TsacertOptionTest { // create key pair for TSA service // SubjectInfoAccess extension contains URL to TSA service - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-v", "-alias", TSA_KEY_ALIAS, @@ -152,7 +136,7 @@ public class TsacertOptionTest { // sign jar file // specify -tsadigestalg option because // TSA server uses SHA-1 digest algorithm - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-J-Dhttp.proxyHost=", "-J-Dhttp.proxyPort=", "-J-Djava.net.useSystemProxies=", @@ -171,7 +155,7 @@ public class TsacertOptionTest { analyzer.shouldContain(JAR_SIGNED); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verbose", "-verify", "-keystore", KEYSTORE, diff --git a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh index ebc3e7f9c95..013f90c58c1 100644 --- a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh +++ b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh @@ -47,6 +47,8 @@ esac # Choose 1024-bit RSA to make sure it runs fine and fast on all platforms. In # fact, every keyalg/keysize combination is OK for this test. +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + KS=js.ks KT="$TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -storepass changeit -keypass changeit -keystore $KS -keyalg rsa -keysize 1024" JAR="$TESTJAVA${FS}bin${FS}jar ${TESTTOOLVMOPTS}" diff --git a/jdk/test/sun/security/tools/jarsigner/default_options.sh b/jdk/test/sun/security/tools/jarsigner/default_options.sh index e97b569fea9..e848e1ce671 100644 --- a/jdk/test/sun/security/tools/jarsigner/default_options.sh +++ b/jdk/test/sun/security/tools/jarsigner/default_options.sh @@ -34,6 +34,8 @@ fi PASS=changeit export PASS +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + KS=ks KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -storepass:env PASS -keypass:env PASS -keystore $KS" JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/AliasNotInStoreTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/AliasNotInStoreTest.java index 81475fb7b5f..d4f0a8ef390 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/AliasNotInStoreTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/AliasNotInStoreTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -51,7 +50,7 @@ public class AliasNotInStoreTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create first key pair for signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", FIRST_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -63,7 +62,7 @@ public class AliasNotInStoreTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // create second key pair for signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", SECOND_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -75,7 +74,7 @@ public class AliasNotInStoreTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar with first key - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", BOTH_KEYS_KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -92,7 +91,7 @@ public class AliasNotInStoreTest extends Test { JarUtils.updateJar(SIGNED_JARFILE, UPDATED_SIGNED_JARFILE, SECOND_FILE); // sign jar with second key - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-keystore", BOTH_KEYS_KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -102,7 +101,7 @@ public class AliasNotInStoreTest extends Test { checkSigning(analyzer); // create keystore that contains only first key - ProcessTools.executeCommand(KEYTOOL, + keytool( "-importkeystore", "-srckeystore", BOTH_KEYS_KEYSTORE, "-srcalias", FIRST_KEY_ALIAS, @@ -116,7 +115,7 @@ public class AliasNotInStoreTest extends Test { // verify jar with keystore that contains only first key in strict mode, // so there is signed entry (FirstClass.class) that is not signed // by any alias in the keystore - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", FIRST_KEY_KEYSTORE, @@ -128,7 +127,7 @@ public class AliasNotInStoreTest extends Test { ALIAS_NOT_IN_STORE_VERIFYING_WARNING); // verify jar with keystore that contains only first key in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/BadExtendedKeyUsageTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/BadExtendedKeyUsageTest.java index a8c3c8a40d8..503b9c066aa 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/BadExtendedKeyUsageTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/BadExtendedKeyUsageTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -52,7 +51,7 @@ public class BadExtendedKeyUsageTest extends Test { // create a certificate whose signer certificate's // ExtendedKeyUsage extension doesn't allow code signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -65,7 +64,7 @@ public class BadExtendedKeyUsageTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-verbose", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -77,7 +76,7 @@ public class BadExtendedKeyUsageTest extends Test { checkSigning(analyzer, BAD_EXTENDED_KEY_USAGE_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -88,7 +87,7 @@ public class BadExtendedKeyUsageTest extends Test { checkVerifying(analyzer, 0, BAD_EXTENDED_KEY_USAGE_VERIFYING_WARNING); // verity signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java index fd37eb904f3..9f7cc362320 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -53,7 +52,7 @@ public class BadKeyUsageTest extends Test { // create a certificate whose signer certificate's KeyUsage extension // doesn't allow code signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -66,7 +65,7 @@ public class BadKeyUsageTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-verbose", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -78,7 +77,7 @@ public class BadKeyUsageTest extends Test { checkSigning(analyzer, BAD_KEY_USAGE_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -89,7 +88,7 @@ public class BadKeyUsageTest extends Test { checkVerifying(analyzer, 0, BAD_KEY_USAGE_VERIFYING_WARNING); // verify signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/BadNetscapeCertTypeTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/BadNetscapeCertTypeTest.java index e2e8086d8e0..f198bfa8b2c 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/BadNetscapeCertTypeTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/BadNetscapeCertTypeTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; import java.nio.file.Files; @@ -67,7 +66,7 @@ public class BadNetscapeCertTypeTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-verbose", "-keystore", NETSCAPE_KEYSTORE, "-storepass", PASSWORD, @@ -79,7 +78,7 @@ public class BadNetscapeCertTypeTest extends Test { checkSigning(analyzer, BAD_NETSCAPE_CERT_TYPE_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", NETSCAPE_KEYSTORE, @@ -90,7 +89,7 @@ public class BadNetscapeCertTypeTest extends Test { checkVerifying(analyzer, 0, BAD_NETSCAPE_CERT_TYPE_VERIFYING_WARNING); // verify signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/ChainNotValidatedTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/ChainNotValidatedTest.java index 21f09799c71..ab5ef7c9ee7 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/ChainNotValidatedTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/ChainNotValidatedTest.java @@ -55,7 +55,7 @@ public class ChainNotValidatedTest extends Test { // create self-signed certificate whose BasicConstraints extension // is set to false, so the certificate may not be used // as a parent certificate (certpath validation should fail) - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkeypair", "-alias", CA_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -70,7 +70,7 @@ public class ChainNotValidatedTest extends Test { // create a certificate that is signed by self-signed certificate // despite of it may not be used as a parent certificate // (certpath validation should fail) - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkeypair", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -82,7 +82,7 @@ public class ChainNotValidatedTest extends Test { "-ext", "BasicConstraints:critical=ca:false", "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-certreq", "-alias", KEY_ALIAS, "-keystore", KEYSTORE, @@ -90,7 +90,7 @@ public class ChainNotValidatedTest extends Test { "-keypass", PASSWORD, "-file", CERT_REQUEST_FILENAME).shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-gencert", "-alias", CA_KEY_ALIAS, "-keystore", KEYSTORE, @@ -100,7 +100,7 @@ public class ChainNotValidatedTest extends Test { "-validity", Integer.toString(VALIDITY), "-outfile", CERT_FILENAME).shouldHaveExitValue(0); - ProcessTools.executeCommand(KEYTOOL, + keytool( "-importcert", "-alias", KEY_ALIAS, "-keystore", KEYSTORE, @@ -129,7 +129,7 @@ public class ChainNotValidatedTest extends Test { ProcessTools.executeCommand(pb).shouldHaveExitValue(0); // remove CA certificate - ProcessTools.executeCommand(KEYTOOL, + keytool( "-delete", "-alias", CA_KEY_ALIAS, "-keystore", KEYSTORE, @@ -137,7 +137,7 @@ public class ChainNotValidatedTest extends Test { "-keypass", PASSWORD).shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -149,7 +149,7 @@ public class ChainNotValidatedTest extends Test { checkSigning(analyzer, CHAIN_NOT_VALIDATED_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -161,7 +161,7 @@ public class ChainNotValidatedTest extends Test { checkVerifying(analyzer, 0, CHAIN_NOT_VALIDATED_VERIFYING_WARNING); // verify signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiredCertTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiredCertTest.java index ccb8e918a70..2c987d79ea7 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiredCertTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiredCertTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -52,7 +51,7 @@ public class HasExpiredCertTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create key pair for jar signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -66,7 +65,7 @@ public class HasExpiredCertTest extends Test { .shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -77,7 +76,7 @@ public class HasExpiredCertTest extends Test { checkSigning(analyzer, HAS_EXPIRED_CERT_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -87,7 +86,7 @@ public class HasExpiredCertTest extends Test { checkVerifying(analyzer, 0, HAS_EXPIRED_CERT_VERIFYING_WARNING); - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-strict", "-keystore", KEYSTORE, diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiringCertTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiringCertTest.java index f34148e600f..a1d8bbe00e6 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiringCertTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/HasExpiringCertTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -52,7 +51,7 @@ public class HasExpiringCertTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create key pair for jar signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -65,7 +64,7 @@ public class HasExpiringCertTest extends Test { .shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-verbose", "-storepass", PASSWORD, @@ -77,7 +76,7 @@ public class HasExpiringCertTest extends Test { checkSigning(analyzer, HAS_EXPIRING_CERT_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -89,7 +88,7 @@ public class HasExpiringCertTest extends Test { checkVerifying(analyzer, 0, HAS_EXPIRING_CERT_VERIFYING_WARNING); // verify signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/HasUnsignedEntryTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/HasUnsignedEntryTest.java index e71feb3de3a..5dbb63ac986 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/HasUnsignedEntryTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/HasUnsignedEntryTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -51,7 +50,7 @@ public class HasUnsignedEntryTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create key pair for signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -63,7 +62,7 @@ public class HasUnsignedEntryTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-verbose", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -82,7 +81,7 @@ public class HasUnsignedEntryTest extends Test { JarUtils.updateJar(SIGNED_JARFILE, UPDATED_SIGNED_JARFILE, SECOND_FILE); // verify jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -93,7 +92,7 @@ public class HasUnsignedEntryTest extends Test { checkVerifying(analyzer, 0, HAS_UNSIGNED_ENTRY_VERIFYING_WARNING); // verify jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/MultipleWarningsTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/MultipleWarningsTest.java index 677914c5d04..c539ba4a6d6 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/MultipleWarningsTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/MultipleWarningsTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -56,7 +55,7 @@ public class MultipleWarningsTest extends Test { // create first expired certificate // whose ExtendedKeyUsage extension does not allow code signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", FIRST_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -71,7 +70,7 @@ public class MultipleWarningsTest extends Test { // create second expired certificate // whose KeyUsage extension does not allow code signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", SECOND_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -85,7 +84,7 @@ public class MultipleWarningsTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar with first key - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -100,7 +99,7 @@ public class MultipleWarningsTest extends Test { JarUtils.updateJar(SIGNED_JARFILE, UPDATED_SIGNED_JARFILE, SECOND_FILE); // verify jar with second key - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -114,7 +113,7 @@ public class MultipleWarningsTest extends Test { NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with second key in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-strict", "-keystore", KEYSTORE, @@ -134,7 +133,7 @@ public class MultipleWarningsTest extends Test { NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with non-exisiting alias - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -148,7 +147,7 @@ public class MultipleWarningsTest extends Test { NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with non-exisiting alias in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-strict", "-keystore", KEYSTORE, diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/NoTimestampTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/NoTimestampTest.java index 10b142ab967..f69118c807c 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/NoTimestampTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/NoTimestampTest.java @@ -23,7 +23,6 @@ import java.util.Date; import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -57,7 +56,7 @@ public class NoTimestampTest extends Test { * 24 * 60 * 60 * 1000L); // create key pair - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -69,7 +68,7 @@ public class NoTimestampTest extends Test { "-validity", Integer.toString(VALIDITY)); // sign jar file - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-J-Duser.timezone=" + timezone, "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -83,7 +82,7 @@ public class NoTimestampTest extends Test { checkSigning(analyzer, warning); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-J-Duser.timezone=" + timezone, "-verify", "-keystore", KEYSTORE, @@ -96,7 +95,7 @@ public class NoTimestampTest extends Test { checkVerifying(analyzer, 0, warning); // verify signed jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-J-Duser.timezone=" + timezone, "-verify", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/NotSignedByAliasTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/NotSignedByAliasTest.java index 40ef68ef60a..f309cf5233e 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/NotSignedByAliasTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/NotSignedByAliasTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -50,7 +49,7 @@ public class NotSignedByAliasTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create first key pair for signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", FIRST_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -62,7 +61,7 @@ public class NotSignedByAliasTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // create first key pair for signing - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", SECOND_KEY_ALIAS, "-keyalg", KEY_ALG, @@ -74,7 +73,7 @@ public class NotSignedByAliasTest extends Test { "-validity", Integer.toString(VALIDITY)).shouldHaveExitValue(0); // sign jar with first key - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -85,7 +84,7 @@ public class NotSignedByAliasTest extends Test { checkSigning(analyzer); // verify jar with second key - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -96,7 +95,7 @@ public class NotSignedByAliasTest extends Test { checkVerifying(analyzer, 0, NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with second key in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-strict", "-keystore", KEYSTORE, @@ -109,7 +108,7 @@ public class NotSignedByAliasTest extends Test { NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with non-existing alias - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-keystore", KEYSTORE, "-storepass", PASSWORD, @@ -120,7 +119,7 @@ public class NotSignedByAliasTest extends Test { checkVerifying(analyzer, 0, NOT_SIGNED_BY_ALIAS_VERIFYING_WARNING); // verify jar with non-existing alias in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-strict", "-keystore", KEYSTORE, diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/NotYetValidCertTest.java b/jdk/test/sun/security/tools/jarsigner/warnings/NotYetValidCertTest.java index a75c27846fc..235170e14cd 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/NotYetValidCertTest.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/NotYetValidCertTest.java @@ -22,7 +22,6 @@ */ import jdk.testlibrary.OutputAnalyzer; -import jdk.testlibrary.ProcessTools; import jdk.testlibrary.JarUtils; /** @@ -50,7 +49,7 @@ public class NotYetValidCertTest extends Test { JarUtils.createJar(UNSIGNED_JARFILE, FIRST_FILE); // create certificate that will be valid only tomorrow - ProcessTools.executeCommand(KEYTOOL, + keytool( "-genkey", "-alias", KEY_ALIAS, "-keyalg", KEY_ALG, @@ -63,7 +62,7 @@ public class NotYetValidCertTest extends Test { "-validity", Integer.toString(VALIDITY)); // sign jar - OutputAnalyzer analyzer = ProcessTools.executeCommand(JARSIGNER, + OutputAnalyzer analyzer = jarsigner( "-keystore", KEYSTORE, "-storepass", PASSWORD, "-keypass", PASSWORD, @@ -74,7 +73,7 @@ public class NotYetValidCertTest extends Test { checkSigning(analyzer, NOT_YET_VALID_CERT_SIGNING_WARNING); // verify signed jar - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-keystore", KEYSTORE, @@ -86,7 +85,7 @@ public class NotYetValidCertTest extends Test { checkVerifying(analyzer, 0, NOT_YET_VALID_CERT_VERIFYING_WARNING); // verify jar in strict mode - analyzer = ProcessTools.executeCommand(JARSIGNER, + analyzer = jarsigner( "-verify", "-verbose", "-strict", diff --git a/jdk/test/sun/security/tools/jarsigner/warnings/Test.java b/jdk/test/sun/security/tools/jarsigner/warnings/Test.java index 774dae01e90..2e0d34ee238 100644 --- a/jdk/test/sun/security/tools/jarsigner/warnings/Test.java +++ b/jdk/test/sun/security/tools/jarsigner/warnings/Test.java @@ -22,6 +22,11 @@ */ import jdk.testlibrary.OutputAnalyzer; +import jdk.testlibrary.ProcessTools; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * Base class. @@ -175,4 +180,21 @@ public abstract class Test { } analyzer.shouldContain(JAR_SIGNED); } + + protected OutputAnalyzer keytool(String... cmd) throws Throwable { + return tool(KEYTOOL, cmd); + } + + protected OutputAnalyzer jarsigner(String... cmd) throws Throwable { + return tool(JARSIGNER, cmd); + } + + private OutputAnalyzer tool(String tool, String... args) throws Throwable { + List<String> cmd = new ArrayList<>(); + cmd.add(tool); + cmd.add("-J-Duser.language=en"); + cmd.add("-J-Duser.country=US"); + cmd.addAll(Arrays.asList(args)); + return ProcessTools.executeCommand(cmd.toArray(new String[cmd.size()])); + } } diff --git a/jdk/test/sun/security/tools/jarsigner/weaksize.sh b/jdk/test/sun/security/tools/jarsigner/weaksize.sh index c5a06b5661c..f5ddd71e736 100644 --- a/jdk/test/sun/security/tools/jarsigner/weaksize.sh +++ b/jdk/test/sun/security/tools/jarsigner/weaksize.sh @@ -31,6 +31,8 @@ if [ "${TESTJAVA}" = "" ] ; then TESTJAVA=`dirname $JAVAC_CMD`/.. fi +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + # The sigalg used is MD2withRSA, which is obsolete. KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks diff --git a/jdk/test/sun/security/tools/keytool/default_options.sh b/jdk/test/sun/security/tools/keytool/default_options.sh index 182b3a202c4..650084df558 100644 --- a/jdk/test/sun/security/tools/keytool/default_options.sh +++ b/jdk/test/sun/security/tools/keytool/default_options.sh @@ -31,6 +31,8 @@ if [ "${TESTJAVA}" = "" ] ; then TESTJAVA=`dirname $JAVAC_CMD`/.. fi +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + KS=ks KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS}" diff --git a/jdk/test/sun/security/tools/keytool/file-in-help.sh b/jdk/test/sun/security/tools/keytool/file-in-help.sh index 341277e1578..cb9378ad500 100644 --- a/jdk/test/sun/security/tools/keytool/file-in-help.sh +++ b/jdk/test/sun/security/tools/keytool/file-in-help.sh @@ -42,7 +42,8 @@ case "$OS" in ;; esac -LANG=C +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + $TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -printcertreq -help 2> h1 || exit 1 $TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -exportcert -help 2> h2 || exit 2 diff --git a/jdk/test/sun/security/tools/keytool/keyalg.sh b/jdk/test/sun/security/tools/keytool/keyalg.sh index ed13bcfe1d4..f4a284c2e17 100644 --- a/jdk/test/sun/security/tools/keytool/keyalg.sh +++ b/jdk/test/sun/security/tools/keytool/keyalg.sh @@ -31,6 +31,8 @@ if [ "${TESTJAVA}" = "" ] ; then TESTJAVA=`dirname $JAVAC_CMD`/.. fi +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + KS=ks KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks -storepass changeit -keypass changeit" diff --git a/jdk/test/sun/security/tools/keytool/newhelp.sh b/jdk/test/sun/security/tools/keytool/newhelp.sh index 9e860448d66..0228658c936 100644 --- a/jdk/test/sun/security/tools/keytool/newhelp.sh +++ b/jdk/test/sun/security/tools/keytool/newhelp.sh @@ -42,7 +42,8 @@ case "$OS" in ;; esac -LANG=C +TESTTOOLVMOPTS="$TESTTOOLVMOPTS -J-Duser.language=en -J-Duser.country=US" + $TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -help 2> h1 || exit 1 $TESTJAVA${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -help -list 2> h2 || exit 2 From 9088dcdb4a2b62405a1403a747f8834ea725ee8f Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov <igerasim@openjdk.org> Date: Thu, 11 Aug 2016 17:03:40 +0300 Subject: [PATCH 15/15] 8163518: Integer overflow in StringBufferInputStream.read() and CharArrayReader.read/skip() Reviewed-by: rriggs, shade --- .../classes/java/io/CharArrayReader.java | 12 +++-- .../java/io/StringBufferInputStream.java | 6 ++- .../io/CharArrayReader/OverflowInRead.java | 50 ++++++++++++++++++ .../io/CharArrayReader/OverflowInSkip.java | 51 +++++++++++++++++++ .../OverflowInRead.java | 49 ++++++++++++++++++ 5 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 jdk/test/java/io/CharArrayReader/OverflowInRead.java create mode 100644 jdk/test/java/io/CharArrayReader/OverflowInSkip.java create mode 100644 jdk/test/java/io/StringBufferInputStream/OverflowInRead.java diff --git a/jdk/src/java.base/share/classes/java/io/CharArrayReader.java b/jdk/src/java.base/share/classes/java/io/CharArrayReader.java index 3ff8291df21..08b13811d35 100644 --- a/jdk/src/java.base/share/classes/java/io/CharArrayReader.java +++ b/jdk/src/java.base/share/classes/java/io/CharArrayReader.java @@ -131,8 +131,10 @@ public class CharArrayReader extends Reader { if (pos >= count) { return -1; } - if (pos + len > count) { - len = count - pos; + + int avail = count - pos; + if (len > avail) { + len = avail; } if (len <= 0) { return 0; @@ -158,8 +160,10 @@ public class CharArrayReader extends Reader { public long skip(long n) throws IOException { synchronized (lock) { ensureOpen(); - if (pos + n > count) { - n = count - pos; + + long avail = count - pos; + if (n > avail) { + n = avail; } if (n < 0) { return 0; diff --git a/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java b/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java index 3e64f78f6a4..787cbb9c45e 100644 --- a/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java +++ b/jdk/src/java.base/share/classes/java/io/StringBufferInputStream.java @@ -118,8 +118,10 @@ class StringBufferInputStream extends InputStream { if (pos >= count) { return -1; } - if (pos + len > count) { - len = count - pos; + + int avail = count - pos; + if (len > avail) { + len = avail; } if (len <= 0) { return 0; diff --git a/jdk/test/java/io/CharArrayReader/OverflowInRead.java b/jdk/test/java/io/CharArrayReader/OverflowInRead.java new file mode 100644 index 00000000000..8250ea4bd1a --- /dev/null +++ b/jdk/test/java/io/CharArrayReader/OverflowInRead.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8163518 + * @summary Integer overflow when reading in large buffer + * @requires (os.simpleArch == "x64" & os.maxMemory > 8g) + * @run main/othervm -Xmx8g OverflowInRead + */ + +import java.io.CharArrayReader; + +public class OverflowInRead { + public static void main(String[] args) throws Exception { + char[] a = "_123456789_123456789_123456789_123456789" + .toCharArray(); // a.length > 33 + try (CharArrayReader car = new CharArrayReader(a)) { + int len1 = 33; + char[] buf1 = new char[len1]; + if (car.read(buf1, 0, len1) != len1) + throw new Exception("Expected to read " + len1 + " chars"); + + int len2 = Integer.MAX_VALUE - 32; + char[] buf2 = new char[len2]; + int expLen2 = a.length - len1; + if (car.read(buf2, 0, len2) != expLen2) + throw new Exception("Expected to read " + expLen2 + " chars"); + } + } +} diff --git a/jdk/test/java/io/CharArrayReader/OverflowInSkip.java b/jdk/test/java/io/CharArrayReader/OverflowInSkip.java new file mode 100644 index 00000000000..94c04a085d9 --- /dev/null +++ b/jdk/test/java/io/CharArrayReader/OverflowInSkip.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8163518 + * @summary Integer overflow when skipping a lot + */ + +import java.io.CharArrayReader; + +public class OverflowInSkip { + public static void main(String[] args) throws Exception { + char[] a = "_123456789_123456789_123456789_123456789" + .toCharArray(); // a.length > 33 + try (CharArrayReader car = new CharArrayReader(a)) { + long small = 33; + long big = Long.MAX_VALUE; + + long smallSkip = car.skip(small); + if (smallSkip != small) + throw new Exception("Expected to skip " + small + + " chars, but skipped " + smallSkip); + + long expSkip = a.length - small; + long bigSkip = car.skip(big); + if (bigSkip != expSkip) + throw new Exception("Expected to skip " + expSkip + + " chars, but skipped " + bigSkip); + } + } +} diff --git a/jdk/test/java/io/StringBufferInputStream/OverflowInRead.java b/jdk/test/java/io/StringBufferInputStream/OverflowInRead.java new file mode 100644 index 00000000000..bb3c381af81 --- /dev/null +++ b/jdk/test/java/io/StringBufferInputStream/OverflowInRead.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8163518 + * @summary Integer overflow when reading in large buffer + * @requires (os.simpleArch == "x64" & os.maxMemory > 4g) + * @run main/othervm -Xmx4g OverflowInRead + */ + +import java.io.StringBufferInputStream; + +public class OverflowInRead { + public static void main(String[] args) throws Exception { + String s = "_123456789_123456789_123456789_123456789"; // s.length() > 33 + try (StringBufferInputStream sbis = new StringBufferInputStream(s)) { + int len1 = 33; + byte[] buf1 = new byte[len1]; + if (sbis.read(buf1, 0, len1) != len1) + throw new Exception("Expected to read " + len1 + " bytes"); + + int len2 = Integer.MAX_VALUE - 32; + byte[] buf2 = new byte[len2]; + int expLen2 = s.length() - len1; + if (sbis.read(buf2, 0, len2) != expLen2) + throw new Exception("Expected to read " + expLen2 + " bytes"); + } + } +}