This commit is contained in:
Lana Steuck 2015-02-12 16:37:08 -08:00
commit 9b5b4b60c3
52 changed files with 1342 additions and 558 deletions

View File

@ -147,6 +147,15 @@ $(eval $(call SetupJavaCompilation,BUILD_INTERIM_JIMAGE, \
EXCLUDES := jdk/internal/jimage/concurrent, \
BIN := $(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes))
# Because of the explicit INCLUDES in the compilation setup above, the service provider
# file will not be copied unless META-INF/services would also be added to the INCLUDES.
# Adding META-INF/services would include all files in that directory when only the one
# is needed, which is why this explicit copy is defined instead.
$(eval $(call SetupCopyFiles,COPY_JIMAGE_SERVICE_PROVIDER, \
SRC := $(JDK_TOPDIR)/src/java.base/share/classes, \
DEST := $(BUILDTOOLS_OUTPUTDIR)/interim_jimage_classes, \
FILES := META-INF/services/java.nio.file.spi.FileSystemProvider))
##########################################################################################
# Tools needed on solaris because OBJCOPY is broken.
@ -173,7 +182,7 @@ ifeq ($(OPENJDK_TARGET_OS), solaris)
PROGRAM := fix_empty_sec_hdr_flags))
endif
$(BUILD_TOOLS_JDK): $(BUILD_INTERIM_JIMAGE)
$(BUILD_TOOLS_JDK): $(BUILD_INTERIM_JIMAGE) $(COPY_JIMAGE_SERVICE_PROVIDER)
java-tools: $(BUILD_TOOLS_JDK)

View File

