ModificationWatchpoints.java revision 2362
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston/*
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * This code is free software; you can redistribute it and/or modify it
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * under the terms of the GNU General Public License version 2 only, as
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * published by the Free Software Foundation.
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * This code is distributed in the hope that it will be useful, but WITHOUT
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * version 2 for more details (a copy is included in the LICENSE file that
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * accompanied this code).
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * You should have received a copy of the GNU General Public License version
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * 2 along with this work; if not, write to the Free Software Foundation,
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * or visit www.oracle.com if you need additional information or have any
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * questions.
d91236fe104c7ea63142e053b22a39c8a30d304beschrock */
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
d91236fe104c7ea63142e053b22a39c8a30d304beschrock/**
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @test
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @bug 4409582
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @summary Test all info returned by modification watchpoints
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @author Daniel Prusa (or someone in the FFJ group)
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @author Robert Field (modified to JDIScaffold)
d91236fe104c7ea63142e053b22a39c8a30d304beschrock *
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @library scaffold
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @run build JDIScaffold VMConnection
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @run compile -g ModificationWatchpoints.java
d91236fe104c7ea63142e053b22a39c8a30d304beschrock * @run main/othervm ModificationWatchpoints
d91236fe104c7ea63142e053b22a39c8a30d304beschrock */
d91236fe104c7ea63142e053b22a39c8a30d304beschrockimport com.sun.jdi.*;
d91236fe104c7ea63142e053b22a39c8a30d304beschrockimport com.sun.jdi.event.*;
d91236fe104c7ea63142e053b22a39c8a30d304beschrockimport com.sun.jdi.request.*;
d91236fe104c7ea63142e053b22a39c8a30d304beschrockimport java.util.*;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock /********** target program **********/
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrockclass ModificationWatchpointsTarg {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final int RepeatCount = 3;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final byte ByteVal = -17;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final char CharVal = 'Y';
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final short ShortVal = -412;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final int IntVal = -711618;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final long LongVal = 0x1234567890123456L;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final float FloatVal = 7.986f;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final double DoubleVal = 3.14159265358979d;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final String StringVal = "OnceMore";
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static final Object ObjectVal = new Object();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static byte sByte;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static char sChar;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static short sShort;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static int sInt;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static long sLong;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static float sFloat;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static double sDouble;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static String sString;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static Object sObject;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock byte iByte;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock char iChar;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock short iShort;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock int iInt;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock long iLong;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock float iFloat;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock double iDouble;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock String iString;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock Object iObject;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iByteSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iByte = ByteVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iCharSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iChar = CharVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston void iShortSet() {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston iShort = ShortVal;
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iIntSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iInt = IntVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iLongSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iLong = LongVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iFloatSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iFloat = FloatVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iDoubleSet() {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston iDouble = DoubleVal;
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston void iStringSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iString = StringVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston void iObjectSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iObject = ObjectVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sByteSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sByte = ByteVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sCharSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sChar = CharVal;
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston static void sShortSet() {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston sShort = ShortVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sIntSet() {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston sInt = IntVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sLongSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sLong = LongVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sFloatSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sFloat = FloatVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston static void sDoubleSet() {
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston sDouble = DoubleVal;
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sStringSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sString = StringVal;
88045cff0aae4ed8823cd0989168e8f56927f83eRobert Johnston }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sObjectSet() {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sObject = ObjectVal;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock void iUpdate(){
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iByteSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iCharSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iShortSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iIntSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iLongSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iFloatSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iDoubleSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iStringSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock iObjectSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock static void sUpdate(){
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sByteSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sCharSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sShortSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sIntSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sLongSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sFloatSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sDoubleSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sStringSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sObjectSet();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static void main(String[] args){
d91236fe104c7ea63142e053b22a39c8a30d304beschrock ModificationWatchpointsTarg targ = new ModificationWatchpointsTarg();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock for (int i = RepeatCount; i > 0; i--) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock sUpdate();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock targ.iUpdate();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock}
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrockpublic class ModificationWatchpoints extends TestScaffold {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock ReferenceType targ;
d91236fe104c7ea63142e053b22a39c8a30d304beschrock List allMWP = new ArrayList();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock ModificationWatchpoints (String args[]) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock super(args);
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public static void main(String[] args) throws Exception {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock new ModificationWatchpoints(args).startTests();
d91236fe104c7ea63142e053b22a39c8a30d304beschrock }
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock /********** event handlers **********/
d91236fe104c7ea63142e053b22a39c8a30d304beschrock
d91236fe104c7ea63142e053b22a39c8a30d304beschrock public void fieldModified(ModificationWatchpointEvent event) {
d91236fe104c7ea63142e053b22a39c8a30d304beschrock MWP mwp = (MWP)event.request().getProperty("executor");
d91236fe104c7ea63142e053b22a39c8a30d304beschrock mwp.fieldModified(event);
}
/********** test core **********/
void set(String fieldName, String valString) {
Value val = targ.getValue(targ.fieldByName(valString));
MWP mwp = new MWP("ModificationWatchpointsTarg", fieldName, val);
allMWP.add(mwp);
mwp.set();
}
protected void runTests() throws Exception {
/*
* Get to the top of main():
*/
BreakpointEvent bpe = startToMain("ModificationWatchpointsTarg");
targ = bpe.location().declaringType();
/*
* Set watchpoints
*/
set("iByte", "ByteVal");
set("iChar", "CharVal");
set("iShort", "ShortVal");
set("iInt", "IntVal");
set("iLong", "LongVal");
set("iFloat", "FloatVal");
set("iDouble", "DoubleVal");
set("iString", "StringVal");
set("iObject", "ObjectVal");
set("sByte", "ByteVal");
set("sChar", "CharVal");
set("sShort", "ShortVal");
set("sInt", "IntVal");
set("sLong", "LongVal");
set("sFloat", "FloatVal");
set("sDouble", "DoubleVal");
set("sString", "StringVal");
set("sObject", "ObjectVal");
listenUntilVMDisconnect();
if (!testFailed) {
for (Iterator it = allMWP.iterator(); it.hasNext();) {
MWP mwp = (MWP)it.next();
mwp.checkEventCounts(ModificationWatchpointsTarg.RepeatCount);
}
}
if (!testFailed) {
println("ModificationWatchpoints: passed");
} else {
throw new Exception("ModificationWatchpoints: failed");
}
}
/********** request wrapper **********/
class MWP {
private final String className;
private final String fieldName;
private final Value expectedValue;
public int eventCount = 0;
public boolean failed = false;
public MWP(String className, String fieldName, Value value) {
this.className = className;
this.fieldName = fieldName;
this.expectedValue = value;
}
/*
* Sets watchpoint with specified properties.
*/
public void set() {
List classes = vm().classesByName(className);
if (classes.size() != 1) {
failure("Expected one class named " + className + " got " + classes.size());
}
set ((ReferenceType)classes.get(0));
}
/**
* Sets watchpoint for given class.
*/
public void set(ReferenceType clazz) {
Field f = clazz.fieldByName(fieldName);
ModificationWatchpointRequest mwr =
eventRequestManager().createModificationWatchpointRequest(f);
mwr.putProperty("executor", this);
mwr.enable();
println("set watchpoint: " + className +"." + f);
}
public void fieldModified(ModificationWatchpointEvent event) {
Value val = event.valueToBe();
println("Watchpoint reached: " + className + "." + fieldName +
", new value: " + val);
if (!val.equals(expectedValue)) {
failure("FAILURE: value should be: " +
expectedValue.getClass() + ":" + expectedValue +
" has - " + val.getClass() + ":" + val);
}
if (!event.location().method().name().equals(fieldName + "Set")) {
failure("FAILURE: occurred in wrong place: " + event.location());
}
eventCount++;
}
public void checkEventCounts(int expectedCount) {
if (eventCount != expectedCount) {
failure(className + "." + fieldName +
" - only got " + eventCount + " events");
}
}
} // MWP inner class .................
}