| /* | |
| * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /** | |
| * @test | |
| * @bug 4409582 | |
| * @summary Test all info returned by modification watchpoints | |
| * @author Daniel Prusa (or someone in the FFJ group) | |
| * @author Robert Field | |
| * | |
| * @run build TestScaffold VMConnection | |
| * @run compile -g ModificationWatchpoints.java | |
| * @run driver ModificationWatchpoints | |
| */ | |
| import com.sun.jdi.*; | |
| import com.sun.jdi.event.*; | |
| import com.sun.jdi.request.*; | |
| import java.util.*; | |
| /********** target program **********/ | |
| class ModificationWatchpointsTarg { | |
| public static final int RepeatCount = 3; | |
| public static final byte ByteVal = -17; | |
| public static final char CharVal = 'Y'; | |
| public static final short ShortVal = -412; | |
| public static final int IntVal = -711618; | |
| public static final long LongVal = 0x1234567890123456L; | |
| public static final float FloatVal = 7.986f; | |
| public static final double DoubleVal = 3.14159265358979d; | |
| public static final String StringVal = "OnceMore"; | |
| public static final Object ObjectVal = new Object(); | |
| static byte sByte; | |
| static char sChar; | |
| static short sShort; | |
| static int sInt; | |
| static long sLong; | |
| static float sFloat; | |
| static double sDouble; | |
| static String sString; | |
| static Object sObject; | |
| byte iByte; | |
| char iChar; | |
| short iShort; | |
| int iInt; | |
| long iLong; | |
| float iFloat; | |
| double iDouble; | |
| String iString; | |
| Object iObject; | |
| void iByteSet() { | |
| iByte = ByteVal; | |
| } | |
| void iCharSet() { | |
| iChar = CharVal; | |
| } | |
| void iShortSet() { | |
| iShort = ShortVal; | |
| } | |
| void iIntSet() { | |
| iInt = IntVal; | |
| } | |
| void iLongSet() { | |
| iLong = LongVal; | |
| } | |
| void iFloatSet() { | |
| iFloat = FloatVal; | |
| } | |
| void iDoubleSet() { | |
| iDouble = DoubleVal; | |
| } | |
| void iStringSet() { | |
| iString = StringVal; | |
| } | |
| void iObjectSet() { | |
| iObject = ObjectVal; | |
| } | |
| static void sByteSet() { | |
| sByte = ByteVal; | |
| } | |
| static void sCharSet() { | |
| sChar = CharVal; | |
| } | |
| static void sShortSet() { | |
| sShort = ShortVal; | |
| } | |
| static void sIntSet() { | |
| sInt = IntVal; | |
| } | |
| static void sLongSet() { | |
| sLong = LongVal; | |
| } | |
| static void sFloatSet() { | |
| sFloat = FloatVal; | |
| } | |
| static void sDoubleSet() { | |
| sDouble = DoubleVal; | |
| } | |
| static void sStringSet() { | |
| sString = StringVal; | |
| } | |
| static void sObjectSet() { | |
| sObject = ObjectVal; | |
| } | |
| void iUpdate(){ | |
| iByteSet(); | |
| iCharSet(); | |
| iShortSet(); | |
| iIntSet(); | |
| iLongSet(); | |
| iFloatSet(); | |
| iDoubleSet(); | |
| iStringSet(); | |
| iObjectSet(); | |
| } | |
| static void sUpdate(){ | |
| sByteSet(); | |
| sCharSet(); | |
| sShortSet(); | |
| sIntSet(); | |
| sLongSet(); | |
| sFloatSet(); | |
| sDoubleSet(); | |
| sStringSet(); | |
| sObjectSet(); | |
| } | |
| public static void main(String[] args){ | |
| ModificationWatchpointsTarg targ = new ModificationWatchpointsTarg(); | |
| for (int i = RepeatCount; i > 0; i--) { | |
| sUpdate(); | |
| targ.iUpdate(); | |
| } | |
| } | |
| } | |
| public class ModificationWatchpoints extends TestScaffold { | |
| ReferenceType targ; | |
| List allMWP = new ArrayList(); | |
| ModificationWatchpoints (String args[]) { | |
| super(args); | |
| } | |
| public static void main(String[] args) throws Exception { | |
| new ModificationWatchpoints(args).startTests(); | |
| } | |
| /********** event handlers **********/ | |
| public void fieldModified(ModificationWatchpointEvent event) { | |
| MWP mwp = (MWP)event.request().getProperty("executor"); | |
| 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 ................. | |
| } |