@ -66,19 +66,6 @@ UNPACKEXE_LANG := C
ifeq ($(OPENJDK_TARGET_OS), solaris)
UNPACKEXE_LANG := C++
endif
UNPACKEXE_DEBUG_SYMBOLS := true
# On windows, unpack200 is linked completely differently to all other
# executables, using the compiler with the compiler arguments.
# It's also linked incrementally, producing a .ilk file that needs to
# be kept away.
ifeq ($(OPENJDK_TARGET_OS), windows)
BUILD_UNPACKEXE_LDEXE := $(CC)
EXE_OUT_OPTION_save := $(EXE_OUT_OPTION)
EXE_OUT_OPTION := -Fe
# With the current way unpack200 is built, debug symbols aren't supported
# anyway.
UNPACKEXE_DEBUG_SYMBOLS := false
endif
# The linker on older SuSE distros (e.g. on SLES 10) complains with:
# "Invalid version tag `SUNWprivate_1.1'. Only anonymous version tag is allowed in executable."
@ -93,49 +80,36 @@ $(eval $(call SetupNativeCompilation,BUILD_UNPACKEXE, \
SRC := $(UNPACKEXE_SRC), \
LANG := $(UNPACKEXE_LANG), \
OPTIMIZATION := LOW, \
CFLAGS := $(UNPACKEXE_CFLAGS) $(CXXFLAGS_JDKEXE) \
-DFULL, \
CFLAGS := $(UNPACKEXE_CFLAGS) $(CXXFLAGS_JDKEXE) -DFULL, \
CFLAGS_release := -DPRODUCT, \
CFLAGS_linux := -fPIC, \
CFLAGS_solaris := -KPIC, \
CFLAGS_macosx := -fPIC, \
MAPFILE := $(UNPACK_MAPFILE),\
LDFLAGS := $(UNPACKEXE_ZIPOBJS), \
LDFLAGS_windows := $(CXXFLAGS_JDKEXE), \
LDFLAGS_unix := $(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \
LDFLAGS := $(UNPACKEXE_ZIPOBJS) \
$(LDFLAGS_JDKEXE) $(LDFLAGS_CXX_JDK) \
$(call SET_SHARED_LIBRARY_NAME,$(LIBRARY_PREFIX)unpack$(SHARED_LIBRARY_SUFFIX)) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_linux := -lc, \
LDFLAGS_solaris := $(UNPACKEXE_LDFLAGS_solaris) -lc, \
LDFLAGS_SUFFIX := $(LIBCXX), \
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/unpackexe$(OUTPUT_SUBDIR), \
OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/unpackexe$(OUTPUT_SUBDIR), \
OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/modules_cmds/$(MODULE), \
PROGRAM := unpack200, \
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
RC_FLAGS := $(RC_FLAGS) \
-D "JDK_FNAME=unpack200.exe" \
-D "JDK_INTERNAL_NAME=unpack200" \
-D "JDK_FTYPE=0x1L", \
DEBUG_SYMBOLS := $(UNPACKEXE_DEBUG_SYMBOLS), \
DEBUG_SYMBOLS := true, \
MANIFEST := $(JDK_TOPDIR)/src/jdk.runtime/windows/native/unpack200/unpack200_proto.exe.manifest))
ifeq ($(OPENJDK_TARGET_OS), windows)
EXE_OUT_OPTION := $(EXE_OUT_OPTION_save)
endif
ifneq ($(USE_EXTERNAL_LIBZ), true)
$(BUILD_UNPACKEXE): $(UNPACKEXE_ZIPOBJS)
endif
# Build into object dir and copy executable afterwards to avoid .ilk file in
# image. The real fix would be clean up linking of unpack200 using
# -link -incremental:no
# like all other launchers.
$(SUPPORT_OUTPUTDIR)/modules_cmds/$(MODULE)/unpack200$(EXE_SUFFIX): $(BUILD_UNPACKEXE)
$(call install-file)
TARGETS += $(SUPPORT_OUTPUTDIR)/modules_cmds/$(MODULE)/unpack200$(EXE_SUFFIX)
TARGETS += $(BUILD_UNPACKEXE)
################################################################################

View File

@ -1,7 +1,5 @@
java.base
java.desktop
java.activation
java.annotations.common
java.compiler
java.corba
java.instrument
@ -18,9 +16,7 @@ java.sql
java.sql.rowset
java.transaction
java.xml
java.xml.bind
java.xml.crypto
java.xml.ws
jdk.charsets
jdk.deploy
jdk.deploy.osx

View File

@ -1,3 +1,7 @@
java.activation
java.annotations.common
java.xml.bind
java.xml.ws
jdk.crypto.ec
jdk.crypto.mscapi
jdk.crypto.pkcs11

View File

@ -1,5 +1,6 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2015 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -28,9 +29,7 @@
package com.sun.crypto.provider;
import java.util.Arrays;
import java.security.*;
import static com.sun.crypto.provider.AESConstants.AES_BLOCK_SIZE;
import java.security.ProviderException;
/**
* This class represents the GHASH function defined in NIST 800-38D
@ -44,62 +43,90 @@ import static com.sun.crypto.provider.AESConstants.AES_BLOCK_SIZE;
*/
final class GHASH {
private static final byte P128 = (byte) 0xe1; //reduction polynomial
private static boolean getBit(byte[] b, int pos) {
int p = pos / 8;
pos %= 8;
int i = (b[p] >>> (7 - pos)) & 1;
return i != 0;
private static long getLong(byte[] buffer, int offset) {
long result = 0;
int end = offset + 8;
for (int i = offset; i < end; ++i) {
result = (result << 8) + (buffer[i] & 0xFF);
}
return result;
}
private static void shift(byte[] b) {
byte temp, temp2;
temp2 = 0;
for (int i = 0; i < b.length; i++) {
temp = (byte) ((b[i] & 0x01) << 7);
b[i] = (byte) ((b[i] & 0xff) >>> 1);
b[i] = (byte) (b[i] | temp2);
temp2 = temp;
private static void putLong(byte[] buffer, int offset, long value) {
int end = offset + 8;
for (int i = end - 1; i >= offset; --i) {
buffer[i] = (byte) value;
value >>= 8;
}
}
// Given block X and Y, returns the muliplication of X * Y
private static byte[] blockMult(byte[] x, byte[] y) {
if (x.length != AES_BLOCK_SIZE || y.length != AES_BLOCK_SIZE) {
throw new RuntimeException("illegal input sizes");
}
byte[] z = new byte[AES_BLOCK_SIZE];
byte[] v = y.clone();
// calculate Z1-Z127 and V1-V127
for (int i = 0; i < 127; i++) {
private static final int AES_BLOCK_SIZE = 16;
// Multiplies state0, state1 by V0, V1.
private void blockMult(long V0, long V1) {
long Z0 = 0;
long Z1 = 0;
long X;
// Separate loops for processing state0 and state1.
X = state0;
for (int i = 0; i < 64; i++) {
// Zi+1 = Zi if bit i of x is 0
if (getBit(x, i)) {
for (int n = 0; n < z.length; n++) {
z[n] ^= v[n];
}
}
boolean lastBitOfV = getBit(v, 127);
shift(v);
if (lastBitOfV) v[0] ^= P128;
long mask = X >> 63;
Z0 ^= V0 & mask;
Z1 ^= V1 & mask;
// Save mask for conditional reduction below.
mask = (V1 << 63) >> 63;
// V = rightshift(V)
long carry = V0 & 1;
V0 = V0 >>> 1;
V1 = (V1 >>> 1) | (carry << 63);
// Conditional reduction modulo P128.
V0 ^= 0xe100000000000000L & mask;
X <<= 1;
}
X = state1;
for (int i = 64; i < 127; i++) {
// Zi+1 = Zi if bit i of x is 0
long mask = X >> 63;
Z0 ^= V0 & mask;
Z1 ^= V1 & mask;
// Save mask for conditional reduction below.
mask = (V1 << 63) >> 63;
// V = rightshift(V)
long carry = V0 & 1;
V0 = V0 >>> 1;
V1 = (V1 >>> 1) | (carry << 63);
// Conditional reduction.
V0 ^= 0xe100000000000000L & mask;
X <<= 1;
}
// calculate Z128
if (getBit(x, 127)) {
for (int n = 0; n < z.length; n++) {
z[n] ^= v[n];
}
}
return z;
long mask = X >> 63;
Z0 ^= V0 & mask;
Z1 ^= V1 & mask;
// Save result.
state0 = Z0;
state1 = Z1;
}
// hash subkey H; should not change after the object has been constructed
private final byte[] subkeyH;
private final long subkeyH0, subkeyH1;
// buffer for storing hash
private byte[] state;
private long state0, state1;
// variables for save/restore calls
private byte[] stateSave = null;
private long stateSave0, stateSave1;
/**
* Initializes the cipher in the specified mode with the given key
@ -114,8 +141,8 @@ final class GHASH {
if ((subkeyH == null) || subkeyH.length != AES_BLOCK_SIZE) {
throw new ProviderException("Internal error");
}
this.subkeyH = subkeyH;
this.state = new byte[AES_BLOCK_SIZE];
this.subkeyH0 = getLong(subkeyH, 0);
this.subkeyH1 = getLong(subkeyH, 8);
}
/**
@ -124,31 +151,33 @@ final class GHASH {
* this object for different data w/ the same H.
*/
void reset() {
Arrays.fill(state, (byte) 0);
state0 = 0;
state1 = 0;
}
/**
* Save the current snapshot of this GHASH object.
*/
void save() {
stateSave = state.clone();
stateSave0 = state0;
stateSave1 = state1;
}
/**
* Restores this object using the saved snapshot.
*/
void restore() {
state = stateSave;
state0 = stateSave0;
state1 = stateSave1;
}
private void processBlock(byte[] data, int ofs) {
if (data.length - ofs < AES_BLOCK_SIZE) {
throw new RuntimeException("need complete block");
}
for (int n = 0; n < state.length; n++) {
state[n] ^= data[ofs + n];
}
state = blockMult(state, subkeyH);
state0 ^= getLong(data, ofs);
state1 ^= getLong(data, ofs + 8);
blockMult(subkeyH0, subkeyH1);
}
void update(byte[] in) {
@ -169,10 +198,10 @@ final class GHASH {
}
byte[] digest() {
try {
return state.clone();
} finally {
reset();
}
byte[] result = new byte[AES_BLOCK_SIZE];
putLong(result, 0, state0);
putLong(result, 8, state1);
reset();
return result;
}
}

View File

@ -28,9 +28,10 @@ package java.io;
/**
* A <code>PushbackInputStream</code> adds
* functionality to another input stream, namely
* the ability to "push back" or "unread"
* one byte. This is useful in situations where
* it is convenient for a fragment of code
* the ability to "push back" or "unread" bytes,
* by storing pushed-back bytes in an internal buffer.
* This is useful in situations where
* it is convenient for a fragment of code
* to read an indefinite number of data bytes
* that are delimited by a particular byte
* value; after reading the terminating byte,
@ -77,11 +78,9 @@ class PushbackInputStream extends FilterInputStream {
/**
* Creates a <code>PushbackInputStream</code>
* with a pushback buffer of the specified <code>size</code>,
* and saves its argument, the input stream
* and saves its argument, the input stream
* <code>in</code>, for later use. Initially,
* there is no pushed-back byte (the field
* <code>pushBack</code> is initialized to
* <code>-1</code>).
* the pushback buffer is empty.
*
* @param in the input stream from which bytes will be read.
* @param size the size of the pushback buffer.
@ -99,11 +98,9 @@ class PushbackInputStream extends FilterInputStream {
/**
* Creates a <code>PushbackInputStream</code>
* and saves its argument, the input stream
* with a 1-byte pushback buffer, and saves its argument, the input stream
* <code>in</code>, for later use. Initially,
* there is no pushed-back byte (the field
* <code>pushBack</code> is initialized to
* <code>-1</code>).
* the pushback buffer is empty.
*
* @param in the input stream from which bytes will be read.
*/

View File

@ -951,9 +951,6 @@ public final class ProcessBuilder
* {@code command} array as its argument. This may result in
* a {@link SecurityException} being thrown.
*
* <p>If the operating system does not support the creation of
* processes, an {@link UnsupportedOperationException} will be thrown.
*
* <p>Starting an operating system process is highly system-dependent.
* Among the many things that can go wrong are:
* <ul>
@ -967,6 +964,9 @@ public final class ProcessBuilder
* of the exception is system-dependent, but it will always be a
* subclass of {@link IOException}.
*
* <p>If the operating system does not support the creation of
* processes, an {@link UnsupportedOperationException} will be thrown.
*
* <p>Subsequent modifications to this process builder will not
* affect the returned {@link Process}.
*

View File

@ -564,9 +564,6 @@ public class Runtime {
* <code>cmdarray</code> as its argument. This may result in a
* {@link SecurityException} being thrown.
*
* <p>If the operating system does not support the creation of
* processes, an {@link UnsupportedOperationException} will be thrown.
*
* <p>Starting an operating system process is highly system-dependent.
* Among the many things that can go wrong are:
* <ul>
@ -579,6 +576,9 @@ public class Runtime {
* of the exception is system-dependent, but it will always be a
* subclass of {@link IOException}.
*
* <p>If the operating system does not support the creation of
* processes, an {@link UnsupportedOperationException} will be thrown.
*
*
* @param cmdarray array containing the command to call and
* its arguments.

View File

@ -662,7 +662,7 @@ public abstract class Executable extends AccessibleObject
*
* If this {@code Executable} object represents a static method or
* represents a constructor of a top level, static member, local, or
* anoymous class, then the return value is null.
* anonymous class, then the return value is null.
*
* @return an object representing the receiver type of the method or
* constructor represented by this {@code Executable} or {@code null} if

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
@ -4814,41 +4814,61 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
if (dividendHi >= divisor) {
return null;
}
final int shift = Long.numberOfLeadingZeros(divisor);
divisor <<= shift;
final long v1 = divisor >>> 32;
final long v0 = divisor & LONG_MASK;
long q1, q0;
long r_tmp;
long tmp = dividendLo << shift;
long u1 = tmp >>> 32;
long u0 = tmp & LONG_MASK;
tmp = (dividendHi << shift) | (dividendLo >>> 64 - shift);
long u2 = tmp & LONG_MASK;
tmp = divWord(tmp,v1);
q1 = tmp & LONG_MASK;
r_tmp = tmp >>> 32;
long q1, r_tmp;
if (v1 == 1) {
q1 = tmp;
r_tmp = 0;
} else if (tmp >= 0) {
q1 = tmp / v1;
r_tmp = tmp - q1 * v1;
} else {
long[] rq = divRemNegativeLong(tmp, v1);
q1 = rq[1];
r_tmp = rq[0];
}
while(q1 >= DIV_NUM_BASE || unsignedLongCompare(q1*v0, make64(r_tmp, u1))) {
q1--;
r_tmp += v1;
if (r_tmp >= DIV_NUM_BASE)
break;
}
tmp = mulsub(u2,u1,v1,v0,q1);
u1 = tmp & LONG_MASK;
tmp = divWord(tmp,v1);
q0 = tmp & LONG_MASK;
r_tmp = tmp >>> 32;
long q0;
if (v1 == 1) {
q0 = tmp;
r_tmp = 0;
} else if (tmp >= 0) {
q0 = tmp / v1;
r_tmp = tmp - q0 * v1;
} else {
long[] rq = divRemNegativeLong(tmp, v1);
q0 = rq[1];
r_tmp = rq[0];
}
while(q0 >= DIV_NUM_BASE || unsignedLongCompare(q0*v0,make64(r_tmp,u0))) {
q0--;
r_tmp += v1;
if (r_tmp >= DIV_NUM_BASE)
break;
}
if((int)q1 < 0) {
// result (which is positive and unsigned here)
// can't fit into long due to sign bit is used for value
@ -4871,10 +4891,13 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
}
}
}
long q = make64(q1,q0);
q*=sign;
if (roundingMode == ROUND_DOWN && scale == preferredScale)
return valueOf(q, scale);
long r = mulsub(u1, u0, v1, v0, q0) >>> shift;
if (r != 0) {
boolean increment = needIncrement(divisor >>> shift, roundingMode, sign, q, r);
@ -4917,28 +4940,35 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
}
}
private static long divWord(long n, long dLong) {
long r;
long q;
if (dLong == 1) {
q = (int)n;
return (q & LONG_MASK);
}
/**
* Calculate the quotient and remainder of dividing a negative long by
* another long.
*
* @param n the numerator; must be negative
* @param d the denominator; must not be unity
* @return a two-element {@long} array with the remainder and quotient in
* the initial and final elements, respectively
*/
private static long[] divRemNegativeLong(long n, long d) {
assert n < 0 : "Non-negative numerator " + n;
assert d != 1 : "Unity denominator";
// Approximate the quotient and remainder
q = (n >>> 1) / (dLong >>> 1);
r = n - q*dLong;
long q = (n >>> 1) / (d >>> 1);
long r = n - q * d;
// Correct the approximation
while (r < 0) {
r += dLong;
r += d;
q--;
}
while (r >= dLong) {
r -= dLong;
while (r >= d) {
r -= d;
q++;
}
// n - q*dlong == r && 0 <= r <dLong, hence we're done.
return (r << 32) | (q & LONG_MASK);
// n - q*d == r && 0 <= r < d, hence we're done.
return new long[] {r, q};
}
private static long make64(long hi, long lo) {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 2013, 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
@ -1308,6 +1308,7 @@ class DatagramSocket implements java.io.Closeable {
/**
* Sets the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
* @param value The value of the socket option. A value of {@code null}
* may be valid for some options.
@ -1342,6 +1343,7 @@ class DatagramSocket implements java.io.Closeable {
/**
* Returns the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @return The value of the socket option.

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
@ -267,6 +267,7 @@ public abstract class DatagramSocketImpl implements SocketOptions {
/**
* Called to set a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @param value The value of the socket option. A value of {@code null}
@ -276,7 +277,7 @@ public abstract class DatagramSocketImpl implements SocketOptions {
* support the option
*
* @throws NullPointerException if name is {@code null}
*
* @throws IOException if an I/O problem occurs while attempting to set the option
* @since 1.9
*/
protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
@ -308,12 +309,15 @@ public abstract class DatagramSocketImpl implements SocketOptions {
/**
* Called to get a socket option.
*
* @return the socket option
* @param <T> The type of the socket option value
* @param name The socket option
*
* @throws UnsupportedOperationException if the DatagramSocketImpl does not
* support the option
*
* @throws NullPointerException if name is {@code null}
* @throws IOException if an I/O problem occurs while attempting to set the option
*
* @since 1.9
*/

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 2013, 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
@ -924,6 +924,7 @@ class ServerSocket implements java.io.Closeable {
/**
* Sets the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
* @param value The value of the socket option. A value of {@code null}
* may be valid for some options.
@ -957,6 +958,7 @@ class ServerSocket implements java.io.Closeable {
/**
* Returns the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @return The value of the socket option.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 2013, 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
@ -1727,6 +1727,7 @@ class Socket implements java.io.Closeable {
/**
* Sets the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
* @param value The value of the socket option. A value of {@code null}
* may be valid for some options.
@ -1758,6 +1759,7 @@ class Socket implements java.io.Closeable {
/**
* Returns the value of a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @return The value of the socket option.

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1995, 2013, 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
@ -362,6 +362,7 @@ public abstract class SocketImpl implements SocketOptions {
/**
* Called to set a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @param value The value of the socket option. A value of {@code null}
@ -397,6 +398,7 @@ public abstract class SocketImpl implements SocketOptions {
/**
* Called to get a socket option.
*
* @param <T> The type of the socket option value
* @param name The socket option
*
* @return the value of the named option

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2014, 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
@ -1618,11 +1618,13 @@ public class KeyStore {
* integrity check.
*
* <p>
* This method traverses the list of registered security {@link Providers},
* starting with the most preferred Provider.
* For each {@link KeyStoreSpi} implementation supported by a Provider,
* it invokes the {@link engineProbe} method to determine if it supports
* the specified keystore.
* This method traverses the list of registered security
* {@linkplain Provider providers}, starting with the most
* preferred Provider.
* For each {@link KeyStoreSpi} implementation supported by a
* Provider, it invokes the {@link
* KeyStoreSpi#engineProbe(InputStream) engineProbe} method to
* determine if it supports the specified keystore.
* A new KeyStore object is returned that encapsulates the KeyStoreSpi
* implementation from the first Provider that supports the specified file.
*
@ -1672,11 +1674,12 @@ public class KeyStore {
* unlock the keystore data or perform an integrity check.
*
* <p>
* This method traverses the list of registered security {@link Providers},
* starting with the most preferred Provider.
* For each {@link KeyStoreSpi} implementation supported by a Provider,
* it invokes the {@link engineProbe} method to determine if it supports
* the specified keystore.
* This method traverses the list of registered security {@linkplain
* Provider providers}, starting with the most preferred Provider.
* For each {@link KeyStoreSpi} implementation supported by a
* Provider, it invokes the {@link
* KeyStoreSpi#engineProbe(InputStream) engineProbe} method to
* determine if it supports the specified keystore.
* A new KeyStore object is returned that encapsulates the KeyStoreSpi
* implementation from the first Provider that supports the specified file.
*

View File

@ -538,7 +538,14 @@ public interface Chronology extends Comparable<Chronology> {
* <ul>
* <li>a leap-year must imply a year-length longer than a non leap-year.
* <li>a chronology that does not support the concept of a year must return false.
* <li>the correct result must be returned for all years within the
* valid range of years for the chronology.
* </ul>
* <p>
* Outside the range of valid years an implementation is free to return
* either a best guess or false.
* An implementation must not throw an exception, even if the year is
* outside the range of valid years.
*
* @param prolepticYear the proleptic-year to check, not validated for range
* @return true if the year is a leap year

View File

@ -475,10 +475,10 @@ public final class HijrahChronology extends AbstractChronology implements Serial
@Override
public boolean isLeapYear(long prolepticYear) {
checkCalendarInit();
int epochMonth = yearToEpochMonth((int) prolepticYear);
if (epochMonth < 0 || epochMonth > maxEpochDay) {
throw new DateTimeException("Hijrah date out of range");
if (prolepticYear < getMinimumYear() || prolepticYear > getMaximumYear()) {
return false;
}
int epochMonth = yearToEpochMonth((int) prolepticYear);
int len = getYearLength((int) prolepticYear);
return (len > 354);
}

View File

@ -147,7 +147,7 @@ class ComparableTimSort {
*/
int stackLen = (len < 120 ? 5 :
len < 1542 ? 10 :
len < 119151 ? 24 : 40);
len < 119151 ? 24 : 49);
runBase = new int[stackLen];
runLen = new int[stackLen];
}

View File

@ -177,7 +177,7 @@ class TimSort<T> {
*/
int stackLen = (len < 120 ? 5 :
len < 1542 ? 10 :
len < 119151 ? 24 : 40);
len < 119151 ? 24 : 49);
runBase = new int[stackLen];
runLen = new int[stackLen];
}

View File

@ -987,6 +987,21 @@ public interface Stream<T> extends BaseStream<T, Stream<T>> {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
/**
* Returns a sequential {@code Stream} containing a single element, if
* non-null, otherwise returns an empty {@code Stream}.
*
* @param t the single element
* @param <T> the type of stream elements
* @return a stream with a single element if the specified element
* is non-null, otherwise an empty stream
* @since 1.9
*/
public static<T> Stream<T> ofNullable(T t) {
return t == null ? Stream.empty()
: StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
/**
* Returns a sequential ordered stream whose elements are the specified values.
*

View File

@ -160,22 +160,18 @@ public class SingleByte
byte[] da = dst.array();
int dp = dst.arrayOffset() + dst.position();
int dl = dst.arrayOffset() + dst.limit();
int len = Math.min(dl - dp, sl - sp);
CoderResult cr = CoderResult.UNDERFLOW;
if ((dl - dp) < (sl - sp)) {
sl = sp + (dl - dp);
cr = CoderResult.OVERFLOW;
}
while (sp < sl) {
while (len-- > 0) {
char c = sa[sp];
int b = encode(c);
if (b == UNMAPPABLE_ENCODING) {
if (Character.isSurrogate(c)) {
if (sgp == null)
sgp = new Surrogate.Parser();
if (sgp.parse(c, sa, sp, sl) < 0)
if (sgp.parse(c, sa, sp, sl) < 0) {
return withResult(sgp.error(), src, sp, dst, dp);
}
return withResult(sgp.unmappableResult(), src, sp, dst, dp);
}
return withResult(CoderResult.unmappableForLength(1),
@ -184,7 +180,8 @@ public class SingleByte
da[dp++] = (byte)b;
sp++;
}
return withResult(cr, src, sp, dst, dp);
return withResult(sp < sl ? CoderResult.OVERFLOW : CoderResult.UNDERFLOW,
src, sp, dst, dp);
}
private CoderResult encodeBufferLoop(CharBuffer src, ByteBuffer dst) {

View File

@ -243,8 +243,11 @@ public class StreamEncoder extends Writer
if (cr.isUnderflow()) {
if (lcb.hasRemaining()) {
leftoverChar = lcb.get();
if (cb != null && cb.hasRemaining())
flushLeftoverChar(cb, endOfInput);
if (cb != null && cb.hasRemaining()) {
lcb.clear();
lcb.put(leftoverChar).put(cb.get()).flip();
continue;
}
return;
}
break;
@ -265,24 +268,24 @@ public class StreamEncoder extends Writer
CharBuffer cb = CharBuffer.wrap(cbuf, off, len);
if (haveLeftoverChar)
flushLeftoverChar(cb, false);
flushLeftoverChar(cb, false);
while (cb.hasRemaining()) {
CoderResult cr = encoder.encode(cb, bb, false);
if (cr.isUnderflow()) {
assert (cb.remaining() <= 1) : cb.remaining();
if (cb.remaining() == 1) {
haveLeftoverChar = true;
leftoverChar = cb.get();
CoderResult cr = encoder.encode(cb, bb, false);
if (cr.isUnderflow()) {
assert (cb.remaining() <= 1) : cb.remaining();
if (cb.remaining() == 1) {
haveLeftoverChar = true;
leftoverChar = cb.get();
}
break;
}
break;
}
if (cr.isOverflow()) {
assert bb.position() > 0;
writeBytes();
continue;
}
cr.throwException();
if (cr.isOverflow()) {
assert bb.position() > 0;
writeBytes();
continue;
}
cr.throwException();
}
}

View File

@ -26,6 +26,8 @@
package sun.security.util;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import java.security.Principal;
@ -148,6 +150,17 @@ public class HostnameChecker {
String ipAddress = (String)next.get(1);
if (expectedIP.equalsIgnoreCase(ipAddress)) {
return;
} else {
// compare InetAddress objects in order to ensure
// equality between a long IPv6 address and its
// abbreviated form.
try {
if (InetAddress.getByName(expectedIP).equals(
InetAddress.getByName(ipAddress))) {
return;
}
} catch (UnknownHostException e) {
} catch (SecurityException e) {}
}
}
}

View File

@ -55,6 +55,29 @@ grant codeBase "jrt:/jdk.crypto.pkcs11" {
permission java.io.FilePermission "<<ALL FILES>>", "read";
};
grant codeBase "jrt:/java.xml.ws" {
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.xml.internal.*";
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.istack.internal";
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.istack.internal.*";
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.org.apache.xerces.internal.*";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.util.PropertyPermission "*", "read";
};
grant codeBase "jrt:/java.xml.bind" {
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.xml.internal.*";
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.istack.internal";
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.istack.internal.*";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.util.PropertyPermission "*", "read";
};
grant codeBase "jrt:/java.activation" {
permission java.security.AllPermission;
};
// default permissions granted to all domains
grant {

View File

@ -391,6 +391,10 @@ class WindowsPath implements Path {
if (!this.root.equalsIgnoreCase(other.root))
throw new IllegalArgumentException("'other' has different root");
// this path is the empty path
if (this.isEmpty())
return other;
int bn = this.getNameCount();
int cn = other.getNameCount();

View File

@ -30,6 +30,7 @@
#include "jvm.h"
#include "jni_util.h"
#include "io_util.h"
#include "io_util_md.h"
#include <windows.h>
#include <io.h>
@ -467,26 +468,6 @@ Java_java_lang_ProcessImpl_closeHandle(JNIEnv *env, jclass ignored, jlong handle
return (jboolean) CloseHandle((HANDLE) handle);
}
/**
* Returns a copy of the Unicode characters of a string. Fow now this
* function doesn't handle long path names and other issues.
*/
static WCHAR* getPath(JNIEnv *env, jstring ps) {
WCHAR *pathbuf = NULL;
const jchar *chars = (*(env))->GetStringChars(env, ps, NULL);
if (chars != NULL) {
size_t pathlen = wcslen(chars);
pathbuf = (WCHAR*)malloc((pathlen + 6) * sizeof(WCHAR));
if (pathbuf == NULL) {
JNU_ThrowOutOfMemoryError(env, NULL);
} else {
wcscpy(pathbuf, chars);
}
(*env)->ReleaseStringChars(env, ps, chars);
}
return pathbuf;
}
JNIEXPORT jlong JNICALL
Java_java_lang_ProcessImpl_openForAtomicAppend(JNIEnv *env, jclass ignored, jstring path)
{
@ -495,7 +476,7 @@ Java_java_lang_ProcessImpl_openForAtomicAppend(JNIEnv *env, jclass ignored, jstr
const DWORD disposition = OPEN_ALWAYS;
const DWORD flagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
HANDLE h;
WCHAR *pathbuf = getPath(env, path);
WCHAR *pathbuf = pathToNTPath(env, path, JNI_FALSE);
if (pathbuf == NULL) {
/* Exception already pending */
return -1;

View File

@ -33,7 +33,8 @@
/*
* Prototypes for functions in io_util_md.c called from io_util.c,
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c
* FileDescriptor.c, FileInputStream.c, FileOutputStream.c,
* ProcessImpl_md.c
*/
WCHAR* pathToNTPath(JNIEnv *env, jstring path, jboolean throwFNFE);
WCHAR* fileToNTPath(JNIEnv *env, jobject file, jfieldID id);

View File

@ -138,6 +138,7 @@ public interface ScriptEngineFactory {
* @return The value for the given parameter. Returns <code>null</code> if no
* value is assigned to the key.
*
* @throws NullPointerException if the key is null.
*/
public Object getParameter(String key);

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
@ -61,6 +61,7 @@ import sun.tools.java.ClassPath;
* they are subject to change or removal without notice.
*/
@SuppressWarnings("deprecation")
public class BatchEnvironment extends sun.tools.javac.BatchEnvironment {
/** instance of Main which created this environment */

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
@ -676,7 +676,7 @@ public class Main implements sun.rmi.rmic.Constants {
* Compile a single class.
* Fallthrough is intentional
*/
@SuppressWarnings("fallthrough")
@SuppressWarnings({"fallthrough", "deprecation"})
public boolean compileClass (ClassDeclaration c,
ByteArrayOutputStream buf,
BatchEnvironment env)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1994, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1994, 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
@ -39,6 +39,7 @@ import java.util.Enumeration;
* supported API. Code that depends on them does so at its own risk:
* they are subject to change or removal without notice.
*/
@SuppressWarnings("deprecation")
public final
class BinaryClass extends ClassDefinition implements Constants {
BinaryConstantPool cpool;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1994, 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1994, 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
@ -41,6 +41,7 @@ import sun.tools.tree.UplevelReference;
* supported API. Code that depends on them does so at its own risk:
* they are subject to change or removal without notice.
*/
@SuppressWarnings("deprecation")
public
class ClassDefinition implements Constants {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1994, 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
@ -44,6 +44,7 @@ import java.util.HashMap;
* supported API. Code that depends on them does so at its own risk:
* they are subject to change or removal without notice.
*/
@SuppressWarnings("deprecation")
public
class MemberDefinition implements Constants {
protected long where;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1994, 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1994, 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
@ -58,6 +58,7 @@ import java.util.Hashtable;
* @author Arthur van Hoff
*/
@SuppressWarnings("deprecation")
public
class Scanner implements Constants {
/**

View File

@ -0,0 +1,166 @@
/*
* Copyright (c) 2015, Red Hat, Inc.
* 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 8069072
* @summary Test vectors for com.sun.crypto.provider.GHASH
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
public class TestGHASH {
private final Constructor<?> GHASH;
private final Method UPDATE;
private final Method DIGEST;
TestGHASH(String className) throws Exception {
Class<?> cls = Class.forName(className);
GHASH = cls.getDeclaredConstructor(byte[].class);
GHASH.setAccessible(true);
UPDATE = cls.getDeclaredMethod("update", byte[].class);
UPDATE.setAccessible(true);
DIGEST = cls.getDeclaredMethod("digest");
DIGEST.setAccessible(true);
}
private Object newGHASH(byte[] H) throws Exception {
return GHASH.newInstance(H);
}
private void updateGHASH(Object hash, byte[] data)
throws Exception {
UPDATE.invoke(hash, data);
}
private byte[] digestGHASH(Object hash) throws Exception {
return (byte[]) DIGEST.invoke(hash);
}
private static final String HEX_DIGITS = "0123456789abcdef";
private static String hex(byte[] bs) {
StringBuilder sb = new StringBuilder(2 * bs.length);
for (byte b : bs) {
sb.append(HEX_DIGITS.charAt((b >> 4) & 0xF));
sb.append(HEX_DIGITS.charAt(b & 0xF));
}
return sb.toString();
}
private static byte[] bytes(String hex) {
if ((hex.length() & 1) != 0) {
throw new AssertionError();
}
byte[] result = new byte[hex.length() / 2];
for (int i = 0; i < result.length; ++i) {
int a = HEX_DIGITS.indexOf(hex.charAt(2 * i));
int b = HEX_DIGITS.indexOf(hex.charAt(2 * i + 1));
if ((a | b) < 0) {
if (a < 0) {
throw new AssertionError(
"bad character " + (int) hex.charAt(2 * i));
}
throw new AssertionError(
"bad character " + (int) hex.charAt(2 * i + 1));
}
result[i] = (byte) ((a << 4) | b);
}
return result;
}
private static byte[] bytes(long L0, long L1) {
return ByteBuffer.allocate(16)
.putLong(L0)
.putLong(L1)
.array();
}
private void check(int testCase, String H, String A,
String C, String expected) throws Exception {
int lenA = A.length() * 4;
while ((A.length() % 32) != 0) {
A += '0';
}
int lenC = C.length() * 4;
while ((C.length() % 32) != 0) {
C += '0';
}
Object hash = newGHASH(bytes(H));
updateGHASH(hash, bytes(A));
updateGHASH(hash, bytes(C));
updateGHASH(hash, bytes(lenA, lenC));
byte[] digest = digestGHASH(hash);
String actual = hex(digest);
if (!expected.equals(actual)) {
throw new AssertionError(String.format("%d: expected %s, got %s",
testCase, expected, actual));
}
}
public static void main(String[] args) throws Exception {
TestGHASH test;
if (args.length == 0) {
test = new TestGHASH("com.sun.crypto.provider.GHASH");
} else {
test = new TestGHASH(args[0]);
}
// Test vectors from David A. McGrew, John Viega,
// "The Galois/Counter Mode of Operation (GCM)", 2005.
// <http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf>
test.check(1, "66e94bd4ef8a2c3b884cfa59ca342b2e", "", "",
"00000000000000000000000000000000");
test.check(2,
"66e94bd4ef8a2c3b884cfa59ca342b2e", "",
"0388dace60b6a392f328c2b971b2fe78",
"f38cbb1ad69223dcc3457ae5b6b0f885");
test.check(3,
"b83b533708bf535d0aa6e52980d53b78", "",
"42831ec2217774244b7221b784d0d49c" +
"e3aa212f2c02a4e035c17e2329aca12e" +
"21d514b25466931c7d8f6a5aac84aa05" +
"1ba30b396a0aac973d58e091473f5985",
"7f1b32b81b820d02614f8895ac1d4eac");
test.check(4,
"b83b533708bf535d0aa6e52980d53b78",
"feedfacedeadbeeffeedfacedeadbeef" + "abaddad2",
"42831ec2217774244b7221b784d0d49c" +
"e3aa212f2c02a4e035c17e2329aca12e" +
"21d514b25466931c7d8f6a5aac84aa05" +
"1ba30b396a0aac973d58e091",
"698e57f70e6ecc7fd9463b7260a9ae5f");
test.check(5, "b83b533708bf535d0aa6e52980d53b78",
"feedfacedeadbeeffeedfacedeadbeef" + "abaddad2",
"61353b4c2806934a777ff51fa22a4755" +
"699b2a714fcdc6f83766e5f97b6c7423" +
"73806900e49f24b22b097544d4896b42" +
"4989b5e1ebac0f07c23f4598",
"df586bb4c249b92cb6922877e444d37b");
}
}

View File

@ -259,7 +259,7 @@ setup()
;;
esac
if [ -r $jdk/bin/dt_shmem.dll -o -r $jdk/jre/bin/dt_shmem.dll ] ; then
if [ -r $jdk/bin/dt_shmem.dll ] ; then
transport=dt_shmem
address=kkkk.$$
else
@ -933,18 +933,10 @@ dojstack()
debuggeeCmd=`$jdk/bin/jps -v | $grep $debuggeeKeyword`
realDebuggeePid=`echo "$debuggeeCmd" | sed -e 's@ .*@@'`
if [ ! -z "$realDebuggeePid" ] ; then
if [ -r "$jdk/lib/sa-jdi.jar" ] ; then
# disableVersionCheck can be removed after 6475822
# is fixed.
moption="-m -J-Dsun.jvm.hotspot.runtime.VM.disableVersionCheck"
else
moption=
fi
echo "-- debuggee process info ----------------------" >&2
echo " $debuggeeCmd" >&2
echo "-- debuggee threads: jstack $moption $realDebuggeePid" >&2
$jdk/bin/$jstack $moption $realDebuggeePid >&2
$jdk/bin/$jstack $realDebuggeePid >&2
echo "=============================================" >&2
echo >&2
fi

View File

@ -115,10 +115,7 @@ public class DemoRun {
*/
public void runit(String class_name, String vm_options[])
{
String jre_home = System.getProperty("java.home");
String sdk_home = (jre_home.endsWith("jre") ?
(jre_home + File.separator + "..") :
jre_home );
String sdk_home = System.getProperty("java.home");
String cdir = System.getProperty("test.classes", ".");
String os_arch = System.getProperty("os.arch");
String os_name = System.getProperty("os.name");
@ -126,7 +123,7 @@ public class DemoRun {
String libsuffix = os_name.contains("Windows")?".dll":
os_name.contains("OS X")?".dylib":".so";
boolean hprof = demo_name.equals("hprof");
String java = jre_home
String java = sdk_home
+ File.separator + "bin"
+ File.separator + "java";
/* Array of strings to be passed in for exec:

View File

@ -0,0 +1,79 @@
/*
* Copyright 2015 SAP SE. 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 8072611
* @summary ProcessBuilder Redirect to file appending on Windows should work with long file names
* @author Thomas Stuefe
*/
import java.io.File;
import java.lang.ProcessBuilder.Redirect;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class RedirectWithLongFilename {
public static void main(String[] args) throws Exception {
// windows only
if (!Basic.Windows.is()) {
return;
}
// Redirect ProcessBuilder output to a file whose pathlen is > 255.
Path tmpDir = Paths.get(System.getProperty("java.io.tmpdir"));
File dir2 = null;
File longFileName = null;
try {
dir2 = Files.createTempDirectory(tmpDir, "RedirectWithLongFilename").toFile();
dir2.mkdirs();
longFileName = new File(dir2,
"012345678901234567890123456789012345678901234567890123456789" +
"012345678901234567890123456789012345678901234567890123456789" +
"012345678901234567890123456789012345678901234567890123456789" +
"012345678901234567890123456789012345678901234567890123456789" +
"0123456789");
ProcessBuilder pb = new ProcessBuilder("hostname.exe");
pb.redirectOutput(Redirect.appendTo(longFileName));
Process p = pb.start();
p.waitFor();
if (longFileName.exists()) {
System.out.println("OK");
} else {
throw new RuntimeException("Test failed.");
}
} finally {
longFileName.delete();
dir2.delete();
}
}
}

View File

@ -39,7 +39,7 @@ import java.lang.management.*;
public class Pending {
final static int NO_REF_COUNT = 600;
final static int REF_COUNT = 600;
final static int REF_COUNT = 500;
final static int TOTAL_FINALIZABLE = (NO_REF_COUNT + REF_COUNT);
private static int finalized = 0;
private static MemoryMXBean mbean
@ -83,31 +83,22 @@ public class Pending {
// Clean the memory and remove all objects that are pending
// finalization
System.gc();
Runtime.getRuntime().runFinalization();
// Let the finalizer to finish
try {
Thread.sleep(200);
} catch (Exception e) {
throw e;
}
// Create a number of new objects but no references to them
int startCount = mbean.getObjectPendingFinalizationCount();
Snapshot snapshot = getSnapshotAfterFinalization();
System.out.println("Number of objects pending for finalization:");
System.out.println(" Before creating object: " + startCount +
" finalized = " + finalized);
System.out.println(" Before creating object: " + snapshot);
printFinalizerInstanceCount();
// Create objects without saving reference. Should be removed at next GC.
for (int i = 0; i < NO_REF_COUNT; i++) {
new MyObject();
}
Snapshot snapshot = getSnapshot();
snapshot = getSnapshot();
System.out.println(" Afer creating objects with no ref: " + snapshot);
printFinalizerInstanceCount();
// Create objects and save references.
objs = new Object[REF_COUNT];
for (int i = 0; i < REF_COUNT; i++) {
objs[i] = new MyObject();
@ -139,9 +130,8 @@ public class Pending {
+ TOTAL_FINALIZABLE);
}
if (startCount != 0 || snapshot.curPending != 0) {
if (snapshot.curPending != 0) {
throw new RuntimeException("Wrong number of objects pending "
+ "finalization start = " + startCount
+ " end = " + snapshot);
}
@ -161,29 +151,8 @@ public class Pending {
snapshot.curFinalized != expectedTotal && i <= MAX_GC_LOOP;
i++) {
System.gc();
snapshot = getSnapshotAfterFinalization();
// Pause to give a chance to Finalizer thread to run
pause();
printFinalizerInstanceCount();
// Race condition may occur; attempt to check this
// a few times before throwing exception.
for (int j = 0; j < 5; j++) {
// poll for another current pending count
snapshot = getSnapshot();
if (snapshot.curFinalized == expectedTotal ||
snapshot.curPending != 0) {
break;
}
}
System.out.println(" After GC " + i + ": " + snapshot);
Runtime.getRuntime().runFinalization();
// Pause to give a chance to Finalizer thread to run
pause();
snapshot = getSnapshot();
if (snapshot.curFinalized == expectedTotal &&
snapshot.curPending != 0) {
throw new RuntimeException(
@ -237,17 +206,21 @@ public class Pending {
}
}
private static Object pauseObj = new Object();
private static void pause() {
// Enter lock a without blocking
synchronized (pauseObj) {
try {
// may need to tune this timeout for different platforms
pauseObj.wait(20);
} catch (Exception e) {
System.err.println("Unexpected exception.");
e.printStackTrace(System.err);
// Repeat getSnapshot until no pending finalization.
private static Snapshot getSnapshotAfterFinalization() throws Exception {
int loopCount = 0;
Snapshot snapshot = null;
while (loopCount < 100) {
Runtime.getRuntime().runFinalization();
Thread.sleep(50);
snapshot = getSnapshot();
if (snapshot.curPending == 0) {
return snapshot;
}
++loopCount;
System.out.println("Waiting for curPending to be 0. snapshot=" + snapshot);
}
String msg = "Objects pending finalization is not 0. snapshot=%s";
throw new RuntimeException(String.format(msg, snapshot));
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2014, 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
@ -75,7 +75,7 @@ public class SynchronizationStatistics {
}
private static void waitForThreadState(Thread t, Thread.State state) throws InterruptedException {
while (!t.isInterrupted() && t.getState() != state) {
while (t.getState() != state) {
Thread.sleep(3);
}
}
@ -109,7 +109,9 @@ public class SynchronizationStatistics {
synchronized(lock1) {
p.arriveAndAwaitAdvance(); // phase[1]
waitForThreadState(lt, Thread.State.BLOCKED);
lockName = mbean.getThreadInfo(tid).getLockName();
do {
lockName = mbean.getThreadInfo(tid).getLockName();
} while (lockName == null);
}
p.arriveAndAwaitAdvance(); // phase[2]
@ -159,7 +161,9 @@ public class SynchronizationStatistics {
synchronized(lock1) {
p.arriveAndAwaitAdvance(); // phase[1]
waitForThreadState(lt, Thread.State.BLOCKED);
lockName = mbean.getThreadInfo(tid).getLockName();
do {
lockName = mbean.getThreadInfo(tid).getLockName();
} while (lockName == null);
}
p.arriveAndAwaitAdvance(); // phase[2]
@ -168,7 +172,9 @@ public class SynchronizationStatistics {
synchronized(lock2) {
p.arriveAndAwaitAdvance(); // phase [3]
waitForThreadState(lt, Thread.State.BLOCKED);
lockName = mbean.getThreadInfo(tid).getLockName();
do {
lockName = mbean.getThreadInfo(tid).getLockName();
} while (lockName == null);
}
p.arriveAndAwaitAdvance(); // phase [4]
testBlocked(ti, () -> mbean.getThreadInfo(tid), lockName, lock2);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2005, 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
@ -23,7 +23,7 @@
/*
* @test
* @bug 4851776 4907265 6177836 6876282
* @bug 4851776 4907265 6177836 6876282 8066842
* @summary Some tests for the divide methods.
* @author Joseph D. Darcy
*/
@ -358,6 +358,57 @@ public class DivideTests {
return failures;
}
private static int divideByOneTests() {
int failures = 0;
//problematic divisor: one with scale 17
BigDecimal one = BigDecimal.ONE.setScale(17);
RoundingMode rounding = RoundingMode.UNNECESSARY;
long[][] unscaledAndScale = new long[][] {
{ Long.MAX_VALUE, 17},
{-Long.MAX_VALUE, 17},
{ Long.MAX_VALUE, 0},
{-Long.MAX_VALUE, 0},
{ Long.MAX_VALUE, 100},
{-Long.MAX_VALUE, 100}
};
for (long[] uas : unscaledAndScale) {
long unscaled = uas[0];
int scale = (int)uas[1];
BigDecimal noRound = null;
try {
noRound = BigDecimal.valueOf(unscaled, scale).
divide(one, RoundingMode.UNNECESSARY);
} catch (ArithmeticException e) {
failures++;
System.err.println("ArithmeticException for value " + unscaled
+ " and scale " + scale + " without rounding");
}
BigDecimal roundDown = null;
try {
roundDown = BigDecimal.valueOf(unscaled, scale).
divide(one, RoundingMode.DOWN);
} catch (ArithmeticException e) {
failures++;
System.err.println("ArithmeticException for value " + unscaled
+ " and scale " + scale + " with rounding down");
}
if (noRound != null && roundDown != null
&& noRound.compareTo(roundDown) != 0) {
failures++;
System.err.println("Equality failure for value " + unscaled
+ " and scale " + scale);
}
}
return failures;
}
public static void main(String argv[]) {
int failures = 0;
@ -366,10 +417,11 @@ public class DivideTests {
failures += properScaleTests();
failures += trailingZeroTests();
failures += scaledRoundedDivideTests();
failures += divideByOneTests();
if (failures > 0) {
throw new RuntimeException("Incurred " + failures +
" failures while testing exact divide.");
" failures while testing division.");
}
}
}

View File

@ -22,7 +22,7 @@
*/
/* @test
* @bug 4313887 6838333 6925932 7006126 8037945
* @bug 4313887 6838333 6925932 7006126 8037945 8072495
* @summary Unit test for java.nio.file.Path path operations
*/
@ -516,7 +516,9 @@ public class PathOps {
.relativize("\\\\server\\share\\bar", "..\\bar")
.relativize("\\\\server\\share\\foo", "");
test("")
.relativize("", "");
.relativize("", "")
.relativize("a", "a")
.relativize("a\\b\\c", "a\\b\\c");
// normalize
test("C:\\")

View File

@ -30,6 +30,7 @@ import static java.time.temporal.ChronoField.DAY_OF_YEAR;
import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
import static java.time.temporal.ChronoField.YEAR;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
@ -71,6 +72,7 @@ import org.testng.annotations.Test;
/**
* Tests for the Umm alQura chronology and data.
* Note: The dates used for testing are just a sample of calendar data.
* @bug 8067800
*/
@Test
public class TestUmmAlQuraChronology {
@ -530,6 +532,24 @@ public class TestUmmAlQuraChronology {
assertEquals(date.isLeapYear(), leapyear);
}
// Data provider to verify that a given hijrah year is outside the range of supported years
// The values are dependent on the currently configured UmmAlQura calendar data
@DataProvider(name="OutOfRangeLeapYears")
Object[][] data_invalid_leapyears() {
return new Object[][] {
{1299},
{1601},
{Integer.MAX_VALUE},
{Integer.MIN_VALUE},
};
}
@Test(dataProvider="OutOfRangeLeapYears")
public void test_notLeapYears(int y) {
assertFalse(HijrahChronology.INSTANCE.isLeapYear(y), "Out of range leap year");
}
// Date samples to convert HijrahDate to LocalDate and vice versa
@DataProvider(name="samples")
Object[][] data_samples() {

View File

@ -0,0 +1,169 @@
/*
* 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
* @bug 8072909
* @run main/othervm TimSortStackSize2 67108864
* not for regular execution on all platforms:
* run main/othervm -Xmx8g TimSortStackSize2 1073741824
* run main/othervm -Xmx32g TimSortStackSize2 2147483644
* @summary Test TimSort stack size on big arrays
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class TimSortStackSize2 {
public static void main(String[] args) {
int lengthOfTest = Integer.parseInt(args[0]);
boolean passed = true;
try {
Arrays.sort(new TimSortStackSize2(lengthOfTest).createArray(),
new Comparator<Object>() {
@SuppressWarnings("unchecked")
public int compare(Object first, Object second) {
return ((Comparable<Object>)first).compareTo(second);
}
});
System.out.println("TimSort OK");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("TimSort broken");
e.printStackTrace();
passed = false;
}
try {
Arrays.sort(new TimSortStackSize2(lengthOfTest).createArray());
System.out.println("ComparableTimSort OK");
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("ComparableTimSort broken:");
e.printStackTrace();
passed = false;
}
if ( !passed ){
throw new RuntimeException();
}
}
private static final int MIN_MERGE = 32;
private final int minRun;
private final int length;
private final List<Long> runs = new ArrayList<Long>();
public TimSortStackSize2(int len) {
this.length = len;
minRun = minRunLength(len);
fillRunsJDKWorstCase();
}
private static int minRunLength(int n) {
assert n >= 0;
int r = 0; // Becomes 1 if any 1 bits are shifted off
while (n >= MIN_MERGE) {
r |= (n & 1);
n >>= 1;
}
return n + r;
}
/**
* Adds a sequence x_1, ..., x_n of run lengths to <code>runs</code> such that:<br>
* 1. X = x_1 + ... + x_n <br>
* 2. x_j >= minRun for all j <br>
* 3. x_1 + ... + x_{j-2} < x_j < x_1 + ... + x_{j-1} for all j <br>
* These conditions guarantee that TimSort merges all x_j's one by one
* (resulting in X) using only merges on the second-to-last element.
* @param X The sum of the sequence that should be added to runs.
*/
private void generateJDKWrongElem(long X) {
for(long newTotal; X >= 2*minRun+1; X = newTotal) {
//Default strategy
newTotal = X/2 + 1;
//Specialized strategies
if(3*minRun+3 <= X && X <= 4*minRun+1) {
// add x_1=MIN+1, x_2=MIN, x_3=X-newTotal to runs
newTotal = 2*minRun+1;
} else if(5*minRun+5 <= X && X <= 6*minRun+5) {
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=X-newTotal to runs
newTotal = 3*minRun+3;
} else if(8*minRun+9 <= X && X <= 10*minRun+9) {
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=X-newTotal to runs
newTotal = 5*minRun+5;
} else if(13*minRun+15 <= X && X <= 16*minRun+17) {
// add x_1=MIN+1, x_2=MIN, x_3=MIN+2, x_4=2MIN+2, x_5=3MIN+4, x_6=X-newTotal to runs
newTotal = 8*minRun+9;
}
runs.add(0, X-newTotal);
}
runs.add(0, X);
}
/**
* Fills <code>runs</code> with a sequence of run lengths of the form<br>
* Y_n x_{n,1} x_{n,2} ... x_{n,l_n} <br>
* Y_{n-1} x_{n-1,1} x_{n-1,2} ... x_{n-1,l_{n-1}} <br>
* ... <br>
* Y_1 x_{1,1} x_{1,2} ... x_{1,l_1}<br>
* The Y_i's are chosen to satisfy the invariant throughout execution,
* but the x_{i,j}'s are merged (by <code>TimSort.mergeCollapse</code>)
* into an X_i that violates the invariant.
* X is the sum of all run lengths that will be added to <code>runs</code>.
*/
private void fillRunsJDKWorstCase() {
long runningTotal = 0;
long Y = minRun + 4;
long X = minRun;
while(runningTotal+Y+X <= length) {
runningTotal += X + Y;
generateJDKWrongElem(X);
runs.add(0,Y);
// X_{i+1} = Y_i + x_{i,1} + 1, since runs.get(1) = x_{i,1}
X = Y + runs.get(1) + 1;
// Y_{i+1} = X_{i+1} + Y_i + 1
Y += X + 1;
}
if(runningTotal + X <= length) {
runningTotal += X;
generateJDKWrongElem(X);
}
runs.add(length-runningTotal);
}
private Integer[] createArray() {
Integer[] a = new Integer[length];
Arrays.fill(a, 0);
int endRun = -1;
for(long len : runs)
a[endRun+=len] = 1;
a[length-1]=0;
return a;
}
}

View File

@ -54,9 +54,31 @@ public class StreamBuilderTest extends OpTestCase {
}
@Test
public void testOfNullableWithNonNull() {
TestData.OfRef<Integer> data = TestData.Factory.ofSupplier("{1}",
() -> Stream.ofNullable(1));
withData(data).
stream(s -> s).
expectedResult(Collections.singletonList(1)).
exercise();
}
@Test
public void testOfNullableWithNull() {
TestData.OfRef<Integer> data = TestData.Factory.ofSupplier("{null})",
() -> Stream.ofNullable(null));
withData(data).
stream(s -> s).
expectedResult(Collections.emptyList()).
exercise();
}
@Test
public void testSingleton() {
TestData.OfRef<Integer> data = TestData.Factory.ofSupplier("[0, 1)",
TestData.OfRef<Integer> data = TestData.Factory.ofSupplier("{1}",
() -> Stream.of(1));
withData(data).
@ -118,7 +140,7 @@ public class StreamBuilderTest extends OpTestCase {
@Test
public void testIntSingleton() {
TestData.OfInt data = TestData.Factory.ofIntSupplier("[0, 1)",
TestData.OfInt data = TestData.Factory.ofIntSupplier("{1}",
() -> IntStream.of(1));
withData(data).
@ -180,7 +202,7 @@ public class StreamBuilderTest extends OpTestCase {
@Test
public void testLongSingleton() {
TestData.OfLong data = TestData.Factory.ofLongSupplier("[0, 1)",
TestData.OfLong data = TestData.Factory.ofLongSupplier("{1}",
() -> LongStream.of(1));
withData(data).
@ -242,7 +264,7 @@ public class StreamBuilderTest extends OpTestCase {
@Test
public void testDoubleSingleton() {
TestData.OfDouble data = TestData.Factory.ofDoubleSupplier("[0, 1)", () -> DoubleStream.of(1));
TestData.OfDouble data = TestData.Factory.ofDoubleSupplier("{1}", () -> DoubleStream.of(1));
withData(data).
stream(s -> s).

View File

@ -218,19 +218,8 @@ public final class ProcessTools {
* @return Process id
*/
public static int getProcessId() throws Exception {
// Get the current process id using a reflection hack
RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
VMManagement mgmt = (sun.management.VMManagement) jvm.get(runtime);
Method pid_method = mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);
int pid = (Integer) pid_method.invoke(mgmt);
int pid = Integer.parseInt(runtime.getName().split("@")[0]);
return pid;
}

View File

@ -56,7 +56,7 @@ public class SimpleSSLContext {
*/
public SimpleSSLContext () throws IOException {
String paths = System.getProperty("test.src.path");
StringTokenizer st = new StringTokenizer(paths,":");
StringTokenizer st = new StringTokenizer(paths, File.pathSeparator);
boolean securityExceptions = false;
while (st.hasMoreTokens()) {
String path = st.nextToken();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2014, 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
@ -23,7 +23,9 @@
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.BindException;
import java.net.ConnectException;
import java.net.ServerSocket;
import java.rmi.RemoteException;
@ -31,15 +33,15 @@ import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.management.*;
import javax.management.remote.*;
@ -47,6 +49,8 @@ import javax.net.ssl.SSLHandshakeException;
import jdk.testlibrary.ProcessTools;
import jdk.testlibrary.JDKToolLauncher;
import sun.management.Agent;
import sun.management.AgentConfigurationError;
/**
* @test
@ -54,65 +58,55 @@ import jdk.testlibrary.JDKToolLauncher;
* @library /lib/testlibrary
* @build jdk.testlibrary.* JMXStartStopTest JMXStartStopDoSomething
* @run main/othervm/timeout=600 -XX:+UsePerfData JMXStartStopTest
* @summary Makes sure that enabling/disabling the management agent through
* JCMD achieves the desired results
* @summary Makes sure that enabling/disabling the management agent through JCMD
* achieves the desired results
*/
public class JMXStartStopTest {
private static final String TEST_SRC = System.getProperty("test.src");
private static final boolean verbose = false;
/**
* Dynamically allocates two distinct ports using {@linkplain java.net.ServerSocket}
* It keeps each of those ports blocked until it is first accessed by its getter
* Dynamically allocates distinct ports from the ephemeral range 49152-65535
*/
private static class PortAllocator {
private final int port1, port2;
private final ServerSocket ss1, ss2;
PortAllocator() {
try {
ss1 = new ServerSocket(0);
ss2 = new ServerSocket(0);
port1 = ss1.getLocalPort();
port2 = ss2.getLocalPort();
} catch (IOException e) {
throw new Error("Error while obtaining free ports", e);
}
}
public int getPort1() {
if (!ss1.isClosed()) {
try {
ss1.close();
} catch (IOException e) {
// just ignore
}
}
return port1;
}
private final static int LOWER_BOUND = 49152;
private final static int UPPER_BOUND = 65535;
public int getPort2() {
if (!ss2.isClosed()) {
try {
ss2.close();
} catch (IOException e) {
// just ignore
private final static Random RND = new Random(System.currentTimeMillis());
private static int[] allocatePorts(final int numPorts) {
int[] ports = new int[numPorts];
for (int i = 0; i < numPorts; i++) {
int port = -1;
while (port == -1) {
port = RND.nextInt(UPPER_BOUND - LOWER_BOUND + 1) + LOWER_BOUND;
for (int j = 0; j < i; j++) {
if (ports[j] == port) {
port = -1;
break;
}
}
}
System.err.println("*** port = " + port);
ports[i] = port;
}
return port2;
return ports;
}
}
private static void dbg_print(String msg){
private static void dbg_print(String msg) {
if (verbose) {
System.out.println("DBG: " +msg);
System.out.println("DBG: " + msg);
}
}
private static int listMBeans(MBeanServerConnection server,
ObjectName pattern,
QueryExp query)
throws Exception {
ObjectName pattern,
QueryExp query)
throws Exception {
Set<ObjectName> names = server.queryNames(pattern,query);
for (ObjectName name : names) {
@ -131,9 +125,8 @@ public class JMXStartStopTest {
return names.size();
}
private static void testConnectLocal(long pid)
throws Exception {
throws Exception {
String jmxUrlStr = null;
@ -208,12 +201,12 @@ public class JMXStartStopTest {
String jmxUrlStr = (rmiPort != 0) ?
String.format(
"service:jmx:rmi://localhost:%d/jndi/rmi://localhost:%d/jmxrmi",
rmiPort,
"service:jmx:rmi://localhost:%d/jndi/rmi://localhost:%d/jmxrmi",
rmiPort,
port) :
String.format(
"service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi",
port);
"service:jmx:rmi:///jndi/rmi://localhost:%d/jmxrmi",
port);
JMXServiceURL url = new JMXServiceURL(jmxUrlStr);
@ -292,7 +285,21 @@ public class JMXStartStopTest {
if (m.getName().startsWith("test_")) {
long t1 = System.currentTimeMillis();
try {
m.invoke(null);
boolean retry = false;
do {
try {
m.invoke(null);
retry = false;
} catch (InvocationTargetException e) {
if (e.getCause() instanceof BindException ||
e.getCause() instanceof java.rmi.ConnectException) {
System.out.println("Failed to allocate ports. Retrying ...");
retry = true;
} else {
throw e;
}
}
} while (retry);
System.out.println("=== PASSED");
} catch (Throwable e) {
failures.add(new Failure(e, m.getName() + " failed"));
@ -326,13 +333,23 @@ public class JMXStartStopTest {
public synchronized void start() throws InterruptedException, IOException, TimeoutException {
if (started.compareAndSet(false, true)) {
try {
AtomicBoolean error = new AtomicBoolean(false);
p = ProcessTools.startProcess(
"JMXStartStopDoSomething",
pb,
(line) -> line.equals("main enter"),
5,
TimeUnit.SECONDS
"JMXStartStopDoSomething{" + name + "}",
pb,
(line) -> {
boolean ok = line.equals("main enter");
error.set(line.contains("BindException"));
return ok || error.get();
},
5,
TimeUnit.SECONDS
);
if (error.get()) {
throw new BindException("Starting process failed due to " +
"the requested port not being available");
}
pid = p.getPid();
} catch (TimeoutException e) {
p.destroy();
@ -347,7 +364,7 @@ public class JMXStartStopTest {
}
public synchronized void stop()
throws IOException, InterruptedException {
throws IOException, InterruptedException {
if (started.compareAndSet(true, false)) {
p.getOutputStream().write(0);
p.getOutputStream().flush();
@ -374,16 +391,16 @@ public class JMXStartStopTest {
* @throws TimeoutException
*/
private static Something doSomething(String name, String ... args)
throws Exception {
throws Exception {
List<String> pbArgs = new ArrayList<>(Arrays.asList(
"-cp",
System.getProperty("test.class.path")
"-cp",
System.getProperty("test.class.path")
));
pbArgs.addAll(Arrays.asList(args));
pbArgs.add("JMXStartStopDoSomething");
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
pbArgs.toArray(new String[pbArgs.size()])
pbArgs.toArray(new String[pbArgs.size()])
);
Something s = new Something(pb, name);
s.start();
@ -399,7 +416,7 @@ public class JMXStartStopTest {
*/
private static void jcmd(String ... command) throws IOException, InterruptedException {
if (command.length == 0) {
jcmd(null, (Consumer<String>)null);
jcmd(null, c->{});
} else {
jcmd(null, command);
}
@ -408,7 +425,7 @@ public class JMXStartStopTest {
/**
* Run the "jcmd" command
*
* @param c {@linkplain Consumer} instance; may be null
* @param c {@linkplain Consumer} instance
* @param command Command with parameters; space separated string
* @throws IOException
* @throws InterruptedException
@ -419,8 +436,9 @@ public class JMXStartStopTest {
/**
* Run the "jcmd" command
*
* @param target The target application name (or PID)
* @param c {@linkplain Consumer} instance; may be null
* @param c {@linkplain Consumer} instance
* @param command Command with parameters; space separated string
* @throws IOException
* @throws InterruptedException
@ -430,21 +448,37 @@ public class JMXStartStopTest {
JDKToolLauncher l = JDKToolLauncher.createUsingTestJDK("jcmd");
l.addToolArg(target);
for(String cmd : command) {
for (String cmd : command) {
l.addToolArg(cmd);
}
AtomicBoolean portUnavailable = new AtomicBoolean(false);
Process p = ProcessTools.startProcess(
"jcmd",
new ProcessBuilder(l.getCommand()),
c
line -> {
if (line.contains("BindException") ||
line.contains(Agent.getText(AgentConfigurationError.CONNECTOR_SERVER_IO_ERROR))) {
portUnavailable.set(true);
} else {
c.accept(line);
}
}
);
p.waitFor();
dbg_print("[jcmd] --------");
if (portUnavailable.get()) {
String cmd = Arrays.asList(l.getCommand()).stream()
.collect(
Collectors.joining(" ", "", ": Unable to bind address")
);
throw new BindException(cmd);
}
}
private static final String CMD_STOP = "ManagementAgent.stop";
private static final String CMD_START= "ManagementAgent.start";
private static final String CMD_START = "ManagementAgent.start";
private static final String CMD_START_LOCAL = "ManagementAgent.start_local";
static void test_01() throws Exception {
@ -452,22 +486,22 @@ public class JMXStartStopTest {
// restart on other port
System.out.println("**** Test one ****");
PortAllocator pa = new PortAllocator();
int ports[] = PortAllocator.allocatePorts(2);
Something s = doSomething(
"test_01",
"-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
"test_01",
"-Dcom.sun.management.jmxremote.port=" + ports[0],
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
try {
testConnect(pa.getPort1());
testConnect(ports[0]);
jcmd(CMD_STOP);
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
jcmd(CMD_START, "jmxremote.port=" + pa.getPort2());
testConnect(pa.getPort2());
jcmd(CMD_START, "jmxremote.port=" + ports[1]);
testConnect(ports[1]);
} finally {
s.stop();
}
@ -479,15 +513,15 @@ public class JMXStartStopTest {
System.out.println("**** Test two ****");
int[] ports = PortAllocator.allocatePorts(1);
Something s = doSomething("test_02");
PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
testConnect(pa.getPort1());
testConnect(ports[0]);
} finally {
// debugPortUsage(pa);
s.stop();
@ -500,25 +534,25 @@ public class JMXStartStopTest {
System.out.println("**** Test three ****");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_03");
PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
// Second agent shouldn't start
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
"jmxremote.port=" + ports[1],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
// First agent should connect
testConnect(pa.getPort1());
testConnect(ports[0]);
// Second agent should not connect
testNoConnect(pa.getPort2());
testNoConnect(ports[1]);
} finally {
s.stop();
}
@ -530,16 +564,16 @@ public class JMXStartStopTest {
System.out.println("**** Test four ****");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_04");
PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort1(),
"jmxremote.rmi.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
"jmxremote.port=" + ports[0],
"jmxremote.rmi.port=" + ports[1],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
testConnect(pa.getPort1(), pa.getPort2());
testConnect(ports[0], ports[1]);
} finally {
s.stop();
}
@ -550,13 +584,12 @@ public class JMXStartStopTest {
// but should leave remote server disabled
System.out.println("**** Test five ****");
int[] ports = PortAllocator.allocatePorts(1);
Something s = doSomething("test_05");
PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START_LOCAL);
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
testConnectLocal(s.getPid());
} finally {
s.stop();
@ -566,94 +599,36 @@ public class JMXStartStopTest {
static void test_06() throws Exception {
// Run an app without JMX enabled
// start JMX by jcmd on one port, specify rmi port explicitly
// attempt to start it again
// 1) with the same port
// 2) with other port
// 3) attempt to stop it twice
// attempt to start it again with the same port
// Check for valid messages in the output
System.out.println("**** Test six ****");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_06");
PortAllocator pa = new PortAllocator();
try {
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
testConnect(pa.getPort1(), pa.getPort2());
testConnect(ports[0], ports[1]);
final AtomicInteger checks = new AtomicInteger();
final AtomicBoolean checks = new AtomicBoolean(false);
jcmd(
line -> {
if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks.getAndUpdate((op) -> op | 1);
}
},
CMD_START,
"jmxremote.port=" + pa.getPort1(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
line -> {
if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks.set(true);
}
},
CMD_START,
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
jcmd(
line -> {
if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks.getAndUpdate((op) -> op | 2);
}
},
CMD_START,
"jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
jcmd(CMD_STOP);
jcmd(CMD_STOP);
int busyPort;
try (ServerSocket ss = new ServerSocket(0))
{
busyPort = ss.getLocalPort();
int retryCntr = 1;
do {
final boolean[] retry = new boolean[]{false};
jcmd(
line -> {
boolean match = line.contains("Port already in use: " +
busyPort);
System.out.println("[match] " + line + " => " + match);
if (match) {
checks.getAndUpdate((op) -> op | 4);
retry[0] = false;
} else if (line.contains("Exception thrown by the agent")) {
retry[0] = true;
}
},
CMD_START,
"jmxremote.port=" + ss.getLocalPort(),
"jmxremote.rmi.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
if (!retry[0]) {
break;
}
System.out.println("Attempt " + retryCntr + " >>>");
System.out.println("Unexpected reply from the agent. Retrying in 500ms ...");
Thread.sleep(500);
} while (retryCntr++ < 10);
}
if ((checks.get() & 1) == 0) {
throw new Exception("Starting agent on port " + pa.getPort1() + " should " +
"report an invalid agent state");
}
if ((checks.get() & 2) == 0) {
throw new Exception("Starting agent on poprt " + pa.getPort2() + " should " +
"report an invalid agent state");
}
if ((checks.get() & 4) == 0) {
throw new Exception("Starting agent on port " + busyPort + " should " +
"report port in use");
if (!checks.get()) {
throw new Exception("Starting agent on port " + ports[0] + " should "
+ "report an invalid agent state");
}
} finally {
s.stop();
@ -661,68 +636,188 @@ public class JMXStartStopTest {
}
static void test_07() throws Exception {
// Run an app without JMX enabled, but with some properties set
// in command line.
// make sure these properties overridden corectly
// Run an app without JMX enabled
// start JMX by jcmd on one port, specify rmi port explicitly
// attempt to start it again with other port
// Check for valid messages in the output
System.out.println("**** Test seven ****");
Something s = doSomething(
"test_07",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
PortAllocator pa = new PortAllocator();
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_07");
try {
testNoConnect(pa.getPort1());
jcmd(CMD_START,
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
testConnect(ports[0], ports[1]);
final AtomicBoolean checks = new AtomicBoolean(false);
jcmd(
CMD_START,
"jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
testConnect(pa.getPort2());
line -> {
if (line.contains("java.lang.RuntimeException: Invalid agent state")) {
checks.set(true);
}
},
CMD_START,
"jmxremote.port=" + ports[1],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
if (!checks.get()) {
throw new Exception("Starting agent on poprt " + ports[1] + " should "
+ "report an invalid agent state");
}
} finally {
s.stop();
}
}
static void test_08() throws Exception {
// Run an app with JMX enabled and with some properties set
// in command line.
// stop JMX agent and then start it again with different property values
// make sure these properties overridden corectly
// Run an app without JMX enabled
// start JMX by jcmd on one port, specify rmi port explicitly
// attempt to stop it twice
// Check for valid messages in the output
System.out.println("**** Test eight ****");
PortAllocator pa = new PortAllocator();
Something s = doSomething(
"test_08",
"-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_08");
try {
testNoConnect(pa.getPort1());
jcmd(CMD_START,
"jmxremote.port=" + ports[0],
"jmxremote.authenticate=false",
"jmxremote.ssl=false");
testConnect(ports[0], ports[1]);
jcmd(CMD_STOP);
testNoConnect(pa.getPort1());
jcmd(
CMD_START,
"jmxremote.port=" + pa.getPort2(),
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
testConnect(pa.getPort2());
jcmd(CMD_STOP);
} finally {
s.stop();
}
}
static void test_09() throws Exception {
// Run an app without JMX enabled
// attempt to start JMX using a non-available port
// Check for valid messages in the output
System.out.println("**** Test nine ****");
Something s = doSomething("test_09");
try (ServerSocket ss = new ServerSocket(0)) {
int localPort = ss.getLocalPort();
int[] ports;
do {
ports = PortAllocator.allocatePorts(1);
} while (localPort == ports[0]);
final AtomicBoolean checks = new AtomicBoolean(false);
int retryCntr = 1;
do {
final AtomicBoolean retry = new AtomicBoolean(false);
try {
jcmd(
line -> {
if (line.contains(Agent.getText(AgentConfigurationError.AGENT_EXCEPTION))) {
retry.set(true);
}
},
CMD_START,
"jmxremote.port=" + ports[0],
"jmxremote.rmi.port=" + localPort,
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
} catch (BindException e) {
checks.set(true);
}
if (!retry.get()) {
break;
}
System.out.println("Attempt " + retryCntr + " >>>");
System.out.println("Unexpected reply from the agent. Retrying in 500ms ...");
Thread.sleep(500);
} while (retryCntr++ < 10);
if (!checks.get()) {
throw new Exception("Starting agent on port " + ports[0] + " should "
+ "report port in use");
}
} finally {
s.stop();
}
}
static void test_10() throws Exception {
// Run an app without JMX enabled, but with some properties set
// in command line.
// make sure these properties overridden corectly
System.out.println("**** Test ten ****");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething(
"test_10",
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
try {
testNoConnect(ports[0]);
jcmd(
CMD_START,
"jmxremote.port=" + ports[1],
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
testConnect(ports[1]);
} finally {
s.stop();
}
}
static void test_11() throws Exception {
// Run an app with JMX enabled and with some properties set
// in command line.
// stop JMX agent and then start it again with different property values
// make sure these properties overridden corectly
System.out.println("**** Test eleven ****");
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething(
"test_11",
"-Dcom.sun.management.jmxremote.port=" + ports[0],
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
try {
testNoConnect(ports[0]);
jcmd(CMD_STOP);
testNoConnect(ports[0]);
jcmd(
CMD_START,
"jmxremote.port=" + ports[1],
"jmxremote.authenticate=false",
"jmxremote.ssl=false"
);
testConnect(ports[1]);
} finally {
s.stop();
}
}
static void test_12() throws Exception {
// Run an app with JMX enabled and with some properties set
// in command line.
// stop JMX agent and then start it again with different property values
@ -730,87 +825,85 @@ public class JMXStartStopTest {
// in command line
// make sure these properties overridden corectly
System.out.println("**** Test nine ****");
System.out.println("**** Test twelve ****");
Something s = doSomething("test_09",
"-Dcom.sun.management.config.file=" +
TEST_SRC + File.separator + "management_cl.properties",
"-Dcom.sun.management.jmxremote.authenticate=false"
int[] ports = PortAllocator.allocatePorts(2);
Something s = doSomething("test_12",
"-Dcom.sun.management.config.file="
+ TEST_SRC + File.separator + "management_cl.properties",
"-Dcom.sun.management.jmxremote.authenticate=false"
);
PortAllocator pa = new PortAllocator();
try {
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
jcmd(CMD_STOP);
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
jcmd(CMD_START,
"config.file=" + TEST_SRC + File.separator +
"management_jcmd.properties",
"jmxremote.authenticate=false",
"jmxremote.port=" + pa.getPort2()
"config.file=" + TEST_SRC + File.separator
+ "management_jcmd.properties",
"jmxremote.authenticate=false",
"jmxremote.port=" + ports[1]
);
testConnect(pa.getPort2());
testConnect(ports[1]);
} finally {
s.stop();
}
}
static void test_10() throws Exception {
static void test_13() throws Exception {
// Run an app with JMX enabled and with some properties set
// in command line.
// stop JMX agent and then start it again with different property values
// stop JMX agent again and then start it without property value
// make sure these properties overridden corectly
System.out.println("**** Test ten ****");
PortAllocator pa = new PortAllocator();
System.out.println("**** Test thirteen ****");
int[] ports = PortAllocator.allocatePorts(1);
Something s = doSomething(
"test_10",
"-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
"test_13",
"-Dcom.sun.management.jmxremote.port=" + ports[0],
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=true");
try {
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
jcmd(CMD_STOP);
jcmd(CMD_START,
"jmxremote.ssl=false",
"jmxremote.port=" + pa.getPort1()
"jmxremote.ssl=false",
"jmxremote.port=" + ports[0]
);
testConnect(pa.getPort1());
testConnect(ports[0]);
jcmd(CMD_STOP);
jcmd(CMD_START,
"jmxremote.port=" + pa.getPort1()
"jmxremote.port=" + ports[0]
);
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
} finally {
s.stop();
}
}
static void test_11() throws Exception {
static void test_14() throws Exception {
// Run an app with JMX enabled
// stop remote agent
// make sure local agent is not affected
System.out.println("**** Test eleven ****");
PortAllocator pa = new PortAllocator();
System.out.println("**** Test fourteen ****");
int[] ports = PortAllocator.allocatePorts(1);
Something s = doSomething(
"test_11",
"-Dcom.sun.management.jmxremote.port=" + pa.getPort1(),
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
"test_14",
"-Dcom.sun.management.jmxremote.port=" + ports[0],
"-Dcom.sun.management.jmxremote.authenticate=false",
"-Dcom.sun.management.jmxremote.ssl=false");
try {
testConnect(pa.getPort1());
testConnect(ports[0]);
jcmd(CMD_STOP);
testConnectLocal(s.getPid());
} finally {
@ -818,17 +911,17 @@ public class JMXStartStopTest {
}
}
static void test_12() throws Exception {
static void test_15() throws Exception {
// Run an app with JMX disabled
// start local agent only
System.out.println("**** Test twelve ****");
System.out.println("**** Test fifteen ****");
Something s = doSomething("test_12");
PortAllocator pa = new PortAllocator();
int[] ports = PortAllocator.allocatePorts(1);
Something s = doSomething("test_15");
try {
testNoConnect(pa.getPort1());
testNoConnect(ports[0]);
jcmd(CMD_START + "_local");
testConnectLocal(s.getPid());

View File

@ -0,0 +1,90 @@
/*
* 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
@bug 8030179
@summary test if the charset encoder deails with surrogate correctly
* @run testng/othervm -esa StreamEncoderOut
*/
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.stream.Stream;
import static java.util.stream.Collectors.joining;
@Test
public class StreamEncoderOut {
enum Input {
HIGH("\ud834"),
LOW("\udd1e"),
HIGH_LOW("\ud834\udd1e");
final String value;
Input(String value) {
this.value = value;
}
@Override
public String toString() {
return name() + " : \'" + value + "\"";
}
}
@DataProvider(name = "CharsetAndString")
// [Charset, Input]
public static Object[][] makeStreamTestData() {
// Cross product of supported charsets and inputs
return Charset.availableCharsets().values().stream().
filter(Charset::canEncode).
flatMap(cs -> Stream.of(Input.values()).map(i -> new Object[]{cs, i})).
toArray(Object[][]::new);
}
private static String generate(String s, int n) {
return Stream.generate(() -> s).limit(n).collect(joining());
}
static final OutputStream DEV_NULL = new OutputStream() {
@Override
public void write(byte b[], int off, int len) throws IOException {}
@Override
public void write(int b) throws IOException {}
};
@Test(dataProvider = "CharsetAndString")
public void test(Charset cs, Input input) throws IOException {
OutputStreamWriter w = new OutputStreamWriter(DEV_NULL, cs);
String t = generate(input.value, 8193);
for (int i = 0; i < 10; i++) {
w.append(t);
}
}
}

View File

@ -187,6 +187,9 @@ public class TestHostnameChecker {
in = new FileInputStream(new File(PATH, "cert4.crt"));
X509Certificate cert4 = (X509Certificate)cf.generateCertificate(in);
in.close();
in = new FileInputStream(new File(PATH, "cert5.crt"));
X509Certificate cert5 = (X509Certificate)cf.generateCertificate(in);
in.close();
HostnameChecker checker = HostnameChecker.getInstance(
HostnameChecker.TYPE_TLS);
@ -202,6 +205,9 @@ public class TestHostnameChecker {
check(checker, "5.6.7.8", cert3, true);
check(checker, "foo.bar.com", cert4, true);
check(checker, "altfoo.bar.com", cert4, true);
check(checker, "2001:db8:3c4d:15::1a2f:1a2b", cert5, true);
check(checker, "2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b", cert5, true);
check(checker, "2002:db8:3c4d:15::1a2f:1a2b", cert5, false);
checker = HostnameChecker.getInstance(
HostnameChecker.TYPE_LDAP);

View File

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIIECDCCAvCgAwIBAgIJAJaBmuUlfY8sMA0GCSqGSIb3DQEBBQUAMIGmMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTESMBAGA1UEBwwJU29tZS1DaXR5
MSowKAYDVQQKDCFVbmNvbmZpZ3VyZWQgT3BlblNTTCBJbnN0YWxsYXRpb24xEDAO
BgNVBAsMB3NlY3Rpb24xMDAuBgNVBAMMJzIwMDE6MGRiODozYzRkOjAwMTU6MDAw
MDowMDAwOjFhMmY6MWEyYjAeFw0xNTAyMTAxODMzMjBaFw0xNTAzMTIxODMzMjBa
MIGmMQswCQYDVQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0ZTESMBAGA1UEBwwJ
U29tZS1DaXR5MSowKAYDVQQKDCFVbmNvbmZpZ3VyZWQgT3BlblNTTCBJbnN0YWxs
YXRpb24xEDAOBgNVBAsMB3NlY3Rpb24xMDAuBgNVBAMMJzIwMDE6MGRiODozYzRk
OjAwMTU6MDAwMDowMDAwOjFhMmY6MWEyYjCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAMcigWxmeF6Dmo3xAw3y/8d3vB8Th4YsmvwXb9DxwNWV+B3vxJgq
ww6T6VBxrle1bgu/RtZDJwLf5vMhVElxuuE86di2qyurKFbpe29C9xnCxuMlXpje
X2pNknz4ZzOqD4opmIAFjXZ2Xp1kLt+HJX7ABoz7Uga+IbVfDRPPf2KOqYNpBQkp
dgI5VOZDQNVNb+8vdXDwyanMQ0TgPXKL4BQIkGB4RM8sgpPMUvB+tEB7zmUtgSco
2a5M84wIhxv85CmFFoTVSzXsRCDhVAZj0aHRkkmAsMSmzPa4HiPnuVRV740oQjDy
oMGLndaEs2nxIqckUFHOHcSTf0/wmcvPbIsCAwEAAaM3MDUwCQYDVR0TBAIwADAL
BgNVHQ8EBAMCBeAwGwYDVR0RBBQwEocQIAENuDxNABUAAAAAGi8aKzANBgkqhkiG
9w0BAQUFAAOCAQEAtnelRbYPPZRgTd4oxOiPqwc01EE9JgtkFWlooCwVUDChOR2k
us1qlhKsvbN2Tcsm1Ss3p0Uxk/g1o2/mY8rA/dJ8qiN6jbfjpEi8b2MirP5tQSE0
QNXbVGr5FnLbuUmn+82pB0vBSaq7gxehbV6S7dteyQUnb2imltC5wS9PwYb8wWx7
IpyXWt0jkYkC8KJEevVYI7qtwpjYhyc1FqwzUiPmdqGz2AFLQ4RgTXJi93SPoyKM
s65oPV+r6/0qwnslScxVfszHxxFn1Yfsc5Oseare1MnlNzH69PmWs523C/fBvnB2
MsHKLPdoN7uSpBLB7j46g5jQG/ceri/cquZKYA==
-----END CERTIFICATE-----