1 /* 2 * Copyright (c) 2001, 2016, 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 try { 75 String s = String.format("%02x", 0xff); 76 } catch (Exception e) { 77 e.printStackTrace(); 78 } 79 } 80 }; 81 82 two.start(); 83 one.start(); 84 zero.start(); 85 86 try { 87 zero.join(); 88 System.out.println("zero joined"); 89 one.join(); 90 System.out.println("one joined"); 91 two.join(); 92 System.out.println("two joined"); 93 } catch (InterruptedException iex) { 94 iex.printStackTrace(); 95 } 96 } catch (Exception e) { 97 e.printStackTrace(); 98 } 99 bkpt(); 100 System.out.println("Goodbye from ClassesByName2Targ!"); 101 } 102 } 103 104 /********** test program **********/ 105 106 public class ClassesByName2Test extends TestScaffold { 107 volatile boolean stop = false; 108 109 ClassesByName2Test (String args[]) { 110 super(args); 111 } 112 113 public void breakpointReached(BreakpointEvent event) { 114 System.out.println("Got BreakpointEvent: " + event); 115 stop = true; 116 } 117 118 public void eventSetComplete(EventSet set) { 119 // Don't resume. 120 } 121 122 public static void main(String[] args) throws Exception { 123 new ClassesByName2Test(args).startTests(); 124 } 125 126 void breakpointAtMethod(ReferenceType ref, String methodName) 127 throws Exception { 128 List meths = ref.methodsByName(methodName); 129 if (meths.size() != 1) { 130 throw new Exception("test error: should be one " + 131 methodName); 132 } 133 Method meth = (Method)meths.get(0); 134 BreakpointRequest bkptReq = vm().eventRequestManager(). 135 createBreakpointRequest(meth.location()); 136 bkptReq.enable(); 137 try { 138 addListener (this); 139 } catch (Exception ex){ 140 ex.printStackTrace(); 141 failure("failure: Could not add listener"); 142 throw new Exception("ClassesByname2Test: failed"); 143 } 144 } 145 146 protected void runTests() throws Exception { 147 BreakpointEvent bpe = startToMain("ClassesByName2Targ"); 148 149 /* 150 Bug 6263966 - Don't just resume because the debuggee can 151 complete and disconnect while the following loop is 152 accessing it. 153 */ 154 breakpointAtMethod(bpe.location().declaringType(), "bkpt"); 155 vm().resume(); 156 157 /* The test of 'stop' is so that we stop when the debuggee hits 158 the bkpt. The 150 is so we stop if the debuggee 159 is slow (eg, -Xcomp -server) - we don't want to 160 spend all day waiting for it to get to the bkpt. 161 */ 162 for (int i = 0; i < 150 && !stop; i++) { 163 List all = vm().allClasses(); 164 System.out.println("\n++++ Lookup number: " + i + ". allClasses() returned " + 165 all.size() + " classes."); 166 for (Iterator it = all.iterator(); it.hasNext(); ) { 167 ReferenceType cls = (ReferenceType)it.next(); 168 String name = cls.name(); 169 List found = vm().classesByName(name); 170 if (found.contains(cls)) { 171 //System.out.println("Found class: " + name); 172 } else { 173 System.out.println("CLASS NOT FOUND: " + name); 174 throw new Exception("CLASS NOT FOUND (by classesByName): " + 175 name); 176 } 177 } 178 } 179 180 // In case of a slow debuggee, we don't want to resume the debuggee and wait 181 // for it to complete. 182 vm().exit(0); 183 184 /* 185 * deal with results of test 186 * if anything has called failure("foo") testFailed will be true 187 */ 188 if (!testFailed) { 189 println("ClassesByName2Test: passed"); 190 } else { 191 throw new Exception("ClassesByName2Test: failed"); 192 } 193 } 194 }