1/* 2 * Copyright (c) 2013, 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 * @summary Test stepping through lambdas 27 * @author Staffan Larsen 28 * 29 * @run build TestScaffold VMConnection TargetListener TargetAdapter 30 * @run compile -g LambdaStepTest.java 31 * @run driver LambdaStepTest 32 */ 33import com.sun.jdi.LocalVariable; 34import com.sun.jdi.ObjectReference; 35import com.sun.jdi.ReferenceType; 36import com.sun.jdi.StackFrame; 37import com.sun.jdi.StringReference; 38import com.sun.jdi.ThreadReference; 39import com.sun.jdi.event.BreakpointEvent; 40import com.sun.jdi.event.StepEvent; 41 42 /********** target program **********/ 43 44interface DefaultTest { 45 default void defaultMethod() { 46 String from = "default"; 47 System.out.println("Hello from " + from); 48 } 49} 50class LambdaStepTestTarg implements DefaultTest { 51 private void test() { 52 String from = "test"; 53 System.out.println("Hello from " + from); 54 } 55 private static void instanceTest() { 56 LambdaStepTestTarg l = new LambdaStepTestTarg(); 57 l.test(); 58 } 59 private static void lambdaTest() { 60 Runnable r = () -> { 61 String from = "lambda"; 62 System.out.println("Hello from " + from); 63 }; 64 r.run(); 65 } 66 private static void defaultTest() { 67 LambdaStepTestTarg l = new LambdaStepTestTarg(); 68 l.defaultMethod(); 69 } 70 public static void main(String[] args) { 71 instanceTest(); 72 lambdaTest(); 73 defaultTest(); 74 System.out.println("Goodbye from LambdaStepTestTarg!"); 75 } 76} 77 78 79 /********** test program **********/ 80 81public class LambdaStepTest extends TestScaffold { 82 LambdaStepTest (String args[]) { 83 super(args); 84 } 85 86 public static void main(String[] args) 87 throws Exception 88 { 89 new LambdaStepTest (args).startTests(); 90 } 91 92 /********** test core **********/ 93 94 protected void runTests() 95 throws Exception 96 { 97 // ## Normal instance method 98 99 BreakpointEvent bpe = startTo("LambdaStepTestTarg", "instanceTest", "()V"); 100 ThreadReference thread = bpe.thread(); 101 102 // step over allocation 103 StepEvent se = stepOverLine(thread); 104 System.out.println(se.thread().frame(0)); 105 106 // step into test(); 107 se = stepIntoLine(thread); 108 System.out.println(se.thread().frame(0)); 109 110 // step over variable initialization 111 se = stepOverLine(thread); 112 System.out.println(se.thread().frame(0)); 113 114 // get value of variable "from" 115 StackFrame frame = se.thread().frame(0); 116 LocalVariable lv = frame.visibleVariableByName("from"); 117 System.out.println(lv); 118 StringReference sr = (StringReference) frame.getValue(lv); 119 if (!sr.value().equals("test")) { 120 throw new Exception("Unexpected variable value in instanceTest: "+sr.value()); 121 } 122 123 124 // ## Lambda method 125 126 bpe = resumeTo("LambdaStepTestTarg", "lambdaTest", "()V"); 127 thread = bpe.thread(); 128 129 // step over allocation 130 se = stepOverLine(thread); 131 System.out.println(se.thread().frame(0)); 132 133 // step into run() of the lambda 134 se = stepIntoLine(thread); 135 System.out.println(se.thread().frame(0)); 136 137 // step over variable initialization 138 se = stepOverLine(thread); 139 System.out.println(se.thread().frame(0)); 140 141 // get value of variable "from" 142 frame = se.thread().frame(0); 143 lv = frame.visibleVariableByName("from"); 144 System.out.println(lv); 145 sr = (StringReference) frame.getValue(lv); 146 if (!sr.value().equals("lambda")) { 147 throw new Exception("Unexpected variable value in lambdaTest: "+sr.value()); 148 } 149 150 151 // ## Default method 152 153 bpe = resumeTo("LambdaStepTestTarg", "defaultTest", "()V"); 154 thread = bpe.thread(); 155 156 // step over allocation 157 se = stepOverLine(thread); 158 System.out.println(se.thread().frame(0)); 159 160 // step into defaultMethod() 161 se = stepIntoLine(thread); 162 System.out.println(se.thread().frame(0)); 163 164 // step over variable initialization 165 se = stepOverLine(thread); 166 System.out.println(se.thread().frame(0)); 167 168 // get value of variable "from" 169 frame = se.thread().frame(0); 170 lv = frame.visibleVariableByName("from"); 171 System.out.println(lv); 172 sr = (StringReference) frame.getValue(lv); 173 if (!sr.value().equals("default")) { 174 throw new Exception("Unexpected variable value in lambdaTest: "+sr.value()); 175 } 176 177 178 /* 179 * resume the target listening for events 180 */ 181 listenUntilVMDisconnect(); 182 183 } 184} 185