1 /*
   2  * Copyright (c) 1999, 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 4248728
  27  *  @summary Test ReferenceType.allLineLocations
  28  *  @author Gordon Hirsch
  29  *
  30  *  @modules jdk.jdi
  31  *  @run build JDIScaffold VMConnection
  32  *  @run compile -g RefTypes.java
  33  *  @run build AllLineLocations
  34  *
  35  *  @run driver AllLineLocations RefTypes
  36  */
  37 import com.sun.jdi.*;
  38 import com.sun.jdi.event.*;
  39 import com.sun.jdi.request.*;
  40 
  41 import java.util.List;
  42 
  43 public class AllLineLocations extends JDIScaffold {
  44     final String[] args;
  45 
  46     public static void main(String args[]) throws Exception {
  47         new AllLineLocations(args).startTests();
  48     }
  49 
  50     AllLineLocations(String args[]) {
  51         super();
  52         this.args = args;
  53     }
  54 
  55     protected void runTests() throws Exception {
  56         connect(args);
  57         waitForVMStart();
  58 
  59         /*
  60          * Get to a point where the classes are loaded.
  61          */
  62         BreakpointEvent bp = resumeTo("RefTypes", "loadClasses", "()V");
  63         stepOut(bp.thread());
  64 
  65         /*
  66          * These classes should have no line numbers, except for
  67          * one in the implicit constructor.
  68          */
  69         ReferenceType rt = findReferenceType("AllAbstract");
  70         if (rt == null) {
  71             throw new Exception("AllAbstract: not loaded");
  72         }
  73         List list = rt.allLineLocations();
  74         if (list.size() != 1) {
  75             throw new Exception("AllAbstract: incorrect number of line locations");
  76         }
  77         if (rt.locationsOfLine(5000).size() != 0) {
  78             throw new Exception("AllAbstract: incorrect locationsOfLine");
  79         }
  80         Method method = findMethod(rt, "<init>", "()V");
  81         if (method == null) {
  82             throw new Exception("AllAbstract.<init> not found");
  83         }
  84         List list2 = method.allLineLocations();
  85         if (!list2.equals(list)) {
  86             throw new Exception("AllAbstract: line locations in wrong method");
  87         }
  88         if (method.locationsOfLine(5000).size() != 0) {
  89             throw new Exception("AllAbstract: incorrect locationsOfLine");
  90         }
  91         System.out.println("AllAbstract: passed");
  92 
  93         rt = findReferenceType("AllNative");
  94         if (rt == null) {
  95             throw new Exception("AllNative: not loaded");
  96         }
  97         list = rt.allLineLocations();
  98         if (list.size() != 1) {
  99             throw new Exception("AllNative: incorrect number of line locations");
 100         }
 101         if (rt.locationsOfLine(5000).size() != 0) {
 102             throw new Exception("AllNative: incorrect locationsOfLine");
 103         }
 104         method = findMethod(rt, "<init>", "()V");
 105         if (method == null) {
 106             throw new Exception("AllNative.<init> not found");
 107         }
 108         list2 = method.allLineLocations();
 109         if (!list2.equals(list)) {
 110             throw new Exception("AllNative: line locations in wrong method");
 111         }
 112         if (method.locationsOfLine(5000).size() != 0) {
 113             throw new Exception("AllNative: incorrect locationsOfLine");
 114         }
 115         System.out.println("AllNative: passed");
 116 
 117         rt = findReferenceType("Interface");
 118         if (rt == null) {
 119             throw new Exception("Interface: not loaded");
 120         }
 121         list = rt.allLineLocations();
 122         if (list.size() != 0) {
 123             throw new Exception("Interface: locations reported for abstract methods");
 124         }
 125         System.out.println("Interface: passed");
 126 
 127         /*
 128          * These classes have line numbers in one method and
 129          * in the implicit constructor.
 130          */
 131         rt = findReferenceType("Abstract");
 132         if (rt == null) {
 133             throw new Exception("Abstract: not loaded");
 134         }
 135         list = rt.allLineLocations();
 136         if (list.size() != 5) {
 137             throw new Exception("Abstract: incorrect number of line locations");
 138         }
 139         method = findMethod(rt, "b", "()V");
 140         if (method == null) {
 141             throw new Exception("Abstract.b not found");
 142         }
 143         list2 = method.allLineLocations();
 144         list.removeAll(list2);
 145 
 146         // Remaining location should be in constructor
 147         if ((list.size() != 1) ||
 148             !(((Location)list.get(0)).method().name().equals("<init>"))) {
 149             throw new Exception("Abstract: line locations in wrong method");
 150         }
 151         if (method.locationsOfLine(20).size() != 1) {
 152             throw new Exception("Abstract method: incorrect locationsOfLine");
 153         }
 154         if (method.locationsOfLine(5000).size() != 0) {
 155             throw new Exception("Abstract method: incorrect locationsOfLine");
 156         }
 157         method = findMethod(rt, "a", "()V");
 158         if (method.locationsOfLine(5000).size() != 0) {
 159             throw new Exception("Abstract method: incorrect locationsOfLine");
 160         }
 161         System.out.println("Abstract: passed");
 162 
 163         rt = findReferenceType("Native");
 164         if (rt == null) {
 165             throw new Exception("Native: not loaded");
 166         }
 167         list = rt.allLineLocations();
 168         if (list.size() != 5) {
 169             throw new Exception("Native: incorrect number of line locations");
 170         }
 171         if (rt.locationsOfLine(5000).size() != 0) {
 172             throw new Exception("Native: incorrect locationsOfLine");
 173         }
 174         method = findMethod(rt, "b", "()V");
 175         if (method == null) {
 176             throw new Exception("Native.b not found");
 177         }
 178         list2 = method.allLineLocations();
 179         list.removeAll(list2);
 180 
 181         // Remaining location should be in constructor
 182         if ((list.size() != 1) ||
 183             !(((Location)list.get(0)).method().name().equals("<init>"))) {
 184             throw new Exception("Native: line locations in wrong method");
 185         }
 186         if (method.locationsOfLine(30).size() != 1) {
 187             throw new Exception("Native method: incorrect locationsOfLine");
 188         }
 189         if (method.locationsOfLine(5000).size() != 0) {
 190             throw new Exception("Native method: incorrect locationsOfLine");
 191         }
 192         method = findMethod(rt, "a", "()V");
 193         if (method.locationsOfLine(5000).size() != 0) {
 194             throw new Exception("Native method: incorrect locationsOfLine");
 195         }
 196         System.out.println("Native: passed");
 197 
 198         rt = findReferenceType("AbstractAndNative");
 199         if (rt == null) {
 200             throw new Exception("AbstractAndNative: not loaded");
 201         }
 202         list = rt.allLineLocations();
 203         if (list.size() != 5) {
 204             throw new Exception("AbstractAndNative: incorrect number of line locations");
 205         }
 206         if (rt.locationsOfLine(5000).size() != 0) {
 207             throw new Exception("AbstractAndNative: incorrect locationsOfLine");
 208         }
 209         method = findMethod(rt, "c", "()V");
 210         if (method == null) {
 211             throw new Exception("AbstractAndNative.c not found");
 212         }
 213         list2 = method.allLineLocations();
 214         list.removeAll(list2);
 215 
 216         // Remaining location should be in constructor
 217         if ((list.size() != 1) ||
 218             !(((Location)list.get(0)).method().name().equals("<init>"))) {
 219             throw new Exception("AbstractAndNative: line locations in wrong method");
 220         }
 221         System.out.println("AbstractAndNative: passed");
 222 
 223         // Allow application to complete
 224         resumeToVMDeath();
 225     }
 226 }