mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-11 05:59:52 +00:00
Merge
This commit is contained in:
commit
a6f6f19835
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -72,12 +72,6 @@ public class BufferedWriter extends Writer {
|
||||
|
||||
private static int defaultCharBufferSize = 8192;
|
||||
|
||||
/**
|
||||
* Line separator string. This is the value of the line.separator
|
||||
* property at the moment that the stream was created.
|
||||
*/
|
||||
private String lineSeparator;
|
||||
|
||||
/**
|
||||
* Creates a buffered character-output stream that uses a default-sized
|
||||
* output buffer.
|
||||
@ -105,9 +99,6 @@ public class BufferedWriter extends Writer {
|
||||
cb = new char[sz];
|
||||
nChars = sz;
|
||||
nextChar = 0;
|
||||
|
||||
lineSeparator = java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction("line.separator"));
|
||||
}
|
||||
|
||||
/** Checks to make sure that the stream has not been closed */
|
||||
@ -240,7 +231,7 @@ public class BufferedWriter extends Writer {
|
||||
* @exception IOException If an I/O error occurs
|
||||
*/
|
||||
public void newLine() throws IOException {
|
||||
write(lineSeparator);
|
||||
write(System.lineSeparator());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -68,12 +68,6 @@ public class PrintWriter extends Writer {
|
||||
private Formatter formatter;
|
||||
private PrintStream psOut = null;
|
||||
|
||||
/**
|
||||
* Line separator string. This is the value of the line.separator
|
||||
* property at the moment that the stream was created.
|
||||
*/
|
||||
private final String lineSeparator;
|
||||
|
||||
/**
|
||||
* Returns a charset object for the given charset name.
|
||||
* @throws NullPointerException is csn is null
|
||||
@ -113,8 +107,6 @@ public class PrintWriter extends Writer {
|
||||
super(out);
|
||||
this.out = out;
|
||||
this.autoFlush = autoFlush;
|
||||
lineSeparator = java.security.AccessController.doPrivileged(
|
||||
new sun.security.action.GetPropertyAction("line.separator"));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -477,7 +469,7 @@ public class PrintWriter extends Writer {
|
||||
try {
|
||||
synchronized (lock) {
|
||||
ensureOpen();
|
||||
out.write(lineSeparator);
|
||||
out.write(System.lineSeparator());
|
||||
if (autoFlush)
|
||||
out.flush();
|
||||
}
|
||||
|
||||
@ -135,7 +135,7 @@ public final class String
|
||||
* unnecessary since Strings are immutable.
|
||||
*/
|
||||
public String() {
|
||||
this.value = new char[0];
|
||||
this.value = "".value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -175,7 +175,7 @@ public final class String
|
||||
* not affect the newly created string.
|
||||
*
|
||||
* @param value
|
||||
* Array that is the source of characters
|
||||
* Array that is the source of characters
|
||||
*
|
||||
* @param offset
|
||||
* The initial offset
|
||||
@ -191,8 +191,14 @@ public final class String
|
||||
if (offset < 0) {
|
||||
throw new StringIndexOutOfBoundsException(offset);
|
||||
}
|
||||
if (count < 0) {
|
||||
throw new StringIndexOutOfBoundsException(count);
|
||||
if (count <= 0) {
|
||||
if (count < 0) {
|
||||
throw new StringIndexOutOfBoundsException(count);
|
||||
}
|
||||
if (offset <= value.length) {
|
||||
this.value = "".value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Note: offset or count might be near -1>>>1.
|
||||
if (offset > value.length - count) {
|
||||
@ -233,8 +239,14 @@ public final class String
|
||||
if (offset < 0) {
|
||||
throw new StringIndexOutOfBoundsException(offset);
|
||||
}
|
||||
if (count < 0) {
|
||||
throw new StringIndexOutOfBoundsException(count);
|
||||
if (count <= 0) {
|
||||
if (count < 0) {
|
||||
throw new StringIndexOutOfBoundsException(count);
|
||||
}
|
||||
if (offset <= codePoints.length) {
|
||||
this.value = "".value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Note: offset or count might be near -1>>>1.
|
||||
if (offset > codePoints.length - count) {
|
||||
@ -246,11 +258,11 @@ public final class String
|
||||
// Pass 1: Compute precise size of char[]
|
||||
int n = count;
|
||||
for (int i = offset; i < end; i++) {
|
||||
int c = codePoints[i];
|
||||
if (Character.isBmpCodePoint(c))
|
||||
continue;
|
||||
else if (Character.isValidCodePoint(c))
|
||||
n++;
|
||||
int c = codePoints[i];
|
||||
if (Character.isBmpCodePoint(c))
|
||||
continue;
|
||||
else if (Character.isValidCodePoint(c))
|
||||
n++;
|
||||
else throw new IllegalArgumentException(Integer.toString(c));
|
||||
}
|
||||
|
||||
@ -783,7 +795,7 @@ public final class String
|
||||
* subarray of {@code dst} starting at index {@code dstBegin}
|
||||
* and ending at index:
|
||||
* <blockquote><pre>
|
||||
* dstbegin + (srcEnd-srcBegin) - 1
|
||||
* dstBegin + (srcEnd-srcBegin) - 1
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* @param srcBegin index of the first character in the string
|
||||
@ -828,7 +840,7 @@ public final class String
|
||||
* dst} starting at index {@code dstBegin} and ending at index:
|
||||
*
|
||||
* <blockquote><pre>
|
||||
* dstbegin + (srcEnd-srcBegin) - 1
|
||||
* dstBegin + (srcEnd-srcBegin) - 1
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* @deprecated This method does not properly convert characters into
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 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
|
||||
@ -588,22 +588,29 @@ public abstract class Executable extends AccessibleObject
|
||||
return AnnotationParser.toArray(declaredAnnotations());
|
||||
}
|
||||
|
||||
private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
|
||||
private transient volatile Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
|
||||
|
||||
private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
|
||||
if (declaredAnnotations == null) {
|
||||
Executable root = getRoot();
|
||||
if (root != null) {
|
||||
declaredAnnotations = root.declaredAnnotations();
|
||||
} else {
|
||||
declaredAnnotations = AnnotationParser.parseAnnotations(
|
||||
getAnnotationBytes(),
|
||||
sun.misc.SharedSecrets.getJavaLangAccess().
|
||||
getConstantPool(getDeclaringClass()),
|
||||
getDeclaringClass());
|
||||
private Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
|
||||
Map<Class<? extends Annotation>, Annotation> declAnnos;
|
||||
if ((declAnnos = declaredAnnotations) == null) {
|
||||
synchronized (this) {
|
||||
if ((declAnnos = declaredAnnotations) == null) {
|
||||
Executable root = getRoot();
|
||||
if (root != null) {
|
||||
declAnnos = root.declaredAnnotations();
|
||||
} else {
|
||||
declAnnos = AnnotationParser.parseAnnotations(
|
||||
getAnnotationBytes(),
|
||||
sun.misc.SharedSecrets.getJavaLangAccess().
|
||||
getConstantPool(getDeclaringClass()),
|
||||
getDeclaringClass()
|
||||
);
|
||||
}
|
||||
declaredAnnotations = declAnnos;
|
||||
}
|
||||
}
|
||||
}
|
||||
return declaredAnnotations;
|
||||
return declAnnos;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1996, 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
|
||||
@ -1139,21 +1139,28 @@ class Field extends AccessibleObject implements Member {
|
||||
return AnnotationParser.toArray(declaredAnnotations());
|
||||
}
|
||||
|
||||
private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
|
||||
private transient volatile Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
|
||||
|
||||
private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
|
||||
if (declaredAnnotations == null) {
|
||||
Field root = this.root;
|
||||
if (root != null) {
|
||||
declaredAnnotations = root.declaredAnnotations();
|
||||
} else {
|
||||
declaredAnnotations = AnnotationParser.parseAnnotations(
|
||||
annotations,
|
||||
sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(getDeclaringClass()),
|
||||
getDeclaringClass());
|
||||
private Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
|
||||
Map<Class<? extends Annotation>, Annotation> declAnnos;
|
||||
if ((declAnnos = declaredAnnotations) == null) {
|
||||
synchronized (this) {
|
||||
if ((declAnnos = declaredAnnotations) == null) {
|
||||
Field root = this.root;
|
||||
if (root != null) {
|
||||
declAnnos = root.declaredAnnotations();
|
||||
} else {
|
||||
declAnnos = AnnotationParser.parseAnnotations(
|
||||
annotations,
|
||||
sun.misc.SharedSecrets.getJavaLangAccess()
|
||||
.getConstantPool(getDeclaringClass()),
|
||||
getDeclaringClass());
|
||||
}
|
||||
declaredAnnotations = declAnnos;
|
||||
}
|
||||
}
|
||||
}
|
||||
return declaredAnnotations;
|
||||
return declAnnos;
|
||||
}
|
||||
|
||||
private native byte[] getTypeAnnotationBytes0();
|
||||
|
||||
@ -990,7 +990,7 @@ public final class Collectors {
|
||||
* function.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, or serializability
|
||||
* of the {@code Map} or {@code List} objects returned, or of the
|
||||
* of the {@code ConcurrentMap} or {@code List} objects returned, or of the
|
||||
* thread-safety of the {@code List} objects returned.
|
||||
* @implSpec
|
||||
* This produces a result similar to:
|
||||
@ -1028,6 +1028,9 @@ public final class Collectors {
|
||||
* produces a result of type {@code D}. The resulting collector produces a
|
||||
* {@code Map<K, D>}.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, or serializability
|
||||
* of the {@code ConcurrentMap} returned.
|
||||
*
|
||||
* <p>For example, to compute the set of last names of people in each city,
|
||||
* where the city names are sorted:
|
||||
* <pre>{@code
|
||||
@ -1143,7 +1146,8 @@ public final class Collectors {
|
||||
* {@code Map<Boolean, List<T>>}.
|
||||
*
|
||||
* There are no guarantees on the type, mutability,
|
||||
* serializability, or thread-safety of the {@code Map} returned.
|
||||
* serializability, or thread-safety of the {@code Map} or {@code List}
|
||||
* returned.
|
||||
*
|
||||
* @param <T> the type of the input elements
|
||||
* @param predicate a predicate used for classifying input elements
|
||||
@ -1212,6 +1216,9 @@ public final class Collectors {
|
||||
* may have duplicates, use {@link #toMap(Function, Function, BinaryOperator)}
|
||||
* instead.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, serializability,
|
||||
* or thread-safety of the {@code Map} returned.
|
||||
*
|
||||
* @apiNote
|
||||
* It is common for either the key or the value to be the input elements.
|
||||
* In this case, the utility method
|
||||
@ -1271,6 +1278,9 @@ public final class Collectors {
|
||||
* the value mapping function is applied to each equal element, and the
|
||||
* results are merged using the provided merging function.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, serializability,
|
||||
* or thread-safety of the {@code Map} returned.
|
||||
*
|
||||
* @apiNote
|
||||
* There are multiple ways to deal with collisions between multiple elements
|
||||
* mapping to the same key. The other forms of {@code toMap} simply use
|
||||
@ -1382,6 +1392,9 @@ public final class Collectors {
|
||||
* may have duplicates, use
|
||||
* {@link #toConcurrentMap(Function, Function, BinaryOperator)} instead.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, or serializability
|
||||
* of the {@code ConcurrentMap} returned.
|
||||
*
|
||||
* @apiNote
|
||||
* It is common for either the key or the value to be the input elements.
|
||||
* In this case, the utility method
|
||||
@ -1436,6 +1449,9 @@ public final class Collectors {
|
||||
* the value mapping function is applied to each equal element, and the
|
||||
* results are merged using the provided merging function.
|
||||
*
|
||||
* <p>There are no guarantees on the type, mutability, or serializability
|
||||
* of the {@code ConcurrentMap} returned.
|
||||
*
|
||||
* @apiNote
|
||||
* There are multiple ways to deal with collisions between multiple elements
|
||||
* mapping to the same key. The other forms of {@code toConcurrentMap} simply use
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -27,9 +27,7 @@ package sun.security.x509;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Vector;
|
||||
|
||||
import sun.security.util.*;
|
||||
|
||||
@ -111,7 +109,7 @@ implements CertAttrSet<String> {
|
||||
*/
|
||||
public PolicyConstraintsExtension(int require, int inhibit)
|
||||
throws IOException {
|
||||
this(Boolean.FALSE, require, inhibit);
|
||||
this(Boolean.TRUE, require, inhibit);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -202,7 +200,7 @@ implements CertAttrSet<String> {
|
||||
DerOutputStream tmp = new DerOutputStream();
|
||||
if (extensionValue == null) {
|
||||
extensionId = PKIXExtensions.PolicyConstraints_Id;
|
||||
critical = false;
|
||||
critical = true;
|
||||
encodeThis();
|
||||
}
|
||||
super.encode(tmp);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -92,7 +92,7 @@ implements CertAttrSet<String> {
|
||||
throws IOException {
|
||||
this.maps = map;
|
||||
this.extensionId = PKIXExtensions.PolicyMappings_Id;
|
||||
this.critical = false;
|
||||
this.critical = true;
|
||||
encodeThis();
|
||||
}
|
||||
|
||||
@ -100,8 +100,8 @@ implements CertAttrSet<String> {
|
||||
* Create a default PolicyMappingsExtension.
|
||||
*/
|
||||
public PolicyMappingsExtension() {
|
||||
extensionId = PKIXExtensions.KeyUsage_Id;
|
||||
critical = false;
|
||||
extensionId = PKIXExtensions.PolicyMappings_Id;
|
||||
critical = true;
|
||||
maps = new ArrayList<CertificatePolicyMap>();
|
||||
}
|
||||
|
||||
@ -153,7 +153,7 @@ implements CertAttrSet<String> {
|
||||
DerOutputStream tmp = new DerOutputStream();
|
||||
if (extensionValue == null) {
|
||||
extensionId = PKIXExtensions.PolicyMappings_Id;
|
||||
critical = false;
|
||||
critical = true;
|
||||
encodeThis();
|
||||
}
|
||||
super.encode(tmp);
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1995, 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
|
||||
@ -214,7 +214,7 @@ public final class FileDescriptor {
|
||||
if (!closed) {
|
||||
closed = true;
|
||||
IOException ioe = null;
|
||||
try (Closeable c = releaser) {
|
||||
try (releaser) {
|
||||
if (otherParents != null) {
|
||||
for (Closeable referent : otherParents) {
|
||||
try {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 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
|
||||
@ -212,7 +212,7 @@ public final class FileDescriptor {
|
||||
if (!closed) {
|
||||
closed = true;
|
||||
IOException ioe = null;
|
||||
try (Closeable c = releaser) {
|
||||
try (releaser) {
|
||||
if (otherParents != null) {
|
||||
for (Closeable referent : otherParents) {
|
||||
try {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2014, 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
|
||||
@ -224,6 +224,7 @@ final public class LdapCtx extends ComponentDirContext
|
||||
String hostname = null; // host name of server (no brackets
|
||||
// for IPv6 literals)
|
||||
LdapClient clnt = null; // connection handle
|
||||
private boolean reconnect = false; // indicates that re-connect requested
|
||||
Hashtable<String, java.lang.Object> envprops = null; // environment properties of context
|
||||
int handleReferrals = DEFAULT_REFERRAL_MODE; // how referral is handled
|
||||
boolean hasLdapsScheme = false; // true if the context was created
|
||||
@ -2663,6 +2664,7 @@ final public class LdapCtx extends ComponentDirContext
|
||||
}
|
||||
|
||||
sharable = false; // can't share with existing contexts
|
||||
reconnect = true;
|
||||
ensureOpen(); // open or reauthenticated
|
||||
}
|
||||
|
||||
@ -2739,7 +2741,7 @@ final public class LdapCtx extends ComponentDirContext
|
||||
try {
|
||||
boolean initial = (clnt == null);
|
||||
|
||||
if (initial) {
|
||||
if (initial || reconnect) {
|
||||
ldapVersion = (ver != null) ? Integer.parseInt(ver) :
|
||||
DEFAULT_LDAP_VERSION;
|
||||
|
||||
@ -2767,6 +2769,7 @@ final public class LdapCtx extends ComponentDirContext
|
||||
// Required for SASL client identity
|
||||
envprops);
|
||||
|
||||
reconnect = false;
|
||||
|
||||
/**
|
||||
* Pooled connections are preauthenticated;
|
||||
|
||||
@ -37,12 +37,13 @@ import javax.naming.NameNotFoundException;
|
||||
import javax.naming.directory.Attribute;
|
||||
import javax.naming.directory.Attributes;
|
||||
import javax.naming.directory.BasicAttributes;
|
||||
import javax.naming.directory.DirContext;
|
||||
import javax.naming.directory.InitialDirContext;
|
||||
|
||||
import java.security.*;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.*;
|
||||
import javax.naming.CommunicationException;
|
||||
import javax.naming.ldap.InitialLdapContext;
|
||||
import javax.naming.ldap.LdapContext;
|
||||
import javax.security.auth.x500.X500Principal;
|
||||
|
||||
import sun.misc.HexDumpEncoder;
|
||||
@ -160,7 +161,12 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
/**
|
||||
* The JNDI directory context.
|
||||
*/
|
||||
private DirContext ctx;
|
||||
private LdapContext ctx;
|
||||
|
||||
/**
|
||||
* Flag indicating that communication error occurred.
|
||||
*/
|
||||
private boolean communicationError = false;
|
||||
|
||||
/**
|
||||
* Flag indicating whether we should prefetch CRLs.
|
||||
@ -218,6 +224,11 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
certStoreCache = Cache.newSoftMemoryCache(185);
|
||||
static synchronized CertStore getInstance(LDAPCertStoreParameters params)
|
||||
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
|
||||
// if necessary, convert params to SunLDAPCertStoreParameters because
|
||||
// LDAPCertStoreParameters does not override equals() and hashCode()
|
||||
if (! (params instanceof SunLDAPCertStoreParameters)) {
|
||||
params = new SunLDAPCertStoreParameters(params.getServerName(), params.getPort());
|
||||
}
|
||||
CertStore lcs = certStoreCache.get(params);
|
||||
if (lcs == null) {
|
||||
lcs = CertStore.getInstance("LDAP", params);
|
||||
@ -256,7 +267,7 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
}
|
||||
|
||||
try {
|
||||
ctx = new InitialDirContext(env);
|
||||
ctx = new InitialLdapContext(env, null);
|
||||
/*
|
||||
* By default, follow referrals unless application has
|
||||
* overridden property in an application resource file.
|
||||
@ -369,8 +380,17 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
valueMap = new HashMap<>(8);
|
||||
String[] attrIds = requestedAttributes.toArray(STRING0);
|
||||
Attributes attrs;
|
||||
|
||||
if (communicationError) {
|
||||
ctx.reconnect(null);
|
||||
communicationError = false;
|
||||
}
|
||||
|
||||
try {
|
||||
attrs = ctx.getAttributes(name, attrIds);
|
||||
} catch (CommunicationException ce) {
|
||||
communicationError = true;
|
||||
throw ce;
|
||||
} catch (NameNotFoundException e) {
|
||||
// name does not exist on this LDAP server
|
||||
// treat same as not attributes found
|
||||
@ -884,7 +904,12 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
SunLDAPCertStoreParameters() {
|
||||
super();
|
||||
}
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(obj instanceof LDAPCertStoreParameters)) {
|
||||
return false;
|
||||
}
|
||||
@ -892,6 +917,7 @@ public final class LDAPCertStore extends CertStoreSpi {
|
||||
return (getPort() == params.getPort() &&
|
||||
getServerName().equalsIgnoreCase(params.getServerName()));
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
if (hashCode == 0) {
|
||||
int result = 17;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -911,6 +911,7 @@ public final class KeychainStore extends KeyStoreSpi {
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private byte[] fetchPrivateKeyFromBag(byte[] privateKeyInfo) throws IOException, NoSuchAlgorithmException, CertificateException
|
||||
{
|
||||
byte[] returnValue = null;
|
||||
@ -971,6 +972,7 @@ public final class KeychainStore extends KeyStoreSpi {
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
private byte[] extractKeyData(DerInputStream stream)
|
||||
throws IOException, NoSuchAlgorithmException, CertificateException
|
||||
{
|
||||
|
||||
@ -142,9 +142,6 @@ java/lang/instrument/RetransformBigClass.sh generic-all
|
||||
# 8058492
|
||||
java/lang/management/ThreadMXBean/FindDeadlocks.java generic-all
|
||||
|
||||
# 8058506
|
||||
java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java generic-all
|
||||
|
||||
############################################################################
|
||||
|
||||
# jdk_jmx
|
||||
|
||||
@ -421,8 +421,7 @@ needs_jdk = \
|
||||
java/util/Collections/EmptyIterator.java \
|
||||
java/util/concurrent/locks/Lock/TimedAcquireLeak.java \
|
||||
java/util/jar/JarInputStream/ExtraFileInMetaInf.java \
|
||||
java/util/logging/AnonLoggerWeakRefLeak.sh \
|
||||
java/util/logging/LoggerWeakRefLeak.sh \
|
||||
java/util/logging/TestLoggerWeakRefLeak.java \
|
||||
java/util/zip/3GBZipFiles.sh \
|
||||
jdk/lambda/FDTest.java \
|
||||
jdk/lambda/separate/Compiler.java \
|
||||
|
||||
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8048603
|
||||
* @summary Checks if MAC algorithms work fine with empty buffer
|
||||
* @author Alexander Fomin
|
||||
* @build Utils
|
||||
* @run main EmptyByteBufferTest
|
||||
*/
|
||||
public class EmptyByteBufferTest implements MacTest {
|
||||
|
||||
/**
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Utils.runTests(new EmptyByteBufferTest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doTest(String alg) throws NoSuchAlgorithmException,
|
||||
InvalidKeyException, NoSuchProviderException {
|
||||
SecretKey key = Utils.getSecretKeySpec();
|
||||
|
||||
// instantiate Mac object and init it with a SecretKey
|
||||
Mac mac = Mac.getInstance(alg, "SunJCE");
|
||||
mac.init(key);
|
||||
|
||||
// prepare buffer
|
||||
byte[] data = new byte[0];
|
||||
ByteBuffer buf = ByteBuffer.wrap(data);
|
||||
|
||||
mac.update(buf);
|
||||
mac.doFinal();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8048603
|
||||
* @summary Checks if PBE algorithms work fine with large buffer
|
||||
* @author Alexander Fomin
|
||||
* @build Utils
|
||||
* @run main LargeByteBufferTest
|
||||
*/
|
||||
public class LargeByteBufferTest implements MacTest {
|
||||
|
||||
private static final int BUFFER_SIZE = 65535;
|
||||
|
||||
/**
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Utils.runTests(new LargeByteBufferTest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doTest(String alg) throws NoSuchAlgorithmException,
|
||||
InvalidKeyException, NoSuchProviderException {
|
||||
SecretKey key = Utils.getSecretKeySpec();
|
||||
|
||||
// instantiate Mac object and init it with a SecretKey
|
||||
Mac mac = Mac.getInstance(alg, "SunJCE");
|
||||
mac.init(key);
|
||||
|
||||
// prepare buffer
|
||||
byte[] data = new byte[BUFFER_SIZE];
|
||||
for (int i = 0; i < BUFFER_SIZE; i++) {
|
||||
data[i] = (byte) (i % 256);
|
||||
}
|
||||
|
||||
ByteBuffer buf = ByteBuffer.wrap(data);
|
||||
int limitBefore = buf.limit();
|
||||
|
||||
mac.update(buf);
|
||||
mac.doFinal();
|
||||
|
||||
int limitAfter = buf.limit();
|
||||
int positonAfter = buf.position();
|
||||
|
||||
if (limitAfter != limitBefore) {
|
||||
System.out.println("limit after = " + limitAfter);
|
||||
System.out.println("limit before = " + limitBefore);
|
||||
throw new RuntimeException("Test failed: "
|
||||
+ "limit of buffer has been chenged.");
|
||||
}
|
||||
|
||||
if (positonAfter != limitAfter) {
|
||||
System.out.println("position after = " + positonAfter);
|
||||
System.out.println("limit after = " + limitAfter);
|
||||
throw new RuntimeException("Test failed: "
|
||||
+ "position of buffer isn't equal to its limit");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
100
jdk/test/com/sun/crypto/provider/Mac/MacSameTest.java
Normal file
100
jdk/test/com/sun/crypto/provider/Mac/MacSameTest.java
Normal file
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.SecureRandom;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8048603
|
||||
* @summary Check if doFinal and update operation result in same Mac
|
||||
* @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
|
||||
* @build Utils
|
||||
* @run main MacSameTest
|
||||
*/
|
||||
public class MacSameTest implements MacTest {
|
||||
|
||||
private static final int MESSAGE_SIZE = 25;
|
||||
private static final int OFFSET = 5;
|
||||
private static final int KEY_SIZE = 70;
|
||||
|
||||
/**
|
||||
* Initialize a message, instantiate a Mac object,
|
||||
* initialize the object with a SecretKey,
|
||||
* feed the message into the Mac object
|
||||
* all at once and get the output MAC as result1.
|
||||
* Reset the Mac object, chop the message into three pieces,
|
||||
* feed into the Mac object sequentially, and get the output MAC as result2.
|
||||
* Finally, compare result1 and result2 and see if they are the same.
|
||||
*
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Utils.runTests(new MacSameTest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doTest(String algo) throws NoSuchAlgorithmException,
|
||||
NoSuchProviderException, InvalidKeyException {
|
||||
Mac mac;
|
||||
try {
|
||||
mac = Mac.getInstance(algo, "SunJCE");
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
// depending on Solaris configuration,
|
||||
// it can support HMAC or not with Mac
|
||||
System.out.println("Expected NoSuchAlgorithmException thrown: "
|
||||
+ nsae);
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] plain = new byte[MESSAGE_SIZE];
|
||||
for (int i = 0; i < MESSAGE_SIZE; i++) {
|
||||
plain[i] = (byte) (i % 256);
|
||||
}
|
||||
|
||||
byte[] tail = new byte[plain.length - OFFSET];
|
||||
System.arraycopy(plain, OFFSET, tail, 0, tail.length);
|
||||
|
||||
SecureRandom srdm = new SecureRandom();
|
||||
byte[] keyVal = new byte[KEY_SIZE];
|
||||
srdm.nextBytes(keyVal);
|
||||
SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
|
||||
|
||||
mac.init(keySpec);
|
||||
byte[] result1 = mac.doFinal(plain);
|
||||
|
||||
mac.reset();
|
||||
mac.update(plain[0]);
|
||||
mac.update(plain, 1, OFFSET - 1);
|
||||
byte[] result2 = mac.doFinal(tail);
|
||||
|
||||
if (!java.util.Arrays.equals(result1, result2)) {
|
||||
throw new RuntimeException("result1 and result2 are not the same");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
69
jdk/test/com/sun/crypto/provider/Mac/NullByteBufferTest.java
Normal file
69
jdk/test/com/sun/crypto/provider/Mac/NullByteBufferTest.java
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8048603
|
||||
* @summary Checks if PBE algorithms work fine with null buffer
|
||||
* @author Alexander Fomin
|
||||
* @build Utils
|
||||
* @run main NullByteBufferTest
|
||||
*/
|
||||
public class NullByteBufferTest implements MacTest {
|
||||
|
||||
/**
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
Utils.runTests(new NullByteBufferTest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doTest(String alg) throws NoSuchAlgorithmException,
|
||||
InvalidKeyException, NoSuchProviderException {
|
||||
SecretKey key = Utils.getSecretKeySpec();
|
||||
|
||||
// instantiate Mac object and init it with a SecretKey
|
||||
Mac mac = Mac.getInstance(alg, "SunJCE");
|
||||
mac.init(key);
|
||||
|
||||
try {
|
||||
ByteBuffer buf = null;
|
||||
mac.update(buf);
|
||||
mac.doFinal();
|
||||
throw new RuntimeException(
|
||||
"Expected IllegalArgumentException not thrown");
|
||||
} catch (IllegalArgumentException e) {
|
||||
System.out.println("Expected IllegalArgumentException thrown: "
|
||||
+ e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
79
jdk/test/com/sun/crypto/provider/Mac/Utils.java
Normal file
79
jdk/test/com/sun/crypto/provider/Mac/Utils.java
Normal file
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* Helper class.
|
||||
*/
|
||||
class Utils {
|
||||
|
||||
static final int KEY_SIZE = 70;
|
||||
|
||||
static final String[] MAC_ALGOS = {"HmacMD5", "HmacSHA1", "HmacSHA224",
|
||||
"HmacSHA256", "HmacSHA384", "HmacSHA512"};
|
||||
|
||||
/**
|
||||
* Get SecretKeySpec.
|
||||
*/
|
||||
static SecretKeySpec getSecretKeySpec() {
|
||||
SecureRandom srdm = new SecureRandom();
|
||||
byte[] keyVal = new byte[KEY_SIZE];
|
||||
srdm.nextBytes(keyVal);
|
||||
return new SecretKeySpec(keyVal, "HMAC");
|
||||
}
|
||||
|
||||
static void runTests(MacTest... tests) {
|
||||
boolean success = true;
|
||||
for (MacTest test : tests) {
|
||||
success &= runTest(test);
|
||||
}
|
||||
|
||||
if (success) {
|
||||
System.out.println("Test passed");
|
||||
} else {
|
||||
throw new RuntimeException("Test failed");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean runTest(MacTest test) {
|
||||
boolean success = true;
|
||||
for (String alg : MAC_ALGOS) {
|
||||
try {
|
||||
System.out.println("Test " + alg);
|
||||
test.doTest(alg);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Unexpected exception:");
|
||||
e.printStackTrace();
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
}
|
||||
|
||||
interface MacTest {
|
||||
void doTest(String alg) throws Exception;
|
||||
}
|
||||
@ -23,6 +23,7 @@
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @ignore JDK-8068162
|
||||
* @bug 6331574
|
||||
* @summary test isModifiableClass
|
||||
* @author Robert Field, Sun Microsystems
|
||||
|
||||
@ -30,11 +30,13 @@
|
||||
* @build TestMethods
|
||||
* @build LambdaFormTestCase
|
||||
* @build LFGarbageCollectedTest
|
||||
* @run main/othervm LFGarbageCollectedTest
|
||||
* @run main/othervm -Xmx64m -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+HeapDumpOnOutOfMemoryError -DHEAP_DUMP=false LFGarbageCollectedTest
|
||||
*/
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.ref.PhantomReference;
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.EnumSet;
|
||||
@ -44,6 +46,7 @@ import java.util.Map;
|
||||
* Lambda forms garbage collection test class.
|
||||
*/
|
||||
public final class LFGarbageCollectedTest extends LambdaFormTestCase {
|
||||
private static boolean HEAP_DUMP = Boolean.getBoolean("HEAP_DUMP");
|
||||
|
||||
/**
|
||||
* Constructor for a lambda forms garbage collection test case.
|
||||
@ -55,37 +58,86 @@ public final class LFGarbageCollectedTest extends LambdaFormTestCase {
|
||||
super(testMethod);
|
||||
}
|
||||
|
||||
PhantomReference ph;
|
||||
ReferenceQueue rq = new ReferenceQueue();
|
||||
MethodType mtype;
|
||||
Map<String, Object> data;
|
||||
|
||||
@Override
|
||||
public void doTest() {
|
||||
try {
|
||||
Map<String, Object> data = getTestMethod().getTestCaseData();
|
||||
TestMethods testCase = getTestMethod();
|
||||
data = testCase.getTestCaseData();
|
||||
MethodHandle adapter;
|
||||
try {
|
||||
adapter = getTestMethod().getTestCaseMH(data, TestMethods.Kind.ONE);
|
||||
adapter = testCase.getTestCaseMH(data, TestMethods.Kind.ONE);
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new Error("Unexpected exception: ", ex);
|
||||
}
|
||||
Object lambdaForm = LambdaFormTestCase.INTERNAL_FORM.invoke(adapter);
|
||||
mtype = adapter.type();
|
||||
Object lambdaForm = INTERNAL_FORM.invoke(adapter);
|
||||
if (lambdaForm == null) {
|
||||
throw new Error("Unexpected error: Lambda form of the method handle is null");
|
||||
}
|
||||
ReferenceQueue rq = new ReferenceQueue();
|
||||
PhantomReference ph = new PhantomReference(lambdaForm, rq);
|
||||
|
||||
String debugName = (String)DEBUG_NAME.get(lambdaForm);
|
||||
if (debugName != null && debugName.startsWith("identity_")) {
|
||||
// Ignore identity_* LambdaForms.
|
||||
return;
|
||||
}
|
||||
|
||||
ph = new PhantomReference(lambdaForm, rq);
|
||||
lambdaForm = null;
|
||||
data = null;
|
||||
adapter = null;
|
||||
for (int i = 0; i < 1000 && !ph.isEnqueued(); i++) {
|
||||
System.gc();
|
||||
}
|
||||
if (!ph.isEnqueued()) {
|
||||
throw new AssertionError("Error: Lambda form is not garbage collected");
|
||||
}
|
||||
|
||||
collectLambdaForm();
|
||||
} catch (IllegalAccessException | IllegalArgumentException |
|
||||
InvocationTargetException ex) {
|
||||
throw new Error("Unexpected exception: ", ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void collectLambdaForm() throws IllegalAccessException {
|
||||
// Usually, 2 System.GCs are necessary to enqueue a SoftReference.
|
||||
System.gc();
|
||||
System.gc();
|
||||
|
||||
Reference ref = null;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
try {
|
||||
ref = rq.remove(1000);
|
||||
} catch (InterruptedException e) {
|
||||
/* ignore */
|
||||
}
|
||||
if (ref != null) {
|
||||
break;
|
||||
}
|
||||
System.gc(); // If the reference hasn't been queued yet, trigger one more GC.
|
||||
}
|
||||
|
||||
if (ref == null) {
|
||||
dumpTestData();
|
||||
System.err.println("Method type: " + mtype);
|
||||
System.err.println("LambdaForm: " + REF_FIELD.get(ph));
|
||||
|
||||
if (HEAP_DUMP) {
|
||||
// Trigger OOM to force heap dump for post-mortem analysis.
|
||||
val = new long[1_000_000_000];
|
||||
}
|
||||
throw new AssertionError("Error: LambdaForm is not garbage collected");
|
||||
};
|
||||
}
|
||||
|
||||
private void dumpTestData() {
|
||||
System.err.println("Test case: " + getTestMethod());
|
||||
for (String s : data.keySet()) {
|
||||
System.err.printf("\t%20s => %s\n", s, data.get(s));
|
||||
}
|
||||
}
|
||||
|
||||
private static long[] val;
|
||||
|
||||
/**
|
||||
* Main routine for lambda forms garbage collection test.
|
||||
*
|
||||
@ -101,7 +153,9 @@ public final class LFGarbageCollectedTest extends LambdaFormTestCase {
|
||||
TestMethods.IDENTITY,
|
||||
TestMethods.CONSTANT,
|
||||
TestMethods.ARRAY_ELEMENT_GETTER,
|
||||
TestMethods.ARRAY_ELEMENT_SETTER));
|
||||
TestMethods.ARRAY_ELEMENT_SETTER,
|
||||
TestMethods.EXACT_INVOKER,
|
||||
TestMethods.INVOKER));
|
||||
LambdaFormTestCase.runTests(LFGarbageCollectedTest::new, testMethods);
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,9 +23,11 @@
|
||||
|
||||
import com.oracle.testlibrary.jsr292.Helper;
|
||||
import com.sun.management.HotSpotDiagnosticMXBean;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.management.GarbageCollectorMXBean;
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.ref.Reference;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@ -42,8 +44,6 @@ import jdk.testlibrary.TimeLimitedRunner;
|
||||
*/
|
||||
public abstract class LambdaFormTestCase {
|
||||
|
||||
private final static String METHOD_HANDLE_CLASS_NAME = "java.lang.invoke.MethodHandle";
|
||||
private final static String INTERNAL_FORM_METHOD_NAME = "internalForm";
|
||||
private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO
|
||||
= 45 / (128.0 * 1024 * 1024);
|
||||
private static final long TIMEOUT = Helper.IS_THOROUGH ? 0L : (long) (Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT) * 0.9);
|
||||
@ -53,6 +53,8 @@ public abstract class LambdaFormTestCase {
|
||||
* used to get a lambda form from a method handle.
|
||||
*/
|
||||
protected final static Method INTERNAL_FORM;
|
||||
protected final static Field DEBUG_NAME;
|
||||
protected final static Field REF_FIELD;
|
||||
private static final List<GarbageCollectorMXBean> gcInfo;
|
||||
|
||||
private static long gcCount() {
|
||||
@ -61,9 +63,14 @@ public abstract class LambdaFormTestCase {
|
||||
|
||||
static {
|
||||
try {
|
||||
Class mhClass = Class.forName(METHOD_HANDLE_CLASS_NAME);
|
||||
INTERNAL_FORM = mhClass.getDeclaredMethod(INTERNAL_FORM_METHOD_NAME);
|
||||
INTERNAL_FORM = MethodHandle.class.getDeclaredMethod("internalForm");
|
||||
INTERNAL_FORM.setAccessible(true);
|
||||
|
||||
DEBUG_NAME = Class.forName("java.lang.invoke.LambdaForm").getDeclaredField("debugName");
|
||||
DEBUG_NAME.setAccessible(true);
|
||||
|
||||
REF_FIELD = Reference.class.getDeclaredField("referent");
|
||||
REF_FIELD.setAccessible(true);
|
||||
} catch (Exception ex) {
|
||||
throw new Error("Unexpected exception: ", ex);
|
||||
}
|
||||
@ -138,6 +145,10 @@ public abstract class LambdaFormTestCase {
|
||||
testCase.getTestMethod().name);
|
||||
testCase.doTest();
|
||||
System.err.println("PASSED");
|
||||
} catch (OutOfMemoryError e) {
|
||||
// Don't swallow OOME so a heap dump can be created.
|
||||
System.err.println("FAILED");
|
||||
throw e;
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
System.err.printf("FAILED. Caused by %s%n", t.getMessage());
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2014, 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
|
||||
@ -32,6 +32,7 @@
|
||||
*
|
||||
* @library /lib/testlibrary/
|
||||
* @build jdk.testlibrary.* CollectionUsageThreshold MemoryUtil RunUtil
|
||||
* @requires vm.opt.ExplicitGCInvokesConcurrent == "false" | vm.opt.ExplicitGCInvokesConcurrent == "null"
|
||||
* @run main/timeout=300 CollectionUsageThreshold
|
||||
*/
|
||||
|
||||
|
||||
@ -32,6 +32,7 @@
|
||||
*
|
||||
* @library /lib/testlibrary/
|
||||
* @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil
|
||||
* @requires vm.opt.ExplicitGCInvokesConcurrent == "false" | vm.opt.ExplicitGCInvokesConcurrent == "null"
|
||||
* @run main/timeout=600 LowMemoryTest
|
||||
*/
|
||||
|
||||
|
||||
@ -22,27 +22,51 @@
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 4945514
|
||||
* @bug 4945514 8042581
|
||||
* @summary DatagramSocket should make handle not inherited
|
||||
*/
|
||||
|
||||
import java.net.*;
|
||||
import java.net.BindException;
|
||||
import java.net.DatagramSocket;
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public class InheritHandle {
|
||||
private static final long SLEEPTIME_MS = 1000L;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
DatagramSocket sock = new DatagramSocket (0);
|
||||
sock.setReuseAddress(true);
|
||||
int port = sock.getLocalPort();
|
||||
int port;
|
||||
try (DatagramSocket sock = new DatagramSocket(0);) {
|
||||
sock.setReuseAddress(true);
|
||||
port = sock.getLocalPort();
|
||||
|
||||
/**
|
||||
* spawn a child to check whether handle passed to it or not;
|
||||
* it shouldn't
|
||||
*/
|
||||
Runtime.getRuntime().exec ("sleep 10");
|
||||
/**
|
||||
* spawn a child to check whether handle passed to it or not; it
|
||||
* shouldn't
|
||||
*/
|
||||
Runtime.getRuntime().exec("sleep 10");
|
||||
}
|
||||
|
||||
sock.close();
|
||||
sock = new DatagramSocket (null);
|
||||
sock.setReuseAddress(true);
|
||||
sock.bind(new InetSocketAddress(port));
|
||||
try (DatagramSocket sock = new DatagramSocket(null);) {
|
||||
sock.setReuseAddress(true);
|
||||
int retries = 0;
|
||||
boolean isWindows = System.getProperty("os.name").startsWith("Windows");
|
||||
InetSocketAddress addr = new InetSocketAddress(port);
|
||||
while (true) {
|
||||
try {
|
||||
sock.bind(addr);
|
||||
break;
|
||||
} catch (BindException e) {
|
||||
if (isWindows && retries++ < 5) {
|
||||
Thread.sleep(SLEEPTIME_MS);
|
||||
System.out.println("BindException \"" + e.getMessage() + "\", retrying...");
|
||||
continue;
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,92 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 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.
|
||||
*/
|
||||
|
||||
import java.util.logging.*;
|
||||
|
||||
public class AnonLoggerWeakRefLeak extends SimpleApplication {
|
||||
// The test driver script will allow this program to run until we
|
||||
// reach DEFAULT_LOOP_TIME or a decrease in instance counts is
|
||||
// observed. For this particular WeakReference leak, the count
|
||||
// was always observed to be increasing so if we get a decreasing
|
||||
// count, then the leak is fixed in the bits being tested.
|
||||
// Two minutes has been enough time to observe a decrease in
|
||||
// fixed bits on overloaded systems, but the test will likely
|
||||
// finish more quickly.
|
||||
public static int DEFAULT_LOOP_TIME = 120; // time is in seconds
|
||||
|
||||
// execute the AnonLoggerWeakRefLeak app work
|
||||
public void doMyAppWork(String[] args) throws Exception {
|
||||
int loop_time = 0;
|
||||
int max_loop_time = DEFAULT_LOOP_TIME;
|
||||
|
||||
// args[0] is the port-file
|
||||
if (args.length < 2) {
|
||||
System.out.println("INFO: using default time of "
|
||||
+ max_loop_time + " seconds.");
|
||||
} else {
|
||||
try {
|
||||
max_loop_time = Integer.parseInt(args[1]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
throw new RuntimeException("Error: '" + args[1]
|
||||
+ "': is not a valid seconds value.");
|
||||
}
|
||||
}
|
||||
|
||||
long count = 0;
|
||||
long now = 0;
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
while (now < (startTime + (max_loop_time * 1000))) {
|
||||
if ((count % 1000) == 0) {
|
||||
// Print initial call count to let caller know that
|
||||
// we're up and running and then periodically
|
||||
System.out.println("INFO: call count = " + count);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 100; i++) {
|
||||
// this Logger call is leaking a WeakReference in Logger.kids
|
||||
java.util.logging.Logger.getAnonymousLogger();
|
||||
count++;
|
||||
}
|
||||
|
||||
try {
|
||||
// delay for 1/10 of a second to avoid CPU saturation
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ie) {
|
||||
// ignore any exceptions
|
||||
}
|
||||
|
||||
now = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
System.out.println("INFO: final loop count = " + count);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
AnonLoggerWeakRefLeak myApp = new AnonLoggerWeakRefLeak();
|
||||
|
||||
SimpleApplication.setMyApp(myApp);
|
||||
|
||||
SimpleApplication.main(args);
|
||||
}
|
||||
}
|
||||
@ -1,254 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2010, 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 6942989
|
||||
# @summary Check for WeakReference leak in anonymous Logger objects
|
||||
# @author Daniel D. Daugherty
|
||||
#
|
||||
# @library ../../../sun/tools/common
|
||||
# @build SimpleApplication ShutdownSimpleApplication
|
||||
# @build AnonLoggerWeakRefLeak
|
||||
# @run shell/timeout=240 AnonLoggerWeakRefLeak.sh
|
||||
|
||||
# The timeout is: 2 minutes for infrastructure and 2 minutes for the test
|
||||
#
|
||||
|
||||
. ${TESTSRC}/../../../sun/tools/common/CommonSetup.sh
|
||||
. ${TESTSRC}/../../../sun/tools/common/ApplicationSetup.sh
|
||||
|
||||
|
||||
TEST_NAME="AnonLoggerWeakRefLeak"
|
||||
TARGET_CLASS="java\.lang\.ref\.WeakReference"
|
||||
|
||||
|
||||
# MAIN begins here
|
||||
#
|
||||
|
||||
seconds=
|
||||
if [ "$#" -gt 0 ]; then
|
||||
seconds="$1"
|
||||
fi
|
||||
|
||||
# see if this version of jmap supports the '-histo:live' option
|
||||
jmap_option="-histo:live"
|
||||
set +e
|
||||
"${JMAP}" 2>&1 | grep ':live' > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" != 0 ]; then
|
||||
# usage message doesn't show ':live' option
|
||||
|
||||
if $isWindows; then
|
||||
# If SA isn't present, then jmap gives a different usage message
|
||||
# that doesn't show the ':live' option. However, that's a bug that
|
||||
# is covered by 6971851 so we try using the option just to be sure.
|
||||
# For some reason, this problem has only been seen on OpenJDK6 on
|
||||
# Windows. Not sure why.
|
||||
set +e
|
||||
# Note: Don't copy this code to try probing process 0 on Linux; it
|
||||
# will kill the process group in strange ways.
|
||||
"${JMAP}" "$jmap_option" 0 2>&1 | grep 'Usage' > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" = 0 ]; then
|
||||
# Usage message generated so flag the problem.
|
||||
status=1
|
||||
else
|
||||
# No usage message so clear the flag.
|
||||
status=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$status" != 0 ]; then
|
||||
echo "WARNING: 'jmap $jmap_option' is not supported on this platform"
|
||||
echo "WARNING: so this test cannot work reliably. Aborting!"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Start application and use TEST_NAME.port for coordination
|
||||
startApplication "$TEST_NAME" "$TEST_NAME.port" $seconds
|
||||
|
||||
finished_early=false
|
||||
|
||||
decreasing_cnt=0
|
||||
increasing_cnt=0
|
||||
loop_cnt=0
|
||||
prev_instance_cnt=0
|
||||
|
||||
MAX_JMAP_TRY_CNT=10
|
||||
jmap_retry_cnt=0
|
||||
loop_cnt_on_retry=0
|
||||
|
||||
while true; do
|
||||
# see if the target process has finished its run and bail if it has
|
||||
set +e
|
||||
grep "^INFO: final loop count = " "$appOutput" > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" = 0 ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
# Output format for 'jmap -histo' in JDK1.5.0:
|
||||
#
|
||||
# <#bytes> <#instances> <class_name>
|
||||
#
|
||||
# Output format for 'jmap -histo:live':
|
||||
#
|
||||
# <num>: <#instances> <#bytes> <class_name>
|
||||
#
|
||||
set +e
|
||||
"${JMAP}" "$jmap_option" "$appJavaPid" > "$TEST_NAME.jmap" 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
|
||||
if [ "$status" != 0 ]; then
|
||||
echo "INFO: jmap exited with exit code = $status"
|
||||
|
||||
# There are intermittent jmap failures; see 6498448.
|
||||
#
|
||||
# So far the following have been observed in a jmap call
|
||||
# that was not in a race with target process termination:
|
||||
#
|
||||
# (Solaris specific, 2nd sample)
|
||||
# <pid>: Unable to open door: target process not responding or HotSpot VM not loaded
|
||||
# The -F option can be used when the target process is not responding
|
||||
#
|
||||
# (on Solaris so far)
|
||||
# java.io.IOException
|
||||
#
|
||||
# (on Solaris so far, 1st sample)
|
||||
# <pid>: Permission denied
|
||||
#
|
||||
sed 's/^/INFO: /' "$TEST_NAME.jmap"
|
||||
|
||||
if [ "$loop_cnt" = "$loop_cnt_on_retry" ]; then
|
||||
# loop count hasn't changed
|
||||
jmap_retry_cnt=`expr $jmap_retry_cnt + 1`
|
||||
else
|
||||
# loop count has changed so remember it
|
||||
jmap_retry_cnt=1
|
||||
loop_cnt_on_retry="$loop_cnt"
|
||||
fi
|
||||
|
||||
# This is '-ge' because we have the original attempt plus
|
||||
# MAX_JMAP_TRY_CNT - 1 retries.
|
||||
if [ "$jmap_retry_cnt" -ge "$MAX_JMAP_TRY_CNT" ]; then
|
||||
echo "INFO: jmap failed $MAX_JMAP_TRY_CNT times in a row" \
|
||||
"without making any progress."
|
||||
echo "FAIL: jmap is unable to take any samples." >&2
|
||||
killApplication
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# short delay and try again
|
||||
# Note: sleep 1 didn't help with "<pid>: Permission denied"
|
||||
sleep 2
|
||||
echo "INFO: retrying jmap (retry=$jmap_retry_cnt, loop=$loop_cnt)."
|
||||
continue
|
||||
fi
|
||||
|
||||
set +e
|
||||
instance_cnt=`grep "${PATTERN_WS}${TARGET_CLASS}${PATTERN_EOL}" \
|
||||
"$TEST_NAME.jmap" \
|
||||
| sed '
|
||||
# strip leading whitespace; does nothing in JDK1.5.0
|
||||
s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <#bytes> in JDK1.5.0; does nothing otherwise
|
||||
s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <num>: field; does nothing in JDK1.5.0
|
||||
s/^[1-9][0-9]*:'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <class_name> field
|
||||
s/'"${PATTERN_WS}"'.*//
|
||||
'`
|
||||
set -e
|
||||
if [ -z "$instance_cnt" ]; then
|
||||
echo "INFO: instance count is unexpectedly empty"
|
||||
if [ "$loop_cnt" = 0 ]; then
|
||||
echo "INFO: on the first iteration so no sample was found."
|
||||
echo "INFO: There is likely a problem with the sed filter."
|
||||
echo "INFO: start of jmap output:"
|
||||
cat "$TEST_NAME.jmap"
|
||||
echo "INFO: end of jmap output."
|
||||
echo "FAIL: cannot find the instance count value." >&2
|
||||
killApplication
|
||||
exit 2
|
||||
fi
|
||||
else
|
||||
echo "INFO: instance_cnt = $instance_cnt"
|
||||
|
||||
if [ "$instance_cnt" -gt "$prev_instance_cnt" ]; then
|
||||
increasing_cnt=`expr $increasing_cnt + 1`
|
||||
else
|
||||
# actually decreasing or the same
|
||||
decreasing_cnt=`expr $decreasing_cnt + 1`
|
||||
|
||||
# For this particular WeakReference leak, the count was
|
||||
# always observed to be increasing so if we get a decreasing
|
||||
# or the same count, then the leak is fixed in the bits
|
||||
# being tested.
|
||||
echo "INFO: finishing early due to non-increasing instance count."
|
||||
finished_early=true
|
||||
killApplication
|
||||
break
|
||||
fi
|
||||
prev_instance_cnt="$instance_cnt"
|
||||
fi
|
||||
|
||||
# delay between samples
|
||||
sleep 5
|
||||
|
||||
loop_cnt=`expr $loop_cnt + 1`
|
||||
done
|
||||
|
||||
if [ $finished_early = false ]; then
|
||||
stopApplication "$TEST_NAME.port"
|
||||
waitForApplication
|
||||
fi
|
||||
|
||||
echo "INFO: $TEST_NAME has finished running."
|
||||
echo "INFO: increasing_cnt = $increasing_cnt"
|
||||
echo "INFO: decreasing_cnt = $decreasing_cnt"
|
||||
if [ "$jmap_retry_cnt" -gt 0 ]; then
|
||||
echo "INFO: jmap_retry_cnt = $jmap_retry_cnt (in $loop_cnt iterations)"
|
||||
fi
|
||||
|
||||
if [ "$loop_cnt" = 0 ]; then
|
||||
echo "FAIL: jmap is unable to take any samples." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "INFO: The instance count of" `eval echo $TARGET_CLASS` "objects"
|
||||
if [ "$decreasing_cnt" = 0 ]; then
|
||||
echo "INFO: is always increasing."
|
||||
echo "FAIL: This indicates that there is a memory leak." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "INFO: is not always increasing."
|
||||
echo "PASS: This indicates that there is not a memory leak."
|
||||
exit 0
|
||||
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 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.
|
||||
*/
|
||||
|
||||
import java.util.logging.*;
|
||||
|
||||
public class LoggerWeakRefLeak extends SimpleApplication {
|
||||
// The test driver script will allow this program to run until we
|
||||
// reach DEFAULT_LOOP_TIME or a decrease in instance counts is
|
||||
// observed. For these particular WeakReference leaks, the count
|
||||
// was always observed to be increasing so if we get a decreasing
|
||||
// count, then the leaks are fixed in the bits being tested.
|
||||
// Two minutes has been enough time to observe a decrease in
|
||||
// fixed bits on overloaded systems, but the test will likely
|
||||
// finish more quickly.
|
||||
public static int DEFAULT_LOOP_TIME = 120; // time is in seconds
|
||||
|
||||
// execute the LoggerWeakRefLeak app work
|
||||
public void doMyAppWork(String[] args) throws Exception {
|
||||
int loop_time = 0;
|
||||
int max_loop_time = DEFAULT_LOOP_TIME;
|
||||
|
||||
// args[0] is the port-file
|
||||
if (args.length < 2) {
|
||||
System.out.println("INFO: using default time of "
|
||||
+ max_loop_time + " seconds.");
|
||||
} else {
|
||||
try {
|
||||
max_loop_time = Integer.parseInt(args[1]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
throw new RuntimeException("Error: '" + args[1]
|
||||
+ "': is not a valid seconds value.");
|
||||
}
|
||||
}
|
||||
|
||||
long count = 0;
|
||||
int loggerCount = 0;
|
||||
long now = 0;
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
while (now < (startTime + (max_loop_time * 1000))) {
|
||||
if ((count % 1000) == 0) {
|
||||
// Print initial call count to let caller know that
|
||||
// we're up and running and then periodically
|
||||
System.out.println("INFO: call count = " + count);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 100; i++) {
|
||||
// This Logger call is leaking two different WeakReferences:
|
||||
// - one in LogManager.LogNode
|
||||
// - one in Logger.kids
|
||||
java.util.logging.Logger.getLogger("logger-" + loggerCount);
|
||||
count++;
|
||||
if (++loggerCount >= 25000) {
|
||||
// Limit the Logger namespace used by the test so
|
||||
// the weak refs in LogManager.loggers that are
|
||||
// being properly managed don't skew the counts
|
||||
// by too much.
|
||||
loggerCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// delay for 1/10 of a second to avoid CPU saturation
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ie) {
|
||||
// ignore any exceptions
|
||||
}
|
||||
|
||||
now = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
System.out.println("INFO: final loop count = " + count);
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
AnonLoggerWeakRefLeak myApp = new AnonLoggerWeakRefLeak();
|
||||
|
||||
SimpleApplication.setMyApp(myApp);
|
||||
|
||||
SimpleApplication.main(args);
|
||||
}
|
||||
}
|
||||
@ -1,254 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2010, 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 6942989
|
||||
# @summary Check for WeakReference leak in Logger objects
|
||||
# @author Daniel D. Daugherty
|
||||
#
|
||||
# @library ../../../sun/tools/common
|
||||
# @build SimpleApplication ShutdownSimpleApplication
|
||||
# @build LoggerWeakRefLeak
|
||||
# @run shell/timeout=240 LoggerWeakRefLeak.sh
|
||||
|
||||
# The timeout is: 2 minutes for infrastructure and 2 minutes for the test
|
||||
#
|
||||
|
||||
. ${TESTSRC}/../../../sun/tools/common/CommonSetup.sh
|
||||
. ${TESTSRC}/../../../sun/tools/common/ApplicationSetup.sh
|
||||
|
||||
|
||||
TEST_NAME="LoggerWeakRefLeak"
|
||||
TARGET_CLASS="java\.lang\.ref\.WeakReference"
|
||||
|
||||
|
||||
# MAIN begins here
|
||||
#
|
||||
|
||||
seconds=
|
||||
if [ "$#" -gt 0 ]; then
|
||||
seconds="$1"
|
||||
fi
|
||||
|
||||
# see if this version of jmap supports the '-histo:live' option
|
||||
jmap_option="-histo:live"
|
||||
set +e
|
||||
"${JMAP}" 2>&1 | grep ':live' > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" != 0 ]; then
|
||||
# usage message doesn't show ':live' option
|
||||
|
||||
if $isWindows; then
|
||||
# If SA isn't present, then jmap gives a different usage message
|
||||
# that doesn't show the ':live' option. However, that's a bug that
|
||||
# is covered by 6971851 so we try using the option just to be sure.
|
||||
# For some reason, this problem has only been seen on OpenJDK6 on
|
||||
# Windows. Not sure why.
|
||||
set +e
|
||||
# Note: Don't copy this code to try probing process 0 on Linux; it
|
||||
# will kill the process group in strange ways.
|
||||
"${JMAP}" "$jmap_option" 0 2>&1 | grep 'Usage' > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" = 0 ]; then
|
||||
# Usage message generated so flag the problem.
|
||||
status=1
|
||||
else
|
||||
# No usage message so clear the flag.
|
||||
status=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$status" != 0 ]; then
|
||||
echo "WARNING: 'jmap $jmap_option' is not supported on this platform"
|
||||
echo "WARNING: so this test cannot work reliably. Aborting!"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Start application and use TEST_NAME.port for coordination
|
||||
startApplication "$TEST_NAME" "$TEST_NAME.port" $seconds
|
||||
|
||||
finished_early=false
|
||||
|
||||
decreasing_cnt=0
|
||||
increasing_cnt=0
|
||||
loop_cnt=0
|
||||
prev_instance_cnt=0
|
||||
|
||||
MAX_JMAP_TRY_CNT=10
|
||||
jmap_retry_cnt=0
|
||||
loop_cnt_on_retry=0
|
||||
|
||||
while true; do
|
||||
# see if the target process has finished its run and bail if it has
|
||||
set +e
|
||||
grep "^INFO: final loop count = " "$appOutput" > /dev/null 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
if [ "$status" = 0 ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
# Output format for 'jmap -histo' in JDK1.5.0:
|
||||
#
|
||||
# <#bytes> <#instances> <class_name>
|
||||
#
|
||||
# Output format for 'jmap -histo:live':
|
||||
#
|
||||
# <num>: <#instances> <#bytes> <class_name>
|
||||
#
|
||||
set +e
|
||||
"${JMAP}" "$jmap_option" "$appJavaPid" > "$TEST_NAME.jmap" 2>&1
|
||||
status="$?"
|
||||
set -e
|
||||
|
||||
if [ "$status" != 0 ]; then
|
||||
echo "INFO: jmap exited with exit code = $status"
|
||||
|
||||
# There are intermittent jmap failures; see 6498448.
|
||||
#
|
||||
# So far the following have been observed in a jmap call
|
||||
# that was not in a race with target process termination:
|
||||
#
|
||||
# (Solaris specific, 2nd sample)
|
||||
# <pid>: Unable to open door: target process not responding or HotSpot VM not loaded
|
||||
# The -F option can be used when the target process is not responding
|
||||
#
|
||||
# (on Solaris so far)
|
||||
# java.io.IOException
|
||||
#
|
||||
# (on Solaris so far, 1st sample)
|
||||
# <pid>: Permission denied
|
||||
#
|
||||
sed 's/^/INFO: /' "$TEST_NAME.jmap"
|
||||
|
||||
if [ "$loop_cnt" = "$loop_cnt_on_retry" ]; then
|
||||
# loop count hasn't changed
|
||||
jmap_retry_cnt=`expr $jmap_retry_cnt + 1`
|
||||
else
|
||||
# loop count has changed so remember it
|
||||
jmap_retry_cnt=1
|
||||
loop_cnt_on_retry="$loop_cnt"
|
||||
fi
|
||||
|
||||
# This is '-ge' because we have the original attempt plus
|
||||
# MAX_JMAP_TRY_CNT - 1 retries.
|
||||
if [ "$jmap_retry_cnt" -ge "$MAX_JMAP_TRY_CNT" ]; then
|
||||
echo "INFO: jmap failed $MAX_JMAP_TRY_CNT times in a row" \
|
||||
"without making any progress."
|
||||
echo "FAIL: jmap is unable to take any samples." >&2
|
||||
killApplication
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# short delay and try again
|
||||
# Note: sleep 1 didn't help with "<pid>: Permission denied"
|
||||
sleep 2
|
||||
echo "INFO: retrying jmap (retry=$jmap_retry_cnt, loop=$loop_cnt)."
|
||||
continue
|
||||
fi
|
||||
|
||||
set +e
|
||||
instance_cnt=`grep "${PATTERN_WS}${TARGET_CLASS}${PATTERN_EOL}" \
|
||||
"$TEST_NAME.jmap" \
|
||||
| sed '
|
||||
# strip leading whitespace; does nothing in JDK1.5.0
|
||||
s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <#bytes> in JDK1.5.0; does nothing otherwise
|
||||
s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <num>: field; does nothing in JDK1.5.0
|
||||
s/^[1-9][0-9]*:'"${PATTERN_WS}${PATTERN_WS}"'*//
|
||||
# strip <class_name> field
|
||||
s/'"${PATTERN_WS}"'.*//
|
||||
'`
|
||||
set -e
|
||||
if [ -z "$instance_cnt" ]; then
|
||||
echo "INFO: instance count is unexpectedly empty"
|
||||
if [ "$loop_cnt" = 0 ]; then
|
||||
echo "INFO: on the first iteration so no sample was found."
|
||||
echo "INFO: There is likely a problem with the sed filter."
|
||||
echo "INFO: start of jmap output:"
|
||||
cat "$TEST_NAME.jmap"
|
||||
echo "INFO: end of jmap output."
|
||||
echo "FAIL: cannot find the instance count value." >&2
|
||||
killApplication
|
||||
exit 2
|
||||
fi
|
||||
else
|
||||
echo "INFO: instance_cnt = $instance_cnt"
|
||||
|
||||
if [ "$instance_cnt" -gt "$prev_instance_cnt" ]; then
|
||||
increasing_cnt=`expr $increasing_cnt + 1`
|
||||
else
|
||||
# actually decreasing or the same
|
||||
decreasing_cnt=`expr $decreasing_cnt + 1`
|
||||
|
||||
# For these particular WeakReference leaks, the count was
|
||||
# always observed to be increasing so if we get a decreasing
|
||||
# or the same count, then the leaks are fixed in the bits
|
||||
# being tested.
|
||||
echo "INFO: finishing early due to non-increasing instance count."
|
||||
finished_early=true
|
||||
killApplication
|
||||
break
|
||||
fi
|
||||
prev_instance_cnt="$instance_cnt"
|
||||
fi
|
||||
|
||||
# delay between samples
|
||||
sleep 5
|
||||
|
||||
loop_cnt=`expr $loop_cnt + 1`
|
||||
done
|
||||
|
||||
if [ $finished_early = false ]; then
|
||||
stopApplication "$TEST_NAME.port"
|
||||
waitForApplication
|
||||
fi
|
||||
|
||||
echo "INFO: $TEST_NAME has finished running."
|
||||
echo "INFO: increasing_cnt = $increasing_cnt"
|
||||
echo "INFO: decreasing_cnt = $decreasing_cnt"
|
||||
if [ "$jmap_retry_cnt" -gt 0 ]; then
|
||||
echo "INFO: jmap_retry_cnt = $jmap_retry_cnt (in $loop_cnt iterations)"
|
||||
fi
|
||||
|
||||
if [ "$loop_cnt" = 0 ]; then
|
||||
echo "FAIL: jmap is unable to take any samples." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "INFO: The instance count of" `eval echo $TARGET_CLASS` "objects"
|
||||
if [ "$decreasing_cnt" = 0 ]; then
|
||||
echo "INFO: is always increasing."
|
||||
echo "FAIL: This indicates that there is a memory leak." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "INFO: is not always increasing."
|
||||
echo "PASS: This indicates that there is not a memory leak."
|
||||
exit 0
|
||||
164
jdk/test/java/util/logging/TestLoggerWeakRefLeak.java
Normal file
164
jdk/test/java/util/logging/TestLoggerWeakRefLeak.java
Normal file
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import static jdk.testlibrary.Asserts.assertGreaterThan;
|
||||
import jdk.testlibrary.ProcessTools;
|
||||
|
||||
import com.sun.tools.attach.AttachNotSupportedException;
|
||||
import com.sun.tools.attach.VirtualMachine;
|
||||
|
||||
import sun.tools.attach.HotSpotVirtualMachine;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6942989
|
||||
* @summary Check for WeakReference leak in Logger and anonymous Logger objects
|
||||
* @library /lib/testlibrary
|
||||
* @build jdk.testlibrary.*
|
||||
* @run main/othervm TestLoggerWeakRefLeak Logger
|
||||
* @run main/othervm TestLoggerWeakRefLeak AnonymousLogger
|
||||
*/
|
||||
public class TestLoggerWeakRefLeak {
|
||||
|
||||
private static final String TARGET_CLASS = "java.lang.ref.WeakReference";
|
||||
private static final int INSTANCE_COUNT = 100;
|
||||
private static int loggerCount = 0;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
if (args[0].equals("AnonymousLogger")) {
|
||||
System.out.println("Test for WeakReference leak in AnonymousLogger object");
|
||||
testIfLeaking(TestLoggerWeakRefLeak::callAnonymousLogger);
|
||||
} else {
|
||||
System.out.println("Test for WeakReference leak in Logger object");
|
||||
testIfLeaking(TestLoggerWeakRefLeak::callLogger);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For these particular WeakReference leaks, the count was always observed
|
||||
* to be increasing so if decreasing or the same count is observed,
|
||||
* then there is no leak.
|
||||
*/
|
||||
private static void testIfLeaking(Runnable callLogger) throws Exception {
|
||||
long count = 0;
|
||||
int instanceCount = 0;
|
||||
int previousInstanceCount = 0;
|
||||
int increasingCount = 0;
|
||||
int decreasingCount = 0;
|
||||
|
||||
while (true) {
|
||||
callLogger.run();
|
||||
count += INSTANCE_COUNT;
|
||||
|
||||
if ((count % 1000) == 0) {
|
||||
System.out.println("call count = " + count);
|
||||
|
||||
instanceCount = getInstanceCountFromHeapHisto();
|
||||
if (instanceCount > previousInstanceCount) {
|
||||
increasingCount++;
|
||||
} else {
|
||||
decreasingCount++;
|
||||
System.out.println("increasing count: " + increasingCount);
|
||||
System.out.println("decreasing or the same count: " + decreasingCount);
|
||||
System.out.println("Test passed: decreasing or the same instance count is observed");
|
||||
break;
|
||||
}
|
||||
previousInstanceCount = instanceCount;
|
||||
}
|
||||
|
||||
delayExecution();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This Logger call is leaking two different WeakReferences:
|
||||
* - one in LogManager.LogNode
|
||||
* - one in Logger.kids
|
||||
*/
|
||||
private static void callLogger() {
|
||||
for (int i = 0; i < INSTANCE_COUNT; i++) {
|
||||
java.util.logging.Logger.getLogger("logger-" + loggerCount);
|
||||
if (++loggerCount >= 25000) {
|
||||
// Limit the Logger namespace used by the test so the weak refs
|
||||
// in LogManager.loggers that are being properly managed
|
||||
// don't skew the counts by too much.
|
||||
loggerCount = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This Logger call is leaking a WeakReference in Logger.kids
|
||||
*/
|
||||
private static void callAnonymousLogger() {
|
||||
for (int i = 0; i < INSTANCE_COUNT; i++) {
|
||||
java.util.logging.Logger.getAnonymousLogger();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 'vm.heapHisto("-live")' will request a full GC
|
||||
*/
|
||||
private static int getInstanceCountFromHeapHisto() throws AttachNotSupportedException, Exception {
|
||||
int instanceCount = 0;
|
||||
|
||||
HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine
|
||||
.attach(Integer.toString(ProcessTools.getProcessId()));
|
||||
try {
|
||||
try (InputStream heapHistoStream = vm.heapHisto("-live");
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(heapHistoStream))) {
|
||||
String inputLine;
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
if (inputLine.contains(TARGET_CLASS)) {
|
||||
instanceCount = Integer.parseInt(inputLine
|
||||
.split("[ ]+")[2]);
|
||||
System.out.println("instance count: " + instanceCount);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
vm.detach();
|
||||
}
|
||||
|
||||
assertGreaterThan(instanceCount, 0, "No instances of " + TARGET_CLASS + " are found");
|
||||
|
||||
return instanceCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delay for 1/10 of a second to avoid CPU saturation
|
||||
*/
|
||||
private static void delayExecution() {
|
||||
try {
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ie) {
|
||||
// Ignore any exceptions
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 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
|
||||
@ -37,7 +37,6 @@
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import javax.management.Attribute;
|
||||
import javax.management.JMX;
|
||||
import javax.management.MBeanServer;
|
||||
import javax.management.Notification;
|
||||
@ -95,18 +94,16 @@ public class CounterMonitorDeadlockTest {
|
||||
monitorProxy.setInitThreshold(100);
|
||||
monitorProxy.setGranularityPeriod(10L); // 10 ms
|
||||
monitorProxy.setNotify(true);
|
||||
monitorProxy.start();
|
||||
|
||||
final int initGetCount = observedProxy.getGetCount();
|
||||
int getCount;
|
||||
monitorProxy.start();
|
||||
|
||||
System.out.println("Checking GetCount, possible deadlock if timeout.");
|
||||
do { // 8038322. Until timeout of testing harness
|
||||
Thread.sleep(200);
|
||||
} while ((getCount=observedProxy.getGetCount()) == initGetCount);
|
||||
} while ((observedProxy.getGetCount()) == initGetCount);
|
||||
System.out.println("Done!");
|
||||
|
||||
if (getCount <= initGetCount)
|
||||
throw new Exception("Test failed: presumable deadlock");
|
||||
// This won't show up as a deadlock in CTRL-\ or in
|
||||
// ThreadMXBean.findDeadlockedThreads(), because they don't
|
||||
// see that thread A is waiting for thread B (B.join()), and
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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.
|
||||
*/
|
||||
package jdk.testlibrary;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
/**
|
||||
* A classloader, which using target classloader in case provided condition
|
||||
* for class name is met, and using parent otherwise
|
||||
*/
|
||||
public class FilterClassLoader extends ClassLoader {
|
||||
|
||||
private final ClassLoader target;
|
||||
private final Predicate<String> condition;
|
||||
|
||||
public FilterClassLoader(ClassLoader target, ClassLoader parent,
|
||||
Predicate<String> condition) {
|
||||
super(parent);
|
||||
this.condition = condition;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||
if (condition.test(name)) {
|
||||
return target.loadClass(name);
|
||||
}
|
||||
return super.loadClass(name);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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.
|
||||
*/
|
||||
package jdk.testlibrary;
|
||||
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
/**
|
||||
* An url classloader, which trying to load class from provided URL[] first,
|
||||
* and using parent classloader in case it failed
|
||||
*/
|
||||
public class ParentLastURLClassLoader extends URLClassLoader {
|
||||
|
||||
public ParentLastURLClassLoader(URL urls[], ClassLoader parent) {
|
||||
super(urls, parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||
try {
|
||||
Class c = findClass(name);
|
||||
if (c != null) {
|
||||
return c;
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
// ignore
|
||||
}
|
||||
return super.loadClass(name);
|
||||
}
|
||||
}
|
||||
@ -28,6 +28,15 @@ public class Platform {
|
||||
private static final String dataModel = System.getProperty("sun.arch.data.model");
|
||||
private static final String vmVersion = System.getProperty("java.vm.version");
|
||||
private static final String osArch = System.getProperty("os.arch");
|
||||
private static final String vmName = System.getProperty("java.vm.name");
|
||||
|
||||
public static boolean isClient() {
|
||||
return vmName.endsWith(" Client VM");
|
||||
}
|
||||
|
||||
public static boolean isServer() {
|
||||
return vmName.endsWith(" Server VM");
|
||||
}
|
||||
|
||||
public static boolean is32bit() {
|
||||
return dataModel.equals("32");
|
||||
|
||||
@ -39,6 +39,7 @@ import java.util.Collections;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.BooleanSupplier;
|
||||
|
||||
/**
|
||||
* Common library for various test helper functions.
|
||||
@ -270,25 +271,6 @@ public final class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns file content as a list of strings
|
||||
*
|
||||
* @param file File to operate on
|
||||
* @return List of strings
|
||||
* @throws IOException
|
||||
*/
|
||||
public static List<String> fileAsList(File file) throws IOException {
|
||||
assertTrue(file.exists() && file.isFile(),
|
||||
file.getAbsolutePath() + " does not exist or not a file");
|
||||
List<String> output = new ArrayList<>();
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(file.getAbsolutePath()))) {
|
||||
while (reader.ready()) {
|
||||
output.add(reader.readLine().replace(NEW_LINE, ""));
|
||||
}
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts the provided timeout value for the TIMEOUT_FACTOR
|
||||
* @param tOut the timeout value to be adjusted
|
||||
@ -298,4 +280,50 @@ public final class Utils {
|
||||
public static long adjustTimeout(long tOut) {
|
||||
return Math.round(tOut * Utils.TIMEOUT_FACTOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for condition to be true
|
||||
*
|
||||
* @param condition, a condition to wait for
|
||||
*/
|
||||
public static final void waitForCondition(BooleanSupplier condition) {
|
||||
waitForCondition(condition, -1L, 100L);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait until timeout for condition to be true
|
||||
*
|
||||
* @param condition, a condition to wait for
|
||||
* @param timeout a time in milliseconds to wait for condition to be true
|
||||
* specifying -1 will wait forever
|
||||
* @return condition value, to determine if wait was successfull
|
||||
*/
|
||||
public static final boolean waitForCondition(BooleanSupplier condition,
|
||||
long timeout) {
|
||||
return waitForCondition(condition, timeout, 100L);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait until timeout for condition to be true for specified time
|
||||
*
|
||||
* @param condition, a condition to wait for
|
||||
* @param timeout a time in milliseconds to wait for condition to be true,
|
||||
* specifying -1 will wait forever
|
||||
* @param sleepTime a time to sleep value in milliseconds
|
||||
* @return condition value, to determine if wait was successfull
|
||||
*/
|
||||
public static final boolean waitForCondition(BooleanSupplier condition,
|
||||
long timeout, long sleepTime) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
while (!(condition.getAsBoolean() || (timeout != -1L
|
||||
&& ((System.currentTimeMillis() - startTime) > timeout)))) {
|
||||
try {
|
||||
Thread.sleep(sleepTime);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
return condition.getAsBoolean();
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,13 +29,14 @@
|
||||
*/
|
||||
|
||||
import sun.awt.datatransfer.DataTransferer;
|
||||
|
||||
import java.util.Comparator;
|
||||
import sun.datatransfer.DataFlavorUtil;
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
|
||||
public class DataFlavorComparatorTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
DataTransferer.DataFlavorComparator comparator = new DataTransferer.DataFlavorComparator();
|
||||
Comparator<DataFlavor> comparator = DataFlavorUtil.getDataFlavorComparator();
|
||||
DataFlavor flavor1 = DataFlavor.imageFlavor;
|
||||
DataFlavor flavor2 = DataFlavor.selectionHtmlFlavor;
|
||||
if (comparator.compare(flavor1, flavor2) == 0) {
|
||||
|
||||
@ -26,20 +26,22 @@ import com.sun.tools.jdeps.ClassFileReader;
|
||||
import static com.sun.tools.classfile.ConstantPool.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileVisitResult;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.FileSystem;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.SimpleFileVisitor;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.FutureTask;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/*
|
||||
* @test
|
||||
@ -52,8 +54,10 @@ import java.util.concurrent.FutureTask;
|
||||
public class CallerSensitiveFinder {
|
||||
private static int numThreads = 3;
|
||||
private static boolean verbose = false;
|
||||
private final ExecutorService pool;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
List<Path> classes = new ArrayList<>();
|
||||
Stream<Path> classes = null;
|
||||
String testclasses = System.getProperty("test.classes", ".");
|
||||
int i = 0;
|
||||
while (i < args.length) {
|
||||
@ -65,25 +69,30 @@ public class CallerSensitiveFinder {
|
||||
if (!p.toFile().exists()) {
|
||||
throw new IllegalArgumentException(arg + " does not exist");
|
||||
}
|
||||
classes.add(p);
|
||||
classes = Stream.of(p);
|
||||
}
|
||||
}
|
||||
if (classes.isEmpty()) {
|
||||
classes.addAll(PlatformClassPath.getJREClasses());
|
||||
}
|
||||
CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
|
||||
|
||||
if (classes == null) {
|
||||
classes = getPlatformClasses();
|
||||
}
|
||||
|
||||
CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
|
||||
List<String> errors = csfinder.run(classes);
|
||||
|
||||
if (!errors.isEmpty()) {
|
||||
throw new RuntimeException(errors.size() +
|
||||
" caller-sensitive methods are missing @CallerSensitive annotation");
|
||||
}
|
||||
}
|
||||
|
||||
private final List<String> csMethodsMissingAnnotation = new ArrayList<>();
|
||||
private final List<String> csMethodsMissingAnnotation =
|
||||
Collections.synchronizedList(new ArrayList<>());
|
||||
private final ReferenceFinder finder;
|
||||
public CallerSensitiveFinder() {
|
||||
this.finder = new ReferenceFinder(getFilter(), getVisitor());
|
||||
pool = Executors.newFixedThreadPool(numThreads);
|
||||
|
||||
}
|
||||
|
||||
private ReferenceFinder.Filter getFilter() {
|
||||
@ -123,11 +132,17 @@ public class CallerSensitiveFinder {
|
||||
};
|
||||
}
|
||||
|
||||
public List<String> run(List<Path> classes) throws IOException, InterruptedException,
|
||||
public List<String> run(Stream<Path> classes)throws IOException, InterruptedException,
|
||||
ExecutionException, ConstantPoolException
|
||||
{
|
||||
ExecutorService pool = Executors.newFixedThreadPool(numThreads);
|
||||
for (Path path : classes) {
|
||||
classes.forEach(this::processPath);
|
||||
waitForCompletion();
|
||||
pool.shutdown();
|
||||
return csMethodsMissingAnnotation;
|
||||
}
|
||||
|
||||
void processPath(Path path) {
|
||||
try {
|
||||
ClassFileReader reader = ClassFileReader.newInstance(path);
|
||||
for (ClassFile cf : reader.getClassFiles()) {
|
||||
String classFileName = cf.getName();
|
||||
@ -137,10 +152,11 @@ public class CallerSensitiveFinder {
|
||||
// - visit and find method references matching the given method name
|
||||
pool.submit(getTask(cf));
|
||||
}
|
||||
} catch (IOException x) {
|
||||
throw new UncheckedIOException(x);
|
||||
} catch (ConstantPoolException x) {
|
||||
throw new RuntimeException(x);
|
||||
}
|
||||
waitForCompletion();
|
||||
pool.shutdown();
|
||||
return csMethodsMissingAnnotation;
|
||||
}
|
||||
|
||||
private static final String CALLER_SENSITIVE_ANNOTATION = "Lsun/reflect/CallerSensitive;";
|
||||
@ -178,61 +194,34 @@ public class CallerSensitiveFinder {
|
||||
for (FutureTask<Void> t : tasks) {
|
||||
t.get();
|
||||
}
|
||||
if (tasks.isEmpty()) {
|
||||
throw new RuntimeException("No classes found, or specified.");
|
||||
}
|
||||
System.out.println("Parsed " + tasks.size() + " classfiles");
|
||||
}
|
||||
|
||||
static class PlatformClassPath {
|
||||
static List<Path> getJREClasses() throws IOException {
|
||||
List<Path> result = new ArrayList<Path>();
|
||||
Path home = Paths.get(System.getProperty("java.home"));
|
||||
static Stream<Path> getPlatformClasses() throws IOException {
|
||||
Path home = Paths.get(System.getProperty("java.home"));
|
||||
|
||||
if (home.endsWith("jre")) {
|
||||
// jar files in <javahome>/jre/lib
|
||||
// skip <javahome>/lib
|
||||
result.addAll(addJarFiles(home.resolve("lib")));
|
||||
} else if (home.resolve("lib").toFile().exists()) {
|
||||
// either a JRE or a jdk build image
|
||||
File classes = home.resolve("classes").toFile();
|
||||
if (classes.exists() && classes.isDirectory()) {
|
||||
// jdk build outputdir
|
||||
result.add(classes.toPath());
|
||||
}
|
||||
// add other JAR files
|
||||
result.addAll(addJarFiles(home.resolve("lib")));
|
||||
} else {
|
||||
throw new RuntimeException("\"" + home + "\" not a JDK home");
|
||||
}
|
||||
return result;
|
||||
// Either an exploded build or an image.
|
||||
File classes = home.resolve("modules").toFile();
|
||||
if (classes.isDirectory()) {
|
||||
return Stream.of(classes.toPath());
|
||||
} else {
|
||||
return jrtPaths();
|
||||
}
|
||||
}
|
||||
|
||||
static List<Path> addJarFiles(final Path root) throws IOException {
|
||||
final List<Path> result = new ArrayList<Path>();
|
||||
final Path ext = root.resolve("ext");
|
||||
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
|
||||
@Override
|
||||
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
|
||||
throws IOException {
|
||||
if (dir.equals(root) || dir.equals(ext)) {
|
||||
return FileVisitResult.CONTINUE;
|
||||
} else {
|
||||
// skip other cobundled JAR files
|
||||
return FileVisitResult.SKIP_SUBTREE;
|
||||
}
|
||||
}
|
||||
static Stream<Path> jrtPaths() {
|
||||
FileSystem jrt = FileSystems.getFileSystem(URI.create("jrt:/"));
|
||||
Path root = jrt.getPath("/");
|
||||
|
||||
@Override
|
||||
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
|
||||
throws IOException {
|
||||
File f = file.toFile();
|
||||
String fn = f.getName();
|
||||
// parse alt-rt.jar as well
|
||||
if (fn.endsWith(".jar") && !fn.equals("jfxrt.jar")) {
|
||||
result.add(file);
|
||||
}
|
||||
return FileVisitResult.CONTINUE;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
try {
|
||||
return Files.walk(root)
|
||||
.filter(p -> p.getNameCount() > 1)
|
||||
.filter(p -> p.toString().endsWith(".class"));
|
||||
} catch (IOException x) {
|
||||
throw new UncheckedIOException(x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,11 +34,13 @@
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class MissingCallerSensitive {
|
||||
public static void main(String[] args) throws Exception {
|
||||
String testclasses = System.getProperty("test.classes", ".");
|
||||
List<Path> classes = new ArrayList<>();
|
||||
classes.add(Paths.get(testclasses, "MissingCallerSensitive.class"));
|
||||
|
||||
Stream<Path> classes = Stream.of(Paths.get(testclasses, "MissingCallerSensitive.class"));
|
||||
|
||||
CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
|
||||
List<String> errors = csfinder.run(classes);
|
||||
|
||||
265
jdk/test/sun/security/pkcs11/Mac/MacKAT.java
Normal file
265
jdk/test/sun/security/pkcs11/Mac/MacKAT.java
Normal file
@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.Provider;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.SecretKey;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 4846410 6313661 4963723
|
||||
* @summary Basic known-answer-test for Hmac algorithms
|
||||
* @author Andreas Sterbenz
|
||||
* @library ..
|
||||
* @run main MacKAT
|
||||
*/
|
||||
public class MacKAT extends PKCS11Test {
|
||||
|
||||
private final static byte[] ALONG, BLONG, BKEY, BKEY_20, DDDATA_50,
|
||||
AAKEY_20, CDDATA_50, AAKEY_131;
|
||||
|
||||
static {
|
||||
ALONG = new byte[1024 * 128];
|
||||
Arrays.fill(ALONG, (byte)'a');
|
||||
BLONG = new byte[1024 * 128];
|
||||
Random random = new Random(12345678);
|
||||
random.nextBytes(BLONG);
|
||||
BKEY = new byte[128];
|
||||
random.nextBytes(BKEY);
|
||||
BKEY_20 = new byte[20];
|
||||
Arrays.fill(BKEY_20, (byte) 0x0b);
|
||||
DDDATA_50 = new byte[50];
|
||||
Arrays.fill(DDDATA_50, (byte) 0xdd);
|
||||
AAKEY_20 = new byte[20];
|
||||
Arrays.fill(AAKEY_20, (byte) 0xaa);
|
||||
CDDATA_50 = new byte[50];
|
||||
Arrays.fill(CDDATA_50, (byte) 0xcd);
|
||||
AAKEY_131 = new byte[131];
|
||||
Arrays.fill(AAKEY_131, (byte) 0xaa);
|
||||
}
|
||||
|
||||
private final static Test[] tests = {
|
||||
newMacTest("SslMacMD5",
|
||||
ALONG,
|
||||
"f4:ad:01:71:51:f6:89:56:72:a3:32:bf:d9:2a:f2:a5",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("SslMacMD5",
|
||||
BLONG,
|
||||
"34:1c:ad:a0:95:57:32:f8:8e:80:8f:ee:b2:d8:23:e5",
|
||||
"76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
|
||||
newMacTest("SslMacSHA1",
|
||||
ALONG,
|
||||
"11:c1:71:2e:61:be:4b:cf:bc:6d:e2:4c:58:ae:27:30:0b:24:a4:87",
|
||||
"23:ae:dd:61:87:6c:7a:45:47:2f:2c:8f:ea:64:99:3e:27:5f:97:a5"),
|
||||
newMacTest("SslMacSHA1",
|
||||
BLONG,
|
||||
"84:af:57:0a:af:ef:16:93:90:50:da:88:f8:ad:1a:c5:66:6c:94:d0",
|
||||
"9b:bb:e2:aa:9b:28:1c:95:0e:ea:30:21:98:a5:7e:31:9e:bf:5f:51"),
|
||||
newMacTest("HmacMD5",
|
||||
ALONG,
|
||||
"76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("HmacMD5",
|
||||
BLONG,
|
||||
"6c:22:79:bb:34:9e:da:f4:f5:cf:df:0c:62:3d:59:e0",
|
||||
"76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
|
||||
newMacTest("HmacMD5",
|
||||
BLONG,
|
||||
"e6:ad:00:c9:49:6b:98:fe:53:a2:b9:2d:7d:41:a2:03",
|
||||
BKEY),
|
||||
newMacTest("HmacSHA1",
|
||||
ALONG,
|
||||
"9e:b3:6e:35:fa:fb:17:2e:2b:f3:b0:4a:9d:38:83:c4:5f:6d:d9:00",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("HmacSHA1",
|
||||
BLONG,
|
||||
"80:2d:5b:ea:08:df:a4:1f:e5:3e:1c:fa:fc:ad:dd:31:da:15:60:2c",
|
||||
"76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
|
||||
newMacTest("HmacSHA1",
|
||||
BLONG,
|
||||
"a2:fa:2a:85:18:0e:94:b2:a5:e2:17:8b:2a:29:7a:95:cd:e8:aa:82",
|
||||
BKEY),
|
||||
newMacTest("HmacSHA256",
|
||||
ALONG,
|
||||
"3f:6d:08:df:0c:90:b0:e9:ed:13:4a:2e:c3:48:1d:3d:3e:61:2e:f1:"
|
||||
+ "30:c2:63:c4:58:57:03:c2:cb:87:15:07",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("HmacSHA256",
|
||||
BLONG,
|
||||
"e2:4e:a3:b9:0b:b8:99:e4:71:cf:ca:9f:f8:4e:f0:34:8b:19:9f:33:"
|
||||
+ "4b:1a:b7:13:f7:c8:57:92:e3:03:74:78",
|
||||
BKEY),
|
||||
newMacTest("HmacSHA384",
|
||||
ALONG,
|
||||
"d0:f0:d4:54:1c:0a:6d:81:ed:15:20:d7:0c:96:06:61:a0:ff:c9:ff:"
|
||||
+ "91:e9:a0:cd:e2:45:64:9d:93:4c:a9:fa:89:ae:c0:90:e6:"
|
||||
+ "0b:a1:a0:56:80:57:3b:ed:4b:b0:71",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("HmacSHA384",
|
||||
BLONG,
|
||||
"75:c4:ca:c7:f7:58:9d:d3:23:b1:1b:5c:93:2d:ec:7a:03:dc:8c:eb:"
|
||||
+ "8d:fe:79:46:4f:30:e7:99:62:de:44:e2:38:95:0e:79:91:"
|
||||
+ "78:2f:a4:05:0a:f0:17:10:38:a1:8e",
|
||||
BKEY),
|
||||
newMacTest("HmacSHA512",
|
||||
ALONG,
|
||||
"41:ea:4c:e5:31:3f:7c:18:0e:5e:95:a9:25:0a:10:58:e6:40:53:88:"
|
||||
+ "82:4f:5a:da:6f:29:de:04:7b:8e:d7:ed:7c:4d:b8:2a:48:"
|
||||
+ "2d:17:2a:2d:59:bb:81:9c:bf:33:40:04:77:44:fb:45:25:"
|
||||
+ "1f:fd:b9:29:f4:a6:69:a3:43:6f",
|
||||
"1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
|
||||
newMacTest("HmacSHA512",
|
||||
BLONG,
|
||||
"fb:cf:4b:c6:d5:49:5a:5b:0b:d9:2a:32:f5:fa:68:d2:68:a4:0f:ae:"
|
||||
+ "53:fc:49:12:e6:1d:53:cf:b2:cb:c5:c5:f2:2d:86:bd:14:"
|
||||
+ "61:30:c3:a6:6f:44:1f:77:9b:aa:a1:22:48:a9:dd:d0:45:"
|
||||
+ "86:d1:a1:82:53:13:c4:03:06:a3",
|
||||
BKEY),
|
||||
|
||||
// Test vectors From RFC 4231
|
||||
newMacTest("HmacSHA224",
|
||||
bytes("Hi There"),
|
||||
"89:6f:b1:12:8a:bb:df:19:68:32:10:7c:d4:9d:f3:3f:47:b4:b1:16:"
|
||||
+ "99:12:ba:4f:53:68:4b:22",
|
||||
BKEY_20),
|
||||
newMacTest("HmacSHA224",
|
||||
bytes("what do ya want for nothing?"),
|
||||
"a3:0e:01:09:8b:c6:db:bf:45:69:0f:3a:7e:9e:6d:0f:8b:be:a2:a3:"
|
||||
+ "9e:61:48:00:8f:d0:5e:44",
|
||||
bytes("Jefe")),
|
||||
newMacTest("HmacSHA224",
|
||||
DDDATA_50,
|
||||
"7f:b3:cb:35:88:c6:c1:f6:ff:a9:69:4d:7d:6a:d2:64:93:65:b0:c1:"
|
||||
+ "f6:5d:69:d1:ec:83:33:ea",
|
||||
AAKEY_20),
|
||||
newMacTest("HmacSHA224",
|
||||
CDDATA_50,
|
||||
"6c:11:50:68:74:01:3c:ac:6a:2a:bc:1b:b3:82:62:7c:ec:6a:90:d8:"
|
||||
+ "6e:fc:01:2d:e7:af:ec:5a",
|
||||
"01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:"
|
||||
+ "15:16:17:18:19"),
|
||||
newMacTest("HmacSHA224",
|
||||
bytes("Test Using Larger Than Block-Size Key - Hash Key First"),
|
||||
"95:e9:a0:db:96:20:95:ad:ae:be:9b:2d:6f:0d:bc:e2:d4:99:f1:12:"
|
||||
+ "f2:d2:b7:27:3f:a6:87:0e",
|
||||
AAKEY_131),
|
||||
newMacTest("HmacSHA224",
|
||||
bytes("This is a test using a larger than block-size key and "
|
||||
+ "a larger than block-size data. The key needs to be "
|
||||
+ "hashed before being used by the HMAC algorithm."),
|
||||
"3a:85:41:66:ac:5d:9f:02:3f:54:d5:17:d0:b3:9d:bd:94:67:70:db:"
|
||||
+ "9c:2b:95:c9:f6:f5:65:d1",
|
||||
AAKEY_131),
|
||||
};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
main(new MacKAT());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void main(Provider p) throws Exception {
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
List<String> algorithms = getSupportedAlgorithms("Mac", "", p);
|
||||
for (Test test : tests) {
|
||||
if(!algorithms.contains(test.getAlg())) {
|
||||
continue;
|
||||
}
|
||||
test.run(p);
|
||||
}
|
||||
|
||||
System.out.println("All tests passed");
|
||||
long stop = System.currentTimeMillis();
|
||||
System.out.println("Done (" + (stop - start) + " ms).");
|
||||
}
|
||||
|
||||
private static byte[] bytes(String s) {
|
||||
try {
|
||||
return s.getBytes("UTF8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static Test newMacTest(String alg, byte[] input, String macvalue,
|
||||
String key) {
|
||||
return new MacTest(alg, input, parse(macvalue), parse(key));
|
||||
}
|
||||
|
||||
private static Test newMacTest(String alg, byte[] input, String macvalue,
|
||||
byte[] key) {
|
||||
return new MacTest(alg, input, parse(macvalue), key);
|
||||
}
|
||||
|
||||
interface Test {
|
||||
void run(Provider p) throws Exception;
|
||||
String getAlg();
|
||||
}
|
||||
|
||||
static class MacTest implements Test {
|
||||
private final String alg;
|
||||
private final byte[] input;
|
||||
private final byte[] macvalue;
|
||||
private final byte[] key;
|
||||
|
||||
MacTest(String alg, byte[] input, byte[] macvalue, byte[] key) {
|
||||
this.alg = alg;
|
||||
this.input = input;
|
||||
this.macvalue = macvalue;
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAlg() {
|
||||
return alg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(Provider p) throws Exception {
|
||||
Mac mac = Mac.getInstance(alg, p);
|
||||
SecretKey keySpec = new SecretKeySpec(key, alg);
|
||||
mac.init(keySpec);
|
||||
mac.update(input);
|
||||
byte[] macv = mac.doFinal();
|
||||
if (Arrays.equals(macvalue, macv) == false) {
|
||||
System.out.println("Mac test for " + alg + " failed:");
|
||||
if (input.length < 256) {
|
||||
System.out.println("input: "
|
||||
+ PKCS11Test.toString(input));
|
||||
}
|
||||
System.out.println("key: " + PKCS11Test.toString(key));
|
||||
System.out.println("macvalue: "
|
||||
+ PKCS11Test.toString(macvalue));
|
||||
System.out.println("calculated: " + PKCS11Test.toString(macv));
|
||||
throw new Exception("Mac test for " + alg + " failed");
|
||||
}
|
||||
System.out.println("passed: " + alg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
125
jdk/test/sun/security/pkcs11/Mac/MacSameTest.java
Normal file
125
jdk/test/sun/security/pkcs11/Mac/MacSameTest.java
Normal file
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, 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.
|
||||
*/
|
||||
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.Provider;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.List;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8048603
|
||||
* @summary Check if doFinal and update operation result in same Mac
|
||||
* @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
|
||||
* @library ..
|
||||
* @run main MacSameTest
|
||||
*/
|
||||
public class MacSameTest extends PKCS11Test {
|
||||
|
||||
private static final int MESSAGE_SIZE = 25;
|
||||
private static final int OFFSET = 5;
|
||||
private static final int KEY_SIZE = 70;
|
||||
|
||||
/**
|
||||
* Initialize a message, instantiate a Mac object,
|
||||
* initialize the object with a SecretKey,
|
||||
* feed the message into the Mac object
|
||||
* all at once and get the output MAC as result1.
|
||||
* Reset the Mac object, chop the message into three pieces,
|
||||
* feed into the Mac object sequentially, and get the output MAC as result2.
|
||||
* Finally, compare result1 and result2 and see if they are the same.
|
||||
*
|
||||
* @param args the command line arguments
|
||||
*/
|
||||
public static void main(String[] args) throws Exception {
|
||||
main(new MacSameTest());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void main(Provider p) {
|
||||
List<String> algorithms = getSupportedAlgorithms("Mac", "Hmac", p);
|
||||
boolean success = true;
|
||||
for (String alg : algorithms) {
|
||||
try {
|
||||
doTest(alg, p);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Unexpected exception: " + e);
|
||||
e.printStackTrace();
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!success) {
|
||||
throw new RuntimeException("Test failed");
|
||||
}
|
||||
}
|
||||
|
||||
private void doTest(String algo, Provider provider)
|
||||
throws NoSuchAlgorithmException, NoSuchProviderException,
|
||||
InvalidKeyException {
|
||||
System.out.println("Test " + algo);
|
||||
Mac mac;
|
||||
try {
|
||||
mac = Mac.getInstance(algo, provider);
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
if ("SunPKCS11-Solaris".equals(provider.getName())) {
|
||||
// depending on Solaris configuration,
|
||||
// it can support HMAC or not with Mac
|
||||
System.out.println("Expected NoSuchAlgorithmException thrown: "
|
||||
+ nsae);
|
||||
return;
|
||||
}
|
||||
throw nsae;
|
||||
}
|
||||
|
||||
byte[] plain = new byte[MESSAGE_SIZE];
|
||||
for (int i = 0; i < MESSAGE_SIZE; i++) {
|
||||
plain[i] = (byte) (i % 256);
|
||||
}
|
||||
|
||||
byte[] tail = new byte[plain.length - OFFSET];
|
||||
System.arraycopy(plain, OFFSET, tail, 0, tail.length);
|
||||
|
||||
SecureRandom srdm = new SecureRandom();
|
||||
byte[] keyVal = new byte[KEY_SIZE];
|
||||
srdm.nextBytes(keyVal);
|
||||
SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
|
||||
|
||||
mac.init(keySpec);
|
||||
byte[] result1 = mac.doFinal(plain);
|
||||
|
||||
mac.reset();
|
||||
mac.update(plain[0]);
|
||||
mac.update(plain, 1, OFFSET - 1);
|
||||
byte[] result2 = mac.doFinal(tail);
|
||||
|
||||
if (!java.util.Arrays.equals(result1, result2)) {
|
||||
throw new RuntimeException("result1 and result2 are not the same");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -582,4 +582,21 @@ public abstract class PKCS11Test {
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns supported algorithms of specified type.
|
||||
*/
|
||||
static List<String> getSupportedAlgorithms(String type, String alg,
|
||||
Provider p) {
|
||||
// prepare a list of supported algorithms
|
||||
List<String> algorithms = new ArrayList<>();
|
||||
Set<Provider.Service> services = p.getServices();
|
||||
for (Provider.Service service : services) {
|
||||
if (service.getType().equals(type)
|
||||
&& service.getAlgorithm().startsWith(alg)) {
|
||||
algorithms.add(service.getAlgorithm());
|
||||
}
|
||||
}
|
||||
return algorithms;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 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
|
||||
* 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
|
||||
* @summary Change default criticality of policy mappings and policy constraints
|
||||
certificate extensions
|
||||
* @bug 8059916
|
||||
*/
|
||||
|
||||
import sun.security.x509.PolicyConstraintsExtension;
|
||||
import sun.security.x509.PolicyMappingsExtension;
|
||||
|
||||
public class DefaultCriticality {
|
||||
public static void main(String [] args) throws Exception {
|
||||
PolicyConstraintsExtension pce = new PolicyConstraintsExtension(-1,-1);
|
||||
if (!pce.isCritical()) {
|
||||
throw new Exception("PolicyConstraintsExtension should be " +
|
||||
"critical by default");
|
||||
}
|
||||
|
||||
PolicyMappingsExtension pme = new PolicyMappingsExtension();
|
||||
if (!pme.isCritical()) {
|
||||
throw new Exception("PolicyMappingsExtension should be " +
|
||||
"critical by default");
|
||||
}
|
||||
|
||||
System.out.println("Test passed.");
|
||||
}
|
||||
}
|
||||
@ -1,314 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2010, 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 6964018
|
||||
# @summary Unit test for common tools infrastructure.
|
||||
#
|
||||
# @build SimpleApplication SleeperApplication ShutdownSimpleApplication
|
||||
# @run shell CommonTests.sh
|
||||
|
||||
. ${TESTSRC}/CommonSetup.sh
|
||||
. ${TESTSRC}/ApplicationSetup.sh
|
||||
|
||||
# hope for the best:
|
||||
status=0
|
||||
|
||||
|
||||
# Test program path constants from CommonSetup.sh:
|
||||
#
|
||||
for name in JAVA JHAT JINFO JMAP JPS JSTACK; do
|
||||
eval value=$`echo $name`
|
||||
|
||||
echo "INFO: $name=$value"
|
||||
if [ -x "$value" ]; then
|
||||
echo "INFO: '$value' is executable."
|
||||
else
|
||||
echo "ERROR: '$value' is not executable." >&2
|
||||
status=1
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Display flag values from CommonSetup.sh:
|
||||
#
|
||||
for name in isCygwin isMKS isLinux isSolaris isUnknownOS isWindows; do
|
||||
eval value=$`echo $name`
|
||||
echo "INFO: flag $name=$value"
|
||||
done
|
||||
|
||||
|
||||
# Test OS constant from CommonSetup.sh:
|
||||
#
|
||||
if [ -z "$OS" ]; then
|
||||
echo "ERROR: OS constant cannot be empty." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
# Display the PATTERN_EOL value:
|
||||
#
|
||||
echo "INFO: PATTERN_EOL="`echo "$PATTERN_EOL" | od -c`
|
||||
|
||||
|
||||
# Test PATTERN_EOL with 'grep' for a regular line.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.grep_reg_line_eol"
|
||||
set +e
|
||||
echo 'regular line' | grep "line${PATTERN_EOL}" > "$TESTOUT"
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_EOL works for regular line with grep."
|
||||
else
|
||||
echo "ERROR: PATTERN_EOL does not work for regular line with grep." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
if $isWindows; then
|
||||
# Test PATTERN_EOL with 'grep' for a CR line.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.grep_cr_line_eol"
|
||||
set +e
|
||||
echo 'CR line
' | grep "line${PATTERN_EOL}" > "$TESTOUT"
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_EOL works for CR line with grep."
|
||||
else
|
||||
echo "ERROR: PATTERN_EOL does not work for CR line with grep." >&2
|
||||
status=1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Test PATTERN_EOL with 'sed' for a regular line.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.sed_reg_line_eol"
|
||||
echo 'regular line' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_EOL works for regular line with sed."
|
||||
else
|
||||
echo "ERROR: PATTERN_EOL does not work for regular line with sed." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
if $isWindows; then
|
||||
# Test PATTERN_EOL with 'sed' for a CR line.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.sed_cr_line_eol"
|
||||
echo 'CR line
' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_EOL works for CR line with sed."
|
||||
else
|
||||
echo "ERROR: PATTERN_EOL does not work for CR line with sed." >&2
|
||||
status=1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Display the PATTERN_WS value:
|
||||
#
|
||||
echo "INFO: PATTERN_WS="`echo "$PATTERN_WS" | od -c`
|
||||
|
||||
|
||||
# Test PATTERN_WS with 'grep' for a blank.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.grep_blank"
|
||||
set +e
|
||||
echo 'blank: ' | grep "$PATTERN_WS" > "$TESTOUT"
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_WS works for blanks with grep."
|
||||
else
|
||||
echo "ERROR: PATTERN_WS does not work for blanks with grep." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
# Test PATTERN_WS with 'grep' for a tab.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.grep_tab"
|
||||
set +e
|
||||
echo 'tab: ' | grep "$PATTERN_WS" > "$TESTOUT"
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_WS works for tabs with grep."
|
||||
else
|
||||
echo "ERROR: PATTERN_WS does not work for tabs with grep." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
# Test PATTERN_WS with 'sed' for a blank.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.sed_blank"
|
||||
echo 'blank: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_WS works for blanks with sed."
|
||||
else
|
||||
echo "ERROR: PATTERN_WS does not work for blanks with sed." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
# Test PATTERN_WS with 'sed' for a tab.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.sed_tab"
|
||||
echo 'tab: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: PATTERN_WS works for tabs with sed."
|
||||
else
|
||||
echo "ERROR: PATTERN_WS does not work for tabs with sed." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
|
||||
# Test startApplication and use PORTFILE for coordination
|
||||
# The app sleeps for 30 seconds.
|
||||
#
|
||||
PORTFILE="${TESTCLASSES}"/shutdown.port
|
||||
startApplication SleeperApplication "${PORTFILE}" 30
|
||||
|
||||
|
||||
# Test appJavaPid in "ps" cmd output.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.ps_app"
|
||||
set +e
|
||||
if $isCygwin; then
|
||||
# On Cygwin, appJavaPid is the Windows pid for the Java process
|
||||
# and appOtherPid is the Cygwin pid for the Java process.
|
||||
ps -p "$appOtherPid" \
|
||||
| grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
else
|
||||
# output only pid and comm columns to avoid mismatches
|
||||
ps -eo pid,comm \
|
||||
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
fi
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: begin appJavaPid=$appJavaPid in 'ps' cmd output:"
|
||||
cat "$TESTOUT"
|
||||
echo "INFO: end appJavaPid=$appJavaPid in 'ps' cmd output."
|
||||
else
|
||||
echo "ERROR: 'ps' cmd should show appJavaPid=$appJavaPid." >&2
|
||||
status=1
|
||||
fi
|
||||
|
||||
if [ -n "$appOtherPid" ]; then
|
||||
# Test appOtherPid in "ps" cmd output, if we have one.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.ps_other"
|
||||
set +e
|
||||
if $isCygwin; then
|
||||
ps -p "$appOtherPid" \
|
||||
| grep "${PATTERN_WS}${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
else
|
||||
# output only pid and comm columns to avoid mismatches
|
||||
ps -eo pid,comm \
|
||||
| grep "^${PATTERN_WS}*${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
fi
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: begin appOtherPid=$appOtherPid in 'ps' cmd output:"
|
||||
cat "$TESTOUT"
|
||||
echo "INFO: end appOtherPid=$appOtherPid in 'ps' cmd output."
|
||||
else
|
||||
echo "ERROR: 'ps' cmd should show appOtherPid=$appOtherPid." >&2
|
||||
status=1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Test stopApplication and PORTFILE for coordination
|
||||
#
|
||||
stopApplication "${PORTFILE}"
|
||||
|
||||
|
||||
# Test application still running after stopApplication.
|
||||
#
|
||||
# stopApplication just lets the app know that it can stop, but the
|
||||
# app might still be doing work. This test just demonstrates that
|
||||
# fact and doesn't fail if the app is already done.
|
||||
#
|
||||
TESTOUT="${TESTCLASSES}/testout.after_stop"
|
||||
set +e
|
||||
if $isCygwin; then
|
||||
# On Cygwin, appJavaPid is the Windows pid for the Java process
|
||||
# and appOtherPid is the Cygwin pid for the Java process.
|
||||
ps -p "$appOtherPid" \
|
||||
| grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
else
|
||||
# output only pid and comm columns to avoid mismatches
|
||||
ps -eo pid,comm \
|
||||
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
fi
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "INFO: it is okay for appJavaPid=$appJavaPid to still be running" \
|
||||
"after stopApplication() is called."
|
||||
echo "INFO: begin 'after_stop' output:"
|
||||
cat "$TESTOUT"
|
||||
echo "INFO: end 'after_stop' output."
|
||||
fi
|
||||
|
||||
|
||||
# Test waitForApplication
|
||||
#
|
||||
# The app might already be gone so this function shouldn't generate
|
||||
# a fatal error in either call.
|
||||
#
|
||||
waitForApplication
|
||||
|
||||
if [ $isWindows = false ]; then
|
||||
# Windows can recycle pids quickly so we can't use this test there
|
||||
TESTOUT="${TESTCLASSES}/testout.after_kill"
|
||||
set +e
|
||||
# output only pid and comm columns to avoid mismatches
|
||||
ps -eo pid,comm \
|
||||
| grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
|
||||
set -e
|
||||
if [ -s "$TESTOUT" ]; then
|
||||
echo "ERROR: 'ps' cmd should not show appJavaPid." >&2
|
||||
echo "ERROR: begin 'after_kill' output:" >&2
|
||||
cat "$TESTOUT" >&2
|
||||
echo "ERROR: end 'after_kill' output." >&2
|
||||
status=1
|
||||
else
|
||||
echo "INFO: 'ps' cmd does not show appJavaPid after" \
|
||||
"waitForApplication() is called."
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Test killApplication
|
||||
#
|
||||
# The app is already be gone so this function shouldn't generate
|
||||
# a fatal error.
|
||||
#
|
||||
killApplication
|
||||
|
||||
exit $status
|
||||
@ -25,6 +25,9 @@ import static jdk.testlibrary.Asserts.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
import jdk.testlibrary.JcmdBase;
|
||||
@ -95,11 +98,11 @@ public class TestJcmdDefaults {
|
||||
}
|
||||
|
||||
private static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
|
||||
File file = new File(TEST_SRC, "usage.out");
|
||||
List<String> fileOutput = Utils.fileAsList(file);
|
||||
Path path = Paths.get(TEST_SRC, "usage.out");
|
||||
List<String> fileOutput = Files.readAllLines(path);
|
||||
List<String> outputAsLines = output.asLines();
|
||||
assertTrue(outputAsLines.containsAll(fileOutput),
|
||||
"The ouput should contain all content of " + file.getAbsolutePath());
|
||||
"The ouput should contain all content of " + path.toAbsolutePath());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -25,6 +25,9 @@ import static jdk.testlibrary.Asserts.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
import jdk.testlibrary.JcmdBase;
|
||||
@ -160,11 +163,11 @@ public class TestJcmdSanity {
|
||||
}
|
||||
|
||||
private static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
|
||||
File file = new File(TEST_SRC, "help_help.out");
|
||||
List<String> fileOutput = Utils.fileAsList(file);
|
||||
Path path = Paths.get(TEST_SRC, "help_help.out");
|
||||
List<String> fileOutput = Files.readAllLines(path);
|
||||
List<String> outputAsLines = output.asLines();
|
||||
assertTrue(outputAsLines.containsAll(fileOutput),
|
||||
"The ouput should contain all content of " + file.getAbsolutePath());
|
||||
"The ouput should contain all content of " + path.toAbsolutePath());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -28,6 +28,9 @@ import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@ -189,11 +192,11 @@ public final class JpsHelper {
|
||||
*/
|
||||
public static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
|
||||
String testSrc = System.getProperty("test.src", "?");
|
||||
File file = new File(testSrc, "usage.out");
|
||||
List<String> fileOutput = Utils.fileAsList(file);
|
||||
Path path = Paths.get(testSrc, "usage.out");
|
||||
List<String> fileOutput = Files.readAllLines(path);
|
||||
List<String> outputAsLines = output.asLines();
|
||||
assertTrue(outputAsLines.containsAll(fileOutput),
|
||||
"The ouput should contain all content of " + file.getAbsolutePath());
|
||||
"The ouput should contain all content of " + path.toAbsolutePath());
|
||||
}
|
||||
|
||||
private static File getManifest(String className) throws IOException {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 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
|
||||
@ -30,12 +30,10 @@
|
||||
* @run main/othervm Arrrghs
|
||||
*/
|
||||
|
||||
import java.io.BufferedReader;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
@ -48,9 +46,6 @@ public class Arrrghs extends TestHelper {
|
||||
private Arrrghs(){}
|
||||
/**
|
||||
* This class provides various tests for arguments processing.
|
||||
* A group of tests to ensure that arguments are passed correctly to
|
||||
* a child java process upon a re-exec, this typically happens when
|
||||
* a version other than the one being executed is requested by the user.
|
||||
*
|
||||
* History: these set of tests were part of Arrrghs.sh. The MKS shell
|
||||
* implementations were notoriously buggy. Implementing these tests purely
|
||||
@ -58,12 +53,6 @@ public class Arrrghs extends TestHelper {
|
||||
*
|
||||
*/
|
||||
|
||||
// The version string to force a re-exec
|
||||
final static String VersionStr = "-version:1.1+";
|
||||
|
||||
// The Cookie or the pattern we match in the debug output.
|
||||
final static String Cookie = "ReExec Args: ";
|
||||
|
||||
/*
|
||||
* SIGH, On Windows all strings are quoted, we need to unwrap it
|
||||
*/
|
||||
@ -78,122 +67,6 @@ public class Arrrghs extends TestHelper {
|
||||
return in;
|
||||
}
|
||||
|
||||
/*
|
||||
* This method detects the cookie in the output stream of the process.
|
||||
*/
|
||||
private boolean detectCookie(InputStream istream,
|
||||
String expectedArguments) throws IOException {
|
||||
BufferedReader rd = new BufferedReader(new InputStreamReader(istream));
|
||||
boolean retval = false;
|
||||
|
||||
String in = rd.readLine();
|
||||
while (in != null) {
|
||||
if (debug) System.out.println(in);
|
||||
if (in.startsWith(Cookie)) {
|
||||
String detectedArgument = removeExtraQuotes(in.substring(Cookie.length()));
|
||||
if (expectedArguments.equals(detectedArgument)) {
|
||||
retval = true;
|
||||
} else {
|
||||
System.out.println("Error: Expected Arguments\t:'" +
|
||||
expectedArguments + "'");
|
||||
System.out.println(" Detected Arguments\t:'" +
|
||||
detectedArgument + "'");
|
||||
}
|
||||
// Return the value asap if not in debug mode.
|
||||
if (!debug) {
|
||||
rd.close();
|
||||
istream.close();
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
in = rd.readLine();
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
private boolean doReExecTest0(ProcessBuilder pb, String expectedArguments) {
|
||||
boolean retval = false;
|
||||
try {
|
||||
pb.redirectErrorStream(true);
|
||||
Process p = pb.start();
|
||||
retval = detectCookie(p.getInputStream(), expectedArguments);
|
||||
p.waitFor();
|
||||
p.destroy();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
throw new RuntimeException(ex.getMessage());
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns true if the expected and detected arguments are the same.
|
||||
* Quoting could cause dissimilar testArguments and expected arguments.
|
||||
*/
|
||||
int doReExecTest(String testArguments, String expectedPattern) {
|
||||
ProcessBuilder pb = new ProcessBuilder(javaCmd,
|
||||
VersionStr, testArguments);
|
||||
|
||||
Map<String, String> env = pb.environment();
|
||||
env.put(JLDEBUG_KEY, "true");
|
||||
return doReExecTest0(pb, testArguments) ? 0 : 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method for identical test pattern and expected arguments
|
||||
*/
|
||||
int doReExecTest(String testPattern) {
|
||||
return doReExecTest(testPattern, testPattern);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testQuoteParsingThroughReExec() {
|
||||
/*
|
||||
* Tests for 6214916
|
||||
* These tests require that a JVM (any JVM) be installed in the system registry.
|
||||
* If none is installed, skip this test.
|
||||
*/
|
||||
TestResult tr = doExec(javaCmd, VersionStr, "-version");
|
||||
if (!tr.isOK()) {
|
||||
System.err.println("Warning:Argument Passing Tests were skipped, " +
|
||||
"no java found in system registry.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Basic test
|
||||
testExitValue += doReExecTest("-a -b -c -d");
|
||||
|
||||
// Basic test with many spaces
|
||||
testExitValue += doReExecTest("-a -b -c -d");
|
||||
|
||||
// Quoted whitespace does matter ?
|
||||
testExitValue += doReExecTest("-a \"\"-b -c\"\" -d");
|
||||
|
||||
|
||||
// Escaped quotes outside of quotes as literals
|
||||
testExitValue += doReExecTest("-a \\\"-b -c\\\" -d");
|
||||
|
||||
// Check for escaped quotes inside of quotes as literal
|
||||
testExitValue += doReExecTest("-a \"-b \\\"stuff\\\"\" -c -d");
|
||||
|
||||
// A quote preceeded by an odd number of slashes is a literal quote
|
||||
testExitValue += doReExecTest("-a -b\\\\\\\" -c -d");
|
||||
|
||||
// A quote preceeded by an even number of slashes is a literal quote
|
||||
// see 6214916.
|
||||
testExitValue += doReExecTest("-a -b\\\\\\\\\" -c -d");
|
||||
|
||||
// Make sure that whitespace doesn't interfere with the removal of the
|
||||
// appropriate tokens. (space-tab-space preceeds -jre-restict-search).
|
||||
testExitValue += doReExecTest("-a -b \t -jre-restrict-search -c -d", "-a -b -c -d");
|
||||
|
||||
// Make sure that the mJRE tokens being stripped, aren't stripped if
|
||||
// they happen to appear as arguments to the main class.
|
||||
testExitValue += doReExecTest("foo -version:1.1+");
|
||||
|
||||
System.out.println("Completed arguments quoting tests with "
|
||||
+ testExitValue + " errors");
|
||||
}
|
||||
// the pattern we hope to see in the output
|
||||
static final Pattern ArgPattern = Pattern.compile("\\s*argv\\[[0-9]*\\].*=.*");
|
||||
|
||||
|
||||
@ -89,36 +89,6 @@ TestSyntax() {
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Shell routine to ensure help page does not include mjre options
|
||||
#
|
||||
TestHelp() {
|
||||
mess="`$JAVA -help 2>&1`"
|
||||
# make sure it worked
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "java -help failed ????"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo $mess | grep '\-version:<value>' > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "help message contains obsolete option version:<value>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo $mess | grep '\-jre-restrict-search' > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "help message contains obsolete option jre-restrict-search"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo $mess | grep '\-no-jre-restrict-search' > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "help message contains obsolete option no-jre-restrict-search"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# Just as the name says. We sprinkle these in the appropriate location
|
||||
# in the test file system and they just say who they are pretending to be.
|
||||
@ -461,33 +431,4 @@ if [ -x /usr/bin/zipnote ]; then
|
||||
LaunchVM "" "${RELEASE}"
|
||||
fi
|
||||
|
||||
#
|
||||
# Now test specification of mJRE
|
||||
#
|
||||
# In some cases this should result in failure of the command,
|
||||
# in some cases, a warning messages, with the command succeeding.
|
||||
#
|
||||
|
||||
# Commandline use of "-version:" should fail
|
||||
# with a message containing "no longer supported"
|
||||
LaunchVM "-version:1.10+" "Error: Specifying an alternate JDK/JRE"
|
||||
LaunchVM "-version:prettymuchanything" "Error: Specifying an alternate JDK/JRE"
|
||||
|
||||
# Commandline use of "-jre-restrict-search" should now fail
|
||||
LaunchVM "-jre-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
|
||||
# Commandline use of "-jre-no-restrict-search" should now fail
|
||||
LaunchVM "-jre-no-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
|
||||
|
||||
|
||||
# mJRE directives to use a specific version should be flagged
|
||||
# with a warning, but the jar should be executed with the
|
||||
# current jre
|
||||
CreateFullJar "junk request" ""
|
||||
LaunchVM "" "${RELEASE}"
|
||||
# Going to silently ignore JRE-Version setting in jar file manifest
|
||||
#LaunchVM "" "warning: The jarfile JRE-Version"
|
||||
|
||||
# Verify help does not contain obsolete options
|
||||
TestHelp
|
||||
|
||||
exit 0
|
||||
|
||||
212
jdk/test/tools/launcher/MultipleJRERemoved.java
Normal file
212
jdk/test/tools/launcher/MultipleJRERemoved.java
Normal file
@ -0,0 +1,212 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 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
|
||||
* 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 8067437
|
||||
* @summary Verify Multiple JRE version support has been removed.
|
||||
* @build TestHelper
|
||||
* @run main MultipleJRERemoved
|
||||
*/
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.*;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
|
||||
public class MultipleJRERemoved extends TestHelper {
|
||||
|
||||
public static final String VERSION_JAR = "version.jar";
|
||||
public static final String PRINT_VERSION_CLASS = "PrintVersion";
|
||||
private final File javaFile = new File(PRINT_VERSION_CLASS + ".java");
|
||||
private final File clsFile = new File(PRINT_VERSION_CLASS + ".class");
|
||||
|
||||
private MultipleJRERemoved() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param args the command line arguments
|
||||
* @throws java.io.FileNotFoundException
|
||||
*/
|
||||
public static void main(String[] args) throws Exception {
|
||||
MultipleJRERemoved a = new MultipleJRERemoved();
|
||||
a.run(args);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check all combinations of flags: "-version:", "-jre-restrict-search", "-jre-no-restrict-search". Test expects to see errors.
|
||||
*/
|
||||
@Test
|
||||
public void allFlagCombinations() throws IOException {
|
||||
final Pattern newLine = Pattern.compile("\n");
|
||||
createJar(Collections.emptyMap());
|
||||
|
||||
for (Flag flag1 : Flag.values()) {
|
||||
for (Flag flag2 : Flag.values()) {
|
||||
for (Flag flag3 : Flag.values()) {
|
||||
List<Flag> flags = Stream.of(flag1, flag2, flag3)
|
||||
.filter(f -> !Flag.EMPTY.equals(f))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (flags.size() == 0) continue;
|
||||
|
||||
List<String> flagValues = flags.stream()
|
||||
.map(Flag::value)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<String> errorMessages = flags.stream()
|
||||
.map(Flag::errorMessage)
|
||||
.flatMap(newLine::splitAsStream)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<String> jarCmd = new ArrayList<>();
|
||||
jarCmd.add(javaCmd);
|
||||
jarCmd.addAll(flagValues);
|
||||
jarCmd.add("-jar");
|
||||
jarCmd.add("version.jar");
|
||||
|
||||
check(jarCmd, errorMessages);
|
||||
|
||||
List<String> cmd = new ArrayList<>();
|
||||
cmd.add(javaCmd);
|
||||
cmd.addAll(flagValues);
|
||||
cmd.add(PRINT_VERSION_CLASS);
|
||||
|
||||
check(cmd, errorMessages);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void check(List<String> cmd, List<String> errorMessages) {
|
||||
TestResult tr = doExec(cmd.toArray(new String[cmd.size()]));
|
||||
tr.checkNegative();
|
||||
tr.isNotZeroOutput();
|
||||
errorMessages.forEach(tr::contains);
|
||||
|
||||
if (!tr.testStatus) {
|
||||
System.out.println(tr);
|
||||
throw new RuntimeException("test case: failed\n" + cmd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that java -help output doesn't contain information about "mJRE" flags.
|
||||
*/
|
||||
@Test
|
||||
public void javaHelp() {
|
||||
TestResult tr = doExec(javaCmd, "-help");
|
||||
tr.checkPositive();
|
||||
tr.isNotZeroOutput();
|
||||
tr.notContains("-version:<value>");
|
||||
tr.notContains("-jre-restrict-search");
|
||||
tr.notContains("-jre-no-restrict-search");
|
||||
tr.notContains("-no-jre-restrict-search"); //it's not a typo in flag name.
|
||||
if (!tr.testStatus) {
|
||||
System.out.println(tr);
|
||||
throw new RuntimeException("Failed. java -help output contains obsolete flags.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that java -jar version.jar output ignores "mJRE" manifest directives.
|
||||
*/
|
||||
@Test
|
||||
public void manifestDirectives() throws IOException {
|
||||
Map<String, String> manifest = new TreeMap<>();
|
||||
manifest.put("JRE-Version", "1.8");
|
||||
manifest.put("JRE-Restrict-Search", "1.8");
|
||||
createJar(manifest);
|
||||
|
||||
TestResult tr = doExec(javaCmd, "-jar", VERSION_JAR);
|
||||
tr.checkPositive();
|
||||
tr.contains(System.getProperty("java.version"));
|
||||
if (!tr.testStatus) {
|
||||
System.out.println(tr);
|
||||
throw new RuntimeException("Failed.\n");
|
||||
}
|
||||
}
|
||||
|
||||
private void emitFile() throws IOException {
|
||||
List<String> scr = new ArrayList<>();
|
||||
scr.add("public class PrintVersion {");
|
||||
scr.add(" public static void main(String... args) {");
|
||||
scr.add(" System.out.println(System.getProperty(\"java.version\"));");
|
||||
scr.add(" }");
|
||||
scr.add("}");
|
||||
createFile(javaFile, scr);
|
||||
compile(javaFile.getName());
|
||||
}
|
||||
|
||||
private void createJar(Map<String, String> manifestAttributes) throws IOException {
|
||||
emitFile();
|
||||
|
||||
Manifest manifest = new Manifest();
|
||||
final Attributes mainAttributes = manifest.getMainAttributes();
|
||||
mainAttributes.putValue("Manifest-Version", "1.0");
|
||||
mainAttributes.putValue("Main-Class", PRINT_VERSION_CLASS);
|
||||
manifestAttributes.forEach(mainAttributes::putValue);
|
||||
|
||||
try (JarOutputStream jar = new JarOutputStream(new FileOutputStream(VERSION_JAR), manifest)) {
|
||||
jar.putNextEntry(new ZipEntry(PRINT_VERSION_CLASS + ".class"));
|
||||
jar.write(Files.readAllBytes(clsFile.toPath()));
|
||||
jar.closeEntry();
|
||||
} finally {
|
||||
javaFile.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private enum Flag {
|
||||
EMPTY("", ""),
|
||||
VERSION("-version:1.9", "Error: Specifying an alternate JDK/JRE version is no longer supported.\n" +
|
||||
"The use of the flag '-version:' is no longer valid.\n" +
|
||||
"Please download and execute the appropriate version."),
|
||||
JRE_RESTRICT_SEARCH("-jre-restrict-search", "Error: Specifying an alternate JDK/JRE is no longer supported.\n" +
|
||||
"The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid."),
|
||||
JRE_NO_RESTRICT_SEARCH("-jre-no-restrict-search", "Error: Specifying an alternate JDK/JRE is no longer supported.\n" +
|
||||
"The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid.");
|
||||
private final String flag;
|
||||
private final String errorMessage;
|
||||
|
||||
Flag(String flag, String errorMessage) {
|
||||
this.flag = flag;
|
||||
this.errorMessage = errorMessage;
|
||||
}
|
||||
|
||||
String value() {
|
||||
return flag;
|
||||
}
|
||||
|
||||
String errorMessage() {
|
||||
return errorMessage;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user