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 4406439 4925740 27 * @summary ClassesByName2 verifies that all the classes in the loaded class list can be found with classesByName.. 28 * 29 * @author Tim Bell (based on ClassesByName by Robert Field) 30 * 31 * @modules java.corba 32 * jdk.jdi 33 * @run build TestScaffold VMConnection TargetListener TargetAdapter 34 * @run compile -g ClassesByName2Test.java 35 * @run driver ClassesByName2Test 36 */ 37 import com.sun.jdi.*; 38 import com.sun.jdi.event.*; 39 import com.sun.jdi.request.*; 40 41 import java.util.*; 42 43 /********** target program **********/ 44 45 class ClassesByName2Targ { 46 static void bkpt() { 47 } 48 49 public static void main(String[] args){ 50 System.out.println("Howdy!"); 51 try { 52 53 Thread zero = new Thread ("ZERO") { 54 public void run () { 55 System.setProperty("java.awt.headless", "true"); 56 java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); 57 58 } 59 }; 60 61 Thread one = new Thread ("ONE") { 62 public void run () { 63 try { 64 java.security.KeyPairGenerator keyGen = 65 java.security.KeyPairGenerator.getInstance("DSA", "SUN"); 66 } catch (Exception e) { 67 e.printStackTrace(); 68 } 69 } 70 }; 71 72 Thread two = new Thread ("TWO") { 73 public void run () { 74 javax.rmi.CORBA.Util.getCodebase(this.getClass()); 75 } 76 }; 77 78 two.start(); 79 one.start(); 80 zero.start(); 81 82 try { 83 zero.join(); 84 System.out.println("zero joined"); 85 one.join(); 86 System.out.println("one joined"); 87 two.join(); 88 System.out.println("two joined"); 89 } catch (InterruptedException iex) { 90 iex.printStackTrace(); 91 } 92 } catch (Exception e) { 93 e.printStackTrace(); 94 } 95 bkpt(); 96 System.out.println("Goodbye from ClassesByName2Targ!"); 97 } 98 } 99 100 /********** test program **********/ 101 102 public class ClassesByName2Test extends TestScaffold { 103 volatile boolean stop = false; 104 105 ClassesByName2Test (String args[]) { 106 super(args); 107 } 108 109 public void breakpointReached(BreakpointEvent event) { 110 System.out.println("Got BreakpointEvent: " + event); 111 stop = true; 112 } 113 114 public void eventSetComplete(EventSet set) { 115 // Don't resume. 116 } 117 118 public static void main(String[] args) throws Exception { 119 new ClassesByName2Test(args).startTests(); 120 } 121 122 void breakpointAtMethod(ReferenceType ref, String methodName) 123 throws Exception { 124 List meths = ref.methodsByName(methodName); 125 if (meths.size() != 1) { 126 throw new Exception("test error: should be one " + 127 methodName); 128 } 129 Method meth = (Method)meths.get(0); 130 BreakpointRequest bkptReq = vm().eventRequestManager(). 131 createBreakpointRequest(meth.location()); 132 bkptReq.enable(); 133 try { 134 addListener (this); 135 } catch (Exception ex){ 136 ex.printStackTrace(); 137 failure("failure: Could not add listener"); 138 throw new Exception("ClassesByname2Test: failed"); 139 } 140 } 141 142 protected void runTests() throws Exception { 143 BreakpointEvent bpe = startToMain("ClassesByName2Targ"); 144 145 /* 146 Bug 6263966 - Don't just resume because the debuggee can 147 complete and disconnect while the following loop is 148 accessing it. 149 */ 150 breakpointAtMethod(bpe.location().declaringType(), "bkpt"); 151 vm().resume(); 152 153 /* The test of 'stop' is so that we stop when the debuggee hits 154 the bkpt. The 150 is so we stop if the debuggee 155 is slow (eg, -Xcomp -server) - we don't want to 156 spend all day waiting for it to get to the bkpt. 157 */ 158 for (int i = 0; i < 150 && !stop; i++) { 159 List all = vm().allClasses(); 160 System.out.println("\n++++ Lookup number: " + i + ". allClasses() returned " + 161 all.size() + " classes."); 162 for (Iterator it = all.iterator(); it.hasNext(); ) { 163 ReferenceType cls = (ReferenceType)it.next(); 164 String name = cls.name(); 165 List found = vm().classesByName(name); 166 if (found.contains(cls)) { 167 //System.out.println("Found class: " + name); 168 } else { 169 System.out.println("CLASS NOT FOUND: " + name); 170 throw new Exception("CLASS NOT FOUND (by classesByName): " + 171 name); 172 } 173 } 174 } 175 176 // In case of a slow debuggee, we don't want to resume the debuggee and wait 177 // for it to complete. 178 vm().exit(0); 179 180 /* 181 * deal with results of test 182 * if anything has called failure("foo") testFailed will be true 183 */ 184 if (!testFailed) { 185 println("ClassesByName2Test: passed"); 186 } else { 187 throw new Exception("ClassesByName2Test: failed"); 188 } 189 } 190 }