1 /*
2  * Copyright (c) 2005, 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  *
26  *  @bug 6224700
27  *  @summary ReferenceType.nestedTypes() is too slow
28  *  @author jjh
29  *
30  *  @run build TestScaffold VMConnection TargetListener TargetAdapter
31  *  @run compile -g AnyDebuggeeTest.java
32  *  @run driver AnyDebuggeeeTest
33  *
34  *  This test is intended to be run manually to investigate behaviors;
35  *  it is not an actual test of any specific functionality, it just
36  *  allows you to run the debugger part of this test on any debuggee.
37  *  As set up, it prints the time to find all nested types and all
38  *  subclasses in the debuggee, and so can be used to verify the
39  *  fix for 6224700.
40  *
41  *  For other investigations, edit this test to do whatever you want.
42  *  To run this test do this:
43  *     runregress -no AnyDebuggeeTest <cmd line options>
44  *  where <cmd line options> are the options to be used to
45  *  launch the debuggee, with the classname prefixed with @@.
46  *  For example, this would run java2d demo as the debuggee:
47  *     runregress -no AnyDebuggeeTest -classpath $jdkDir/demo/jfc/Java2D/Java2Demo.jar \
48  *                                    -client @@java2d.Java2Demo'
49  * If <cmd line options> is not specified, then the AnyDebuggeeTarg class below
50  * is run as the debuggee.
51  */
52 import com.sun.jdi.*;
53 import com.sun.jdi.event.*;
54 import com.sun.jdi.request.*;
55 import javax.swing.*;
56 
57 import java.util.*;
58 
59 class AnyDebuggeeTarg {
main(String[] args)60     public static void main(String[] args){
61         System.out.println("Howdy!");
62         try {
63             javax.swing.UIManager.setLookAndFeel( javax.swing.UIManager.getSystemLookAndFeelClassName());
64         } catch( Throwable exc) {
65         }
66         JFrame f = new JFrame("JFrame");
67         try {
68             Thread.sleep(60000);
69         } catch (InterruptedException ee) {
70         }
71 
72         System.out.println("Goodbye from NestedClassesTarg!");
73     }
74 }
75 
76     /********** test program **********/
77 
78 public class AnyDebuggeeTest extends TestScaffold {
79     static String targetName = "AnyDebuggeeTarg";
80     ReferenceType targetClass;
81     ThreadReference mainThread;
82 
AnyDebuggeeTest(String args[])83     AnyDebuggeeTest(String args[]) {
84         super(args);
85     }
86 
main(String[] args)87     public static void main(String[] args)      throws Exception {
88         /*
89          * If args contains @@xxxx, then that is the
90          * name of the class we are to run.
91          */
92         for (int ii = 0; ii < args.length; ii ++) {
93             if (args[ii].startsWith("@@")) {
94                 targetName = args[ii] = args[ii].substring(2);
95             }
96         }
97         new AnyDebuggeeTest(args).startTests();
98     }
99 
100 
runTests()101     protected void runTests() throws Exception {
102         /*
103          * Get to the top of main()
104          * to determine targetClass and mainThread
105          */
106         BreakpointEvent bpe;
107         bpe = startToMain(targetName);
108 
109         targetClass = bpe.location().declaringType();
110         mainThread = bpe.thread();
111 
112         // Let debuggee run for awhile to get classes loaded
113         resumeForMsecs(20000);
114 
115         List<ReferenceType> allClasses = vm().allClasses();
116         System.out.println( allClasses.size() + " classes");
117 
118 
119         int size = 0;
120         long start = System.currentTimeMillis();
121         for(ReferenceType rt: allClasses) {
122             if (rt instanceof ClassType) {
123             List<ReferenceType> nested = rt.nestedTypes();
124             int sz = nested.size();
125             size += sz;
126         }
127         }
128         long end = System.currentTimeMillis();
129         System.out.println(size + " nested types took " + (end - start) + " ms");
130 
131         size = 0;
132         start = System.currentTimeMillis();
133         for(ReferenceType rt: allClasses) {
134             if (rt instanceof ClassType) {
135                 List<ClassType> subs = ((ClassType)rt).subclasses();
136                 int sz = subs.size();
137                 size += sz;
138             }
139         }
140         end = System.currentTimeMillis();
141         System.out.println(size + " subclasses took " + (end - start) + " ms");
142 
143         /*
144          * deal with results of test
145          * if anything has called failure("foo") testFailed will be true
146          */
147         if (!testFailed) {
148             println("AnyDebuggeeTest: passed");
149         } else {
150             throw new Exception("AnyDebuggeeTest: failed");
151         }
152     }
153 }
154