1 /** hard coded linenumbers in other tests - DO NOT CHANGE 2 * @test/nodynamiccopyright/ 3 * @bug 4490824 4 * @summary JDI: provide arguments when no debug attributes present 5 * 6 * @author jjh 7 * 8 * @run build TestScaffold VMConnection TargetListener TargetAdapter 9 * @run compile ArgumentValuesTest.java 10 * @run driver ArgumentValuesTest 11 */ 12 import com.sun.jdi.*; 13 import com.sun.jdi.event.*; 14 import com.sun.jdi.request.*; 15 16 import java.util.*; 17 18 /********** target program **********/ 19 20 class ArgumentValuesTarg { 21 static char s_char1 = 'a'; 22 static byte s_byte1 = (byte) 146; 23 static short s_short1 = (short) 28123; 24 static int s_int1 = 3101246; 25 static long s_long1 = 0x0123456789ABCDEFL; 26 static float s_float1 = 2.3145f; 27 static double s_double1 = 1.469d; 28 static int s_iarray1[] = {1, 2, 3}; 29 static int s_marray1[][] = {{1, 2, 3}, {3, 4, 5}, null, {6, 7}}; 30 static String s_sarray1[] = {"abc", null, "def", "ghi"}; 31 static String s_string1 = "abcdef"; 32 33 static String s_string2 = "xy"; 34 static String s_string3 = "wz"; 35 static List<Integer> intList; 36 37 public static void noArgs() { 38 int index = 0; // line 38 39 } 40 41 public static void allArgs(char p_char, byte p_byte, short p_short, 42 int p_int, long p_long, float p_float, 43 double p_double, int p_iarray[], int p_marray[][], 44 String p_sarray1[], String p_string) { 45 int index = 0; // line 45 46 } 47 48 public static void varArgs(String ... p1) { 49 int index = 0; // line 49 50 } 51 52 public static void genericArgs(List<Integer> p1) { 53 int index = 0; // line 53 54 } 55 56 public void instanceMethod(char p_char, byte p_byte) { 57 int index = 0; // line 57 58 } 59 60 public static void main(String[] args) { 61 System.out.println("Howdy!"); 62 allArgs( 63 s_char1, s_byte1, s_short1, s_int1, 64 s_long1, s_float1, s_double1, s_iarray1, 65 s_marray1, s_sarray1, s_string1); 66 67 noArgs(); 68 varArgs(s_string1, s_string2, s_string3); 69 ArgumentValuesTarg avt = new ArgumentValuesTarg(); 70 intList = new ArrayList<Integer>(10); 71 intList.add(10); 72 intList.add(20); 73 genericArgs(intList); 74 75 avt.instanceMethod(s_char1, s_byte1); 76 77 System.out.println("Goodbye from ArgumentValuesTarg!"); 78 } 79 } 80 81 /********** test program **********/ 82 83 public class ArgumentValuesTest extends TestScaffold { 84 // Must be in same order as args to allArgs(....) 85 String fieldNames[] = {"s_char1", "s_byte1", "s_short1", "s_int1", 86 "s_long1", "s_float1", "s_double1", "s_iarray1", 87 "s_marray1", "s_sarray1", "s_string1"}; 88 89 String fieldNamesVarArgs[] = {"s_string1", "s_string2", "s_string3"}; 90 String fieldNamesInstance[] = {"s_char1", "s_byte1"}; 91 92 ReferenceType targetClass; 93 ThreadReference mainThread; 94 95 ArgumentValuesTest (String args[]) { 96 super(args); 97 } 98 99 public static void main(String[] args) 100 throws Exception 101 { 102 new ArgumentValuesTest (args).startTests(); 103 } 104 105 /********** test core **********/ 106 107 protected void runTests() 108 throws Exception 109 { 110 /* 111 * Get to the top of main() to determine targetClass and mainThread 112 */ 113 BreakpointEvent bpe = startToMain("ArgumentValuesTarg"); 114 targetClass = bpe.location().declaringType(); 115 mainThread = bpe.thread(); 116 EventRequestManager erm = vm().eventRequestManager(); 117 118 119 { 120 System.out.println("----- Testing each type of arg"); 121 bpe = resumeTo("ArgumentValuesTarg", 45); 122 StackFrame frame = bpe.thread().frame(0); 123 124 Method mmm = frame.location().method(); 125 System.out.println("Arg types are: " + mmm.argumentTypeNames()); 126 127 List<Value> argVals = frame.getArgumentValues(); 128 129 if (argVals.size() != fieldNames.length) { 130 failure("failure: Varargs: expected length " + fieldNames.length + 131 " args, got: " + argVals); 132 } 133 for (int ii = 0; ii < argVals.size(); ii++) { 134 Value gotVal = argVals.get(ii); 135 136 Field theField = targetClass.fieldByName(fieldNames[ii]); 137 Value expectedVal = targetClass.getValue(theField); 138 System.out.println(fieldNames[ii] + ": gotVal = " + gotVal + 139 ", expected = " + expectedVal); 140 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass()); 141 if (!gotVal.equals(expectedVal)) { 142 failure(" failure: gotVal != expected"); 143 } 144 } 145 } 146 147 // a method with no params 148 { 149 System.out.println("----- Testing no args"); 150 bpe = resumeTo("ArgumentValuesTarg", 38); 151 StackFrame frame = bpe.thread().frame(0); 152 153 Method mmm = frame.location().method(); 154 System.out.println("Arg types are: " + mmm.argumentTypeNames()); 155 156 List<Value> argVals = frame.getArgumentValues(); 157 if (argVals.size() == 0) { 158 System.out.println("Empty arg list ok"); 159 } else { 160 failure("failure: Expected empty val list, got: " + argVals); 161 } 162 } 163 164 // var args. 3 Strings are passed in and they appear 165 // as a String[3] in the method. 166 { 167 System.out.println("----- Testing var args"); 168 bpe = resumeTo("ArgumentValuesTarg", 49); 169 StackFrame frame = bpe.thread().frame(0); 170 171 Method mmm = frame.location().method(); 172 System.out.println("Arg types are: " + mmm.argumentTypeNames()); 173 174 List<Value> argVals = frame.getArgumentValues(); 175 if (argVals.size() != 1) { 176 failure("failure: Varargs: expected one arg, got: " + argVals); 177 } 178 argVals = ((ArrayReference)argVals.get(0)).getValues(); 179 180 if (argVals.size() != fieldNamesVarArgs.length) { 181 failure("failure: Varargs: expected length " + fieldNamesVarArgs.length + 182 " array elements, got: " + argVals); 183 } 184 185 for (int ii = 0; ii < argVals.size(); ii++) { 186 Value gotVal = argVals.get(ii); 187 188 Field theField = targetClass.fieldByName(fieldNamesVarArgs[ii]); 189 Value expectedVal = targetClass.getValue(theField); 190 System.out.println(fieldNamesVarArgs[ii] + ": gotVal = " + gotVal + 191 ", expected = " + expectedVal); 192 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass()); 193 if (!gotVal.equals(expectedVal)) { 194 failure(" failure: gotVal != expected"); 195 } 196 } 197 } 198 199 // a method with with one generic param 200 { 201 System.out.println("----- Testing generic args"); 202 bpe = resumeTo("ArgumentValuesTarg", 53); 203 StackFrame frame = bpe.thread().frame(0); 204 205 Method mmm = frame.location().method(); 206 System.out.println("Arg types are: " + mmm.argumentTypeNames()); 207 208 List<Value> argVals = frame.getArgumentValues(); 209 if (argVals.size() != 1) { 210 failure("failure: Expected one arg, got: " + argVals); 211 } else { 212 Value gotVal = argVals.get(0); 213 214 Field theField = targetClass.fieldByName("intList"); 215 Value expectedVal = targetClass.getValue(theField); 216 System.out.println("intList " + ": gotVal = " + gotVal + 217 ", expected = " + expectedVal); 218 if (!gotVal.equals(expectedVal)) { 219 failure("failure: gotVal != expected"); 220 } 221 } 222 } 223 224 // test instance method call 225 { 226 System.out.println("----- Testing instance method call"); 227 bpe = resumeTo("ArgumentValuesTarg", 57); 228 StackFrame frame = bpe.thread().frame(0); 229 230 Method mmm = frame.location().method(); 231 System.out.println("Arg types are: " + mmm.argumentTypeNames()); 232 233 List<Value> argVals = frame.getArgumentValues(); 234 235 if (argVals.size() != fieldNamesInstance.length) { 236 failure("failure: Varargs: expected length " + fieldNamesInstance.length + 237 " args, got: " + argVals); 238 } 239 for (int ii = 0; ii < argVals.size(); ii++) { 240 Value gotVal = argVals.get(ii); 241 242 Field theField = targetClass.fieldByName(fieldNamesInstance[ii]); 243 Value expectedVal = targetClass.getValue(theField); 244 System.out.println(fieldNamesInstance[ii] + ": gotVal = " + gotVal + 245 ", expected = " + expectedVal); 246 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass()); 247 if (!gotVal.equals(expectedVal)) { 248 failure(" failure: gotVal != expected"); 249 } 250 } 251 } 252 253 254 /* 255 * resume the target listening for events 256 */ 257 listenUntilVMDisconnect(); 258 259 /* 260 * deal with results of test if anything has called failure("foo") 261 * testFailed will be true 262 */ 263 if (!testFailed) { 264 println("ArgumentValuesTest: passed"); 265 } else { 266 throw new Exception("ArgumentValuesTest: failed"); 267 } 268 } 269 }