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 }