6977952: Test: Sync missing tests from hs16.3 to hs17.x
Reviewed-by: wrockett
This commit is contained in:
parent
2929434832
commit
a3319eba8a
44
hotspot/test/compiler/6894807/IsInstanceTest.java
Normal file
44
hotspot/test/compiler/6894807/IsInstanceTest.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 6894807
|
||||
* @summary No ClassCastException for HashAttributeSet constructors if run with -Xcomp
|
||||
* @compile IsInstanceTest.java
|
||||
* @run shell Test6894807.sh
|
||||
*/
|
||||
|
||||
public class IsInstanceTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
BaseInterface baseInterfaceImpl = new BaseInterfaceImpl();
|
||||
for (int i = 0; i < 100000; i++) {
|
||||
if (isInstanceOf(baseInterfaceImpl, ExtendedInterface.class)) {
|
||||
System.out.println("Failed at index:" + i);
|
||||
System.out.println("Arch: "+System.getProperty("os.arch", "")+
|
||||
" OS: "+System.getProperty("os.name", "")+
|
||||
" OSV: "+System.getProperty("os.version", "")+
|
||||
" Cores: "+Runtime.getRuntime().availableProcessors()+
|
||||
" JVM: "+System.getProperty("java.version", "")+" "+System.getProperty("sun.arch.data.model", ""));
|
||||
break;
|
||||
}
|
||||
}
|
||||
System.out.println("Done!");
|
||||
}
|
||||
|
||||
public static boolean isInstanceOf(BaseInterface baseInterfaceImpl, Class... baseInterfaceClasses) {
|
||||
for (Class baseInterfaceClass : baseInterfaceClasses) {
|
||||
if (baseInterfaceClass.isInstance(baseInterfaceImpl)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private interface BaseInterface {
|
||||
}
|
||||
|
||||
private interface ExtendedInterface extends BaseInterface {
|
||||
}
|
||||
|
||||
private static class BaseInterfaceImpl implements BaseInterface {
|
||||
}
|
||||
}
|
68
hotspot/test/compiler/6894807/Test6894807.sh
Normal file
68
hotspot/test/compiler/6894807/Test6894807.sh
Normal file
@ -0,0 +1,68 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ "${TESTSRC}" = "" ]
|
||||
then TESTSRC=.
|
||||
fi
|
||||
|
||||
if [ "${TESTJAVA}" = "" ]
|
||||
then
|
||||
PARENT=`dirname \`which java\``
|
||||
TESTJAVA=`dirname ${PARENT}`
|
||||
echo "TESTJAVA not set, selecting " ${TESTJAVA}
|
||||
echo "If this is incorrect, try setting the variable manually."
|
||||
fi
|
||||
|
||||
if [ "${TESTCLASSES}" = "" ]
|
||||
then
|
||||
echo "TESTCLASSES not set. Test cannot execute. Failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BIT_FLAG=""
|
||||
|
||||
# set platform-dependent variables
|
||||
OS=`uname -s`
|
||||
case "$OS" in
|
||||
SunOS | Linux )
|
||||
NULL=/dev/null
|
||||
PS=":"
|
||||
FS="/"
|
||||
## for solaris, linux it's HOME
|
||||
FILE_LOCATION=$HOME
|
||||
if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
|
||||
then
|
||||
BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT | grep -v '^#'`
|
||||
fi
|
||||
;;
|
||||
Windows_* )
|
||||
NULL=NUL
|
||||
PS=";"
|
||||
FS="\\"
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
;;
|
||||
esac
|
||||
|
||||
JEMMYPATH=${CPAPPEND}
|
||||
CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
|
||||
|
||||
THIS_DIR=`pwd`
|
||||
|
||||
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -version
|
||||
|
||||
${TESTJAVA}${FS}bin${FS}java ${BIT_FLAG} -server IsInstanceTest > test.out 2>&1
|
||||
|
||||
cat test.out
|
||||
|
||||
grep "Failed at index" test.out
|
||||
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
echo "Test Failed"
|
||||
exit 1
|
||||
else
|
||||
echo "Test Passed"
|
||||
exit 0
|
||||
fi
|
6
hotspot/test/runtime/6626217/IFace.java
Normal file
6
hotspot/test/runtime/6626217/IFace.java
Normal file
@ -0,0 +1,6 @@
|
||||
// A simple interface, to allow an unknown foreign call from a class
|
||||
// loaded with LOADER1 to a class loaded with LOADER2.
|
||||
public interface IFace {
|
||||
public many_loader[] gen();
|
||||
}
|
||||
|
52
hotspot/test/runtime/6626217/Loader2.java
Normal file
52
hotspot/test/runtime/6626217/Loader2.java
Normal file
@ -0,0 +1,52 @@
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FileInputStream;
|
||||
public class Loader2 extends ClassLoader {
|
||||
int _recur;
|
||||
public void print( String msg ) {
|
||||
for( int i=0; i<_recur; i++ )
|
||||
System.out.print(" ");
|
||||
System.out.println(">>Loader2>> "+msg);
|
||||
}
|
||||
|
||||
protected Class findClass2(String name) throws ClassNotFoundException {
|
||||
print("Fetching the implementation of "+name);
|
||||
int old = _recur;
|
||||
try {
|
||||
FileInputStream fi = new FileInputStream(name+".impl2");
|
||||
byte result[] = new byte[fi.available()];
|
||||
fi.read(result);
|
||||
|
||||
print("DefineClass1 on "+name);
|
||||
_recur++;
|
||||
Class clazz = defineClass(name, result, 0, result.length);
|
||||
_recur = old;
|
||||
print("Returning newly loaded class.");
|
||||
return clazz;
|
||||
} catch (Exception e) {
|
||||
_recur = old;
|
||||
print("Not found on disk.");
|
||||
// If we caught an exception, either the class was not found or
|
||||
// it was unreadable by our process.
|
||||
return null;
|
||||
//throw new ClassNotFoundException(e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
|
||||
// Attempt a disk load first
|
||||
Class c = findClass2(name);
|
||||
if( c == null ) {
|
||||
// check if the class has already been loaded
|
||||
print("Checking for prior loaded class "+name);
|
||||
c = findLoadedClass(name);
|
||||
print("Letting super-loader load "+name);
|
||||
int old = _recur;
|
||||
_recur++;
|
||||
c = super.loadClass(name, false);
|
||||
_recur=old;
|
||||
}
|
||||
if (resolve) { print("Resolving class "+name); resolveClass(c); }
|
||||
print("Returning clazz "+c.getClassLoader()+":"+name);
|
||||
return c;
|
||||
}
|
||||
}
|
101
hotspot/test/runtime/6626217/Test6626217.sh
Normal file
101
hotspot/test/runtime/6626217/Test6626217.sh
Normal file
@ -0,0 +1,101 @@
|
||||
#
|
||||
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
|
||||
# SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
#
|
||||
|
||||
#
|
||||
# @test @(#)Test6626217.sh
|
||||
# @bug 6626217
|
||||
# @summary Loader-constraint table allows arrays instead of only the base-classes
|
||||
# @run shell Test6626217.sh
|
||||
#
|
||||
|
||||
if [ "${TESTSRC}" = "" ]
|
||||
then TESTSRC=.
|
||||
fi
|
||||
|
||||
if [ "${TESTJAVA}" = "" ]
|
||||
then
|
||||
PARENT=`dirname \`which java\``
|
||||
TESTJAVA=`dirname ${PARENT}`
|
||||
echo "TESTJAVA not set, selecting " ${TESTJAVA}
|
||||
echo "If this is incorrect, try setting the variable manually."
|
||||
fi
|
||||
|
||||
if [ "${TESTCLASSES}" = "" ]
|
||||
then
|
||||
echo "TESTCLASSES not set. Test cannot execute. Failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
BIT_FLAG=""
|
||||
|
||||
# set platform-dependent variables
|
||||
OS=`uname -s`
|
||||
case "$OS" in
|
||||
SunOS | Linux )
|
||||
NULL=/dev/null
|
||||
PS=":"
|
||||
FS="/"
|
||||
RM=/bin/rm
|
||||
CP=/bin/cp
|
||||
MV=/bin/mv
|
||||
## for solaris, linux it's HOME
|
||||
FILE_LOCATION=$HOME
|
||||
if [ -f ${FILE_LOCATION}${FS}JDK64BIT -a ${OS} = "SunOS" ]
|
||||
then
|
||||
BIT_FLAG=`cat ${FILE_LOCATION}${FS}JDK64BIT`
|
||||
fi
|
||||
;;
|
||||
Windows_* )
|
||||
NULL=NUL
|
||||
PS=";"
|
||||
FS="\\"
|
||||
RM=rm
|
||||
CP=cp
|
||||
MV=mv
|
||||
;;
|
||||
* )
|
||||
echo "Unrecognized system!"
|
||||
exit 1;
|
||||
;;
|
||||
esac
|
||||
|
||||
JEMMYPATH=${CPAPPEND}
|
||||
CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH
|
||||
|
||||
THIS_DIR=`pwd`
|
||||
|
||||
JAVA=${TESTJAVA}${FS}bin${FS}java
|
||||
JAVAC=${TESTJAVA}${FS}bin${FS}javac
|
||||
|
||||
${JAVA} ${BIT_FLAG} -version
|
||||
|
||||
# Current directory is scratch directory, copy all the test source there
|
||||
# (for the subsequent moves to work).
|
||||
${CP} ${TESTSRC}${FS}* ${THIS_DIR}
|
||||
|
||||
# A Clean Compile: this line will probably fail within jtreg as have a clean dir:
|
||||
${RM} -f *.class *.impl many_loader.java
|
||||
|
||||
# Compile all the usual suspects, including the default 'many_loader'
|
||||
${CP} many_loader1.java.foo many_loader.java
|
||||
${JAVAC} -source 1.4 -target 1.4 -Xlint *.java
|
||||
|
||||
# Rename the class files, so the custom loader (and not the system loader) will find it
|
||||
${MV} from_loader2.class from_loader2.impl2
|
||||
|
||||
# Compile the next version of 'many_loader'
|
||||
${MV} many_loader.class many_loader.impl1
|
||||
${CP} many_loader2.java.foo many_loader.java
|
||||
${JAVAC} -source 1.4 -target 1.4 -Xlint many_loader.java
|
||||
|
||||
# Rename the class file, so the custom loader (and not the system loader) will find it
|
||||
${MV} many_loader.class many_loader.impl2
|
||||
${MV} many_loader.impl1 many_loader.class
|
||||
${RM} many_loader.java
|
||||
|
||||
${JAVA} ${BIT_FLAG} -Xverify -Xint -cp . bug_21227 >test.out 2>&1
|
||||
grep "violates loader constraints" test.out
|
||||
exit $?
|
||||
|
11
hotspot/test/runtime/6626217/You_Have_Been_P0wned.java
Normal file
11
hotspot/test/runtime/6626217/You_Have_Been_P0wned.java
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
// I can cast any old thing I want to this type object:
|
||||
public class You_Have_Been_P0wned {
|
||||
// Make a bunch of int-fields so I can peek & poke it
|
||||
int _a;
|
||||
int _b;
|
||||
int _c;
|
||||
int _d;
|
||||
|
||||
}
|
||||
|
61
hotspot/test/runtime/6626217/bug_21227.java
Normal file
61
hotspot/test/runtime/6626217/bug_21227.java
Normal file
@ -0,0 +1,61 @@
|
||||
|
||||
import java.lang.reflect.*;
|
||||
import java.security.*;
|
||||
|
||||
abstract public class bug_21227 {
|
||||
|
||||
// Jam anything you want in here, it will be cast to a You_Have_Been_P0wned
|
||||
public static Object _p0wnee;
|
||||
|
||||
public static void main(String argv[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
|
||||
System.out.println("Warmup");
|
||||
|
||||
// Make a Class 'many_loader' under the default loader
|
||||
bug_21227 bug = new many_loader();
|
||||
|
||||
// Some classes under a new Loader, LOADER2, including another version of 'many_loader'
|
||||
ClassLoader LOADER2 = new Loader2();
|
||||
Class clazz2 = LOADER2.loadClass("from_loader2");
|
||||
IFace iface = (IFace)clazz2.newInstance();
|
||||
|
||||
// Set the victim, a String of length 6
|
||||
String s = "victim";
|
||||
_p0wnee = s;
|
||||
|
||||
// Go cast '_p0wnee' to type You_Have_Been_P0wned
|
||||
many_loader[] x2 = bug.make(iface);
|
||||
|
||||
many_loader b = x2[0];
|
||||
|
||||
// Make it clear that the runtime type many_loader (what we get from the
|
||||
// array X2) varies from the static type of many_loader.
|
||||
Class cl1 = b.getClass();
|
||||
ClassLoader ld1 = cl1.getClassLoader();
|
||||
Class cl2 = many_loader.class;
|
||||
ClassLoader ld2 = cl2.getClassLoader();
|
||||
System.out.println("bug.make() "+ld1+":"+cl1);
|
||||
System.out.println("many_loader "+ld2+":"+cl2);
|
||||
|
||||
// Read the victims guts out
|
||||
You_Have_Been_P0wned q = b._p0wnee;
|
||||
System.out.println("q._a = 0x"+Integer.toHexString(q._a));
|
||||
System.out.println("q._b = 0x"+Integer.toHexString(q._b));
|
||||
System.out.println("q._c = 0x"+Integer.toHexString(q._c));
|
||||
System.out.println("q._d = 0x"+Integer.toHexString(q._d));
|
||||
|
||||
System.out.println("I will now crash the VM:");
|
||||
// On 32-bit HotSpot Java6 this sets the victim String length shorter, then crashes the VM
|
||||
//q._c = 3;
|
||||
q._a = -1;
|
||||
|
||||
System.out.println(s);
|
||||
|
||||
}
|
||||
|
||||
// I need to compile (hence call in a loop) a function which returns a value
|
||||
// loaded from classloader other than the system one. The point of this
|
||||
// call is to give me an abstract 'hook' into a function loaded with a
|
||||
// foreign loader.
|
||||
public abstract many_loader[] make( IFace iface ); // abstract factory
|
||||
}
|
||||
|
9
hotspot/test/runtime/6626217/from_loader2.java
Normal file
9
hotspot/test/runtime/6626217/from_loader2.java
Normal file
@ -0,0 +1,9 @@
|
||||
// A simple class to extend an abstract class and get loaded with different
|
||||
// loaders. This class is loaded via LOADER2.
|
||||
public class from_loader2 implements IFace {
|
||||
public many_loader[] gen() {
|
||||
many_loader[] x = new many_loader[1];
|
||||
x[0] = new many_loader();
|
||||
return x;
|
||||
}
|
||||
}
|
23
hotspot/test/runtime/6626217/many_loader1.java.foo
Normal file
23
hotspot/test/runtime/6626217/many_loader1.java.foo
Normal file
@ -0,0 +1,23 @@
|
||||
// A simple class to extend an abstract class and get loaded with different
|
||||
// loaders. This class is loaded via LOADER1. A similar named class will
|
||||
// be loaded via LOADER2.
|
||||
public class many_loader extends bug_21227 {
|
||||
public You_Have_Been_P0wned _p0wnee;
|
||||
|
||||
// I need to compile (hence call in a loop) a function which returns a value
|
||||
// loaded from classloader other than the system one. The point of this
|
||||
// call is to give me an abstract 'hook' into a function loaded with a
|
||||
// foreign loader.
|
||||
|
||||
// The original 'make(boolean)' returns a bug_21227. The VM will inject a
|
||||
// synthetic method to up-cast the returned 'from_loader1' into a
|
||||
// 'bug_21227'.
|
||||
public many_loader[] make( IFace iface ) {
|
||||
// This function needs to return a value known to be loaded from LOADER2.
|
||||
// Since I need to use a yet different loader, I need to make an unknown
|
||||
// foreign call. In this case I'll be using an interface to make the
|
||||
// unknown call, with but a single implementor so the compiler can do the
|
||||
// upcast statically.
|
||||
return iface==null ? null : iface.gen();
|
||||
}
|
||||
}
|
19
hotspot/test/runtime/6626217/many_loader2.java.foo
Normal file
19
hotspot/test/runtime/6626217/many_loader2.java.foo
Normal file
@ -0,0 +1,19 @@
|
||||
// A simple class to extend an abstract class and get loaded with different
|
||||
// loaders. This class is loaded via LOADER2. A similar named class will
|
||||
// be loaded via LOADER1.
|
||||
public class many_loader extends bug_21227 {
|
||||
final Object _ref_to_be_p0wned;
|
||||
|
||||
many_loader() {
|
||||
_ref_to_be_p0wned = bug_21227._p0wnee;
|
||||
System.out.println("Gonna hack this thing: " + _ref_to_be_p0wned.toString() );
|
||||
}
|
||||
|
||||
// I need to compile (hence call in a loop) a function which returns a value
|
||||
// loaded from classloader other than the system one. The point of this
|
||||
// call is to give me an abstract 'hook' into a function loaded with a
|
||||
// foreign loader.
|
||||
public many_loader[] make( IFace iface ) {
|
||||
throw new Error("do not call me");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user