Igor Ignatyev 59ac4c2629 8199383: [TESTBUG] Open source VM testbase JVMTI tests
Reviewed-by: sspitsyn, erikj
2018-05-24 17:12:15 -07:00

526 lines
29 KiB
Java

/*
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
*
* @summary converted from VM Testbase nsk/jvmti/IterateThroughHeap/callbacks.
* VM Testbase keywords: [quick, jpda, jvmti, noras]
* VM Testbase readme:
* This test exercises JVMTI function IterateThroughHeap().
* Test checks that for all test objects appropriate callback will be invoked with
* correct arguments regardless to reachability of an object, it's visability
* and regardless to whether or not field is static.
* During this test no particular klass- or heap-filter passed into IterateThroughHeap.
* Test itertaes over instances of four classes which differs only by visibility of
* their members and tags these members.
* Tag contains information about index in array with information about objects,
* and index in array with fields info.
* If field is non-primitive then it will be tag directly, but if field is primitive,
* then it will be tagged undirectly - by tagging an object it belongs to or class in
* case when field is static.
* During the test IterateThtoughHeap invoked two times: find reachable objects
* and then to find unreachable objects.
* Test asserts that each of four available callbacks will be invoked appropriate number
* of times and value passed to callback is correct.
* Tags with format described above are used to distinguise between different
* fields and to be able to compare it's value with appropriate expected value.
* All errors associated with incorrect values passed into callback are reported
* immediatly.
* After each IterateThroughHeap call test verifies information collected during
* heap iteration. For each field following amount of callback invocations are expected:
* - primitive field 1 invocation (jvmtiPrimitiveFieldCallback);
* - primitive array 2 invocations (jvmtiArrayPrimitiveValueCallback,
* jvmtiHeapIterationCallback);
* - java.lang.String field 2 invocations (jvmtiStringPrimitiveValueCallback,
* jvmtiHeapIterationCallback);
* - other objetcts 1 invocation (jvmtiHeapIterationCallback).
*
* @library /vmTestbase
* /test/lib
* @run driver jdk.test.lib.FileInstaller . .
* @run main/othervm/native
* -agentlib:Callbacks=-waittime=5
* nsk.jvmti.IterateThroughHeap.callbacks.Callbacks
*/
package nsk.jvmti.IterateThroughHeap.callbacks;
import java.util.Random;
import java.io.PrintStream;
import nsk.share.*;
import nsk.share.jvmti.*;
public class Callbacks extends DebugeeClass {
static {
loadLibrary("Callbacks");
}
public static void main(String args[]) {
String[] argv = JVMTITest.commonInit(args);
System.exit(new Callbacks().runTest(argv,System.out) + Consts.JCK_STATUS_BASE);
}
protected Log log = null;
protected ArgumentHandler argHandler = null;
protected int status = Consts.TEST_PASSED;
static protected Object testObjects[];
public int runTest(String args[], PrintStream out) {
argHandler = new ArgumentHandler(args);
log = new Log(out, argHandler);
testObjects = new Object[]{new PublicPrimitives(),
new ProtectedPrimitives(),
new PrivatePrimitives(),
new DefaultPrimitives()};
log.display("Verifying reachable objects.");
status = checkStatus(status);
testObjects = null;
log.display("Verifying unreachable objects.");
status = checkStatus(status);
return status;
}
}
class Constants {
public static final boolean BOOLEAN = false;
public static final char CHAR = 'z';
public static final byte BYTE = 0xB;
public static final short SHORT = 0xB00;
public static final int INT = 0xDEADBEEF;
public static final long LONG = 0xDEADBEEFDEADL;
public static final float FLOAT = 3.1416f;
public static final double DOUBLE = 3.14159265;
public static final String STRING = "I hope you'll find me in the heap!";
}
/**
* Class, that contains all possible primitive fields
* except java.lang.String and arrays.
*/
class PublicPrimitives {
public boolean booleanField = Constants.BOOLEAN;
public char charField = Constants.CHAR;
public byte byteField = Constants.BYTE;
public short shortField = Constants.SHORT;
public int intField = Constants.INT;
public long longField = Constants.LONG;
public float floatField = Constants.FLOAT;
public double doubleField = Constants.DOUBLE;
public String stringField = new String(Constants.STRING);
public boolean[] booleanArray = new boolean[]{true,true,false,true,false};
public char[] charArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
public byte[] byteArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
public short[] shortArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
public int[] intArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
public long[] longArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
public float[] floatArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
public double[] doubleArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
public Object objectField = new Object();
public Object[] objectArray = new Object[100];
public int[][] multyArray = new int[10][10];
public static boolean booleanStaticField = Constants.BOOLEAN;
public static char charStaticField = Constants.CHAR;
public static byte byteStaticField = Constants.BYTE;
public static short shortStaticField = Constants.SHORT;
public static int intStaticField = Constants.INT;
public static long longStaticField = Constants.LONG;
public static float floatStaticField = Constants.FLOAT;
public static double doubleStaticField = Constants.DOUBLE;
public static String stringStaticField = new String(Constants.STRING);
public static boolean[] booleanStaticArray = new boolean[]{true,true,false,true,false};
public static char[] charStaticArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
public static byte[] byteStaticArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
public static short[] shortStaticArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
public static int[] intStaticArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
public static long[] longStaticArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
public static float[] floatStaticArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
public static double[] doubleStaticArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
public static Object objectStaticField = new Object();
public static Object[] objectStaticArray = new Object[100];
public static int[][] multyStaticArray = new int[10][10];
}
class ProtectedPrimitives {
protected boolean booleanField = Constants.BOOLEAN;
protected char charField = Constants.CHAR;
protected byte byteField = Constants.BYTE;
protected short shortField = Constants.SHORT;
protected int intField = Constants.INT;
protected long longField = Constants.LONG;
protected float floatField = Constants.FLOAT;
protected double doubleField = Constants.DOUBLE;
protected String stringField = new String(Constants.STRING);
protected boolean[] booleanArray = new boolean[]{true,true,false,true,false};
protected char[] charArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
protected byte[] byteArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
protected short[] shortArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
protected int[] intArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
protected long[] longArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
protected float[] floatArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
protected double[] doubleArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
protected Object objectField = new Object();
protected Object[] objectArray = new Object[100];
protected int[][] multyArray = new int[10][10];
protected static boolean booleanStaticField = Constants.BOOLEAN;
protected static char charStaticField = Constants.CHAR;
protected static byte byteStaticField = Constants.BYTE;
protected static short shortStaticField = Constants.SHORT;
protected static int intStaticField = Constants.INT;
protected static long longStaticField = Constants.LONG;
protected static float floatStaticField = Constants.FLOAT;
protected static double doubleStaticField = Constants.DOUBLE;
protected static String stringStaticField = new String(Constants.STRING);
protected static boolean[] booleanStaticArray = new boolean[]{true,true,false,true,false};
protected static char[] charStaticArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
protected static byte[] byteStaticArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
protected static short[] shortStaticArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
protected static int[] intStaticArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
protected static long[] longStaticArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
protected static float[] floatStaticArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
protected static double[] doubleStaticArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
protected static Object objectStaticField = new Object();
protected static Object[] objectStaticArray = new Object[100];
protected static int[][] multyStaticArray = new int[10][10];
}
class PrivatePrimitives {
private boolean booleanField = Constants.BOOLEAN;
private char charField = Constants.CHAR;
private byte byteField = Constants.BYTE;
private short shortField = Constants.SHORT;
private int intField = Constants.INT;
private long longField = Constants.LONG;
private float floatField = Constants.FLOAT;
private double doubleField = Constants.DOUBLE;
private String stringField = new String(Constants.STRING);
private boolean[] booleanArray = new boolean[]{true,true,false,true,false};
private char[] charArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
private byte[] byteArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
private short[] shortArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
private int[] intArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
private long[] longArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
private float[] floatArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
private double[] doubleArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
private Object objectField = new Object();
private Object[] objectArray = new Object[100];
private int[][] multyArray = new int[10][10];
private static boolean booleanStaticField = Constants.BOOLEAN;
private static char charStaticField = Constants.CHAR;
private static byte byteStaticField = Constants.BYTE;
private static short shortStaticField = Constants.SHORT;
private static int intStaticField = Constants.INT;
private static long longStaticField = Constants.LONG;
private static float floatStaticField = Constants.FLOAT;
private static double doubleStaticField = Constants.DOUBLE;
private static String stringStaticField = new String(Constants.STRING);
private static boolean[] booleanStaticArray = new boolean[]{true,true,false,true,false};
private static char[] charStaticArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
private static byte[] byteStaticArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
private static short[] shortStaticArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
private static int[] intStaticArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
private static long[] longStaticArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
private static float[] floatStaticArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
private static double[] doubleStaticArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
private static Object objectStaticField = new Object();
private static Object[] objectStaticArray = new Object[100];
private static int[][] multyStaticArray = new int[10][10];
}
class DefaultPrimitives {
boolean booleanField = Constants.BOOLEAN;
char charField = Constants.CHAR;
byte byteField = Constants.BYTE;
short shortField = Constants.SHORT;
int intField = Constants.INT;
long longField = Constants.LONG;
float floatField = Constants.FLOAT;
double doubleField = Constants.DOUBLE;
String stringField = new String(Constants.STRING);
boolean[] booleanArray = new boolean[]{true,true,false,true,false};
char[] charArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
byte[] byteArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
short[] shortArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
int[] intArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
long[] longArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
float[] floatArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
double[] doubleArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
Object objectField = new Object();
Object[] objectArray = new Object[100];
int[][] multyArray = new int[10][10];
static boolean booleanStaticField = Constants.BOOLEAN;
static char charStaticField = Constants.CHAR;
static byte byteStaticField = Constants.BYTE;
static short shortStaticField = Constants.SHORT;
static int intStaticField = Constants.INT;
static long longStaticField = Constants.LONG;
static float floatStaticField = Constants.FLOAT;
static double doubleStaticField = Constants.DOUBLE;
static String stringStaticField = new String(Constants.STRING);
static boolean[] booleanStaticArray = new boolean[]{true,true,false,true,false};
static char[] charStaticArray = new char[]{Constants.CHAR,
Constants.CHAR+1,
Constants.CHAR+2,
Constants.CHAR+3,
Constants.CHAR+4};
static byte[] byteStaticArray = new byte[]{Constants.BYTE,
Constants.BYTE+1,
Constants.BYTE+2,
Constants.BYTE+3,
Constants.BYTE+4};
static short[] shortStaticArray = new short[]{Constants.SHORT,
Constants.SHORT+1,
Constants.SHORT+2,
Constants.SHORT+3,
Constants.SHORT+4};
static int[] intStaticArray = new int[]{Constants.INT,
Constants.INT+1,
Constants.INT+2,
Constants.INT+3,
Constants.INT+4};
static long[] longStaticArray = new long[]{Constants.LONG,
Constants.LONG+1,
Constants.LONG+2,
Constants.LONG+3,
Constants.LONG+4};
static float[] floatStaticArray = new float[]{Constants.FLOAT,
Constants.FLOAT+1,
Constants.FLOAT+2,
Constants.FLOAT+3,
Constants.FLOAT+4};
static double[] doubleStaticArray = new double[]{Constants.DOUBLE,
Constants.DOUBLE+1,
Constants.DOUBLE+2,
Constants.DOUBLE+3,
Constants.DOUBLE+4};
static Object objectStaticField = new Object();
static Object[] objectStaticArray = new Object[100];
static int[][] multyStaticArray = new int[10][10];
}