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 4321339
  27  * @summary Check correct processing of filters after a count filter
  28  * @author Robert Field
  29  *
  30  * @run build TestScaffold VMConnection TargetListener TargetAdapter
  31  * @run compile -g CountFilterTest.java
  32  * @run driver CountFilterTest
  33  */
  34 import com.sun.jdi.*;
  35 import com.sun.jdi.event.*;
  36 import com.sun.jdi.request.*;
  37 
  38 import java.util.*;
  39 
  40     /********** target program **********/
  41 
  42 class CountFilterTarg {
  43 
  44     void thisOne() {
  45     }
  46 
  47     void butNotThisOne() {
  48     }
  49 
  50     void norThisOne() {
  51     }
  52 
  53     void butThisOne() {
  54     }
  55 
  56     public static void main(String[] args){
  57         CountFilterTarg cft = new CountFilterTarg();
  58         System.out.println("Hi! Hi! Hello...");
  59         cft.thisOne();
  60         cft.butNotThisOne();
  61         cft.norThisOne();
  62         cft.butThisOne();
  63         System.out.println("Goodbye from CountFilterTarg!");
  64     }
  65 }
  66 
  67     /********** test program **********/
  68 
  69 public class CountFilterTest extends TestScaffold {
  70     ReferenceType targetClass;
  71     ThreadReference mainThread;
  72     EventRequestManager erm;
  73     Map whereMap = new HashMap();
  74 
  75     CountFilterTest (String args[]) {
  76         super(args);
  77     }
  78 
  79     public static void main(String[] args)      throws Exception {
  80         new CountFilterTest(args).startTests();
  81     }
  82 
  83     /********** event handlers **********/
  84 
  85     public void breakpointReached(BreakpointEvent event) {
  86         println("Got BreakpointEvent");
  87         locatableEvent(event, event.location());
  88     }
  89 
  90     public void methodEntered(MethodEntryEvent event) {
  91         println("Got MethodEntryEvent");
  92         locatableEvent(event, event.location());
  93     }
  94 
  95     public void methodExited(MethodExitEvent event) {
  96         println("Got MethodExitEvent");
  97         locatableEvent(event, event.location());
  98     }
  99 
 100     public void locatableEvent(Event event, Location loc) {
 101         String got = loc.method().name();
 102         String expected = (String)whereMap.get(event.request());
 103         if (!got.equals(expected)) {
 104             failure("FAIL: expected event in " + expected +
 105                     " but it occurred in " + got);
 106         }
 107     }
 108 
 109     /********** test assist*****/
 110 
 111     BreakpointRequest breakpointAtMethod(String methodName)
 112                                            throws Exception {
 113         List meths = targetClass.methodsByName(methodName);
 114         if (meths.size() != 1) {
 115             throw new Exception("test error: should be one " +
 116                                 methodName);
 117         }
 118         Method meth = (Method)meths.get(0);
 119         return erm.createBreakpointRequest(meth.location());
 120     }
 121 
 122     /********** test core **********/
 123 
 124     protected void runTests() throws Exception {
 125         /*
 126          * Get to the top of main()
 127          * to determine targetClass and mainThread
 128          */
 129         BreakpointEvent bpe = startToMain("CountFilterTarg");
 130         targetClass = bpe.location().declaringType();
 131         mainThread = bpe.thread();
 132         erm = vm().eventRequestManager();
 133         ThreadReference otherThread = null;
 134 
 135         /* find a thread that isn't mainThread */
 136         for (Iterator it = vm().allThreads().iterator();
 137                        it.hasNext(); ) {
 138             ThreadReference tr = (ThreadReference)it.next();
 139             if (!tr.equals(mainThread)) {
 140                 otherThread = tr;
 141                 break;
 142             }
 143         }
 144         if (otherThread == null) {
 145             throw new Exception("test error: couldn't find " +
 146                                 "other thread");
 147         }
 148 
 149         /*
 150          * Set event requests
 151          */
 152         MethodEntryRequest meRequest =
 153             erm.createMethodEntryRequest();
 154         meRequest.addClassFilter("CountFilterTarg");
 155         meRequest.addCountFilter(5);  // incl constructor
 156         meRequest.enable();
 157         whereMap.put(meRequest, "butThisOne");
 158 
 159         MethodExitRequest mxRequest =
 160             erm.createMethodExitRequest();
 161         mxRequest.addCountFilter(2);
 162         mxRequest.addClassFilter("borp");
 163         mxRequest.enable();
 164         whereMap.put(mxRequest, "nowhere (from method exit)");
 165 
 166         BreakpointRequest thisOneRequest =
 167             breakpointAtMethod("thisOne");
 168         thisOneRequest.addCountFilter(1);
 169         thisOneRequest.addThreadFilter(mainThread);
 170         thisOneRequest.enable();
 171         whereMap.put(thisOneRequest, "thisOne");
 172 
 173         BreakpointRequest butNotThisOneRequest =
 174             breakpointAtMethod("butNotThisOne");
 175         butNotThisOneRequest.addCountFilter(1);
 176         butNotThisOneRequest.addThreadFilter(otherThread);
 177         butNotThisOneRequest.enable();
 178         whereMap.put(butNotThisOneRequest,
 179                      "nowhere (post filter)");
 180 
 181         BreakpointRequest norThisOneRequest =
 182             breakpointAtMethod("norThisOne");
 183         norThisOneRequest.addThreadFilter(otherThread);
 184         norThisOneRequest.addCountFilter(1);
 185         norThisOneRequest.enable();
 186         whereMap.put(norThisOneRequest,
 187                      "nowhere (pre filter)");
 188 
 189         BreakpointRequest butThisOneRequest =
 190             breakpointAtMethod("butThisOne");
 191         butThisOneRequest.addThreadFilter(mainThread);
 192         butThisOneRequest.addCountFilter(1);
 193         butThisOneRequest.enable();
 194         whereMap.put(butThisOneRequest, "butThisOne");
 195 
 196         /*
 197          * resume the target listening for events
 198          */
 199         listenUntilVMDisconnect();
 200 
 201         /*
 202          * deal with results of test
 203          * if anything has called failure("foo") testFailed will be true
 204          */
 205         if (!testFailed) {
 206             println("CountFilterTest: passed");
 207         } else {
 208             throw new Exception("CountFilterTest: failed");
 209         }
 210     }
 211 }