This commit is contained in:
Lana Steuck 2015-01-16 12:34:28 -08:00
commit a6f6f19835
50 changed files with 1740 additions and 1431 deletions

View File

@ -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());
}
/**

View File

@ -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();
}

View File

@ -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

View File

@ -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;
}
/**

View File

@ -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();

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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 {

View File

@ -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 {

View File

@ -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;

View File

@ -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;

View File

@ -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
{

View File

@ -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

View File

@ -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 \

View File

@ -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();
}
}

View File

@ -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");
}
}
}

View 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");
}
}
}

View 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);
}
}
}

View 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;
}

View File

@ -23,6 +23,7 @@
/**
* @test
* @ignore JDK-8068162
* @bug 6331574
* @summary test isModifiableClass
* @author Robert Field, Sun Microsystems

View File

@ -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);
}
}

View File

@ -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());

View File

@ -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
*/

View File

@ -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
*/

View File

@ -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;
}
}
}
}
}
}

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View 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
}
}
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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");

View File

@ -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();
}
}

View File

@ -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) {

View File

@ -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);
}
}
}

View File

@ -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);

View 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);
}
}
}

View 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");
}
}
}

View File

@ -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;
}
}

View File

@ -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.");
}
}

View File

@ -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

View File

@ -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());
}
}

View File

@ -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());
}
}

View File

@ -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 {

View File

@ -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]*\\].*=.*");

View File

@ -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

View 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;
}
}
}