| /* |
| * Copyright (c) 2005, 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 4836939 6646613 |
| * @summary JDI add addSourceNameFilter to ClassPrepareRequest |
| * @author jjh |
| * |
| * @run build TestScaffold VMConnection TargetListener TargetAdapter |
| * @run compile -g SourceNameFilterTest.java |
| * @run driver SourceNameFilterTest |
| * @run compile -g:none SourceNameFilterTest.java |
| * @run driver SourceNameFilterTest |
| */ |
| // The compile -g:none suppresses the lineNumber table to trigger bug 6646613. |
| |
| import com.sun.jdi.*; |
| import com.sun.jdi.event.*; |
| import com.sun.jdi.request.*; |
| |
| import java.util.*; |
| |
| /********** target program **********/ |
| |
| class SourceNameFilterTarg { |
| static void bkpt() { |
| } |
| |
| public static void main(String[] args){ |
| System.out.println("Howdy!"); |
| |
| LoadedLater1.doit(); |
| bkpt(); |
| |
| LoadedLater2.doit(); |
| bkpt(); |
| |
| LoadedLater3.doit(); |
| bkpt(); |
| System.out.println("Goodbye from SourceNameFilterTarg!"); |
| } |
| } |
| class LoadedLater1 { |
| public static void doit() { |
| System.out.println("didit1"); |
| } |
| } |
| |
| class LoadedLater2 { |
| public static void doit() { |
| System.out.println("didit2"); |
| } |
| } |
| |
| class LoadedLater3 { |
| public static void doit() { |
| System.out.println("didit3"); |
| } |
| } |
| |
| /********** test program **********/ |
| |
| public class SourceNameFilterTest extends TestScaffold { |
| ReferenceType targetClass; |
| ThreadReference mainThread; |
| boolean gotEvent1 = false; |
| boolean gotEvent2 = false; |
| boolean gotEvent3 = false; |
| ClassPrepareRequest cpReq; |
| boolean shouldResume = false; |
| SourceNameFilterTest (String args[]) { |
| super(args); |
| } |
| |
| public static void main(String[] args) throws Exception { |
| new SourceNameFilterTest(args).startTests(); |
| } |
| public void eventSetComplete(EventSet set) { |
| //System.out.println("jj: resuming, set = " + set); |
| if (shouldResume) { |
| set.resume(); |
| shouldResume = false; |
| } |
| } |
| |
| public void classPrepared(ClassPrepareEvent event) { |
| shouldResume = true; |
| |
| ReferenceType rt = event.referenceType(); |
| String rtname = rt.name(); |
| |
| if (rtname.equals("LoadedLater1")) { |
| gotEvent1 = true; |
| } |
| |
| if (rtname.equals("LoadedLater2")) { |
| gotEvent2 = true; |
| } |
| |
| if (rtname.equals("LoadedLater3")) { |
| gotEvent3 = true; |
| } |
| |
| // debug code |
| if (false) { |
| println("Got ClassPrepareEvent for : " + rtname); |
| try { |
| println(" sourceName = " + rt.sourceName()); |
| } catch (AbsentInformationException ee) { |
| failure("failure: absent info on sourceName(): " + ee); |
| } |
| |
| String stratum = rt.defaultStratum(); |
| println(" defaultStratum = " + stratum); |
| |
| try { |
| println(" sourceNames = " + rt.sourceNames(stratum)); |
| } catch (AbsentInformationException ee) { |
| failure("failure: absent info on sourceNames(): " + ee); |
| } |
| println("\nAvailable strata: " + rt.availableStrata()); |
| } |
| } |
| |
| |
| /********** test core **********/ |
| |
| protected void runTests() throws Exception { |
| /* |
| * Get to the top of main() |
| * to determine targetClass and mainThread |
| */ |
| BreakpointEvent bpe = startToMain("SourceNameFilterTarg"); |
| targetClass = bpe.location().declaringType(); |
| boolean noSourceName = false; |
| try { |
| targetClass.sourceName(); |
| } catch (AbsentInformationException ee) { |
| noSourceName = true; |
| } |
| if (noSourceName) { |
| println("-- Running with no source names"); |
| } else { |
| println("-- Running with source names"); |
| } |
| |
| mainThread = bpe.thread(); |
| EventRequestManager erm = vm().eventRequestManager(); |
| addListener(this); |
| |
| /* |
| * Resume the target listening for events |
| * This should cause a class prepare event for LoadedLater1 |
| */ |
| cpReq = erm.createClassPrepareRequest(); |
| cpReq.enable(); |
| resumeTo("SourceNameFilterTarg", "bkpt", "()V"); |
| |
| /* |
| * This should cause us to not get a class prepared for |
| * LoadedLater2 since it doesn't come from "jj" |
| */ |
| cpReq.disable(); |
| cpReq.addSourceNameFilter("jj"); |
| cpReq.enable(); |
| resumeTo("SourceNameFilterTarg", "bkpt", "()V"); |
| cpReq.disable(); |
| |
| /* |
| * This should cause us to get a class prepare event for |
| * LoadedLater3 except in the case where -g:none |
| * was used to compile so that there is no LineNumberTable |
| * and therefore, no source name for the class. |
| */ |
| cpReq = erm.createClassPrepareRequest(); |
| cpReq.addSourceNameFilter("SourceNameFilterTest.java"); |
| cpReq.enable(); |
| resumeTo("SourceNameFilterTarg", "bkpt", "()V"); |
| |
| listenUntilVMDisconnect(); |
| |
| if (!gotEvent1) { |
| failure("failure: Did not get a class prepare request " + |
| "for LoadedLater1"); |
| } |
| |
| if (gotEvent2) { |
| failure("failure: Did get a class prepare request " + |
| "for LoadedLater2"); |
| } |
| |
| if (gotEvent3 && noSourceName) { |
| failure("failure: Did get a class prepare request " + |
| "for LoadedLater3"); |
| } |
| else if (!gotEvent3 && !noSourceName) { |
| failure("failure: Did not get a class prepare request " + |
| "for LoadedLater3"); |
| } |
| |
| /* |
| * deal with results of test |
| * if anything has called failure("foo") testFailed will be true |
| */ |
| if (!testFailed) { |
| println("SourceNameFilterTest: passed"); |
| } else { |
| throw new Exception("SourceNameFilterTest: failed"); |
| } |
| } |
| } |