| /* |
| * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /** |
| * @test |
| * @summary Test Method.variables() and the like. |
| * @author Robert Field |
| * |
| * @run build JDIScaffold VMConnection |
| * @run compile -g Vars.java |
| * @run driver Vars |
| */ |
| |
| import com.sun.jdi.*; |
| import com.sun.jdi.event.*; |
| import java.util.*; |
| |
| /* |
| * This class is internal |
| */ |
| abstract class AbstractTestVars { |
| abstract float test1(String blah, int i); |
| native int test2(double k, boolean b); |
| String test3(short sh, long lo) { |
| String st = "roses"; |
| return st; |
| } |
| } |
| |
| /* |
| * This class is internal |
| */ |
| class TestVars extends AbstractTestVars { |
| float test1(String blah, int i) { |
| return (float)1.1; |
| } |
| |
| void hi() { |
| return; |
| } |
| |
| public static void main(String[] args) throws Exception { |
| new TestVars().hi(); |
| return; |
| } |
| } |
| |
| /* |
| * "Vars" test runs TestVars and makes LocalVariable queries |
| */ |
| public class Vars extends JDIScaffold { |
| final String[] args; |
| |
| boolean failed = false; |
| |
| Vars(String args[]) { |
| super(); |
| this.args = args; |
| } |
| |
| public static void main(String[] args) throws Exception { |
| new Vars(args).runTests(); |
| } |
| |
| static final int VARIABLES = 1; |
| static final int BYNAME = 2; |
| static final int ARGUMENTS = 3; |
| |
| String testCase(Method method, int which) { |
| try { |
| List vars; |
| switch (which) { |
| case VARIABLES: |
| vars = method.variables(); |
| break; |
| case BYNAME: |
| vars = method.variablesByName("st"); |
| break; |
| case ARGUMENTS: |
| vars = method.arguments(); |
| break; |
| default: |
| throw new InternalException("should not happen"); |
| } |
| StringBuffer sb = new StringBuffer(); |
| for (Iterator it = vars.iterator(); it.hasNext(); ) { |
| LocalVariable lv = (LocalVariable)it.next(); |
| if (sb.length() > 0) { |
| sb.append(","); |
| } |
| sb.append(lv.name()); |
| } |
| return sb.toString(); |
| } catch (Exception exc) { |
| String st = exc.getClass().getName(); |
| int inx = st.lastIndexOf('.'); |
| return st.substring(inx+1); |
| } |
| } |
| |
| /** |
| * Sets failed if fails. |
| */ |
| void test(Method method, int which, String name, String expected) { |
| String got = testCase(method, which); |
| if (got.equals(expected)) { |
| System.out.println(name + ": got expected: " + got); |
| } else { |
| failed = true; |
| System.out.println(name + ": ERROR expected: " + expected); |
| System.out.println(" got: " + got); |
| } |
| } |
| |
| void test2(Method method, int which, String name, String expected, String expected2) { |
| String got = testCase(method, which); |
| if (got.equals(expected) || got.equals(expected2)) { |
| System.out.println(name + ": got expected: " + got); |
| } else { |
| failed = true; |
| System.out.println(name + ": ERROR expected: " + expected); |
| System.out.println(" got: " + got); |
| } |
| } |
| |
| protected void runTests() throws Exception { |
| List argList = new ArrayList(Arrays.asList(args)); |
| argList.add("TestVars"); |
| System.out.println("run args: " + argList); |
| connect((String[])argList.toArray(args)); |
| waitForVMStart(); |
| |
| /* |
| * Get to a point where the classes are loaded. |
| */ |
| BreakpointEvent bp = resumeTo("TestVars", "hi", "()V"); |
| |
| /* |
| * These classes should have no line numbers, except for |
| * one in the implicit constructor. |
| */ |
| ReferenceType rt = findReferenceType("AbstractTestVars"); |
| if (rt == null) { |
| throw new Exception("AbstractTestVars: not loaded"); |
| } |
| Method method = findMethod(rt, "test1", "(Ljava/lang/String;I)F"); |
| if (method == null) { |
| throw new Exception("Method not found"); |
| } |
| test(method, VARIABLES, "abstract/variables", |
| "AbsentInformationException"); |
| test(method, BYNAME, "abstract/variablesByName", |
| "AbsentInformationException"); |
| test(method, ARGUMENTS, "abstract/arguments", |
| "AbsentInformationException"); |
| |
| method = findMethod(rt, "test2", "(DZ)I"); |
| if (method == null) { |
| throw new Exception("Method not found"); |
| } |
| test(method, VARIABLES, "native/variables", |
| "AbsentInformationException"); |
| test(method, BYNAME, "native/variablesByName", |
| "AbsentInformationException"); |
| test(method, ARGUMENTS, "native/arguments", |
| "AbsentInformationException"); |
| |
| method = findMethod(rt, "test3", "(SJ)Ljava/lang/String;"); |
| if (method == null) { |
| throw new Exception("Method not found"); |
| } |
| // javac can put these in whatever order it desires. hopper |
| // does it one way and mantis another. |
| test2(method, VARIABLES, "normal/variables", "sh,lo,st", "st,sh,lo"); |
| test(method, BYNAME, "normal/variablesByName", "st"); |
| test(method, ARGUMENTS, "normal/arguments", "sh,lo"); |
| |
| // Allow application to complete |
| resumeToVMDeath(); |
| |
| if (failed) { |
| throw new Exception("Vars: failed"); |
| } else { |
| System.out.println("Vars: passed"); |
| } |
| } |
| } |