1 /*
   2  * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  * @test
  26  * @bug 4409582
  27  * @summary Test all info returned by modification watchpoints
  28  * @author Daniel Prusa (or someone in the FFJ group)
  29  * @author Robert Field (modified to JDIScaffold)
  30  *
  31  * @run build JDIScaffold VMConnection
  32  * @run compile -g ModificationWatchpoints.java
  33  * @run driver ModificationWatchpoints
  34  */
  35 import com.sun.jdi.*;
  36 import com.sun.jdi.event.*;
  37 import com.sun.jdi.request.*;
  38 import java.util.*;
  39 
  40     /********** target program **********/
  41 
  42 class ModificationWatchpointsTarg {
  43     public static final int RepeatCount = 3;
  44 
  45     public static final byte ByteVal = -17;
  46     public static final char CharVal = 'Y';
  47     public static final short ShortVal = -412;
  48     public static final int IntVal = -711618;
  49     public static final long LongVal = 0x1234567890123456L;
  50     public static final float FloatVal = 7.986f;
  51     public static final double DoubleVal = 3.14159265358979d;
  52     public static final String StringVal = "OnceMore";
  53     public static final Object ObjectVal = new Object();
  54 
  55     static byte sByte;
  56     static char sChar;
  57     static short sShort;
  58     static int sInt;
  59     static long sLong;
  60     static float sFloat;
  61     static double sDouble;
  62     static String sString;
  63     static Object sObject;
  64 
  65     byte iByte;
  66     char iChar;
  67     short iShort;
  68     int iInt;
  69     long iLong;
  70     float iFloat;
  71     double iDouble;
  72     String iString;
  73     Object iObject;
  74 
  75     void iByteSet() {
  76         iByte = ByteVal;
  77     }
  78 
  79     void iCharSet() {
  80         iChar = CharVal;
  81     }
  82 
  83     void iShortSet() {
  84         iShort = ShortVal;
  85     }
  86 
  87     void iIntSet() {
  88         iInt = IntVal;
  89     }
  90 
  91     void iLongSet() {
  92         iLong = LongVal;
  93     }
  94 
  95     void iFloatSet() {
  96         iFloat = FloatVal;
  97     }
  98 
  99     void iDoubleSet() {
 100         iDouble = DoubleVal;
 101     }
 102 
 103     void iStringSet() {
 104         iString = StringVal;
 105     }
 106 
 107     void iObjectSet() {
 108         iObject = ObjectVal;
 109     }
 110 
 111     static void sByteSet() {
 112         sByte = ByteVal;
 113     }
 114 
 115     static void sCharSet() {
 116         sChar = CharVal;
 117     }
 118 
 119     static void sShortSet() {
 120         sShort = ShortVal;
 121     }
 122 
 123     static void sIntSet() {
 124         sInt = IntVal;
 125     }
 126 
 127     static void sLongSet() {
 128         sLong = LongVal;
 129     }
 130 
 131     static void sFloatSet() {
 132         sFloat = FloatVal;
 133     }
 134 
 135     static void sDoubleSet() {
 136         sDouble = DoubleVal;
 137     }
 138 
 139     static void sStringSet() {
 140         sString = StringVal;
 141     }
 142 
 143     static void sObjectSet() {
 144         sObject = ObjectVal;
 145     }
 146 
 147     void iUpdate(){
 148         iByteSet();
 149         iCharSet();
 150         iShortSet();
 151         iIntSet();
 152         iLongSet();
 153         iFloatSet();
 154         iDoubleSet();
 155         iStringSet();
 156         iObjectSet();
 157     }
 158 
 159     static void sUpdate(){
 160         sByteSet();
 161         sCharSet();
 162         sShortSet();
 163         sIntSet();
 164         sLongSet();
 165         sFloatSet();
 166         sDoubleSet();
 167         sStringSet();
 168         sObjectSet();
 169     }
 170 
 171     public static void main(String[] args){
 172         ModificationWatchpointsTarg targ = new ModificationWatchpointsTarg();
 173         for (int i = RepeatCount; i > 0; i--) {
 174             sUpdate();
 175             targ.iUpdate();
 176         }
 177     }
 178 }
 179 
 180 public class ModificationWatchpoints extends TestScaffold {
 181     ReferenceType targ;
 182     List allMWP = new ArrayList();
 183 
 184     ModificationWatchpoints (String args[]) {
 185         super(args);
 186     }
 187 
 188     public static void main(String[] args)      throws Exception {
 189         new ModificationWatchpoints(args).startTests();
 190     }
 191 
 192     /********** event handlers **********/
 193 
 194     public void fieldModified(ModificationWatchpointEvent event) {
 195         MWP mwp = (MWP)event.request().getProperty("executor");
 196         mwp.fieldModified(event);
 197     }
 198 
 199 
 200     /********** test core **********/
 201 
 202     void set(String fieldName, String valString) {
 203         Value val = targ.getValue(targ.fieldByName(valString));
 204         MWP mwp = new MWP("ModificationWatchpointsTarg", fieldName, val);
 205         allMWP.add(mwp);
 206         mwp.set();
 207     }
 208 
 209     protected void runTests() throws Exception {
 210         /*
 211          * Get to the top of main():
 212          */
 213         BreakpointEvent bpe = startToMain("ModificationWatchpointsTarg");
 214         targ = bpe.location().declaringType();
 215 
 216         /*
 217          * Set watchpoints
 218          */
 219         set("iByte", "ByteVal");
 220         set("iChar", "CharVal");
 221         set("iShort", "ShortVal");
 222         set("iInt", "IntVal");
 223         set("iLong", "LongVal");
 224         set("iFloat", "FloatVal");
 225         set("iDouble", "DoubleVal");
 226         set("iString", "StringVal");
 227         set("iObject", "ObjectVal");
 228 
 229         set("sByte", "ByteVal");
 230         set("sChar", "CharVal");
 231         set("sShort", "ShortVal");
 232         set("sInt", "IntVal");
 233         set("sLong", "LongVal");
 234         set("sFloat", "FloatVal");
 235         set("sDouble", "DoubleVal");
 236         set("sString", "StringVal");
 237         set("sObject", "ObjectVal");
 238 
 239         listenUntilVMDisconnect();
 240 
 241         if (!testFailed) {
 242             for (Iterator it = allMWP.iterator(); it.hasNext();) {
 243                 MWP mwp = (MWP)it.next();
 244                 mwp.checkEventCounts(ModificationWatchpointsTarg.RepeatCount);
 245             }
 246         }
 247 
 248         if (!testFailed) {
 249             println("ModificationWatchpoints: passed");
 250         } else {
 251             throw new Exception("ModificationWatchpoints: failed");
 252         }
 253     }
 254 
 255     /********** request wrapper **********/
 256 
 257     class MWP {
 258         private final String className;
 259         private final String fieldName;
 260         private final Value expectedValue;
 261         public int eventCount = 0;
 262         public boolean failed = false;
 263 
 264         public MWP(String className, String fieldName, Value value) {
 265             this.className = className;
 266             this.fieldName = fieldName;
 267             this.expectedValue = value;
 268         }
 269 
 270         /*
 271          * Sets watchpoint with specified properties.
 272          */
 273         public void set() {
 274             List classes = vm().classesByName(className);
 275             if (classes.size() != 1) {
 276                 failure("Expected one class named " + className + " got " + classes.size());
 277             }
 278 
 279             set ((ReferenceType)classes.get(0));
 280         }
 281 
 282         /**
 283          * Sets watchpoint for given class.
 284          */
 285         public void set(ReferenceType clazz) {
 286             Field f = clazz.fieldByName(fieldName);
 287             ModificationWatchpointRequest mwr =
 288                        eventRequestManager().createModificationWatchpointRequest(f);
 289             mwr.putProperty("executor", this);
 290             mwr.enable();
 291             println("set watchpoint: " + className +"." + f);
 292         }
 293 
 294         public void fieldModified(ModificationWatchpointEvent event) {
 295             Value val = event.valueToBe();
 296            println("Watchpoint reached: " + className + "." + fieldName +
 297                    ", new value: " + val);
 298             if (!val.equals(expectedValue)) {
 299                 failure("FAILURE: value should be: " +
 300                         expectedValue.getClass() + ":" + expectedValue +
 301                         " has - " + val.getClass() + ":" + val);
 302             }
 303             if (!event.location().method().name().equals(fieldName + "Set")) {
 304                 failure("FAILURE: occurred in wrong place: " + event.location());
 305             }
 306             eventCount++;
 307         }
 308 
 309         public void checkEventCounts(int expectedCount) {
 310             if (eventCount != expectedCount) {
 311                 failure(className + "." + fieldName +
 312                         " - only got " + eventCount + " events");
 313             }
 314         }
 315 
 316     } // MWP inner class .................
 317 }