Merge
This commit is contained in:
commit
e895469a87
jdk
src
java.base
share
classes
java
lang
math
net
util
jdk/internal/loader
native/libnet
unix/native/libnet
windows/native/libnet
jdk.jlink/share/classes/jdk/tools/jlink/plugin
jdk.unsupported/share/classes/sun/misc
jdk.zipfs/share/classes/jdk/nio/zipfs
test
ProblemList.txt
com/sun
java
lang
StackWalker
module/ModuleReader
reflect
net/Inet6Address
time/tck/java/time/temporal
util/concurrent
jdk
net/Sockets
nio/zipfs
lib/testlibrary/jdk/testlibrary
sun
net
InetAddress/nameservice/dns
www
http
ChunkedInputStream
ChunkedOutputStream
HttpClient
HttpURLConnection
protocol
http
6550798
AsyncDisconnect.javaB5017051.javaB6299712.javaB6369510.javaB6518816.javaB6641309.javaB6660405.javaB8012625.javaBasicLongCredentials.javaChunkedErrorStream.javaHttpOnly.javaHttpStreams.javaNoCache.javaRedirectOnPost.javaStreamingOutputStream.javaUserAuth.javaUserCookie.javaZoneId.javahttps/HttpsURLConnection
jar
nio/ch
security/provider
util/logging
@ -306,8 +306,9 @@ public final class StackWalker {
|
||||
return DEFAULT_WALKER;
|
||||
}
|
||||
|
||||
checkPermission(options);
|
||||
return new StackWalker(toEnumSet(options));
|
||||
EnumSet<Option> optionSet = toEnumSet(options);
|
||||
checkPermission(optionSet);
|
||||
return new StackWalker(optionSet);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -341,8 +342,9 @@ public final class StackWalker {
|
||||
if (estimateDepth <= 0) {
|
||||
throw new IllegalArgumentException("estimateDepth must be > 0");
|
||||
}
|
||||
checkPermission(options);
|
||||
return new StackWalker(toEnumSet(options), estimateDepth);
|
||||
EnumSet<Option> optionSet = toEnumSet(options);
|
||||
checkPermission(optionSet);
|
||||
return new StackWalker(optionSet, estimateDepth);
|
||||
}
|
||||
|
||||
// ----- private constructors ------
|
||||
@ -540,13 +542,11 @@ public final class StackWalker {
|
||||
}
|
||||
|
||||
// ---- package access ----
|
||||
static StackWalker newInstanceNoCheck(EnumSet<Option> options) {
|
||||
return new StackWalker(options, 0, null);
|
||||
}
|
||||
|
||||
static StackWalker newInstance(Set<Option> options, ExtendedOption extendedOption) {
|
||||
checkPermission(options);
|
||||
return new StackWalker(toEnumSet(options), 0, extendedOption);
|
||||
EnumSet<Option> optionSet = toEnumSet(options);
|
||||
checkPermission(optionSet);
|
||||
return new StackWalker(optionSet, 0, extendedOption);
|
||||
}
|
||||
|
||||
int estimateDepth() {
|
||||
|
@ -30,6 +30,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
@ -163,9 +164,12 @@ public interface ModuleReader extends Closeable {
|
||||
* @param bb
|
||||
* The byte buffer to release
|
||||
*
|
||||
* @implSpec The default implementation does nothing.
|
||||
* @implSpec The default implementation doesn't do anything except check
|
||||
* if the byte buffer is null.
|
||||
*/
|
||||
default void release(ByteBuffer bb) { }
|
||||
default void release(ByteBuffer bb) {
|
||||
Objects.requireNonNull(bb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the module reader. Once closed then subsequent calls to locate or
|
||||
|
@ -272,9 +272,9 @@ class SystemModuleFinder implements ModuleFinder {
|
||||
* if not found.
|
||||
*/
|
||||
private ImageLocation findImageLocation(String name) throws IOException {
|
||||
Objects.requireNonNull(name);
|
||||
if (closed)
|
||||
throw new IOException("ModuleReader is closed");
|
||||
|
||||
if (imageReader != null) {
|
||||
return imageReader.findLocation(module, name);
|
||||
} else {
|
||||
@ -322,6 +322,7 @@ class SystemModuleFinder implements ModuleFinder {
|
||||
|
||||
@Override
|
||||
public void release(ByteBuffer bb) {
|
||||
Objects.requireNonNull(bb);
|
||||
ImageReader.releaseByteBuffer(bb);
|
||||
}
|
||||
|
||||
|
@ -75,11 +75,12 @@ import sun.security.util.SecurityConstants;
|
||||
*
|
||||
* <p> A Java virtual machine has at least one non-empty layer, the {@link
|
||||
* #boot() boot} layer, that is created when the Java virtual machine is
|
||||
* started. The <em>system modules</em>, including {@code java.base}, are in
|
||||
* the boot layer. The modules in the boot layer are mapped to the bootstrap
|
||||
* class loader and other class loaders that are built-in into the Java virtual
|
||||
* machine. The boot layer will often be the {@link #parent() parent} when
|
||||
* creating additional layers. </p>
|
||||
* started. The boot layer contains module {@code java.base} and is the only
|
||||
* layer in the Java virtual machine with a module named "{@code java.base}".
|
||||
* The modules in the boot layer are mapped to the bootstrap class loader and
|
||||
* other class loaders that are <a href="../ClassLoader.html#builtinLoaders">
|
||||
* built-in</a> into the Java virtual machine. The boot layer will often be
|
||||
* the {@link #parent() parent} when creating additional layers. </p>
|
||||
*
|
||||
* <p> As when creating a {@code Configuration},
|
||||
* {@link ModuleDescriptor#isAutomatic() automatic} modules receive
|
||||
@ -204,7 +205,8 @@ public final class Layer {
|
||||
* for this layer
|
||||
* @throws LayerInstantiationException
|
||||
* If all modules cannot be defined to the same class loader for any
|
||||
* of the reasons listed above
|
||||
* of the reasons listed above or the layer cannot be created because
|
||||
* the configuration contains a module named "{@code java.base}"
|
||||
* @throws SecurityException
|
||||
* If {@code RuntimePermission("createClassLoader")} or
|
||||
* {@code RuntimePermission("getClassLoader")} is denied by
|
||||
@ -219,14 +221,13 @@ public final class Layer {
|
||||
checkCreateClassLoaderPermission();
|
||||
checkGetClassLoaderPermission();
|
||||
|
||||
Loader loader;
|
||||
try {
|
||||
loader = new Loader(cf.modules(), parentLoader);
|
||||
Loader loader = new Loader(cf.modules(), parentLoader);
|
||||
loader.initRemotePackageMap(cf, this);
|
||||
return new Layer(cf, this, mn -> loader);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new LayerInstantiationException(e.getMessage());
|
||||
}
|
||||
return new Layer(cf, this, mn -> loader);
|
||||
}
|
||||
|
||||
|
||||
@ -266,6 +267,9 @@ public final class Layer {
|
||||
* @throws IllegalArgumentException
|
||||
* If the parent of the given configuration is not the configuration
|
||||
* for this layer
|
||||
* @throws LayerInstantiationException
|
||||
* If the layer cannot be created because the configuration contains
|
||||
* a module named "{@code java.base}"
|
||||
* @throws SecurityException
|
||||
* If {@code RuntimePermission("createClassLoader")} or
|
||||
* {@code RuntimePermission("getClassLoader")} is denied by
|
||||
@ -281,7 +285,11 @@ public final class Layer {
|
||||
checkGetClassLoaderPermission();
|
||||
|
||||
LoaderPool pool = new LoaderPool(cf, this, parentLoader);
|
||||
return new Layer(cf, this, pool::loaderFor);
|
||||
try {
|
||||
return new Layer(cf, this, pool::loaderFor);
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new LayerInstantiationException(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -330,7 +338,8 @@ public final class Layer {
|
||||
* for this layer
|
||||
* @throws LayerInstantiationException
|
||||
* If creating the {@code Layer} fails for any of the reasons
|
||||
* listed above
|
||||
* listed above or the layer cannot be created because the
|
||||
* configuration contains a module named "{@code java.base}"
|
||||
* @throws SecurityException
|
||||
* If {@code RuntimePermission("getClassLoader")} is denied by
|
||||
* the security manager
|
||||
|
@ -513,7 +513,7 @@ public final class Module {
|
||||
* package {@code pn} to the given module.
|
||||
*
|
||||
* <p> This method has no effect if the package is already exported to the
|
||||
* given module. If also has no effect if invoked on an unnamed module (as
|
||||
* given module. It also has no effect if invoked on an unnamed module (as
|
||||
* unnamed modules export all packages). </p>
|
||||
*
|
||||
* @param pn
|
||||
@ -866,7 +866,7 @@ public final class Module {
|
||||
URI uri = mref.location().orElse(null);
|
||||
|
||||
Module m;
|
||||
if (loader == null && name.equals("java.base")) {
|
||||
if (loader == null && name.equals("java.base") && Layer.boot() == null) {
|
||||
m = Object.class.getModule();
|
||||
} else {
|
||||
m = new Module(layer, loader, descriptor, uri);
|
||||
|
@ -55,7 +55,7 @@ import java.util.Arrays;
|
||||
* object to the operation. In either case, eight <em>rounding
|
||||
* modes</em> are provided for the control of rounding. Using the
|
||||
* integer fields in this class (such as {@link #ROUND_HALF_UP}) to
|
||||
* represent rounding mode is largely obsolete; the enumeration values
|
||||
* represent rounding mode is deprecated; the enumeration values
|
||||
* of the {@code RoundingMode} {@code enum}, (such as {@link
|
||||
* RoundingMode#HALF_UP}) should be used instead.
|
||||
*
|
||||
@ -93,7 +93,7 @@ import java.util.Arrays;
|
||||
* <p>In general the rounding modes and precision setting determine
|
||||
* how operations return results with a limited number of digits when
|
||||
* the exact result has more digits (perhaps infinitely many in the
|
||||
* case of division) than the number of digits returned.
|
||||
* case of division and square root) than the number of digits returned.
|
||||
*
|
||||
* First, the
|
||||
* total number of digits to return is specified by the
|
||||
@ -196,18 +196,19 @@ import java.util.Arrays;
|
||||
* {@code BigDecimal} value; for example [19, 2] is the
|
||||
* {@code BigDecimal} numerically equal to 0.19 having a scale of 2.
|
||||
*
|
||||
* <p>Note: care should be exercised if {@code BigDecimal} objects
|
||||
* are used as keys in a {@link java.util.SortedMap SortedMap} or
|
||||
* elements in a {@link java.util.SortedSet SortedSet} since
|
||||
* {@code BigDecimal}'s <i>natural ordering</i> is <i>inconsistent
|
||||
* with equals</i>. See {@link Comparable}, {@link
|
||||
* java.util.SortedMap} or {@link java.util.SortedSet} for more
|
||||
* information.
|
||||
*
|
||||
* <p>All methods and constructors for this class throw
|
||||
* {@code NullPointerException} when passed a {@code null} object
|
||||
* reference for any input parameter.
|
||||
*
|
||||
* @apiNote Care should be exercised if {@code BigDecimal} objects
|
||||
* are used as keys in a {@link java.util.SortedMap SortedMap} or
|
||||
* elements in a {@link java.util.SortedSet SortedSet} since
|
||||
* {@code BigDecimal}'s <i>natural ordering</i> is <em>inconsistent
|
||||
* with equals</em>. See {@link Comparable}, {@link
|
||||
* java.util.SortedMap} or {@link java.util.SortedSet} for more
|
||||
* information.
|
||||
*
|
||||
* @see BigInteger
|
||||
* @see MathContext
|
||||
* @see RoundingMode
|
||||
@ -377,10 +378,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* same sequence of characters as the {@link #BigDecimal(String)}
|
||||
* constructor, while allowing a sub-array to be specified.
|
||||
*
|
||||
* <p>Note that if the sequence of characters is already available
|
||||
* @implNote If the sequence of characters is already available
|
||||
* within a character array, using this constructor is faster than
|
||||
* converting the {@code char} array to string and using the
|
||||
* {@code BigDecimal(String)} constructor .
|
||||
* {@code BigDecimal(String)} constructor.
|
||||
*
|
||||
* @param in {@code char} array that is the source of characters.
|
||||
* @param offset first character in the array to inspect.
|
||||
@ -401,14 +402,14 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* constructor, while allowing a sub-array to be specified and
|
||||
* with rounding according to the context settings.
|
||||
*
|
||||
* <p>Note that if the sequence of characters is already available
|
||||
* @implNote If the sequence of characters is already available
|
||||
* within a character array, using this constructor is faster than
|
||||
* converting the {@code char} array to string and using the
|
||||
* {@code BigDecimal(String)} constructor.
|
||||
*
|
||||
* @param in {@code char} array that is the source of characters.
|
||||
* @param offset first character in the array to inspect.
|
||||
* @param len number of characters to consider..
|
||||
* @param len number of characters to consider.
|
||||
* @param mc the context to use.
|
||||
* @throws ArithmeticException if the result is inexact but the
|
||||
* rounding mode is {@code UNNECESSARY}.
|
||||
@ -679,10 +680,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* same sequence of characters as the {@link #BigDecimal(String)}
|
||||
* constructor.
|
||||
*
|
||||
* <p>Note that if the sequence of characters is already available
|
||||
* @implNote If the sequence of characters is already available
|
||||
* as a character array, using this constructor is faster than
|
||||
* converting the {@code char} array to string and using the
|
||||
* {@code BigDecimal(String)} constructor .
|
||||
* {@code BigDecimal(String)} constructor.
|
||||
*
|
||||
* @param in {@code char} array that is the source of characters.
|
||||
* @throws NumberFormatException if {@code in} is not a valid
|
||||
@ -700,10 +701,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* constructor and with rounding according to the context
|
||||
* settings.
|
||||
*
|
||||
* <p>Note that if the sequence of characters is already available
|
||||
* @implNote If the sequence of characters is already available
|
||||
* as a character array, using this constructor is faster than
|
||||
* converting the {@code char} array to string and using the
|
||||
* {@code BigDecimal(String)} constructor .
|
||||
* {@code BigDecimal(String)} constructor.
|
||||
*
|
||||
* @param in {@code char} array that is the source of characters.
|
||||
* @param mc the context to use.
|
||||
@ -805,7 +806,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* "-0" [0,0]
|
||||
* </pre>
|
||||
*
|
||||
* <p>Note: For values other than {@code float} and
|
||||
* @apiNote For values other than {@code float} and
|
||||
* {@code double} NaN and ±Infinity, this constructor is
|
||||
* compatible with the values returned by {@link Float#toString}
|
||||
* and {@link Double#toString}. This is generally the preferred
|
||||
@ -859,13 +860,13 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* This is because 0.1 cannot be represented exactly as a
|
||||
* {@code double} (or, for that matter, as a binary fraction of
|
||||
* any finite length). Thus, the value that is being passed
|
||||
* <i>in</i> to the constructor is not exactly equal to 0.1,
|
||||
* <em>in</em> to the constructor is not exactly equal to 0.1,
|
||||
* appearances notwithstanding.
|
||||
*
|
||||
* <li>
|
||||
* The {@code String} constructor, on the other hand, is
|
||||
* perfectly predictable: writing {@code new BigDecimal("0.1")}
|
||||
* creates a {@code BigDecimal} which is <i>exactly</i> equal to
|
||||
* creates a {@code BigDecimal} which is <em>exactly</em> equal to
|
||||
* 0.1, as one would expect. Therefore, it is generally
|
||||
* recommended that the {@linkplain #BigDecimal(String)
|
||||
* String constructor} be used in preference to this one.
|
||||
@ -1199,10 +1200,11 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
|
||||
/**
|
||||
* Translates a {@code long} unscaled value and an
|
||||
* {@code int} scale into a {@code BigDecimal}. This
|
||||
* {@literal "static factory method"} is provided in preference to
|
||||
* a ({@code long}, {@code int}) constructor because it
|
||||
* allows for reuse of frequently used {@code BigDecimal} values..
|
||||
* {@code int} scale into a {@code BigDecimal}.
|
||||
*
|
||||
* @apiNote This static factory method is provided in preference
|
||||
* to a ({@code long}, {@code int}) constructor because it allows
|
||||
* for reuse of frequently used {@code BigDecimal} values.
|
||||
*
|
||||
* @param unscaledVal unscaled value of the {@code BigDecimal}.
|
||||
* @param scale scale of the {@code BigDecimal}.
|
||||
@ -1222,10 +1224,11 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
|
||||
/**
|
||||
* Translates a {@code long} value into a {@code BigDecimal}
|
||||
* with a scale of zero. This {@literal "static factory method"}
|
||||
* is provided in preference to a ({@code long}) constructor
|
||||
* because it allows for reuse of frequently used
|
||||
* {@code BigDecimal} values.
|
||||
* with a scale of zero.
|
||||
*
|
||||
* @apiNote This static factory method is provided in preference
|
||||
* to a ({@code long}) constructor because it allows for reuse of
|
||||
* frequently used {@code BigDecimal} values.
|
||||
*
|
||||
* @param val value of the {@code BigDecimal}.
|
||||
* @return a {@code BigDecimal} whose value is {@code val}.
|
||||
@ -1270,11 +1273,11 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* the {@code double}'s canonical string representation provided
|
||||
* by the {@link Double#toString(double)} method.
|
||||
*
|
||||
* <p><b>Note:</b> This is generally the preferred way to convert
|
||||
* a {@code double} (or {@code float}) into a
|
||||
* {@code BigDecimal}, as the value returned is equal to that
|
||||
* resulting from constructing a {@code BigDecimal} from the
|
||||
* result of using {@link Double#toString(double)}.
|
||||
* @apiNote This is generally the preferred way to convert a
|
||||
* {@code double} (or {@code float}) into a {@code BigDecimal}, as
|
||||
* the value returned is equal to that resulting from constructing
|
||||
* a {@code BigDecimal} from the result of using {@link
|
||||
* Double#toString(double)}.
|
||||
*
|
||||
* @param val {@code double} to convert to a {@code BigDecimal}.
|
||||
* @return a {@code BigDecimal} whose value is equal to or approximately
|
||||
@ -1896,7 +1899,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
*
|
||||
* <p>The remainder is given by
|
||||
* {@code this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))}.
|
||||
* Note that this is not the modulo operation (the result can be
|
||||
* Note that this is <em>not</em> the modulo operation (the result can be
|
||||
* negative).
|
||||
*
|
||||
* @param divisor value by which this {@code BigDecimal} is to be divided.
|
||||
@ -2037,6 +2040,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* {@code (mc.getRoundingMode()==RoundingMode.UNNECESSARY}) and
|
||||
* the exact result cannot fit in {@code mc.getPrecision()}
|
||||
* digits.
|
||||
* @see BigInteger#sqrt()
|
||||
* @since 9
|
||||
*/
|
||||
public BigDecimal sqrt(MathContext mc) {
|
||||
@ -2694,8 +2698,8 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* in this case, the specified rounding mode is applied to the
|
||||
* division.
|
||||
*
|
||||
* <p>Note that since BigDecimal objects are immutable, calls of
|
||||
* this method do <i>not</i> result in the original object being
|
||||
* @apiNote Since BigDecimal objects are immutable, calls of
|
||||
* this method do <em>not</em> result in the original object being
|
||||
* modified, contrary to the usual convention of having methods
|
||||
* named <code>set<i>X</i></code> mutate field <i>{@code X}</i>.
|
||||
* Instead, {@code setScale} returns an object with the proper
|
||||
@ -2727,8 +2731,8 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* in this case, the specified rounding mode is applied to the
|
||||
* division.
|
||||
*
|
||||
* <p>Note that since BigDecimal objects are immutable, calls of
|
||||
* this method do <i>not</i> result in the original object being
|
||||
* @apiNote Since BigDecimal objects are immutable, calls of
|
||||
* this method do <em>not</em> result in the original object being
|
||||
* modified, contrary to the usual convention of having methods
|
||||
* named <code>set<i>X</i></code> mutate field <i>{@code X}</i>.
|
||||
* Instead, {@code setScale} returns an object with the proper
|
||||
@ -2822,8 +2826,8 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* versions of {@code setScale}, but saves the caller the trouble
|
||||
* of specifying a rounding mode in cases where it is irrelevant.
|
||||
*
|
||||
* <p>Note that since {@code BigDecimal} objects are immutable,
|
||||
* calls of this method do <i>not</i> result in the original
|
||||
* @apiNote Since {@code BigDecimal} objects are immutable,
|
||||
* calls of this method do <em>not</em> result in the original
|
||||
* object being modified, contrary to the usual convention of
|
||||
* having methods named <code>set<i>X</i></code> mutate field
|
||||
* <i>{@code X}</i>. Instead, {@code setScale} returns an
|
||||
@ -3091,7 +3095,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
/**
|
||||
* Returns the hash code for this {@code BigDecimal}. Note that
|
||||
* two {@code BigDecimal} objects that are numerically equal but
|
||||
* differ in scale (like 2.0 and 2.00) will generally <i>not</i>
|
||||
* differ in scale (like 2.0 and 2.00) will generally <em>not</em>
|
||||
* have the same hash code.
|
||||
*
|
||||
* @return hash code for this {@code BigDecimal}.
|
||||
@ -3342,7 +3346,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* Converts this {@code BigDecimal} to a {@code BigInteger}.
|
||||
* This conversion is analogous to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code long} as defined in section 5.1.3 of
|
||||
* {@code long} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* any fractional part of this
|
||||
* {@code BigDecimal} will be discarded. Note that this
|
||||
@ -3354,6 +3358,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* {@link #toBigIntegerExact()} method.
|
||||
*
|
||||
* @return this {@code BigDecimal} converted to a {@code BigInteger}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
public BigInteger toBigInteger() {
|
||||
// force to an integer, quietly
|
||||
@ -3379,7 +3384,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* Converts this {@code BigDecimal} to a {@code long}.
|
||||
* This conversion is analogous to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code short} as defined in section 5.1.3 of
|
||||
* {@code short} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* any fractional part of this
|
||||
* {@code BigDecimal} will be discarded, and if the resulting
|
||||
@ -3390,6 +3395,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* as return a result with the opposite sign.
|
||||
*
|
||||
* @return this {@code BigDecimal} converted to a {@code long}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
@Override
|
||||
public long longValue(){
|
||||
@ -3448,7 +3454,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* Converts this {@code BigDecimal} to an {@code int}.
|
||||
* This conversion is analogous to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code short} as defined in section 5.1.3 of
|
||||
* {@code short} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* any fractional part of this
|
||||
* {@code BigDecimal} will be discarded, and if the resulting
|
||||
@ -3459,6 +3465,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* value as well as return a result with the opposite sign.
|
||||
*
|
||||
* @return this {@code BigDecimal} converted to an {@code int}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
@Override
|
||||
public int intValue() {
|
||||
@ -3531,7 +3538,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* Converts this {@code BigDecimal} to a {@code float}.
|
||||
* This conversion is similar to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code float} as defined in section 5.1.3 of
|
||||
* {@code float} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this {@code BigDecimal} has too great a
|
||||
* magnitude to represent as a {@code float}, it will be
|
||||
@ -3542,6 +3549,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* value.
|
||||
*
|
||||
* @return this {@code BigDecimal} converted to a {@code float}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
@Override
|
||||
public float floatValue(){
|
||||
@ -3575,7 +3583,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* Converts this {@code BigDecimal} to a {@code double}.
|
||||
* This conversion is similar to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code float} as defined in section 5.1.3 of
|
||||
* {@code float} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this {@code BigDecimal} has too great a
|
||||
* magnitude represent as a {@code double}, it will be
|
||||
@ -3586,6 +3594,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
|
||||
* value.
|
||||
*
|
||||
* @return this {@code BigDecimal} converted to a {@code double}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
@Override
|
||||
public double doubleValue(){
|
||||
|
@ -116,6 +116,7 @@ import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
* +2<sup>{@code Integer.MAX_VALUE}</sup> (exclusive).
|
||||
*
|
||||
* @see BigDecimal
|
||||
* @jls 4.2.2 Integer Operations
|
||||
* @author Josh Bloch
|
||||
* @author Michael McCloskey
|
||||
* @author Alan Eliasen
|
||||
@ -126,7 +127,7 @@ import jdk.internal.HotSpotIntrinsicCandidate;
|
||||
public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
/**
|
||||
* The signum of this BigInteger: -1 for negative, 0 for zero, or
|
||||
* 1 for positive. Note that the BigInteger zero <i>must</i> have
|
||||
* 1 for positive. Note that the BigInteger zero <em>must</em> have
|
||||
* a signum of 0. This is necessary to ensures that there is exactly one
|
||||
* representation for each BigInteger value.
|
||||
*/
|
||||
@ -710,7 +711,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* Constructs a randomly generated positive BigInteger that is probably
|
||||
* prime, with the specified bitLength.
|
||||
*
|
||||
* <p>It is recommended that the {@link #probablePrime probablePrime}
|
||||
* @apiNote It is recommended that the {@link #probablePrime probablePrime}
|
||||
* method be used in preference to this constructor unless there
|
||||
* is a compelling need to specify a certainty.
|
||||
*
|
||||
@ -1157,9 +1158,11 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
|
||||
/**
|
||||
* Returns a BigInteger whose value is equal to that of the
|
||||
* specified {@code long}. This "static factory method" is
|
||||
* provided in preference to a ({@code long}) constructor
|
||||
* because it allows for reuse of frequently used BigIntegers.
|
||||
* specified {@code long}.
|
||||
*
|
||||
* @apiNote This static factory method is provided in preference
|
||||
* to a ({@code long}) constructor because it allows for reuse of
|
||||
* frequently used BigIntegers.
|
||||
*
|
||||
* @param val value of the BigInteger to return.
|
||||
* @return a BigInteger with the specified value.
|
||||
@ -3551,13 +3554,13 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
|
||||
/**
|
||||
* Returns the number of bits in the minimal two's-complement
|
||||
* representation of this BigInteger, <i>excluding</i> a sign bit.
|
||||
* representation of this BigInteger, <em>excluding</em> a sign bit.
|
||||
* For positive BigIntegers, this is equivalent to the number of bits in
|
||||
* the ordinary binary representation. (Computes
|
||||
* {@code (ceil(log2(this < 0 ? -this : this+1)))}.)
|
||||
*
|
||||
* @return number of bits in the minimal two's-complement
|
||||
* representation of this BigInteger, <i>excluding</i> a sign bit.
|
||||
* representation of this BigInteger, <em>excluding</em> a sign bit.
|
||||
*/
|
||||
public int bitLength() {
|
||||
int n = bitLengthPlusOne - 1;
|
||||
@ -4034,7 +4037,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* Converts this BigInteger to an {@code int}. This
|
||||
* conversion is analogous to a
|
||||
* <i>narrowing primitive conversion</i> from {@code long} to
|
||||
* {@code int} as defined in section 5.1.3 of
|
||||
* {@code int} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this BigInteger is too big to fit in an
|
||||
* {@code int}, only the low-order 32 bits are returned.
|
||||
@ -4044,6 +4047,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
*
|
||||
* @return this BigInteger converted to an {@code int}.
|
||||
* @see #intValueExact()
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
public int intValue() {
|
||||
int result = 0;
|
||||
@ -4055,7 +4059,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* Converts this BigInteger to a {@code long}. This
|
||||
* conversion is analogous to a
|
||||
* <i>narrowing primitive conversion</i> from {@code long} to
|
||||
* {@code int} as defined in section 5.1.3 of
|
||||
* {@code int} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this BigInteger is too big to fit in a
|
||||
* {@code long}, only the low-order 64 bits are returned.
|
||||
@ -4065,6 +4069,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
*
|
||||
* @return this BigInteger converted to a {@code long}.
|
||||
* @see #longValueExact()
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
public long longValue() {
|
||||
long result = 0;
|
||||
@ -4078,7 +4083,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* Converts this BigInteger to a {@code float}. This
|
||||
* conversion is similar to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code float} as defined in section 5.1.3 of
|
||||
* {@code float} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this BigInteger has too great a magnitude
|
||||
* to represent as a {@code float}, it will be converted to
|
||||
@ -4088,6 +4093,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* information about the precision of the BigInteger value.
|
||||
*
|
||||
* @return this BigInteger converted to a {@code float}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
public float floatValue() {
|
||||
if (signum == 0) {
|
||||
@ -4162,7 +4168,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* Converts this BigInteger to a {@code double}. This
|
||||
* conversion is similar to the
|
||||
* <i>narrowing primitive conversion</i> from {@code double} to
|
||||
* {@code float} as defined in section 5.1.3 of
|
||||
* {@code float} as defined in
|
||||
* <cite>The Java™ Language Specification</cite>:
|
||||
* if this BigInteger has too great a magnitude
|
||||
* to represent as a {@code double}, it will be converted to
|
||||
@ -4172,6 +4178,7 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* information about the precision of the BigInteger value.
|
||||
*
|
||||
* @return this BigInteger converted to a {@code double}.
|
||||
* @jls 5.1.3 Narrowing Primitive Conversion
|
||||
*/
|
||||
public double doubleValue() {
|
||||
if (signum == 0) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,7 +23,10 @@
|
||||
* questions.
|
||||
*/
|
||||
package java.net;
|
||||
|
||||
import java.io.IOException;
|
||||
import static java.net.InetAddress.PREFER_IPV6_VALUE;
|
||||
import static java.net.InetAddress.PREFER_SYSTEM_VALUE;
|
||||
|
||||
/*
|
||||
* Package private implementation of InetAddressImpl for dual
|
||||
@ -35,15 +38,23 @@ import java.io.IOException;
|
||||
*
|
||||
* @since 1.4
|
||||
*/
|
||||
|
||||
class Inet6AddressImpl implements InetAddressImpl {
|
||||
public native String getLocalHostName() throws UnknownHostException;
|
||||
public native InetAddress[]
|
||||
lookupAllHostAddr(String hostname) throws UnknownHostException;
|
||||
public native String getHostByAddr(byte[] addr) throws UnknownHostException;
|
||||
private native boolean isReachable0(byte[] addr, int scope, int timeout, byte[] inf, int ttl, int if_scope) throws IOException;
|
||||
|
||||
public boolean isReachable(InetAddress addr, int timeout, NetworkInterface netif, int ttl) throws IOException {
|
||||
public native String getLocalHostName() throws UnknownHostException;
|
||||
|
||||
public native InetAddress[] lookupAllHostAddr(String hostname)
|
||||
throws UnknownHostException;
|
||||
|
||||
public native String getHostByAddr(byte[] addr) throws UnknownHostException;
|
||||
|
||||
private native boolean isReachable0(byte[] addr, int scope, int timeout,
|
||||
byte[] inf, int ttl, int if_scope)
|
||||
throws IOException;
|
||||
|
||||
public boolean isReachable(InetAddress addr, int timeout,
|
||||
NetworkInterface netif, int ttl)
|
||||
throws IOException
|
||||
{
|
||||
byte[] ifaddr = null;
|
||||
int scope = -1;
|
||||
int netif_scope = -1;
|
||||
@ -79,7 +90,8 @@ class Inet6AddressImpl implements InetAddressImpl {
|
||||
|
||||
public synchronized InetAddress anyLocalAddress() {
|
||||
if (anyLocalAddress == null) {
|
||||
if (InetAddress.preferIPv6Address) {
|
||||
if (InetAddress.preferIPv6Address == PREFER_IPV6_VALUE ||
|
||||
InetAddress.preferIPv6Address == PREFER_SYSTEM_VALUE) {
|
||||
anyLocalAddress = new Inet6Address();
|
||||
anyLocalAddress.holder().hostName = "::";
|
||||
} else {
|
||||
@ -91,7 +103,8 @@ class Inet6AddressImpl implements InetAddressImpl {
|
||||
|
||||
public synchronized InetAddress loopbackAddress() {
|
||||
if (loopbackAddress == null) {
|
||||
if (InetAddress.preferIPv6Address) {
|
||||
if (InetAddress.preferIPv6Address == PREFER_IPV6_VALUE ||
|
||||
InetAddress.preferIPv6Address == PREFER_SYSTEM_VALUE) {
|
||||
byte[] loopback =
|
||||
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
|
||||
@ -103,6 +116,6 @@ class Inet6AddressImpl implements InetAddressImpl {
|
||||
return loopbackAddress;
|
||||
}
|
||||
|
||||
private InetAddress anyLocalAddress;
|
||||
private InetAddress loopbackAddress;
|
||||
private InetAddress anyLocalAddress;
|
||||
private InetAddress loopbackAddress;
|
||||
}
|
||||
|
@ -26,8 +26,6 @@
|
||||
package java.net;
|
||||
|
||||
import java.util.NavigableSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
import java.util.Scanner;
|
||||
@ -41,6 +39,7 @@ import java.io.ObjectInputStream;
|
||||
import java.io.ObjectInputStream.GetField;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectOutputStream.PutField;
|
||||
import java.lang.annotation.Native;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.ConcurrentSkipListSet;
|
||||
@ -193,6 +192,11 @@ import sun.net.util.IPAddressUtil;
|
||||
*/
|
||||
public
|
||||
class InetAddress implements java.io.Serializable {
|
||||
|
||||
@Native static final int PREFER_IPV4_VALUE = 0;
|
||||
@Native static final int PREFER_IPV6_VALUE = 1;
|
||||
@Native static final int PREFER_SYSTEM_VALUE = 2;
|
||||
|
||||
/**
|
||||
* Specify the address family: Internet Protocol, Version 4
|
||||
* @since 1.4
|
||||
@ -206,8 +210,7 @@ class InetAddress implements java.io.Serializable {
|
||||
static final int IPv6 = 2;
|
||||
|
||||
/* Specify address family preference */
|
||||
static transient boolean preferIPv6Address = false;
|
||||
|
||||
static transient final int preferIPv6Address;
|
||||
|
||||
static class InetAddressHolder {
|
||||
/**
|
||||
@ -293,8 +296,19 @@ class InetAddress implements java.io.Serializable {
|
||||
* Load net library into runtime, and perform initializations.
|
||||
*/
|
||||
static {
|
||||
preferIPv6Address = java.security.AccessController.doPrivileged(
|
||||
new GetBooleanAction("java.net.preferIPv6Addresses")).booleanValue();
|
||||
String str = java.security.AccessController.doPrivileged(
|
||||
new GetPropertyAction("java.net.preferIPv6Addresses"));
|
||||
if (str == null) {
|
||||
preferIPv6Address = PREFER_IPV4_VALUE;
|
||||
} else if (str.equalsIgnoreCase("true")) {
|
||||
preferIPv6Address = PREFER_IPV6_VALUE;
|
||||
} else if (str.equalsIgnoreCase("false")) {
|
||||
preferIPv6Address = PREFER_IPV4_VALUE;
|
||||
} else if (str.equalsIgnoreCase("system")) {
|
||||
preferIPv6Address = PREFER_SYSTEM_VALUE;
|
||||
} else {
|
||||
preferIPv6Address = PREFER_IPV4_VALUE;
|
||||
}
|
||||
AccessController.doPrivileged(
|
||||
new java.security.PrivilegedAction<>() {
|
||||
public Void run() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
<!--
|
||||
Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -35,7 +35,7 @@ alter the mechanisms and behavior of the various classes of the
|
||||
java.net package. Some are checked only once at startup of the VM,
|
||||
and therefore are best set using the -D option of the java command,
|
||||
while others have a more dynamic nature and can also be changed using
|
||||
the <a href="../../lang/System.html#setProperty(java.lang.String,%20java.lang.String)">System.setProperty()</a> API.
|
||||
the <a href="../../lang/System.html#setProperty(java.lang.String,%20java.lang.String)">System.setProperty()</a> API.
|
||||
The purpose of this document is to list
|
||||
and detail all of these properties.</P>
|
||||
<P>If there is no special note, a property value is checked every time it is used.</P>
|
||||
@ -58,7 +58,8 @@ and detail all of these properties.</P>
|
||||
applications that depend on the representation of an IPv4 address
|
||||
(e.g. 192.168.1.1). This property can be set to <B>true</B> to
|
||||
change that preference and use IPv6 addresses over IPv4 ones where
|
||||
possible.</P>
|
||||
possible, or <B>system</B> to preserve the order of the addresses as
|
||||
returned by the operating system.</P>
|
||||
</UL>
|
||||
<P>Both of these properties are checked only once, at startup.</P>
|
||||
<a name="Proxies"></a>
|
||||
@ -73,7 +74,7 @@ of proxies.</P>
|
||||
<P>The following proxy settings are used by the HTTP protocol handler.</P>
|
||||
<UL>
|
||||
<LI><P><B>http.proxyHost</B> (default: <none>)<BR>
|
||||
The hostname, or address, of the proxy server
|
||||
The hostname, or address, of the proxy server
|
||||
</P>
|
||||
<LI><P><B>http.proxyPort</B> (default: 80)<BR>
|
||||
The port number of the proxy server.</P>
|
||||
@ -94,7 +95,7 @@ of proxies.</P>
|
||||
<P>The following proxy settings are used by the HTTPS protocol handler.</P>
|
||||
<UL>
|
||||
<LI><P><B>https.proxyHost</B>(default: <none>)<BR>
|
||||
The hostname, or address, of the proxy server
|
||||
The hostname, or address, of the proxy server
|
||||
</P>
|
||||
<LI><P><B>https.proxyPort</B> (default: 443)<BR>
|
||||
The port number of the proxy server.</P>
|
||||
@ -105,7 +106,7 @@ of proxies.</P>
|
||||
<P>The following proxy settings are used by the FTP protocol handler.</P>
|
||||
<UL>
|
||||
<LI><P><B>ftp.proxyHost</B>(default: <none>)<BR>
|
||||
The hostname, or address, of the proxy server
|
||||
The hostname, or address, of the proxy server
|
||||
</P>
|
||||
<LI><P><B>ftp.proxyPort</B> (default: 80)<BR>
|
||||
The port number of the proxy server.</P>
|
||||
@ -160,7 +161,7 @@ of proxies.</P>
|
||||
<LI><P><B>http.agent</B> (default: “Java/<version>”)<BR>
|
||||
Defines the string sent in the User-Agent request header in http
|
||||
requests. Note that the string “Java/<version>” will
|
||||
be appended to the one provided in the property (e.g. if
|
||||
be appended to the one provided in the property (e.g. if
|
||||
-Dhttp.agent=”foobar” is used, the User-Agent header will
|
||||
contain “foobar Java/1.5.0” if the version of the VM is
|
||||
1.5.0). This property is checked only once at startup.</P>
|
||||
|
@ -28,6 +28,7 @@ package java.util;
|
||||
import java.io.IOException;
|
||||
import java.io.InvalidObjectException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.ObjectStreamException;
|
||||
import java.io.Serializable;
|
||||
|
||||
@ -607,7 +608,10 @@ class ImmutableCollections {
|
||||
// ---------- Serialization Proxy ----------
|
||||
|
||||
/**
|
||||
* Serialization proxy class for immutable collections.
|
||||
* A unified serialization proxy class for the immutable collections.
|
||||
*
|
||||
* @serial
|
||||
* @since 9
|
||||
*/
|
||||
final class CollSer implements Serializable {
|
||||
private static final long serialVersionUID = 6309168927139932177L;
|
||||
@ -616,14 +620,114 @@ final class CollSer implements Serializable {
|
||||
static final int IMM_SET = 2;
|
||||
static final int IMM_MAP = 3;
|
||||
|
||||
private final int flags;
|
||||
private final Object[] array;
|
||||
/**
|
||||
* Indicates the type of collection that is serialized.
|
||||
* The low order 8 bits have the value 1 for an immutable
|
||||
* {@code List}, 2 for an immutable {@code Set}, and 3 for
|
||||
* an immutable {@code Map}. Any other value causes an
|
||||
* {@link InvalidObjectException} to be thrown. The high
|
||||
* order 24 bits are zero when an instance is serialized,
|
||||
* and they are ignored when an instance is deserialized.
|
||||
* They can thus be used by future implementations without
|
||||
* causing compatibility issues.
|
||||
*
|
||||
* <p>The tag value also determines the interpretation of the
|
||||
* transient {@code Object[] array} field.
|
||||
* For {@code List} and {@code Set}, the array's length is the size
|
||||
* of the collection, and the array contains the elements of the collection.
|
||||
* Null elements are not allowed. For {@code Set}, duplicate elements
|
||||
* are not allowed.
|
||||
*
|
||||
* <p>For {@code Map}, the array's length is twice the number of mappings
|
||||
* present in the map. The array length is necessarily even.
|
||||
* The array contains a succession of key and value pairs:
|
||||
* {@code k1, v1, k2, v2, ..., kN, vN.} Nulls are not allowed,
|
||||
* and duplicate keys are not allowed.
|
||||
*
|
||||
* @serial
|
||||
* @since 9
|
||||
*/
|
||||
private final int tag;
|
||||
|
||||
CollSer(int f, Object... a) {
|
||||
flags = f;
|
||||
/**
|
||||
* @serial
|
||||
* @since 9
|
||||
*/
|
||||
private transient Object[] array;
|
||||
|
||||
CollSer(int t, Object... a) {
|
||||
tag = t;
|
||||
array = a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads objects from the stream and stores them
|
||||
* in the transient {@code Object[] array} field.
|
||||
*
|
||||
* @serialData
|
||||
* A nonnegative int, indicating the count of objects,
|
||||
* followed by that many objects.
|
||||
*
|
||||
* @param ois the ObjectInputStream from which data is read
|
||||
* @throws IOException if an I/O error occurs
|
||||
* @throws ClassNotFoundException if a serialized class cannot be loaded
|
||||
* @throws InvalidObjectException if the count is negative
|
||||
* @since 9
|
||||
*/
|
||||
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
|
||||
ois.defaultReadObject();
|
||||
int len = ois.readInt();
|
||||
|
||||
if (len < 0) {
|
||||
throw new InvalidObjectException("negative length " + len);
|
||||
}
|
||||
|
||||
Object[] a = new Object[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
a[i] = ois.readObject();
|
||||
}
|
||||
|
||||
array = a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes objects to the stream from
|
||||
* the transient {@code Object[] array} field.
|
||||
*
|
||||
* @serialData
|
||||
* A nonnegative int, indicating the count of objects,
|
||||
* followed by that many objects.
|
||||
*
|
||||
* @param oos the ObjectOutputStream to which data is written
|
||||
* @throws IOException if an I/O error occurs
|
||||
* @since 9
|
||||
*/
|
||||
private void writeObject(ObjectOutputStream oos) throws IOException {
|
||||
oos.defaultWriteObject();
|
||||
oos.writeInt(array.length);
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
oos.writeObject(array[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and returns an immutable collection from this proxy class.
|
||||
* The instance returned is created as if by calling one of the
|
||||
* static factory methods for
|
||||
* <a href="List.html#immutable">List</a>,
|
||||
* <a href="Map.html#immutable">Map</a>, or
|
||||
* <a href="Set.html#immutable">Set</a>.
|
||||
* This proxy class is the serial form for all immutable collection instances,
|
||||
* regardless of implementation type. This is necessary to ensure that the
|
||||
* existence of any particular implementation type is kept out of the
|
||||
* serialized form.
|
||||
*
|
||||
* @return a collection created from this proxy object
|
||||
* @throws InvalidObjectException if the tag value is illegal or if an exception
|
||||
* is thrown during creation of the collection
|
||||
* @throws ObjectStreamException if another serialization error has occurred
|
||||
* @since 9
|
||||
*/
|
||||
private Object readResolve() throws ObjectStreamException {
|
||||
try {
|
||||
if (array == null) {
|
||||
@ -631,8 +735,8 @@ final class CollSer implements Serializable {
|
||||
}
|
||||
|
||||
// use low order 8 bits to indicate "kind"
|
||||
// ignore high order bits
|
||||
switch (flags & 0xff) {
|
||||
// ignore high order 24 bits
|
||||
switch (tag & 0xff) {
|
||||
case IMM_LIST:
|
||||
return List.of(array);
|
||||
case IMM_SET:
|
||||
@ -646,7 +750,7 @@ final class CollSer implements Serializable {
|
||||
return new ImmutableCollections.MapN<>(array);
|
||||
}
|
||||
default:
|
||||
throw new InvalidObjectException(String.format("invalid flags 0x%x", flags));
|
||||
throw new InvalidObjectException(String.format("invalid flags 0x%x", tag));
|
||||
}
|
||||
} catch (NullPointerException|IllegalArgumentException ex) {
|
||||
InvalidObjectException ioe = new InvalidObjectException("invalid object");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -107,6 +107,9 @@ import java.util.function.UnaryOperator;
|
||||
* Factories are free to create new instances or reuse existing ones. Therefore,
|
||||
* identity-sensitive operations on these instances (reference equality ({@code ==}),
|
||||
* identity hash code, and synchronization) are unreliable and should be avoided.
|
||||
* <li>They are serialized as specified on the
|
||||
* <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
|
||||
* page.
|
||||
* </ul>
|
||||
*
|
||||
* <p>This interface is a member of the
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -133,6 +133,9 @@ import java.io.Serializable;
|
||||
* Factories are free to create new instances or reuse existing ones. Therefore,
|
||||
* identity-sensitive operations on these instances (reference equality ({@code ==}),
|
||||
* identity hash code, and synchronization) are unreliable and should be avoided.
|
||||
* <li>They are serialized as specified on the
|
||||
* <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
|
||||
* page.
|
||||
* </ul>
|
||||
*
|
||||
* <p>This interface is a member of the
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -84,6 +84,9 @@ package java.util;
|
||||
* Factories are free to create new instances or reuse existing ones. Therefore,
|
||||
* identity-sensitive operations on these instances (reference equality ({@code ==}),
|
||||
* identity hash code, and synchronization) are unreliable and should be avoided.
|
||||
* <li>They are serialized as specified on the
|
||||
* <a href="{@docRoot}/serialized-form.html#java.util.CollSer">Serialized Form</a>
|
||||
* page.
|
||||
* </ul>
|
||||
*
|
||||
* <p>This interface is a member of the
|
||||
|
@ -1242,7 +1242,8 @@ public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
|
||||
*/
|
||||
public KeySetView<K,V> keySet() {
|
||||
KeySetView<K,V> ks;
|
||||
return (ks = keySet) != null ? ks : (keySet = new KeySetView<K,V>(this, null));
|
||||
if ((ks = keySet) != null) return ks;
|
||||
return keySet = new KeySetView<K,V>(this, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1265,7 +1266,8 @@ public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
|
||||
*/
|
||||
public Collection<V> values() {
|
||||
ValuesView<K,V> vs;
|
||||
return (vs = values) != null ? vs : (values = new ValuesView<K,V>(this));
|
||||
if ((vs = values) != null) return vs;
|
||||
return values = new ValuesView<K,V>(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1287,7 +1289,8 @@ public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
|
||||
*/
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
EntrySetView<K,V> es;
|
||||
return (es = entrySet) != null ? es : (entrySet = new EntrySetView<K,V>(this));
|
||||
if ((es = entrySet) != null) return es;
|
||||
return entrySet = new EntrySetView<K,V>(this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -376,12 +376,12 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
|
||||
/** Lazily initialized key set */
|
||||
private transient KeySet<K,V> keySet;
|
||||
/** Lazily initialized entry set */
|
||||
private transient EntrySet<K,V> entrySet;
|
||||
/** Lazily initialized values collection */
|
||||
private transient Values<K,V> values;
|
||||
/** Lazily initialized entry set */
|
||||
private transient EntrySet<K,V> entrySet;
|
||||
/** Lazily initialized descending key set */
|
||||
private transient ConcurrentNavigableMap<K,V> descendingMap;
|
||||
private transient SubMap<K,V> descendingMap;
|
||||
|
||||
/**
|
||||
* Initializes or resets state. Needed by constructors, clone,
|
||||
@ -1827,13 +1827,15 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
* @return a navigable set view of the keys in this map
|
||||
*/
|
||||
public NavigableSet<K> keySet() {
|
||||
KeySet<K,V> ks = keySet;
|
||||
return (ks != null) ? ks : (keySet = new KeySet<>(this));
|
||||
KeySet<K,V> ks;
|
||||
if ((ks = keySet) != null) return ks;
|
||||
return keySet = new KeySet<>(this);
|
||||
}
|
||||
|
||||
public NavigableSet<K> navigableKeySet() {
|
||||
KeySet<K,V> ks = keySet;
|
||||
return (ks != null) ? ks : (keySet = new KeySet<>(this));
|
||||
KeySet<K,V> ks;
|
||||
if ((ks = keySet) != null) return ks;
|
||||
return keySet = new KeySet<>(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1856,8 +1858,9 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
* <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
|
||||
*/
|
||||
public Collection<V> values() {
|
||||
Values<K,V> vs = values;
|
||||
return (vs != null) ? vs : (values = new Values<>(this));
|
||||
Values<K,V> vs;
|
||||
if ((vs = values) != null) return vs;
|
||||
return values = new Values<>(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1888,14 +1891,16 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
* sorted in ascending key order
|
||||
*/
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
EntrySet<K,V> es = entrySet;
|
||||
return (es != null) ? es : (entrySet = new EntrySet<K,V>(this));
|
||||
EntrySet<K,V> es;
|
||||
if ((es = entrySet) != null) return es;
|
||||
return entrySet = new EntrySet<K,V>(this);
|
||||
}
|
||||
|
||||
public ConcurrentNavigableMap<K,V> descendingMap() {
|
||||
ConcurrentNavigableMap<K,V> dm = descendingMap;
|
||||
return (dm != null) ? dm : (descendingMap = new SubMap<K,V>
|
||||
(this, null, false, null, false, true));
|
||||
ConcurrentNavigableMap<K,V> dm;
|
||||
if ((dm = descendingMap) != null) return dm;
|
||||
return descendingMap =
|
||||
new SubMap<K,V>(this, null, false, null, false, true);
|
||||
}
|
||||
|
||||
public NavigableSet<K> descendingKeySet() {
|
||||
@ -2564,7 +2569,7 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
* @serial include
|
||||
*/
|
||||
static final class SubMap<K,V> extends AbstractMap<K,V>
|
||||
implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable {
|
||||
implements ConcurrentNavigableMap<K,V>, Serializable {
|
||||
private static final long serialVersionUID = -7647078645895051609L;
|
||||
|
||||
/** Underlying map */
|
||||
@ -2582,8 +2587,8 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
|
||||
// Lazily initialized view holders
|
||||
private transient KeySet<K,V> keySetView;
|
||||
private transient Set<Map.Entry<K,V>> entrySetView;
|
||||
private transient Collection<V> valuesView;
|
||||
private transient Values<K,V> valuesView;
|
||||
private transient EntrySet<K,V> entrySetView;
|
||||
|
||||
/**
|
||||
* Creates a new submap, initializing all fields.
|
||||
@ -3049,23 +3054,27 @@ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V>
|
||||
/* ---------------- Submap Views -------------- */
|
||||
|
||||
public NavigableSet<K> keySet() {
|
||||
KeySet<K,V> ks = keySetView;
|
||||
return (ks != null) ? ks : (keySetView = new KeySet<>(this));
|
||||
KeySet<K,V> ks;
|
||||
if ((ks = keySetView) != null) return ks;
|
||||
return keySetView = new KeySet<>(this);
|
||||
}
|
||||
|
||||
public NavigableSet<K> navigableKeySet() {
|
||||
KeySet<K,V> ks = keySetView;
|
||||
return (ks != null) ? ks : (keySetView = new KeySet<>(this));
|
||||
KeySet<K,V> ks;
|
||||
if ((ks = keySetView) != null) return ks;
|
||||
return keySetView = new KeySet<>(this);
|
||||
}
|
||||
|
||||
public Collection<V> values() {
|
||||
Collection<V> vs = valuesView;
|
||||
return (vs != null) ? vs : (valuesView = new Values<>(this));
|
||||
Values<K,V> vs;
|
||||
if ((vs = valuesView) != null) return vs;
|
||||
return valuesView = new Values<>(this);
|
||||
}
|
||||
|
||||
public Set<Map.Entry<K,V>> entrySet() {
|
||||
Set<Map.Entry<K,V>> es = entrySetView;
|
||||
return (es != null) ? es : (entrySetView = new EntrySet<K,V>(this));
|
||||
EntrySet<K,V> es;
|
||||
if ((es = entrySetView) != null) return es;
|
||||
return entrySetView = new EntrySet<K,V>(this);
|
||||
}
|
||||
|
||||
public NavigableSet<K> descendingKeySet() {
|
||||
|
@ -596,7 +596,7 @@ public abstract class CountedCompleter<T> extends ForkJoinTask<T> {
|
||||
* not, be invoked for each completer in a computation.
|
||||
*/
|
||||
public final void propagateCompletion() {
|
||||
CountedCompleter<?> a = this, s = a;
|
||||
CountedCompleter<?> a = this, s;
|
||||
for (int c;;) {
|
||||
if ((c = a.pending) == 0) {
|
||||
if ((a = (s = a).completer) == null) {
|
||||
|
@ -56,13 +56,11 @@ package java.util.concurrent;
|
||||
* void solve(Executor e,
|
||||
* Collection<Callable<Result>> solvers)
|
||||
* throws InterruptedException, ExecutionException {
|
||||
* CompletionService<Result> ecs
|
||||
* = new ExecutorCompletionService<Result>(e);
|
||||
* for (Callable<Result> s : solvers)
|
||||
* ecs.submit(s);
|
||||
* int n = solvers.size();
|
||||
* for (int i = 0; i < n; ++i) {
|
||||
* Result r = ecs.take().get();
|
||||
* CompletionService<Result> cs
|
||||
* = new ExecutorCompletionService<>(e);
|
||||
* solvers.forEach(cs::submit);
|
||||
* for (int i = solvers.size(); i > 0; i--) {
|
||||
* Result r = cs.take().get();
|
||||
* if (r != null)
|
||||
* use(r);
|
||||
* }
|
||||
@ -76,27 +74,24 @@ package java.util.concurrent;
|
||||
* void solve(Executor e,
|
||||
* Collection<Callable<Result>> solvers)
|
||||
* throws InterruptedException {
|
||||
* CompletionService<Result> ecs
|
||||
* = new ExecutorCompletionService<Result>(e);
|
||||
* CompletionService<Result> cs
|
||||
* = new ExecutorCompletionService<>(e);
|
||||
* int n = solvers.size();
|
||||
* List<Future<Result>> futures = new ArrayList<>(n);
|
||||
* Result result = null;
|
||||
* try {
|
||||
* for (Callable<Result> s : solvers)
|
||||
* futures.add(ecs.submit(s));
|
||||
* for (int i = 0; i < n; ++i) {
|
||||
* solvers.forEach((solver) -> futures.add(cs.submit(solver)));
|
||||
* for (int i = n; i > 0; i--) {
|
||||
* try {
|
||||
* Result r = ecs.take().get();
|
||||
* Result r = cs.take().get();
|
||||
* if (r != null) {
|
||||
* result = r;
|
||||
* break;
|
||||
* }
|
||||
* } catch (ExecutionException ignore) {}
|
||||
* }
|
||||
* }
|
||||
* finally {
|
||||
* for (Future<Result> f : futures)
|
||||
* f.cancel(true);
|
||||
* } finally {
|
||||
* futures.forEach((future) -> future.cancel(true));
|
||||
* }
|
||||
*
|
||||
* if (result != null)
|
||||
|
@ -348,10 +348,6 @@ public class Phaser {
|
||||
private final AtomicReference<QNode> evenQ;
|
||||
private final AtomicReference<QNode> oddQ;
|
||||
|
||||
private AtomicReference<QNode> queueFor(int phase) {
|
||||
return ((phase & 1) == 0) ? evenQ : oddQ;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns message string for bounds exceptions on arrival.
|
||||
*/
|
||||
|
@ -72,8 +72,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
* loader. This allows automatic modules (for example) to link to types in the
|
||||
* unnamed module of the parent class loader.
|
||||
*
|
||||
* @see Layer#createWithOneLoader
|
||||
* @see Layer#createWithManyLoaders
|
||||
* @see Layer#defineModulesWithOneLoader
|
||||
* @see Layer#defineModulesWithManyLoaders
|
||||
*/
|
||||
|
||||
public final class Loader extends SecureClassLoader {
|
||||
@ -315,6 +315,8 @@ public final class Loader extends SecureClassLoader {
|
||||
}, acc);
|
||||
} catch (PrivilegedActionException pae) {
|
||||
throw (IOException) pae.getCause();
|
||||
} catch (SecurityException se) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -61,7 +61,7 @@ Java_java_net_InetAddress_init(JNIEnv *env, jclass cls) {
|
||||
CHECK_NULL(iac_class);
|
||||
ia_holderID = (*env)->GetFieldID(env, ia_class, "holder", "Ljava/net/InetAddress$InetAddressHolder;");
|
||||
CHECK_NULL(ia_holderID);
|
||||
ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "Z");
|
||||
ia_preferIPv6AddressID = (*env)->GetStaticFieldID(env, ia_class, "preferIPv6Address", "I");
|
||||
CHECK_NULL(ia_preferIPv6AddressID);
|
||||
|
||||
iac_addressID = (*env)->GetFieldID(env, iac_class, "address", "I");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -48,6 +48,7 @@
|
||||
|
||||
#include "java_net_Inet4AddressImpl.h"
|
||||
#include "java_net_Inet6AddressImpl.h"
|
||||
#include "java_net_InetAddress.h"
|
||||
|
||||
/* the initial size of our hostent buffers */
|
||||
#ifndef NI_MAXHOST
|
||||
@ -157,7 +158,10 @@ lookupIfLocalhost(JNIEnv *env, const char *hostname, jboolean includeV6)
|
||||
}
|
||||
|
||||
name = (*env)->NewStringUTF(env, hostname);
|
||||
CHECK_NULL_RETURN(name, NULL);
|
||||
if (name == NULL) {
|
||||
freeifaddrs(ifa);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Iterate over the interfaces, and total up the number of IPv4 and IPv6
|
||||
* addresses we have. Also keep a count of loopback addresses. We need to
|
||||
@ -312,8 +316,8 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
JNU_ReleaseStringPlatformChars(env, host, hostname);
|
||||
return NULL;
|
||||
} else {
|
||||
int i = 0;
|
||||
int inetCount = 0, inet6Count = 0, inetIndex, inet6Index;
|
||||
int i = 0, addressPreference = -1;
|
||||
int inetCount = 0, inet6Count = 0, inetIndex = 0, inet6Index = 0, originalIndex = 0;
|
||||
struct addrinfo *itr, *last = NULL, *iterator = res;
|
||||
while (iterator != NULL) {
|
||||
int skip = 0;
|
||||
@ -394,14 +398,18 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
goto cleanupAndReturn;
|
||||
}
|
||||
|
||||
if ((*env)->GetStaticBooleanField(env, ia_class, ia_preferIPv6AddressID)) {
|
||||
addressPreference = (*env)->GetStaticIntField(env, ia_class, ia_preferIPv6AddressID);
|
||||
|
||||
if (addressPreference == java_net_InetAddress_PREFER_IPV6_VALUE) {
|
||||
/* AF_INET addresses will be offset by inet6Count */
|
||||
inetIndex = inet6Count;
|
||||
inet6Index = 0;
|
||||
} else {
|
||||
} else if (addressPreference == java_net_InetAddress_PREFER_IPV4_VALUE) {
|
||||
/* AF_INET6 addresses will be offset by inetCount */
|
||||
inetIndex = 0;
|
||||
inet6Index = inetCount;
|
||||
} else if (addressPreference == java_net_InetAddress_PREFER_SYSTEM_VALUE) {
|
||||
inetIndex = inet6Index = originalIndex = 0;
|
||||
}
|
||||
|
||||
while (iterator != NULL) {
|
||||
@ -414,7 +422,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
}
|
||||
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
(*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
|
||||
(*env)->SetObjectArrayElement(env, ret, (inetIndex | originalIndex), iaObj);
|
||||
inetIndex++;
|
||||
} else if (iterator->ai_family == AF_INET6) {
|
||||
jint scope = 0;
|
||||
@ -435,9 +443,13 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
setInet6Address_scopeid(env, iaObj, scope);
|
||||
}
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
(*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
|
||||
(*env)->SetObjectArrayElement(env, ret, (inet6Index | originalIndex), iaObj);
|
||||
inet6Index++;
|
||||
}
|
||||
if (addressPreference == java_net_InetAddress_PREFER_SYSTEM_VALUE) {
|
||||
originalIndex++;
|
||||
inetIndex = inet6Index = 0;
|
||||
}
|
||||
iterator = iterator->ai_next;
|
||||
}
|
||||
}
|
||||
|
@ -243,6 +243,7 @@ JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByName0
|
||||
if (name_utf == NULL) {
|
||||
if (!(*env)->ExceptionCheck(env))
|
||||
JNU_ThrowOutOfMemoryError(env, NULL);
|
||||
freeif(ifs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -519,7 +520,7 @@ JNIEXPORT jbyteArray JNICALL Java_java_net_NetworkInterface_getMacAddr0
|
||||
}
|
||||
if ((sock = openSocketWithFallback(env, name_utf)) < 0) {
|
||||
(*env)->ReleaseStringUTFChars(env, name, name_utf);
|
||||
return JNI_FALSE;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!IS_NULL(addrArray)) {
|
||||
@ -664,7 +665,7 @@ jobject createNetworkInterface(JNIEnv *env, netif *ifs) {
|
||||
}
|
||||
|
||||
// Create the array of InetAddresses
|
||||
addrArr = (*env)->NewObjectArray(env, addr_count, ia_class, NULL);
|
||||
addrArr = (*env)->NewObjectArray(env, addr_count, ia_class, NULL);
|
||||
if (addrArr == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@ -1829,7 +1830,7 @@ static int getFlags(int sock, const char *ifname, int *flags) {
|
||||
strncpy(if2.lifr_name, ifname, sizeof(if2.lifr_name) - 1);
|
||||
|
||||
if (ioctl(sock, SIOCGLIFFLAGS, (char *)&if2) < 0) {
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*flags = if2.lifr_flags;
|
||||
@ -1859,8 +1860,7 @@ static int openSocketWithFallback(JNIEnv *env, const char *ifname) {
|
||||
"IPV6 Socket creation failed");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else{ // errno is not NOSUPPORT
|
||||
} else { // errno is not NOSUPPORT
|
||||
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
|
||||
"IPV4 Socket creation failed");
|
||||
return -1;
|
||||
|
@ -95,8 +95,8 @@ void setDefaultScopeID(JNIEnv *env, struct sockaddr *him)
|
||||
CHECK_NULL(c);
|
||||
c = (*env)->NewGlobalRef(env, c);
|
||||
CHECK_NULL(c);
|
||||
ni_defaultIndexID = (*env)->GetStaticFieldID(
|
||||
env, c, "defaultIndex", "I");
|
||||
ni_defaultIndexID = (*env)->GetStaticFieldID(env, c, "defaultIndex", "I");
|
||||
CHECK_NULL(ni_defaultIndexID);
|
||||
ni_class = c;
|
||||
}
|
||||
int defaultIndex;
|
||||
@ -118,8 +118,8 @@ int getDefaultScopeID(JNIEnv *env) {
|
||||
CHECK_NULL_RETURN(c, 0);
|
||||
c = (*env)->NewGlobalRef(env, c);
|
||||
CHECK_NULL_RETURN(c, 0);
|
||||
ni_defaultIndexID = (*env)->GetStaticFieldID(env, c,
|
||||
"defaultIndex", "I");
|
||||
ni_defaultIndexID = (*env)->GetStaticFieldID(env, c, "defaultIndex", "I");
|
||||
CHECK_NULL_RETURN(ni_defaultIndexID, 0);
|
||||
ni_class = c;
|
||||
}
|
||||
defaultIndex = (*env)->GetStaticIntField(env, ni_class,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -97,7 +97,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
|
||||
/* get the address preference */
|
||||
preferIPv6Address
|
||||
= (*env)->GetStaticBooleanField(env, ia_class, ia_preferIPv6AddressID);
|
||||
= (*env)->GetStaticIntField(env, ia_class, ia_preferIPv6AddressID);
|
||||
|
||||
/* Try once, with our static buffer. */
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
@ -122,7 +122,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
}
|
||||
} else {
|
||||
int i = 0;
|
||||
int inetCount = 0, inet6Count = 0, inetIndex, inet6Index;
|
||||
int inetCount = 0, inet6Count = 0, inetIndex = 0, inet6Index = 0, originalIndex = 0;
|
||||
struct addrinfo *itr, *last, *iterator = res;
|
||||
while (iterator != NULL) {
|
||||
int skip = 0;
|
||||
@ -203,12 +203,14 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
goto cleanupAndReturn;
|
||||
}
|
||||
|
||||
if (preferIPv6Address) {
|
||||
if (preferIPv6Address == java_net_InetAddress_PREFER_IPV6_VALUE) {
|
||||
inetIndex = inet6Count;
|
||||
inet6Index = 0;
|
||||
} else {
|
||||
} else if (preferIPv6Address == java_net_InetAddress_PREFER_IPV4_VALUE) {
|
||||
inetIndex = 0;
|
||||
inet6Index = inetCount;
|
||||
} else if (preferIPv6Address == java_net_InetAddress_PREFER_SYSTEM_VALUE) {
|
||||
inetIndex = inet6Index = originalIndex = 0;
|
||||
}
|
||||
|
||||
while (iterator != NULL) {
|
||||
@ -220,7 +222,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
}
|
||||
setInetAddress_addr(env, iaObj, ntohl(((struct sockaddr_in*)iterator->ai_addr)->sin_addr.s_addr));
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
(*env)->SetObjectArrayElement(env, ret, inetIndex, iaObj);
|
||||
(*env)->SetObjectArrayElement(env, ret, (inetIndex | originalIndex), iaObj);
|
||||
inetIndex ++;
|
||||
} else if (iterator->ai_family == AF_INET6) {
|
||||
jint scope = 0;
|
||||
@ -240,9 +242,13 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this,
|
||||
setInet6Address_scopeid(env, iaObj, scope);
|
||||
}
|
||||
setInetAddress_hostName(env, iaObj, host);
|
||||
(*env)->SetObjectArrayElement(env, ret, inet6Index, iaObj);
|
||||
(*env)->SetObjectArrayElement(env, ret, (inet6Index | originalIndex), iaObj);
|
||||
inet6Index ++;
|
||||
}
|
||||
if (preferIPv6Address == java_net_InetAddress_PREFER_SYSTEM_VALUE) {
|
||||
originalIndex++;
|
||||
inetIndex = inet6Index = 0;
|
||||
}
|
||||
iterator = iterator->ai_next;
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ import jdk.tools.jlink.internal.ModuleEntryImpl;
|
||||
* <li>For jimage content: /{module name}/{package1}/.../{packageN}/{file
|
||||
* name}</li>
|
||||
* <li>For other files (shared lib, launchers, config, ...):/{module name}/
|
||||
* {@literal bin|conf|native}/{dir1}>/.../{dirN}/{file name}</li>
|
||||
* {@literal bin|conf|native}/{dir1}/.../{dirN}/{file name}</li>
|
||||
* </ul>
|
||||
*/
|
||||
public interface ModuleEntry {
|
||||
|
@ -296,45 +296,6 @@ public final class Unsafe {
|
||||
theInternalUnsafe.putDouble(o, offset, x);
|
||||
}
|
||||
|
||||
|
||||
// These read VM internal data.
|
||||
|
||||
/**
|
||||
* Fetches an uncompressed reference value from a given native variable
|
||||
* ignoring the VM's compressed references mode.
|
||||
*
|
||||
* @param address a memory address locating the variable
|
||||
* @return the value fetched from the indicated native variable
|
||||
*/
|
||||
@ForceInline
|
||||
public Object getUncompressedObject(long address) {
|
||||
return theInternalUnsafe.getUncompressedObject(address);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the {@link java.lang.Class} Java mirror for the given native
|
||||
* metaspace {@code Klass} pointer.
|
||||
*
|
||||
* @param metaspaceKlass a native metaspace {@code Klass} pointer
|
||||
* @return the {@link java.lang.Class} Java mirror
|
||||
*/
|
||||
@ForceInline
|
||||
public Class<?> getJavaMirror(long metaspaceKlass) {
|
||||
return theInternalUnsafe.getJavaMirror(metaspaceKlass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches a native metaspace {@code Klass} pointer for the given Java
|
||||
* object.
|
||||
*
|
||||
* @param o Java heap object for which to fetch the class pointer
|
||||
* @return a native metaspace {@code Klass} pointer
|
||||
*/
|
||||
@ForceInline
|
||||
public long getKlassPointer(Object o) {
|
||||
return theInternalUnsafe.getKlassPointer(o);
|
||||
}
|
||||
|
||||
// These work on values in the C heap.
|
||||
|
||||
/**
|
||||
|
@ -376,12 +376,17 @@ final class ZipPath implements Path {
|
||||
// count names
|
||||
count = 0;
|
||||
index = 0;
|
||||
while (index < path.length) {
|
||||
byte c = path[index++];
|
||||
if (c != '/') {
|
||||
count++;
|
||||
while (index < path.length && path[index] != '/')
|
||||
index++;
|
||||
if (path.length == 0) {
|
||||
// empty path has one name
|
||||
count = 1;
|
||||
} else {
|
||||
while (index < path.length) {
|
||||
byte c = path[index++];
|
||||
if (c != '/') {
|
||||
count++;
|
||||
while (index < path.length && path[index] != '/')
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
// populate offsets
|
||||
@ -423,10 +428,11 @@ final class ZipPath implements Path {
|
||||
// removes redundant slashs, replace "\" to zip separator "/"
|
||||
// and check for invalid characters
|
||||
private byte[] normalize(byte[] path) {
|
||||
if (path.length == 0)
|
||||
int len = path.length;
|
||||
if (len == 0)
|
||||
return path;
|
||||
byte prevC = 0;
|
||||
for (int i = 0; i < path.length; i++) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte c = path[i];
|
||||
if (c == '\\' || c == '\u0000')
|
||||
return normalize(path, i);
|
||||
@ -434,6 +440,8 @@ final class ZipPath implements Path {
|
||||
return normalize(path, i - 1);
|
||||
prevC = c;
|
||||
}
|
||||
if (len > 1 && prevC == '/')
|
||||
return Arrays.copyOf(path, len - 1);
|
||||
return path;
|
||||
}
|
||||
|
||||
@ -567,7 +575,8 @@ final class ZipPath implements Path {
|
||||
if (watcher == null || events == null || modifiers == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
throw new UnsupportedOperationException();
|
||||
// watcher must be associated with a different provider
|
||||
throw new ProviderMismatchException();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -195,8 +195,6 @@ java/rmi/transport/rapidExportUnexport/RapidExportUnexport.java 7146541 linux-al
|
||||
|
||||
java/rmi/transport/checkLeaseInfoLeak/CheckLeaseLeak.java 7191877 generic-all
|
||||
|
||||
sun/rmi/transport/proxy/EagerHttpFallback.java 7195095 generic-all
|
||||
|
||||
java/rmi/activation/Activatable/extLoadedImpl/ext.sh 8062724 generic-all
|
||||
|
||||
sun/rmi/rmic/newrmic/equivalence/run.sh 8145980 generic-all
|
||||
@ -288,8 +286,6 @@ sun/security/krb5/auto/HttpNegotiateServer.java 8038079 generic-
|
||||
|
||||
sun/security/tools/keytool/autotest.sh 8130302 generic-all
|
||||
|
||||
sun/security/provider/NSASuiteB/TestDSAGenParameterSpec.java 8137255 generic-all
|
||||
|
||||
sun/security/x509/URICertStore/ExtensionsWithLDAP.java 8134577 generic-all
|
||||
|
||||
sun/security/provider/SecureRandom/StrongSecureRandom.java 8157387 linux-all
|
||||
@ -394,7 +390,5 @@ com/sun/jndi/ldap/DeadSSLLdapTimeoutTest.java 8141370 linux-i5
|
||||
|
||||
# core_tools
|
||||
|
||||
tools/jimage/JImageTest.java 8150975 linux-i586,windows-i586
|
||||
|
||||
############################################################################
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 8039358
|
||||
* @summary com.sun.jarsigner.ContentSignerParameters.getTSAPolicyID() should be default
|
||||
* @modules jdk.jartool
|
||||
* @compile DefaultMethod.java
|
||||
*/
|
||||
|
||||
|
1
jdk/test/com/sun/net/httpserver/TEST.properties
Normal file
1
jdk/test/com/sun/net/httpserver/TEST.properties
Normal file
@ -0,0 +1 @@
|
||||
modules = jdk.httpserver
|
@ -202,7 +202,7 @@ public class VerifyStackTrace {
|
||||
// synthetic frames introduced by lambdas & method handles
|
||||
return produced.replaceAll(":[1-9][0-9]*\\)", ":00)")
|
||||
.replaceAll("-internal/", "/").replaceAll("-ea/", "/")
|
||||
.replaceAll("java.base@[0-9]+/", "java.base/")
|
||||
.replaceAll("java.base@(\\d+\\.){0,3}(\\d+)/", "java.base/")
|
||||
.replaceAll("/[0-9]+\\.run", "/xxxxxxxx.run")
|
||||
.replaceAll("/[0-9]+\\.invoke", "/xxxxxxxx.invoke")
|
||||
.replaceAll("\\$[0-9]+", "\\$??");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -38,6 +38,7 @@ import java.io.InputStream;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.module.ModuleReader;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.reflect.Module;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
@ -64,16 +65,24 @@ public class ModuleReaderTest {
|
||||
private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
|
||||
private static final Path MODS_DIR = Paths.get("mods");
|
||||
|
||||
// the module name of the base module
|
||||
private static final String BASE_MODULE = "java.base";
|
||||
|
||||
// the module name of the test module
|
||||
private static final String TEST_MODULE = "m";
|
||||
|
||||
// resources in the base module
|
||||
private static final String[] BASE_RESOURCES = {
|
||||
"java/lang/Object.class"
|
||||
};
|
||||
|
||||
// resources in test module (can't use module-info.class as a test
|
||||
// resource as it will be modified by the jmod tool)
|
||||
private static final String[] RESOURCES = {
|
||||
private static final String[] TEST_RESOURCES = {
|
||||
"p/Main.class"
|
||||
};
|
||||
|
||||
// a resource that is not in the test module
|
||||
// a resource that is not in the base or test module
|
||||
private static final String NOT_A_RESOURCE = "NotAResource";
|
||||
|
||||
|
||||
@ -89,7 +98,74 @@ public class ModuleReaderTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test exploded module
|
||||
* Test ModuleReader to module in runtime image
|
||||
*/
|
||||
public void testImage() throws Exception {
|
||||
|
||||
ModuleFinder finder = ModuleFinder.ofSystem();
|
||||
ModuleReference mref = finder.find(BASE_MODULE).get();
|
||||
ModuleReader reader = mref.open();
|
||||
|
||||
try (reader) {
|
||||
|
||||
for (String name : BASE_RESOURCES) {
|
||||
byte[] expectedBytes;
|
||||
Module baseModule = Object.class.getModule();
|
||||
try (InputStream in = baseModule.getResourceAsStream(name)) {
|
||||
expectedBytes = in.readAllBytes();
|
||||
}
|
||||
|
||||
testFind(reader, name, expectedBytes);
|
||||
testOpen(reader, name, expectedBytes);
|
||||
testRead(reader, name, expectedBytes);
|
||||
|
||||
}
|
||||
|
||||
// test "not found"
|
||||
assertFalse(reader.find(NOT_A_RESOURCE).isPresent());
|
||||
assertFalse(reader.open(NOT_A_RESOURCE).isPresent());
|
||||
assertFalse(reader.read(NOT_A_RESOURCE).isPresent());
|
||||
|
||||
|
||||
// test nulls
|
||||
try {
|
||||
reader.find(null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
try {
|
||||
reader.open(null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
try {
|
||||
reader.read(null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
try {
|
||||
reader.release(null);
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
}
|
||||
|
||||
// test closed ModuleReader
|
||||
try {
|
||||
reader.open(BASE_RESOURCES[0]);
|
||||
assertTrue(false);
|
||||
} catch (IOException expected) { }
|
||||
|
||||
|
||||
try {
|
||||
reader.read(BASE_RESOURCES[0]);
|
||||
assertTrue(false);
|
||||
} catch (IOException expected) { }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test ModuleReader to exploded module
|
||||
*/
|
||||
public void testExplodedModule() throws Exception {
|
||||
test(MODS_DIR);
|
||||
@ -97,7 +173,7 @@ public class ModuleReaderTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test modular JAR
|
||||
* Test ModuleReader to modular JAR
|
||||
*/
|
||||
public void testModularJar() throws Exception {
|
||||
Path dir = Files.createTempDirectory(USER_DIR, "mlib");
|
||||
@ -111,7 +187,7 @@ public class ModuleReaderTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test JMOD
|
||||
* Test ModuleReader to JMOD
|
||||
*/
|
||||
public void testJMod() throws Exception {
|
||||
Path dir = Files.createTempDirectory(USER_DIR, "mlib");
|
||||
@ -145,7 +221,7 @@ public class ModuleReaderTest {
|
||||
try (reader) {
|
||||
|
||||
// test each of the known resources in the module
|
||||
for (String name : RESOURCES) {
|
||||
for (String name : TEST_RESOURCES) {
|
||||
byte[] expectedBytes
|
||||
= Files.readAllBytes(MODS_DIR
|
||||
.resolve(TEST_MODULE)
|
||||
@ -157,6 +233,7 @@ public class ModuleReaderTest {
|
||||
}
|
||||
|
||||
// test "not found"
|
||||
assertFalse(reader.find(NOT_A_RESOURCE).isPresent());
|
||||
assertFalse(reader.open(NOT_A_RESOURCE).isPresent());
|
||||
assertFalse(reader.read(NOT_A_RESOURCE).isPresent());
|
||||
|
||||
@ -176,19 +253,22 @@ public class ModuleReaderTest {
|
||||
assertTrue(false);
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
// should release(null) throw NPE?
|
||||
try {
|
||||
reader.release(null);
|
||||
throw new RuntimeException();
|
||||
} catch (NullPointerException expected) { }
|
||||
|
||||
}
|
||||
|
||||
// test closed ModuleReader
|
||||
try {
|
||||
reader.open(RESOURCES[0]);
|
||||
reader.open(TEST_RESOURCES[0]);
|
||||
assertTrue(false);
|
||||
} catch (IOException expected) { }
|
||||
|
||||
|
||||
try {
|
||||
reader.read(RESOURCES[0]);
|
||||
reader.read(TEST_RESOURCES[0]);
|
||||
assertTrue(false);
|
||||
} catch (IOException expected) { }
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer.create, created on an empty layer
|
||||
* Exercise Layer defineModules, created with empty layer as parent
|
||||
*/
|
||||
public void testLayerOnEmpty() {
|
||||
ModuleDescriptor descriptor1
|
||||
@ -184,7 +184,7 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Exercise Layer.create, created over the boot layer
|
||||
* Exercise Layer defineModules, created with boot layer as parent
|
||||
*/
|
||||
public void testLayerOnBoot() {
|
||||
ModuleDescriptor descriptor1
|
||||
@ -247,8 +247,8 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Layer.create with a configuration of two modules that have the same
|
||||
* module-private package.
|
||||
* Exercise Layer defineModules with a configuration of two modules that
|
||||
* have the same module-private package.
|
||||
*/
|
||||
public void testSameConcealedPackage() {
|
||||
ModuleDescriptor descriptor1
|
||||
@ -281,8 +281,8 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Layer.create with a configuration with a partitioned graph. The same
|
||||
* package is exported in both partitions.
|
||||
* Exercise Layer defineModules with a configuration that is a partitioned
|
||||
* graph. The same package is exported in both partitions.
|
||||
*/
|
||||
public void testSameExportInPartitionedGraph() {
|
||||
|
||||
@ -338,9 +338,9 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Layer.create with a configuration that contains a module that has a
|
||||
* concealed package that is the same name as a non-exported package
|
||||
* in a parent layer.
|
||||
* Exercise Layer defineModules with a configuration that contains a module
|
||||
* that has a concealed package that is the same name as a non-exported
|
||||
* package in a parent layer.
|
||||
*/
|
||||
public void testConcealSamePackageAsBootLayer() {
|
||||
|
||||
@ -667,9 +667,9 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to use Layer.create to create a layer with a module defined to a
|
||||
* class loader that already has a module of the same name defined to the
|
||||
* class loader.
|
||||
* Attempt to use Layer defineModules to create a layer with a module
|
||||
* defined to a class loader that already has a module of the same name
|
||||
* defined to the class loader.
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testModuleAlreadyDefinedToLoader() {
|
||||
@ -696,9 +696,9 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to use Layer.create to create a Layer with a module containing
|
||||
* package {@code p} where the class loader already has a module defined
|
||||
* to it containing package {@code p}.
|
||||
* Attempt to use Layer defineModules to create a Layer with a module
|
||||
* containing package {@code p} where the class loader already has a module
|
||||
* defined to it containing package {@code p}.
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testPackageAlreadyInNamedModule() {
|
||||
@ -738,8 +738,9 @@ public class BasicLayerTest {
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to use Layer.create to create a Layer with a module containing
|
||||
* a package in which a type is already loaded by the class loader.
|
||||
* Attempt to use Layer defineModules to create a Layer with a module
|
||||
* containing a package in which a type is already loaded by the class
|
||||
* loader.
|
||||
*/
|
||||
@Test(expectedExceptions = { LayerInstantiationException.class })
|
||||
public void testPackageAlreadyInUnnamedModule() throws Exception {
|
||||
@ -762,6 +763,46 @@ public class BasicLayerTest {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempt to create a Layer with a module named "java.base".
|
||||
*/
|
||||
public void testLayerWithJavaBase() {
|
||||
ModuleDescriptor descriptor
|
||||
= new ModuleDescriptor.Builder("java.base")
|
||||
.exports("java.lang")
|
||||
.build();
|
||||
|
||||
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
|
||||
|
||||
Configuration cf = Layer.boot()
|
||||
.configuration()
|
||||
.resolveRequires(finder, ModuleFinder.of(), Set.of("java.base"));
|
||||
assertTrue(cf.modules().size() == 1);
|
||||
|
||||
ClassLoader scl = ClassLoader.getSystemClassLoader();
|
||||
|
||||
try {
|
||||
Layer.boot().defineModules(cf, loader -> null );
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModules(cf, loader -> new ClassLoader() { });
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithOneLoader(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
|
||||
try {
|
||||
Layer.boot().defineModulesWithManyLoaders(cf, scl);
|
||||
assertTrue(false);
|
||||
} catch (LayerInstantiationException e) { }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parent of configuration != configuration of parent Layer
|
||||
*/
|
||||
@ -812,7 +853,6 @@ public class BasicLayerTest {
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class })
|
||||
public void testCreateWithNull2() {
|
||||
ClassLoader loader = new ClassLoader() { };
|
||||
Configuration cf = resolveRequires(Layer.boot().configuration(), ModuleFinder.of());
|
||||
Layer.boot().defineModules(cf, null);
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer.defineModulesWithOneLoader
|
||||
* Basic test of Layer defineModulesWithOneLoader
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -99,7 +99,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer.defineModulesWithManyLoaders
|
||||
* Basic test of Layer defineModulesWithManyLoaders
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -131,7 +131,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer.defineModulesWithOneLoader where one of the modules
|
||||
* Basic test of Layer defineModulesWithOneLoader where one of the modules
|
||||
* is a service provider module.
|
||||
*
|
||||
* Test scenario:
|
||||
@ -172,8 +172,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Basic test of Layer.defineModulesWithManyLoaders where one of the modules
|
||||
* is a service provider module.
|
||||
* Basic test of Layer defineModulesWithManyLoaders where one of the
|
||||
* modules is a service provider module.
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 requires m2 and m3
|
||||
@ -224,7 +224,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Tests that the class loaders created by Layer.createWithXXX delegate
|
||||
* Tests that the class loaders created by defineModulesWithXXX delegate
|
||||
* to the given parent class loader.
|
||||
*/
|
||||
public void testDelegationToParent() throws Exception {
|
||||
@ -254,7 +254,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX when modules that have overlapping packages.
|
||||
* Test defineModulesWithXXX when modules that have overlapping packages.
|
||||
*
|
||||
* Test scenario:
|
||||
* m1 exports p
|
||||
@ -288,7 +288,7 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX with split delegation.
|
||||
* Test Layer defineModulesWithXXX with split delegation.
|
||||
*
|
||||
* Test scenario:
|
||||
* layer1: m1 exports p, m2 exports p
|
||||
@ -319,7 +319,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
|
||||
|
||||
Configuration cf2 = cf1.resolveRequires(finder2, ModuleFinder.of(), Set.of("m3", "m4"));
|
||||
Configuration cf2 = cf1.resolveRequires(finder2, ModuleFinder.of(),
|
||||
Set.of("m3", "m4"));
|
||||
|
||||
// package p cannot be supplied by two class loaders
|
||||
try {
|
||||
@ -335,8 +336,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX when the modules that override same named
|
||||
* modules in the parent layer.
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* Test scenario:
|
||||
* layer1: m1, m2, m3 => same loader
|
||||
@ -350,7 +351,8 @@ public class LayerAndLoadersTest {
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
checkLayer(layer2, "m1", "m2", "m3");
|
||||
@ -383,8 +385,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX when the modules that override same named
|
||||
* modules in the parent layer.
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* Test scenario:
|
||||
* layer1: m1, m2, m3 => loader pool
|
||||
@ -398,7 +400,8 @@ public class LayerAndLoadersTest {
|
||||
checkLayer(layer1, "m1", "m2", "m3");
|
||||
|
||||
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
checkLayer(layer2, "m1", "m2", "m3");
|
||||
@ -477,8 +480,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX when the modules that override same named
|
||||
* modules in the parent layer.
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* layer1: m1, m2, m3 => same loader
|
||||
* layer2: m1, m3 => same loader
|
||||
@ -492,7 +495,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ModuleFinder finder = finderFor("m1", "m3");
|
||||
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
|
||||
checkLayer(layer2, "m1", "m3");
|
||||
@ -513,8 +517,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
|
||||
/**
|
||||
* Test Layer.createWithXXX when the modules that override same named
|
||||
* modules in the parent layer.
|
||||
* Test Layer defineModulesWithXXX when the modules that override same
|
||||
* named modules in the parent layer.
|
||||
*
|
||||
* layer1: m1, m2, m3 => loader pool
|
||||
* layer2: m1, m3 => loader pool
|
||||
@ -528,7 +532,8 @@ public class LayerAndLoadersTest {
|
||||
|
||||
ModuleFinder finder = finderFor("m1", "m3");
|
||||
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
|
||||
Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
|
||||
Set.of("m1"));
|
||||
|
||||
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
|
||||
checkLayer(layer2, "m1", "m3");
|
||||
|
147
jdk/test/java/lang/reflect/Module/WithSecurityManager.java
Normal file
147
jdk/test/java/lang/reflect/Module/WithSecurityManager.java
Normal file
@ -0,0 +1,147 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @modules java.logging
|
||||
* @summary Test java.lang.reflect.Module methods that specify permission checks
|
||||
* @run main/othervm -Djava.security.policy=${test.src}/allow.policy WithSecurityManager allow
|
||||
* @run main/othervm WithSecurityManager deny
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ModuleFinder;
|
||||
import java.lang.module.ModuleReference;
|
||||
import java.lang.reflect.Layer;
|
||||
import java.lang.reflect.Module;
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Test java.lang.reflect.Module methods that specify permission checks.
|
||||
*/
|
||||
|
||||
public class WithSecurityManager {
|
||||
|
||||
// a module that will be loaded into a child layer
|
||||
static final String ANOTHER_MODULE = "java.logging";
|
||||
static final String ANOTHER_MODULE_RESOURCE = "java/util/logging/Logger.class";
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
boolean allow = args[0].equals("allow");
|
||||
|
||||
// base module, in the boot layer
|
||||
Module base = Object.class.getModule();
|
||||
|
||||
// another module, in a child layer
|
||||
Module other = loadModuleInChildLayer(ANOTHER_MODULE);
|
||||
assertTrue(other.getLayer() != Layer.boot());
|
||||
|
||||
System.setSecurityManager(new SecurityManager());
|
||||
|
||||
test(base, "java/lang/Object.class", allow);
|
||||
test(other, ANOTHER_MODULE_RESOURCE, allow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the permission checks by invoking methods on the given module.
|
||||
*
|
||||
* If {@code allow} is {@code true} then the permission checks should succeed.
|
||||
*/
|
||||
static void test(Module m, String name, boolean allow) throws IOException {
|
||||
|
||||
// test Module::getClassLoader
|
||||
System.out.format("Test getClassLoader on %s ...%n", m);
|
||||
try {
|
||||
ClassLoader cl = m.getClassLoader();
|
||||
System.out.println(cl);
|
||||
if (!allow)
|
||||
assertTrue("getClassLoader should have failed", false);
|
||||
} catch (SecurityException e) {
|
||||
System.out.println(e + " thrown");
|
||||
if (allow)
|
||||
throw e;
|
||||
}
|
||||
|
||||
// test Module::getResourceAsStream
|
||||
System.out.format("Test getResourceAsStream(\"%s\") on %s ...%n", name, m);
|
||||
try (InputStream in = m.getResourceAsStream(name)) {
|
||||
System.out.println(in);
|
||||
if (allow && (in == null))
|
||||
assertTrue(name + " not found", false);
|
||||
if (!allow && (in != null))
|
||||
assertTrue(name + " should not be found", false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a module layer that contains the given system module.
|
||||
*/
|
||||
static Module loadModuleInChildLayer(String mn) {
|
||||
Optional<ModuleReference> omref = ModuleFinder.ofSystem().find(mn);
|
||||
assertTrue("module " + mn + " not a system module", omref.isPresent());
|
||||
|
||||
// create a ModuleFinder that only finds this module
|
||||
ModuleReference mref = omref.get();
|
||||
ModuleFinder finder = new ModuleFinder() {
|
||||
@Override
|
||||
public Optional<ModuleReference> find(String name) {
|
||||
if (name.equals(mn))
|
||||
return Optional.of(mref);
|
||||
else
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<ModuleReference> findAll() {
|
||||
return Collections.singleton(mref);
|
||||
}
|
||||
};
|
||||
|
||||
// create a child configuration and layer with this module
|
||||
Layer bootLayer = Layer.boot();
|
||||
Configuration cf = bootLayer
|
||||
.configuration()
|
||||
.resolveRequires(finder, ModuleFinder.of(), Set.of(ANOTHER_MODULE));
|
||||
Layer layer = bootLayer.defineModulesWithOneLoader(cf, null);
|
||||
|
||||
Optional<Module> om = layer.findModule(mn);
|
||||
assertTrue("module " + mn + " not in child layer", om.isPresent());
|
||||
return om.get();
|
||||
}
|
||||
|
||||
static void assertTrue(String msg, boolean e) {
|
||||
if (!e)
|
||||
throw new RuntimeException(msg);
|
||||
}
|
||||
|
||||
static void assertTrue(boolean e) {
|
||||
if (!e)
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
}
|
27
jdk/test/java/lang/reflect/Module/allow.policy
Normal file
27
jdk/test/java/lang/reflect/Module/allow.policy
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
grant {
|
||||
permission java.lang.RuntimePermission "getClassLoader";
|
||||
permission java.io.FilePermission "${java.home}/-", "read";
|
||||
};
|
132
jdk/test/java/net/Inet6Address/PreferIPv6AddressesTest.java
Normal file
132
jdk/test/java/net/Inet6Address/PreferIPv6AddressesTest.java
Normal file
@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 8016521
|
||||
* @summary InetAddress should not always re-order addresses returned from name
|
||||
* service
|
||||
* @run main/othervm -Djava.net.preferIPv6Addresses=false PreferIPv6AddressesTest
|
||||
* @run main/othervm -Djava.net.preferIPv6Addresses=true PreferIPv6AddressesTest
|
||||
* @run main/othervm -Djava.net.preferIPv6Addresses=system PreferIPv6AddressesTest
|
||||
* @run main/othervm PreferIPv6AddressesTest
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.*;
|
||||
import java.nio.channels.DatagramChannel;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.IntStream;
|
||||
import static java.lang.System.out;
|
||||
|
||||
public class PreferIPv6AddressesTest {
|
||||
|
||||
// A name, that if resolves, returns both IPv4 and IPv6 addresses.
|
||||
static final String HOST_NAME = "www.google.com";
|
||||
|
||||
static final InetAddress LOOPBACK = InetAddress.getLoopbackAddress();
|
||||
|
||||
static final String preferIPV6Address =
|
||||
System.getProperty("java.net.preferIPv6Addresses", "false");
|
||||
|
||||
public static void main(String args[]) throws IOException {
|
||||
|
||||
InetAddress addrs[];
|
||||
try {
|
||||
addrs = InetAddress.getAllByName(HOST_NAME);
|
||||
} catch (UnknownHostException e) {
|
||||
out.println("Unknown host " + HOST_NAME + ", cannot run test.");
|
||||
return;
|
||||
}
|
||||
|
||||
int firstIPv4Address = IntStream.range(0, addrs.length)
|
||||
.filter(x -> addrs[x] instanceof Inet4Address)
|
||||
.findFirst().orElse(-1);
|
||||
int firstIPv6Address = IntStream.range(0, addrs.length)
|
||||
.filter(x -> addrs[x] instanceof Inet6Address)
|
||||
.findFirst().orElse(-1);
|
||||
|
||||
out.println("IPv6 supported: " + IPv6Supported());
|
||||
out.println("Addresses: " + Arrays.asList(addrs));
|
||||
|
||||
if (preferIPV6Address.equalsIgnoreCase("true") && firstIPv6Address != -1) {
|
||||
int off = firstIPv4Address != -1 ? firstIPv4Address : addrs.length;
|
||||
assertAllv6Addresses(addrs, 0, off);
|
||||
assertAllv4Addresses(addrs, off, addrs.length);
|
||||
assertLoopbackAddress(Inet6Address.class);
|
||||
assertAnyLocalAddress(Inet6Address.class);
|
||||
} else if (preferIPV6Address.equalsIgnoreCase("false") && firstIPv4Address != -1) {
|
||||
int off = firstIPv6Address != -1 ? firstIPv6Address : addrs.length;
|
||||
assertAllv4Addresses(addrs, 0, off);
|
||||
assertAllv6Addresses(addrs, off, addrs.length);
|
||||
assertLoopbackAddress(Inet4Address.class);
|
||||
assertAnyLocalAddress(Inet4Address.class);
|
||||
} else if (preferIPV6Address.equalsIgnoreCase("system") && IPv6Supported()) {
|
||||
assertLoopbackAddress(Inet6Address.class);
|
||||
assertAnyLocalAddress(Inet6Address.class);
|
||||
} else if (preferIPV6Address.equalsIgnoreCase("system") && !IPv6Supported()) {
|
||||
assertLoopbackAddress(Inet4Address.class);
|
||||
assertAnyLocalAddress(Inet4Address.class);
|
||||
}
|
||||
}
|
||||
|
||||
static void assertAllv4Addresses(InetAddress[] addrs, int off, int len) {
|
||||
IntStream.range(off, len)
|
||||
.mapToObj(x -> addrs[x])
|
||||
.forEach(x -> {
|
||||
if (!(x instanceof Inet4Address))
|
||||
throw new RuntimeException("Expected IPv4, got " + x);
|
||||
});
|
||||
}
|
||||
|
||||
static void assertAllv6Addresses(InetAddress[] addrs, int off, int len) {
|
||||
IntStream.range(off, len)
|
||||
.mapToObj(x -> addrs[x])
|
||||
.forEach(x -> {
|
||||
if (!(x instanceof Inet6Address))
|
||||
throw new RuntimeException("Expected IPv6, got " + x);
|
||||
});
|
||||
}
|
||||
|
||||
static void assertLoopbackAddress(Class<?> expectedType) {
|
||||
if (!LOOPBACK.getClass().isAssignableFrom(expectedType))
|
||||
throw new RuntimeException("Expected " + expectedType
|
||||
+ ", got " + LOOPBACK.getClass());
|
||||
}
|
||||
|
||||
static void assertAnyLocalAddress(Class<?> expectedType) {
|
||||
InetAddress anyAddr = (new InetSocketAddress(0)).getAddress();
|
||||
if (!anyAddr.getClass().isAssignableFrom(expectedType))
|
||||
throw new RuntimeException("Expected " + expectedType
|
||||
+ ", got " + anyAddr.getClass());
|
||||
}
|
||||
|
||||
static boolean IPv6Supported() throws IOException {
|
||||
try {
|
||||
DatagramChannel.open(StandardProtocolFamily.INET6);
|
||||
return true;
|
||||
} catch (UnsupportedOperationException x) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -442,28 +442,44 @@ public class TCKIsoFields {
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// range refinedby
|
||||
// rangeRefinedBy
|
||||
//-----------------------------------------------------------------------
|
||||
@DataProvider(name="isofields")
|
||||
Object[][] data_isofields() {
|
||||
return new Object[][] {
|
||||
{IsoFields.DAY_OF_QUARTER},
|
||||
{IsoFields.QUARTER_OF_YEAR},
|
||||
{IsoFields.WEEK_OF_WEEK_BASED_YEAR},
|
||||
{IsoFields.WEEK_BASED_YEAR},
|
||||
{IsoFields.DAY_OF_QUARTER, 49, ValueRange.of(1, 91)},
|
||||
{IsoFields.QUARTER_OF_YEAR, 2, ValueRange.of(1, 4)},
|
||||
{IsoFields.WEEK_OF_WEEK_BASED_YEAR, 20, ValueRange.of(1, 52)},
|
||||
{IsoFields.WEEK_BASED_YEAR, 2016, ValueRange.of(LocalDate.MIN.getYear(),
|
||||
LocalDate.MAX.getYear())},
|
||||
};
|
||||
}
|
||||
|
||||
@Test(dataProvider = "isofields")
|
||||
public void test_isofields_rangerefinedby(TemporalField field) {
|
||||
field.rangeRefinedBy(LocalDate.now());
|
||||
public void test_isofields_rangerefinedby(TemporalField field, int value, ValueRange valueRange) {
|
||||
LocalDate date = LocalDate.of(2016, 5, 19);
|
||||
assertEquals(field.rangeRefinedBy(date), valueRange);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "isofields", expectedExceptions = UnsupportedTemporalTypeException.class)
|
||||
public void test_nonisofields_rangerefinedby(TemporalField field) {
|
||||
public void test_nonisofields_rangerefinedby(TemporalField field, int value, ValueRange valueRange) {
|
||||
field.rangeRefinedBy(ThaiBuddhistDate.now());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// getFrom
|
||||
//-----------------------------------------------------------------------
|
||||
@Test(dataProvider = "isofields")
|
||||
public void test_isofields_getFrom(TemporalField field, int value, ValueRange valueRange) {
|
||||
LocalDate date = LocalDate.of(2016, 5, 19);
|
||||
assertEquals(field.getFrom(date), value);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "isofields", expectedExceptions = UnsupportedTemporalTypeException.class)
|
||||
public void test_nonisofields_getFrom(TemporalField field, int value, ValueRange valueRange) {
|
||||
field.getFrom(ThaiBuddhistDate.now());
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
public void test_loop() {
|
||||
// loop round at least one 400 year cycle, including before 1970
|
||||
|
@ -25,13 +25,10 @@
|
||||
* @test
|
||||
* @bug 6503247 6574123
|
||||
* @summary Test resilience to tryAcquire methods that throw
|
||||
* @library /lib/testlibrary/
|
||||
* @author Martin Buchholz
|
||||
*/
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
import java.util.concurrent.CyclicBarrier;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@ -39,7 +36,6 @@ import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.AbstractQueuedLongSynchronizer;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import jdk.testlibrary.Utils;
|
||||
|
||||
/**
|
||||
* This uses a variant of the standard Mutex demo, except with a
|
||||
@ -48,22 +44,10 @@ import jdk.testlibrary.Utils;
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class FlakyMutex implements Lock {
|
||||
static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000);
|
||||
static class MyError extends Error {}
|
||||
static class MyException extends Exception {}
|
||||
static class MyRuntimeException extends RuntimeException {}
|
||||
|
||||
static final Random rnd = new Random();
|
||||
|
||||
static void maybeThrow() {
|
||||
switch (rnd.nextInt(10)) {
|
||||
case 0: throw new MyError();
|
||||
case 1: throw new MyRuntimeException();
|
||||
case 2: FlakyMutex.<RuntimeException>uncheckedThrow(new MyException());
|
||||
default: /* Do nothing */ break;
|
||||
}
|
||||
}
|
||||
|
||||
static void checkThrowable(Throwable t) {
|
||||
check((t instanceof MyError) ||
|
||||
(t instanceof MyException) ||
|
||||
@ -72,31 +56,35 @@ public class FlakyMutex implements Lock {
|
||||
|
||||
static void realMain(String[] args) throws Throwable {
|
||||
final int nThreads = 3;
|
||||
final CyclicBarrier barrier = new CyclicBarrier(nThreads + 1);
|
||||
final FlakyMutex m = new FlakyMutex();
|
||||
final int iterations = 10_000;
|
||||
final CyclicBarrier startingGate = new CyclicBarrier(nThreads);
|
||||
final FlakyMutex mutex = new FlakyMutex();
|
||||
final ExecutorService es = Executors.newFixedThreadPool(nThreads);
|
||||
for (int i = 0; i < nThreads; i++) {
|
||||
es.submit(new Runnable() { public void run() {
|
||||
try {
|
||||
barrier.await();
|
||||
for (int i = 0; i < 10000; i++) {
|
||||
for (;;) {
|
||||
try { m.lock(); break; }
|
||||
catch (Throwable t) { checkThrowable(t); }
|
||||
}
|
||||
|
||||
try { check(! m.tryLock()); }
|
||||
final Runnable task = () -> {
|
||||
try {
|
||||
startingGate.await();
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
for (;;) {
|
||||
try { mutex.lock(); break; }
|
||||
catch (Throwable t) { checkThrowable(t); }
|
||||
|
||||
try { check(! m.tryLock(1, TimeUnit.MICROSECONDS)); }
|
||||
catch (Throwable t) { checkThrowable(t); }
|
||||
|
||||
m.unlock();
|
||||
}
|
||||
} catch (Throwable t) { unexpected(t); }}});}
|
||||
barrier.await();
|
||||
|
||||
try { check(! mutex.tryLock()); }
|
||||
catch (Throwable t) { checkThrowable(t); }
|
||||
|
||||
try { check(! mutex.tryLock(1, TimeUnit.MICROSECONDS)); }
|
||||
catch (Throwable t) { checkThrowable(t); }
|
||||
|
||||
mutex.unlock();
|
||||
}
|
||||
} catch (Throwable t) { unexpected(t); }
|
||||
};
|
||||
|
||||
for (int i = 0; i < nThreads; i++)
|
||||
es.submit(task);
|
||||
es.shutdown();
|
||||
check(es.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
|
||||
// Let test harness handle timeout
|
||||
check(es.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS));
|
||||
}
|
||||
|
||||
private static class FlakySync extends AbstractQueuedLongSynchronizer {
|
||||
@ -116,8 +104,12 @@ public class FlakyMutex implements Lock {
|
||||
do {} while (hasQueuedPredecessors() != hasQueuedThreads());
|
||||
}
|
||||
|
||||
maybeThrow();
|
||||
return compareAndSetState(0, 1);
|
||||
switch (ThreadLocalRandom.current().nextInt(10)) {
|
||||
case 0: throw new MyError();
|
||||
case 1: throw new MyRuntimeException();
|
||||
case 2: FlakyMutex.<RuntimeException>uncheckedThrow(new MyException());
|
||||
default: return compareAndSetState(0, 1);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean tryRelease(long releases) {
|
||||
|
@ -35,16 +35,10 @@
|
||||
* @test
|
||||
* @bug 8074773
|
||||
* @summary Stress test looks for lost unparks
|
||||
* @library /lib/testlibrary/
|
||||
* @modules java.management
|
||||
* @run main/timeout=1200 ParkLoops
|
||||
*/
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||
|
||||
import java.lang.management.ManagementFactory;
|
||||
import java.lang.management.ThreadInfo;
|
||||
import java.util.SplittableRandom;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@ -52,11 +46,8 @@ import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReferenceArray;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
import jdk.testlibrary.Utils;
|
||||
|
||||
public final class ParkLoops {
|
||||
static final long TEST_TIMEOUT_SECONDS = Utils.adjustTimeout(1000);
|
||||
static final long LONG_DELAY_MS = Utils.adjustTimeout(10_000);
|
||||
static final int THREADS = 4;
|
||||
static final int ITERS = 30_000;
|
||||
|
||||
@ -126,28 +117,13 @@ public final class ParkLoops {
|
||||
final AtomicReferenceArray<Thread> threads
|
||||
= new AtomicReferenceArray<>(THREADS);
|
||||
final CountDownLatch done = new CountDownLatch(THREADS);
|
||||
final Runnable parker = new Parker(threads, done, rnd.split());
|
||||
final Runnable unparker = new Unparker(threads, done, rnd.split());
|
||||
for (int i = 0; i < THREADS; i++) {
|
||||
pool.submit(parker);
|
||||
pool.submit(unparker);
|
||||
}
|
||||
try {
|
||||
if (!done.await(TEST_TIMEOUT_SECONDS, SECONDS)) {
|
||||
dumpAllStacks();
|
||||
throw new AssertionError("lost unpark");
|
||||
}
|
||||
} finally {
|
||||
pool.shutdown();
|
||||
pool.awaitTermination(LONG_DELAY_MS, MILLISECONDS);
|
||||
}
|
||||
}
|
||||
|
||||
static void dumpAllStacks() {
|
||||
ThreadInfo[] threadInfos =
|
||||
ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
|
||||
for (ThreadInfo threadInfo : threadInfos) {
|
||||
System.err.print(threadInfo);
|
||||
pool.submit(new Parker(threads, done, rnd.split()));
|
||||
pool.submit(new Unparker(threads, done, rnd.split()));
|
||||
}
|
||||
// Let test harness handle timeout
|
||||
done.await();
|
||||
pool.shutdown();
|
||||
pool.awaitTermination(Long.MAX_VALUE, SECONDS);
|
||||
}
|
||||
}
|
||||
|
@ -3322,7 +3322,7 @@ public class CompletableFutureTest extends JSR166TestCase {
|
||||
() -> f.obtrudeException(null),
|
||||
|
||||
() -> CompletableFuture.delayedExecutor(1L, SECONDS, null),
|
||||
() -> CompletableFuture.delayedExecutor(1L, null, new ThreadExecutor()),
|
||||
() -> CompletableFuture.delayedExecutor(1L, null, exec),
|
||||
() -> CompletableFuture.delayedExecutor(1L, null),
|
||||
|
||||
() -> f.orTimeout(1L, null),
|
||||
@ -3552,7 +3552,7 @@ public class CompletableFutureTest extends JSR166TestCase {
|
||||
long timeoutMillis = timeoutMillis();
|
||||
CompletableFuture<Integer> f = new CompletableFuture<>();
|
||||
long startTime = System.nanoTime();
|
||||
f.orTimeout(timeoutMillis, MILLISECONDS);
|
||||
assertSame(f, f.orTimeout(timeoutMillis, MILLISECONDS));
|
||||
checkCompletedWithTimeoutException(f);
|
||||
assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
|
||||
}
|
||||
@ -3567,8 +3567,8 @@ public class CompletableFutureTest extends JSR166TestCase {
|
||||
CompletableFuture<Integer> g = new CompletableFuture<>();
|
||||
long startTime = System.nanoTime();
|
||||
f.complete(v1);
|
||||
f.orTimeout(LONG_DELAY_MS, MILLISECONDS);
|
||||
g.orTimeout(LONG_DELAY_MS, MILLISECONDS);
|
||||
assertSame(f, f.orTimeout(LONG_DELAY_MS, MILLISECONDS));
|
||||
assertSame(g, g.orTimeout(LONG_DELAY_MS, MILLISECONDS));
|
||||
g.complete(v1);
|
||||
checkCompletedNormally(f, v1);
|
||||
checkCompletedNormally(g, v1);
|
||||
@ -3583,11 +3583,14 @@ public class CompletableFutureTest extends JSR166TestCase {
|
||||
() -> testCompleteOnTimeout_timesOut(null));
|
||||
}
|
||||
|
||||
/**
|
||||
* completeOnTimeout completes with given value if not complete
|
||||
*/
|
||||
public void testCompleteOnTimeout_timesOut(Integer v) {
|
||||
long timeoutMillis = timeoutMillis();
|
||||
CompletableFuture<Integer> f = new CompletableFuture<>();
|
||||
long startTime = System.nanoTime();
|
||||
f.completeOnTimeout(v, timeoutMillis, MILLISECONDS);
|
||||
assertSame(f, f.completeOnTimeout(v, timeoutMillis, MILLISECONDS));
|
||||
assertSame(v, f.join());
|
||||
assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
|
||||
f.complete(99); // should have no effect
|
||||
@ -3604,8 +3607,8 @@ public class CompletableFutureTest extends JSR166TestCase {
|
||||
CompletableFuture<Integer> g = new CompletableFuture<>();
|
||||
long startTime = System.nanoTime();
|
||||
f.complete(v1);
|
||||
f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS);
|
||||
g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS);
|
||||
assertSame(f, f.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
|
||||
assertSame(g, g.completeOnTimeout(-1, LONG_DELAY_MS, MILLISECONDS));
|
||||
g.complete(v1);
|
||||
checkCompletedNormally(f, v1);
|
||||
checkCompletedNormally(g, v1);
|
||||
|
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is available under and governed by the GNU General Public
|
||||
* License version 2 only, as published by the Free Software Foundation.
|
||||
* However, the following notice accompanied the original version of this
|
||||
* file:
|
||||
*
|
||||
* Written by Doug Lea and Martin Buchholz with assistance from
|
||||
* members of JCP JSR-166 Expert Group and released to the public
|
||||
* domain, as explained at
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CompletionService;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ExecutorCompletionService;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
public class ExecutorCompletionService9Test extends JSR166TestCase {
|
||||
public static void main(String[] args) {
|
||||
main(suite(), args);
|
||||
}
|
||||
public static Test suite() {
|
||||
return new TestSuite(ExecutorCompletionService9Test.class);
|
||||
}
|
||||
|
||||
void solveAll(Executor e,
|
||||
Collection<Callable<Integer>> solvers)
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService<Integer> cs
|
||||
= new ExecutorCompletionService<>(e);
|
||||
solvers.forEach(cs::submit);
|
||||
for (int i = solvers.size(); i > 0; i--) {
|
||||
Integer r = cs.take().get();
|
||||
if (r != null)
|
||||
use(r);
|
||||
}
|
||||
}
|
||||
|
||||
void solveAny(Executor e,
|
||||
Collection<Callable<Integer>> solvers)
|
||||
throws InterruptedException {
|
||||
CompletionService<Integer> cs
|
||||
= new ExecutorCompletionService<>(e);
|
||||
int n = solvers.size();
|
||||
List<Future<Integer>> futures = new ArrayList<>(n);
|
||||
Integer result = null;
|
||||
try {
|
||||
solvers.forEach((solver) -> futures.add(cs.submit(solver)));
|
||||
for (int i = n; i > 0; i--) {
|
||||
try {
|
||||
Integer r = cs.take().get();
|
||||
if (r != null) {
|
||||
result = r;
|
||||
break;
|
||||
}
|
||||
} catch (ExecutionException ignore) {}
|
||||
}
|
||||
} finally {
|
||||
futures.forEach((future) -> future.cancel(true));
|
||||
}
|
||||
|
||||
if (result != null)
|
||||
use(result);
|
||||
}
|
||||
|
||||
HashSet<Integer> results;
|
||||
|
||||
void use(Integer x) {
|
||||
if (results == null) results = new HashSet<Integer>();
|
||||
results.add(x);
|
||||
}
|
||||
|
||||
/**
|
||||
* The first "solvers" sample code in the class javadoc works.
|
||||
*/
|
||||
public void testSolveAll()
|
||||
throws InterruptedException, ExecutionException {
|
||||
Set<Callable<Integer>> solvers = Set.of(
|
||||
() -> null,
|
||||
() -> 1,
|
||||
() -> 2,
|
||||
() -> 3,
|
||||
() -> null);
|
||||
solveAll(cachedThreadPool, solvers);
|
||||
assertEquals(Set.of(1, 2, 3), results);
|
||||
}
|
||||
|
||||
/**
|
||||
* The second "solvers" sample code in the class javadoc works.
|
||||
*/
|
||||
public void testSolveAny()
|
||||
throws InterruptedException {
|
||||
Set<Callable<Integer>> solvers = Set.of(
|
||||
() -> { throw new ArithmeticException(); },
|
||||
() -> null,
|
||||
() -> 1,
|
||||
() -> 2);
|
||||
solveAny(cachedThreadPool, solvers);
|
||||
assertEquals(1, results.size());
|
||||
Integer elt = results.iterator().next();
|
||||
assertTrue(elt.equals(1) || elt.equals(2));
|
||||
}
|
||||
|
||||
}
|
@ -37,8 +37,11 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CompletionService;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.ExecutorCompletionService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.FutureTask;
|
||||
@ -59,7 +62,7 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creating a new ECS with null Executor throw NPE
|
||||
* new ExecutorCompletionService(null) throws NullPointerException
|
||||
*/
|
||||
public void testConstructorNPE() {
|
||||
try {
|
||||
@ -69,111 +72,147 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creating a new ECS with null queue throw NPE
|
||||
* new ExecutorCompletionService(e, null) throws NullPointerException
|
||||
*/
|
||||
public void testConstructorNPE2() {
|
||||
try {
|
||||
ExecutorService e = Executors.newCachedThreadPool();
|
||||
new ExecutorCompletionService(e, null);
|
||||
new ExecutorCompletionService(cachedThreadPool, null);
|
||||
shouldThrow();
|
||||
} catch (NullPointerException success) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submitting a null callable throws NPE
|
||||
* ecs.submit(null) throws NullPointerException
|
||||
*/
|
||||
public void testSubmitNPE() {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
Callable c = null;
|
||||
try {
|
||||
ecs.submit(c);
|
||||
shouldThrow();
|
||||
} catch (NullPointerException success) {}
|
||||
}
|
||||
public void testSubmitNullCallable() {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
try {
|
||||
cs.submit((Callable) null);
|
||||
shouldThrow();
|
||||
} catch (NullPointerException success) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submitting a null runnable throws NPE
|
||||
* ecs.submit(null, val) throws NullPointerException
|
||||
*/
|
||||
public void testSubmitNPE2() {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
Runnable r = null;
|
||||
try {
|
||||
ecs.submit(r, Boolean.TRUE);
|
||||
shouldThrow();
|
||||
} catch (NullPointerException success) {}
|
||||
}
|
||||
public void testSubmitNullRunnable() {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
try {
|
||||
cs.submit((Runnable) null, Boolean.TRUE);
|
||||
shouldThrow();
|
||||
} catch (NullPointerException success) {}
|
||||
}
|
||||
|
||||
/**
|
||||
* A taken submitted task is completed
|
||||
*/
|
||||
public void testTake() throws InterruptedException {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
Callable c = new StringTask();
|
||||
ecs.submit(c);
|
||||
Future f = ecs.take();
|
||||
assertTrue(f.isDone());
|
||||
}
|
||||
public void testTake()
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
cs.submit(new StringTask());
|
||||
Future f = cs.take();
|
||||
assertTrue(f.isDone());
|
||||
assertSame(TEST_STRING, f.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* Take returns the same future object returned by submit
|
||||
*/
|
||||
public void testTake2() throws InterruptedException {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
Callable c = new StringTask();
|
||||
Future f1 = ecs.submit(c);
|
||||
Future f2 = ecs.take();
|
||||
assertSame(f1, f2);
|
||||
}
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
Future f1 = cs.submit(new StringTask());
|
||||
Future f2 = cs.take();
|
||||
assertSame(f1, f2);
|
||||
}
|
||||
|
||||
/**
|
||||
* If poll returns non-null, the returned task is completed
|
||||
* poll returns non-null when the returned task is completed
|
||||
*/
|
||||
public void testPoll1() throws Exception {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
assertNull(ecs.poll());
|
||||
Callable c = new StringTask();
|
||||
ecs.submit(c);
|
||||
public void testPoll1()
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
assertNull(cs.poll());
|
||||
cs.submit(new StringTask());
|
||||
|
||||
long startTime = System.nanoTime();
|
||||
Future f;
|
||||
while ((f = ecs.poll()) == null) {
|
||||
if (millisElapsedSince(startTime) > LONG_DELAY_MS)
|
||||
fail("timed out");
|
||||
Thread.yield();
|
||||
long startTime = System.nanoTime();
|
||||
Future f;
|
||||
while ((f = cs.poll()) == null) {
|
||||
if (millisElapsedSince(startTime) > LONG_DELAY_MS)
|
||||
fail("timed out");
|
||||
Thread.yield();
|
||||
}
|
||||
assertTrue(f.isDone());
|
||||
assertSame(TEST_STRING, f.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* timed poll returns non-null when the returned task is completed
|
||||
*/
|
||||
public void testPoll2()
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
assertNull(cs.poll());
|
||||
cs.submit(new StringTask());
|
||||
|
||||
long startTime = System.nanoTime();
|
||||
Future f;
|
||||
while ((f = cs.poll(SHORT_DELAY_MS, MILLISECONDS)) == null) {
|
||||
if (millisElapsedSince(startTime) > LONG_DELAY_MS)
|
||||
fail("timed out");
|
||||
Thread.yield();
|
||||
}
|
||||
assertTrue(f.isDone());
|
||||
assertSame(TEST_STRING, f.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* poll returns null before the returned task is completed
|
||||
*/
|
||||
public void testPollReturnsNull()
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
final CountDownLatch proceed = new CountDownLatch(1);
|
||||
cs.submit(new Callable() { public String call() throws Exception {
|
||||
proceed.await();
|
||||
return TEST_STRING;
|
||||
}});
|
||||
assertNull(cs.poll());
|
||||
assertNull(cs.poll(0L, MILLISECONDS));
|
||||
assertNull(cs.poll(Long.MIN_VALUE, MILLISECONDS));
|
||||
long startTime = System.nanoTime();
|
||||
assertNull(cs.poll(timeoutMillis(), MILLISECONDS));
|
||||
assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
|
||||
proceed.countDown();
|
||||
assertSame(TEST_STRING, cs.take().get());
|
||||
}
|
||||
|
||||
/**
|
||||
* successful and failed tasks are both returned
|
||||
*/
|
||||
public void testTaskAssortment()
|
||||
throws InterruptedException, ExecutionException {
|
||||
CompletionService cs = new ExecutorCompletionService(cachedThreadPool);
|
||||
ArithmeticException ex = new ArithmeticException();
|
||||
for (int i = 0; i < 2; i++) {
|
||||
cs.submit(new StringTask());
|
||||
cs.submit(callableThrowing(ex));
|
||||
cs.submit(runnableThrowing(ex), null);
|
||||
}
|
||||
int normalCompletions = 0;
|
||||
int exceptionalCompletions = 0;
|
||||
for (int i = 0; i < 3 * 2; i++) {
|
||||
try {
|
||||
if (cs.take().get() == TEST_STRING)
|
||||
normalCompletions++;
|
||||
}
|
||||
catch (ExecutionException expected) {
|
||||
assertTrue(expected.getCause() instanceof ArithmeticException);
|
||||
exceptionalCompletions++;
|
||||
}
|
||||
assertTrue(f.isDone());
|
||||
assertSame(TEST_STRING, f.get());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If timed poll returns non-null, the returned task is completed
|
||||
*/
|
||||
public void testPoll2() throws InterruptedException {
|
||||
final ExecutorService e = Executors.newCachedThreadPool();
|
||||
final ExecutorCompletionService ecs = new ExecutorCompletionService(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
assertNull(ecs.poll());
|
||||
Callable c = new StringTask();
|
||||
ecs.submit(c);
|
||||
Future f = ecs.poll(SHORT_DELAY_MS, MILLISECONDS);
|
||||
if (f != null)
|
||||
assertTrue(f.isDone());
|
||||
}
|
||||
assertEquals(2 * 1, normalCompletions);
|
||||
assertEquals(2 * 2, exceptionalCompletions);
|
||||
assertNull(cs.poll());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -184,7 +223,7 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
final AtomicBoolean done = new AtomicBoolean(false);
|
||||
class MyCallableFuture<V> extends FutureTask<V> {
|
||||
MyCallableFuture(Callable<V> c) { super(c); }
|
||||
protected void done() { done.set(true); }
|
||||
@Override protected void done() { done.set(true); }
|
||||
}
|
||||
final ExecutorService e =
|
||||
new ThreadPoolExecutor(1, 1,
|
||||
@ -193,15 +232,14 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
protected <T> RunnableFuture<T> newTaskFor(Callable<T> c) {
|
||||
return new MyCallableFuture<T>(c);
|
||||
}};
|
||||
ExecutorCompletionService<String> ecs =
|
||||
new ExecutorCompletionService<String>(e);
|
||||
CompletionService<String> cs = new ExecutorCompletionService<>(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
assertNull(ecs.poll());
|
||||
assertNull(cs.poll());
|
||||
Callable<String> c = new StringTask();
|
||||
Future f1 = ecs.submit(c);
|
||||
Future f1 = cs.submit(c);
|
||||
assertTrue("submit must return MyCallableFuture",
|
||||
f1 instanceof MyCallableFuture);
|
||||
Future f2 = ecs.take();
|
||||
Future f2 = cs.take();
|
||||
assertSame("submit and take must return same objects", f1, f2);
|
||||
assertTrue("completed task must have set done", done.get());
|
||||
}
|
||||
@ -215,7 +253,7 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
final AtomicBoolean done = new AtomicBoolean(false);
|
||||
class MyRunnableFuture<V> extends FutureTask<V> {
|
||||
MyRunnableFuture(Runnable t, V r) { super(t, r); }
|
||||
protected void done() { done.set(true); }
|
||||
@Override protected void done() { done.set(true); }
|
||||
}
|
||||
final ExecutorService e =
|
||||
new ThreadPoolExecutor(1, 1,
|
||||
@ -224,15 +262,14 @@ public class ExecutorCompletionServiceTest extends JSR166TestCase {
|
||||
protected <T> RunnableFuture<T> newTaskFor(Runnable t, T r) {
|
||||
return new MyRunnableFuture<T>(t, r);
|
||||
}};
|
||||
final ExecutorCompletionService<String> ecs =
|
||||
new ExecutorCompletionService<String>(e);
|
||||
CompletionService<String> cs = new ExecutorCompletionService<>(e);
|
||||
try (PoolCleaner cleaner = cleaner(e)) {
|
||||
assertNull(ecs.poll());
|
||||
assertNull(cs.poll());
|
||||
Runnable r = new NoOpRunnable();
|
||||
Future f1 = ecs.submit(r, null);
|
||||
Future f1 = cs.submit(r, null);
|
||||
assertTrue("submit must return MyRunnableFuture",
|
||||
f1 instanceof MyRunnableFuture);
|
||||
Future f2 = ecs.take();
|
||||
Future f2 = cs.take();
|
||||
assertSame("submit and take must return same objects", f1, f2);
|
||||
assertTrue("completed task must have set done", done.get());
|
||||
}
|
||||
|
@ -39,6 +39,7 @@
|
||||
* @modules java.management
|
||||
* @build *
|
||||
* @run junit/othervm/timeout=1000 -Djsr166.testImplementationDetails=true JSR166TestCase
|
||||
* @run junit/othervm/timeout=1000 -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 -Djsr166.testImplementationDetails=true JSR166TestCase
|
||||
*/
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
@ -85,6 +86,7 @@ import java.util.concurrent.RecursiveAction;
|
||||
import java.util.concurrent.RecursiveTask;
|
||||
import java.util.concurrent.RejectedExecutionHandler;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.SynchronousQueue;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
@ -546,7 +548,7 @@ public class JSR166TestCase extends TestCase {
|
||||
// Java9+ test classes
|
||||
if (atLeastJava9()) {
|
||||
String[] java9TestClassNames = {
|
||||
// Currently empty, but expecting varhandle tests
|
||||
"ExecutorCompletionService9Test",
|
||||
};
|
||||
addNamedTestClasses(suite, java9TestClassNames);
|
||||
}
|
||||
@ -1860,4 +1862,19 @@ public class JSR166TestCase extends TestCase {
|
||||
} catch (NoSuchElementException success) {}
|
||||
assertFalse(it.hasNext());
|
||||
}
|
||||
|
||||
public <T> Callable<T> callableThrowing(final Exception ex) {
|
||||
return new Callable<T>() { public T call() throws Exception { throw ex; }};
|
||||
}
|
||||
|
||||
public Runnable runnableThrowing(final RuntimeException ex) {
|
||||
return new Runnable() { public void run() { throw ex; }};
|
||||
}
|
||||
|
||||
/** A reusable thread pool to be shared by tests. */
|
||||
static final ExecutorService cachedThreadPool =
|
||||
new ThreadPoolExecutor(0, Integer.MAX_VALUE,
|
||||
1000L, MILLISECONDS,
|
||||
new SynchronousQueue<Runnable>());
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,24 +25,35 @@
|
||||
* @test
|
||||
* @bug 8032808 8044773
|
||||
* @modules jdk.net
|
||||
* @library /lib/testlibrary
|
||||
* @build jdk.testlibrary.*
|
||||
* @run main/othervm -Xcheck:jni Test success
|
||||
* @run main/othervm/policy=policy.fail -Xcheck:jni Test fail
|
||||
* @run main/othervm/policy=policy.success -Xcheck:jni Test success
|
||||
*/
|
||||
|
||||
import java.net.*;
|
||||
import jdk.net.ExtendedSocketOptions;
|
||||
import jdk.net.SocketFlow;
|
||||
import jdk.net.Sockets;
|
||||
import jdk.testlibrary.OSInfo;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.channels.*;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.Set;
|
||||
import jdk.net.*;
|
||||
import java.net.*;
|
||||
import java.nio.channels.AsynchronousSocketChannel;
|
||||
import java.nio.channels.DatagramChannel;
|
||||
import java.nio.channels.SocketChannel;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
import static java.lang.System.out;
|
||||
import static jdk.net.ExtendedSocketOptions.SO_FLOW_SLA;
|
||||
|
||||
public class Test {
|
||||
|
||||
interface Runner { void run() throws Exception; }
|
||||
|
||||
static boolean expectSuccess;
|
||||
private static final boolean expectSupport = checkExpectedOptionSupport();
|
||||
private static final double solarisVersionToCheck = 11.2;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
@ -54,9 +65,8 @@ public class Test {
|
||||
expectSuccess = args[0].equals("success");
|
||||
|
||||
// Main thing is to check for JNI problems
|
||||
// Doesn't matter if current system does not support the option
|
||||
// and currently setting the option with the loopback interface
|
||||
// doesn't work either
|
||||
// Doesn't matter if currently setting the option with the loopback
|
||||
// interface doesn't work
|
||||
|
||||
boolean sm = System.getSecurityManager() != null;
|
||||
out.println("Security Manager enabled: " + sm);
|
||||
@ -75,56 +85,70 @@ public class Test {
|
||||
|
||||
final int udp_port = dg.getLocalPort();
|
||||
|
||||
// If option not available, end test
|
||||
Set<SocketOption<?>> options = dg.supportedOptions();
|
||||
if (!options.contains(ExtendedSocketOptions.SO_FLOW_SLA)) {
|
||||
System.out.println("SO_FLOW_SLA not supported");
|
||||
return;
|
||||
}
|
||||
|
||||
final Socket s = new Socket("127.0.0.1", tcp_port);
|
||||
final SocketChannel sc = SocketChannel.open();
|
||||
sc.connect(new InetSocketAddress("127.0.0.1", tcp_port));
|
||||
|
||||
doTest("Sockets.setOption Socket", () -> {
|
||||
out.println(flowIn);
|
||||
Sockets.setOption(s, ExtendedSocketOptions.SO_FLOW_SLA, flowIn);
|
||||
if (s.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
Sockets.setOption(s, SO_FLOW_SLA, flowIn);
|
||||
out.println(flowIn);
|
||||
});
|
||||
doTest("Sockets.getOption Socket",() -> {
|
||||
Sockets.getOption(s, ExtendedSocketOptions.SO_FLOW_SLA);
|
||||
|
||||
doTest("Sockets.getOption Socket", () -> {
|
||||
Sockets.getOption(s, SO_FLOW_SLA);
|
||||
out.println(flowIn);
|
||||
});
|
||||
doTest("Sockets.setOption SocketChannel",() ->
|
||||
sc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn)
|
||||
|
||||
doTest("Sockets.setOption SocketChannel", () -> {
|
||||
if (sc.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
sc.setOption(SO_FLOW_SLA, flowIn);
|
||||
});
|
||||
doTest("Sockets.getOption SocketChannel", () ->
|
||||
sc.getOption(SO_FLOW_SLA)
|
||||
);
|
||||
doTest("Sockets.getOption SocketChannel",() ->
|
||||
sc.getOption(ExtendedSocketOptions.SO_FLOW_SLA)
|
||||
);
|
||||
doTest("Sockets.setOption DatagramSocket",() -> {
|
||||
doTest("Sockets.setOption DatagramSocket", () -> {
|
||||
try (DatagramSocket dg1 = new DatagramSocket(0)) {
|
||||
if (dg1.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
|
||||
dg1.connect(loop, udp_port);
|
||||
Sockets.setOption(dg1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn);
|
||||
Sockets.setOption(dg1, SO_FLOW_SLA, flowIn);
|
||||
}
|
||||
});
|
||||
doTest("Sockets.setOption DatagramSocket 2", () -> {
|
||||
try (DatagramChannel dg2 = DatagramChannel.open()) {
|
||||
if (dg2.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
dg2.bind(new InetSocketAddress(loop, 0));
|
||||
dg2.connect(new InetSocketAddress(loop, udp_port));
|
||||
dg2.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn);
|
||||
dg2.setOption(SO_FLOW_SLA, flowIn);
|
||||
}
|
||||
});
|
||||
doTest("Sockets.setOption MulticastSocket", () -> {
|
||||
try (MulticastSocket mc1 = new MulticastSocket(0)) {
|
||||
if (mc1.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
mc1.connect(loop, udp_port);
|
||||
Sockets.setOption(mc1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn);
|
||||
Sockets.setOption(mc1, SO_FLOW_SLA, flowIn);
|
||||
}
|
||||
});
|
||||
doTest("Sockets.setOption AsynchronousSocketChannel", () -> {
|
||||
try (AsynchronousSocketChannel asc = AsynchronousSocketChannel.open()) {
|
||||
if (asc.supportedOptions().contains(SO_FLOW_SLA) != expectSupport) {
|
||||
throw new RuntimeException("Unexpected supportedOptions()");
|
||||
}
|
||||
Future<Void> f = asc.connect(loopad);
|
||||
f.get();
|
||||
asc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn);
|
||||
asc.setOption(SO_FLOW_SLA, flowIn);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -144,14 +168,43 @@ public class Test {
|
||||
throw new RuntimeException("Unexpected SecurityException", e);
|
||||
} else {
|
||||
out.println("Caught expected: " + e);
|
||||
return;
|
||||
}
|
||||
} catch (UnsupportedOperationException e) {
|
||||
System.out.println(e);
|
||||
if (expectSupport) {
|
||||
throw new RuntimeException("Test failed: " +
|
||||
"unexpected UnsupportedOperationException");
|
||||
}
|
||||
out.println("UnsupportedOperationException as expected");
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
// Probably a permission error, but we're not
|
||||
// going to check unless a specific permission exception
|
||||
// is defined.
|
||||
System.out.println(e);
|
||||
}
|
||||
if (!expectSupport) {
|
||||
throw new RuntimeException("Test failed: " +
|
||||
"UnsupportedOperationException was not thrown");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean checkExpectedOptionSupport() {
|
||||
if (OSInfo.getOSType().equals(OSInfo.OSType.SOLARIS)) {
|
||||
double solarisVersion = OSInfo.getSolarisVersion();
|
||||
if (solarisVersion >= solarisVersionToCheck) {
|
||||
System.out.println("This Solaris version (" + solarisVersion
|
||||
+ ") should support SO_FLOW_SLA option");
|
||||
return true;
|
||||
} else {
|
||||
System.out.println("This Solaris version (" + solarisVersion
|
||||
+ ") should not support SO_FLOW_SLA option");
|
||||
}
|
||||
} else {
|
||||
System.out.println("Not Solaris, SO_FLOW_SLA should not be " +
|
||||
"supported");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,4 +1,8 @@
|
||||
grant {
|
||||
permission java.util.PropertyPermission "os.name", "read";
|
||||
permission java.io.FilePermission "<<ALL FILES>>", "execute";
|
||||
permission java.util.PropertyPermission "line.separator", "read";
|
||||
permission java.io.FilePermission "/etc/release", "read";
|
||||
permission java.net.SocketPermission "127.0.0.1", "connect,accept" ;
|
||||
permission java.net.SocketPermission "localhost", "listen" ;
|
||||
};
|
||||
|
@ -1,4 +1,8 @@
|
||||
grant {
|
||||
permission java.util.PropertyPermission "os.name", "read";
|
||||
permission java.io.FilePermission "<<ALL FILES>>", "execute";
|
||||
permission java.util.PropertyPermission "line.separator", "read";
|
||||
permission java.io.FilePermission "/etc/release", "read";
|
||||
permission java.net.SocketPermission "127.0.0.1", "connect,accept" ;
|
||||
permission java.net.SocketPermission "localhost", "listen" ;
|
||||
permission jdk.net.NetworkPermission "setOption.SO_FLOW_SLA";
|
||||
|
@ -31,6 +31,7 @@ import java.nio.file.FileVisitResult;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.ProviderMismatchException;
|
||||
import java.nio.file.SimpleFileVisitor;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
@ -39,14 +40,15 @@ import java.net.URI;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
|
||||
/**
|
||||
* @test
|
||||
* @bug 8038500 8040059 8150366 8150496
|
||||
* @bug 8038500 8040059 8150366 8150496 8147539
|
||||
* @summary Basic test for zip provider
|
||||
*
|
||||
* @run main Basic
|
||||
* @run main/othervm/java.security.policy=test.policy Basic
|
||||
* @modules jdk.zipfs
|
||||
*/
|
||||
|
||||
public class Basic {
|
||||
@ -89,7 +91,7 @@ public class Basic {
|
||||
found = false;
|
||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(fs.getPath("/"))) {
|
||||
for (Path entry: stream) {
|
||||
found = entry.toString().equals("/META-INF/");
|
||||
found = entry.toString().equals("/META-INF");
|
||||
if (found) break;
|
||||
}
|
||||
}
|
||||
@ -117,6 +119,13 @@ public class Basic {
|
||||
if (!store.supportsFileAttributeView("basic"))
|
||||
throw new RuntimeException("BasicFileAttributeView should be supported");
|
||||
|
||||
// Test: watch register should throw PME
|
||||
try {
|
||||
fs.getPath("/")
|
||||
.register(FileSystems.getDefault().newWatchService(), ENTRY_CREATE);
|
||||
throw new RuntimeException("watch service is not supported");
|
||||
} catch (ProviderMismatchException x) { }
|
||||
|
||||
// Test: ClosedFileSystemException
|
||||
fs.close();
|
||||
if (fs.isOpen())
|
||||
|
@ -28,6 +28,7 @@
|
||||
* @library /lib/testlibrary/java/util/jar
|
||||
* @build Compiler JarBuilder CreateMultiReleaseTestJars
|
||||
* @run testng MultiReleaseJarTest
|
||||
* @modules jdk.zipfs
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -31,11 +31,12 @@ import java.nio.file.Path;
|
||||
/**
|
||||
*
|
||||
* @test
|
||||
* @bug 8038500 8040059
|
||||
* @bug 8038500 8040059 8139956 8146754
|
||||
* @summary Tests path operations for zip provider.
|
||||
*
|
||||
* @run main PathOps
|
||||
* @run main/othervm/java.security.policy=test.policy PathOps
|
||||
* @modules jdk.zipfs
|
||||
*/
|
||||
|
||||
public class PathOps {
|
||||
@ -424,6 +425,11 @@ public class PathOps {
|
||||
test("/")
|
||||
.relativize("/a", "a")
|
||||
.relativize("/a/c", "a/c");
|
||||
// 8146754
|
||||
test("/tmp/path")
|
||||
.relativize("/tmp/path/a.txt", "a.txt");
|
||||
test("/tmp/path/")
|
||||
.relativize("/tmp/path/a.txt", "a.txt");
|
||||
|
||||
// normalize
|
||||
test("/")
|
||||
@ -486,7 +492,16 @@ public class PathOps {
|
||||
// isSameFile
|
||||
test("/fileDoesNotExist")
|
||||
.isSameFile("/fileDoesNotExist");
|
||||
}
|
||||
|
||||
// 8139956
|
||||
out.println("check getNameCount");
|
||||
int nc = fs.getPath("/").relativize(fs.getPath("/")).getNameCount();
|
||||
if (nc != 1) {
|
||||
out.format("\tExpected: 1\n");
|
||||
out.format("\tActual: %d\n", nc);
|
||||
throw new RuntimeException("getNameCount of empty path failed");
|
||||
}
|
||||
}
|
||||
|
||||
static void npes() {
|
||||
header("NullPointerException");
|
||||
|
@ -22,11 +22,12 @@
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 7156873 8040059 8028480 8034773
|
||||
* @bug 7156873 8040059 8028480 8034773 8153248
|
||||
* @summary ZipFileSystem regression tests
|
||||
*
|
||||
* @run main ZFSTests
|
||||
* @run main/othervm/java.security.policy=test.policy ZFSTests
|
||||
* @modules jdk.zipfs
|
||||
*/
|
||||
|
||||
|
||||
@ -42,7 +43,7 @@ public class ZFSTests {
|
||||
|
||||
public static void main(String[] args) throws Throwable {
|
||||
test7156873();
|
||||
testOpenOptions();
|
||||
tests();
|
||||
}
|
||||
|
||||
static void test7156873() throws Throwable {
|
||||
@ -61,7 +62,7 @@ public class ZFSTests {
|
||||
}
|
||||
}
|
||||
|
||||
static void testOpenOptions() throws Throwable {
|
||||
static void tests() throws Throwable {
|
||||
Path path = Paths.get("file.zip");
|
||||
try {
|
||||
URI uri = URI.create("jar:" + path.toUri());
|
||||
@ -95,6 +96,18 @@ public class ZFSTests {
|
||||
} catch (IllegalArgumentException x) {
|
||||
// expected x.printStackTrace();
|
||||
}
|
||||
|
||||
//8153248
|
||||
Path dir = fs.getPath("/dir");
|
||||
Path subdir = fs.getPath("/dir/subdir");
|
||||
Files.createDirectory(dir);
|
||||
Files.createDirectory(subdir);
|
||||
Files.list(dir)
|
||||
.forEach( child -> {
|
||||
System.out.println("child:" + child);
|
||||
if (child.toString().endsWith("/"))
|
||||
throw new RuntimeException("subdir names ends with /");
|
||||
});
|
||||
}
|
||||
} finally {
|
||||
Files.deleteIfExists(path);
|
||||
|
@ -74,6 +74,7 @@ import static java.nio.file.StandardCopyOption.*;
|
||||
* @summary Test Zip filesystem provider
|
||||
* @run main ZipFSTester
|
||||
* @run main/othervm/java.security.policy=test.policy ZipFSTester
|
||||
* @modules jdk.zipfs
|
||||
*/
|
||||
|
||||
public class ZipFSTester {
|
||||
|
@ -28,6 +28,9 @@ package jdk.testlibrary;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import static jdk.testlibrary.OSInfo.OSType.*;
|
||||
|
||||
@ -147,6 +150,28 @@ public class OSInfo {
|
||||
}
|
||||
}
|
||||
|
||||
public static double getSolarisVersion() {
|
||||
try {
|
||||
OutputAnalyzer output = ProcessTools.executeProcess("uname", "-v");
|
||||
System.out.println("'uname -v' finished with code "
|
||||
+ output.getExitValue());
|
||||
return Double.parseDouble(output.getOutput());
|
||||
} catch (Exception e) {
|
||||
System.out.println("First attempt failed with: " + e.getMessage());
|
||||
}
|
||||
|
||||
//Try to get Solaris version from /etc/release
|
||||
try (BufferedReader in =
|
||||
new BufferedReader(new FileReader("/etc/release"))) {
|
||||
String line = in.readLine().trim().split(" ")[2];
|
||||
return Double.parseDouble(line);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Second attempt failed with: " + e.getMessage());
|
||||
}
|
||||
|
||||
throw new RuntimeException("Unable to get Solaris version");
|
||||
}
|
||||
|
||||
public static class WindowsVersion implements Comparable<WindowsVersion> {
|
||||
private final int major;
|
||||
|
||||
|
@ -423,7 +423,7 @@ public final class ProcessTools {
|
||||
* @param cmds The command line to execute.
|
||||
* @return The output from the process.
|
||||
*/
|
||||
public static OutputAnalyzer executeProcess(String... cmds) throws Throwable {
|
||||
public static OutputAnalyzer executeProcess(String... cmds) throws Exception {
|
||||
return executeProcess(new ProcessBuilder(cmds));
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
|
||||
# @test
|
||||
# @bug 4763315
|
||||
# @modules java.naming
|
||||
# @build CanonicalName Lookup
|
||||
# @run shell/timeout=120 cname.sh
|
||||
# @summary Test DNS provider's handling of CNAME records
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 4333920
|
||||
* @modules jdk.httpserver
|
||||
* @run main ChunkedEncodingTest
|
||||
* @summary ChunkedEncodingTest unit test
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
* @bug 4333920 4994372
|
||||
* @summary ChunkedEncoding unit test; MeteredStream/ProgressData problem
|
||||
* @modules java.base/sun.net
|
||||
* jdk.httpserver
|
||||
* @run main ChunkedEncodingWithProgressMonitorTest
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6446990
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm TestAvailable
|
||||
* @summary HttpURLConnection#available() reads more and more data into memory
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 5026745 6631048
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm/timeout=500 Test
|
||||
* @summary Cannot flush output stream when writing to an HttpUrlConnection
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -30,6 +30,7 @@ import java.util.concurrent.Executors;
|
||||
/*
|
||||
* @test
|
||||
* @bug 7025238
|
||||
* @modules jdk.httpserver
|
||||
* @summary HttpURLConnection does not handle URLs with an empty path component
|
||||
*/
|
||||
public class B7025238 {
|
||||
|
@ -41,6 +41,7 @@ import java.util.List;
|
||||
* @summary Tests for HTTP Digest auth
|
||||
* The impl maintains a cache for auth info,
|
||||
* the testcases run in a separate JVM to avoid cache hits
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm DigestAuth good
|
||||
* @run main/othervm DigestAuth only_nonce
|
||||
* @run main/othervm DigestAuth sha1
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -40,6 +40,7 @@ import sun.net.www.protocol.http.ntlm.NTLMAuthenticationCallback;
|
||||
* @test
|
||||
* @bug 8137174
|
||||
* @modules java.base/sun.net.www.protocol.http.ntlm
|
||||
* jdk.httpserver
|
||||
* @summary Checks if NTLM auth works fine if security manager set
|
||||
* @run main/othervm/java.security.policy=NTLMAuthWithSM.policy NTLMAuthWithSM
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -30,6 +30,7 @@ import java.net.*;
|
||||
/*
|
||||
* @test
|
||||
* @bug 7157360
|
||||
* @modules jdk.httpserver
|
||||
* @summary HttpURLConnection: HTTP method DELETE doesn't support output
|
||||
*/
|
||||
public class PostOnDelete {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 6550798
|
||||
* @summary Using InputStream.skip with ResponseCache will cause partial data to be cached
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm test
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6358532
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm AsyncDisconnect
|
||||
* @summary HttpURLConnection.disconnect doesn't really do the job
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 5017051 6360774
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm B5017051
|
||||
* @summary Tests CR 5017051 & 6360774
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6299712 7150552
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm B6299712
|
||||
* @summary NullPointerException in sun.net.www.protocol.http.HttpURLConnection.followRedirect
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6369510
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm B6369510
|
||||
* @summary HttpURLConnection sets Content-Type to application/x-www-form-urlencoded
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6518816
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm B6518816
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6641309
|
||||
* @modules jdk.httpserver
|
||||
* @summary Wrong Cookie separator used in HttpURLConnection
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6660405
|
||||
* @modules jdk.httpserver
|
||||
* @summary HttpURLConnection returns the wrong InputStream
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 8012625
|
||||
* @modules jdk.httpserver
|
||||
* @run main B8012625
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 6947917
|
||||
* @modules jdk.httpserver
|
||||
* @summary Error in basic authentication when user name and password are long
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6488669 6595324 6993490
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm ChunkedErrorStream
|
||||
* @summary Chunked ErrorStream tests
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -23,6 +23,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 7095980 8007315
|
||||
* @modules jdk.httpserver
|
||||
* @summary Ensure HttpURLConnection (and supporting APIs) don't expose
|
||||
* HttpOnly cookies
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @bug 8011719
|
||||
* @modules jdk.httpserver
|
||||
* @summary Basic checks to verify behavior of returned input streams
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 7133367
|
||||
* @modules jdk.httpserver
|
||||
* @summary ResponseCache.put should not be called when setUseCaches(false)
|
||||
*/
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/**
|
||||
* @test
|
||||
* @library /lib/testlibrary/
|
||||
* @modules jdk.httpserver
|
||||
* @build jdk.testlibrary.SimpleSSLContext
|
||||
* @compile RedirectOnPost.java
|
||||
* @run main/othervm RedirectOnPost
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6472250
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm StreamingOutputStream
|
||||
* @summary HttpURLConnection.getOutputStream streaming mode bug when called multiple times
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6421122
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm UserAuth
|
||||
* @summary Authorization header removed for preemptive authentication by user code
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6439651
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm UserAuth
|
||||
* @summary Sending "Cookie" header with JRE 1.5.0_07 doesn't work anymore
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
* @bug 8027308
|
||||
* @key intermittent
|
||||
* @modules java.base/sun.net.www.protocol.http
|
||||
* jdk.httpserver
|
||||
* @summary verifies that HttpURLConnection does not send the zone id in the
|
||||
* 'Host' field of the header:
|
||||
* Host: [fe80::a00:27ff:aaaa:aaaa] instead of
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,6 +26,7 @@
|
||||
* @bug 6771432
|
||||
* @summary createSocket() - smpatch fails using 1.6.0_10 because of
|
||||
* "Unconnected sockets not implemented"
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm HttpsCreateSockTest
|
||||
*
|
||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,7 @@
|
||||
* @test
|
||||
* @bug 6614957
|
||||
* @summary HttpsURLConnection not using the set SSLSocketFactory for creating all its Sockets
|
||||
* @modules jdk.httpserver
|
||||
* @run main/othervm HttpsSocketFacTest
|
||||
*
|
||||
* SunJSSE does not support dynamic system properties, no way to re-use
|
||||
|
@ -26,6 +26,9 @@
|
||||
* @bug 8132734 8144062
|
||||
* @summary Test that URL connections to multi-release jars can be runtime versioned
|
||||
* @library /lib/testlibrary/java/util/jar
|
||||
* @modules java.compiler
|
||||
* jdk.httpserver
|
||||
* jdk.jartool
|
||||
* @build Compiler JarBuilder CreateMultiReleaseTestJars SimpleHttpServer
|
||||
* @run testng MultiReleaseJarURLConnection
|
||||
*/
|
||||
|
@ -43,6 +43,7 @@ import java.util.Random;
|
||||
/*
|
||||
* @test
|
||||
* @requires sun.arch.data.model == "64"
|
||||
* @modules java.management
|
||||
* @build TestMaxCachedBufferSize
|
||||
* @run main/othervm TestMaxCachedBufferSize
|
||||
* @run main/othervm -Djdk.nio.maxCachedBufferSize=0 TestMaxCachedBufferSize
|
||||
|
@ -33,6 +33,7 @@ import java.security.spec.DSAParameterSpec;
|
||||
import java.security.spec.InvalidParameterSpecException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/*
|
||||
* @test
|
||||
@ -41,26 +42,15 @@ import java.util.List;
|
||||
* @summary Verify that DSAGenParameterSpec can and can only be used to generate
|
||||
* DSA within some certain range of key sizes as described in the class
|
||||
* specification (L, N) as (1024, 160), (2048, 224), (2048, 256) and
|
||||
* (3072, 256) should be OK for DSAGenParameterSpec. But the real
|
||||
* implementation SUN doesn't support (3072, 256).
|
||||
* @run main TestDSAGenParameterSpec
|
||||
* (3072, 256) should be OK for DSAGenParameterSpec.
|
||||
* @run main TestDSAGenParameterSpec 2048,256,true 2048,224,true 1024,160,true 4096,256 3072,224 2048,160 1024,224 512,160
|
||||
* @run main TestDSAGenParameterSpec 3072,256,true
|
||||
*/
|
||||
public class TestDSAGenParameterSpec {
|
||||
|
||||
private static final String ALGORITHM_NAME = "DSA";
|
||||
private static final String PROVIDER_NAME = "SUN";
|
||||
|
||||
private static final List<DataTuple> DATA = Arrays.asList(
|
||||
new DataTuple(1024, 160, true, true),
|
||||
new DataTuple(2048, 224, true, true),
|
||||
new DataTuple(2048, 256, true, true),
|
||||
new DataTuple(3072, 256, true, false),
|
||||
new DataTuple(1024, 224),
|
||||
new DataTuple(2048, 160),
|
||||
new DataTuple(4096, 256),
|
||||
new DataTuple(512, 160),
|
||||
new DataTuple(3072, 224));
|
||||
|
||||
private static void testDSAGenParameterSpec(DataTuple dataTuple)
|
||||
throws NoSuchAlgorithmException, NoSuchProviderException,
|
||||
InvalidParameterSpecException, InvalidAlgorithmParameterException {
|
||||
@ -84,14 +74,7 @@ public class TestDSAGenParameterSpec {
|
||||
checkParam(param, genParamSpec);
|
||||
System.out.println("Test case passed");
|
||||
} catch (InvalidParameterException ipe) {
|
||||
// The DSAGenParameterSpec API support this, but the real
|
||||
// implementation in SUN doesn't
|
||||
if (!dataTuple.isSunProviderSupported) {
|
||||
System.out.println("Test case passed: expected "
|
||||
+ "InvalidParameterException is caught");
|
||||
} else {
|
||||
throw new RuntimeException("Test case failed.", ipe);
|
||||
}
|
||||
throw new RuntimeException("Test case failed.", ipe);
|
||||
}
|
||||
}
|
||||
|
||||
@ -127,11 +110,9 @@ public class TestDSAGenParameterSpec {
|
||||
throw new RuntimeException("Wrong seed length");
|
||||
}
|
||||
|
||||
// use the parameters to generate real DSA keys
|
||||
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM_NAME,
|
||||
PROVIDER_NAME);
|
||||
keyGen.initialize(spec);
|
||||
keyGen.generateKeyPair();
|
||||
}
|
||||
|
||||
private static DSAGenParameterSpec createGenParameterSpec(
|
||||
@ -158,10 +139,21 @@ public class TestDSAGenParameterSpec {
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (DataTuple dataTuple : DATA) {
|
||||
List<DataTuple> dataTuples = Arrays.stream(args)
|
||||
.map(arg -> arg.split(",")).map(params -> {
|
||||
int primePLen = Integer.valueOf(params[0]);
|
||||
int subprimeQLen = Integer.valueOf(params[1]);
|
||||
boolean isDSASpecSupported = false;
|
||||
if (params.length == 3) {
|
||||
isDSASpecSupported = Boolean.valueOf(params[2]);
|
||||
}
|
||||
return new DataTuple(primePLen, subprimeQLen,
|
||||
isDSASpecSupported);
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
for (DataTuple dataTuple : dataTuples) {
|
||||
testDSAGenParameterSpec(dataTuple);
|
||||
}
|
||||
System.out.println("All tests passed");
|
||||
}
|
||||
|
||||
private static class DataTuple {
|
||||
@ -169,18 +161,13 @@ public class TestDSAGenParameterSpec {
|
||||
private int primePLen;
|
||||
private int subprimeQLen;
|
||||
private boolean isDSASpecSupported;
|
||||
private boolean isSunProviderSupported;
|
||||
|
||||
private DataTuple(int primePLen, int subprimeQLen,
|
||||
boolean isDSASpecSupported, boolean isSunProviderSupported) {
|
||||
boolean isDSASpecSupported) {
|
||||
this.primePLen = primePLen;
|
||||
this.subprimeQLen = subprimeQLen;
|
||||
this.isDSASpecSupported = isDSASpecSupported;
|
||||
this.isSunProviderSupported = isSunProviderSupported;
|
||||
}
|
||||
|
||||
private DataTuple(int primePLen, int subprimeQLen) {
|
||||
this(primePLen, subprimeQLen, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,6 +25,19 @@
|
||||
* @test
|
||||
* @bug 8047771
|
||||
* @summary check permissions and principals from various modules
|
||||
* @modules java.desktop
|
||||
* java.logging
|
||||
* java.management
|
||||
* java.security.jgss
|
||||
* java.smartcardio
|
||||
* java.sql
|
||||
* java.xml
|
||||
* java.xml.bind
|
||||
* jdk.attach
|
||||
* jdk.jdi
|
||||
* jdk.net
|
||||
* jdk.security.auth
|
||||
* jdk.security.jgss
|
||||
* @compile -addmods java.xml.ws,java.smartcardio Modules.java
|
||||
* @run main/othervm/java.security.policy==modules.policy
|
||||
* -addmods java.xml.ws,java.smartcardio Modules
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -28,6 +28,7 @@
|
||||
* logger.
|
||||
*
|
||||
* @modules java.base/sun.util.logging
|
||||
* java.logging
|
||||
* @compile -XDignore.symbol.file SourceClassName.java
|
||||
* @run main/othervm SourceClassName
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user