blob: bb5e955679ad75bcdeeec64ad8fdb94af395bdad [file] [log] [blame]
/*
* 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");
}
}
}