1 /*
   2  * Copyright (c) 2001, 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 4450091
  27  *  @summary Test ClassLoaderReference.visibleClasses() which is
  28  *  a direct pass-through of the JVMDI function GetClassLoaderClasses
  29  *  for inclusion of primitive arrays.
  30  *
  31  *  @author Robert Field
  32  *
  33  *  @run build TestScaffold VMConnection TargetListener TargetAdapter
  34  *  @run compile -g ClassLoaderClassesTest.java
  35  *  @run driver ClassLoaderClassesTest
  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 ClassLoaderClassesTarg {
  46     static int[] intArray = new int[10];
  47 
  48     static {
  49         // make sure our class loader "creates" int[] before tested
  50         intArray[1] = 99;
  51     }
  52 
  53     public static void main(String[] args){
  54         System.out.println("Goodbye from ClassLoaderClassesTarg!");
  55     }
  56 }
  57 
  58     /********** test program **********/
  59 
  60 public class ClassLoaderClassesTest extends TestScaffold {
  61     ReferenceType targetClass;
  62 
  63     ClassLoaderClassesTest (String args[]) {
  64         super(args);
  65     }
  66 
  67     public static void main(String[] args)      throws Exception {
  68         new ClassLoaderClassesTest(args).startTests();
  69     }
  70 
  71     /********** test assist **********/
  72 
  73     boolean findClass(String className) throws Exception {
  74         ClassLoaderReference cl = targetClass.classLoader();
  75         Iterator vci = cl.visibleClasses().iterator();
  76         while (vci.hasNext()) {
  77             ReferenceType rt = (ReferenceType)vci.next();
  78             println(rt.name() + " - " + rt.classLoader());
  79             if (rt.name().equals(className)) {
  80                 return true;
  81             }
  82         }
  83         return false;
  84     }
  85 
  86     /********** test core **********/
  87 
  88     protected void runTests() throws Exception {
  89         /*
  90          * Get to the top of main() to determine targetClass
  91          */
  92         BreakpointEvent bpe = startToMain("ClassLoaderClassesTarg");
  93         targetClass = bpe.location().declaringType();
  94 
  95         if (findClass("int[]")) {
  96             println("int[] found");
  97         } else {
  98             failure("failed - int[] not found");
  99         }
 100 
 101         // use it indirectly - throws ClassNotLoadedException on error
 102         Field arrayField = targetClass.fieldByName("intArray");
 103         ArrayType arrayType = (ArrayType)arrayField.type();
 104         println("Type for intArray is " + arrayType);
 105 
 106         /*
 107          * resume the target until end
 108          */
 109         listenUntilVMDisconnect();
 110 
 111         /*
 112          * deal with results of test
 113          * if anything has called failure("foo") testFailed will be true
 114          */
 115         if (!testFailed) {
 116             println("ClassLoaderClassesTest: passed");
 117         } else {
 118             throw new Exception("ClassLoaderClassesTest: failed");
 119         }
 120     }
 121 }