/******************************************************************************* * Copyright (c) 2016 Till Brychcy and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Till Brychcy - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.debug.test.stepping; import org.eclipse.debug.core.model.ILineBreakpoint; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IVariable; import org.eclipse.jdt.debug.core.IJavaDebugTarget; import org.eclipse.jdt.debug.core.IJavaObject; import org.eclipse.jdt.debug.core.IJavaStackFrame; import org.eclipse.jdt.debug.core.IJavaThread; import org.eclipse.jdt.debug.core.IJavaValue; import org.eclipse.jdt.debug.tests.AbstractDebugTest; public class StepResultTests extends AbstractDebugTest { public StepResultTests(String name) { super(name); } public void testReturnValueAfterStepReturn() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp1 = createLineBreakpoint(28, "StepResult1"); bp1.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp1, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("h", stackFrame.getMethodName()); thread = stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); IVariable varInG = stackFrame.getVariables()[0]; assertEquals("h() returned", varInG.getName()); assertEquals("\"h-i\"", varInG.getValue().toString()); // skip the synthetic via a step filter. IJavaDebugTarget javaDebugTarget = (IJavaDebugTarget) stackFrame.getDebugTarget(); boolean oldStepFiltersEnabled = javaDebugTarget.isStepFiltersEnabled(); boolean oldFilterSynthetics = javaDebugTarget.isFilterSynthetics(); try { javaDebugTarget.setStepFiltersEnabled(true); javaDebugTarget.setFilterSynthetics(true); thread = stepReturn(stackFrame); } finally { javaDebugTarget.setStepFiltersEnabled(oldStepFiltersEnabled); javaDebugTarget.setFilterSynthetics(oldFilterSynthetics); } stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("f", stackFrame.getMethodName()); IVariable varInF = stackFrame.getVariables()[0]; assertEquals("access$0() returned", varInF.getName()); assertEquals("\"g-h-i-j\"", varInF.getValue().toString()); thread = stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("main", stackFrame.getMethodName()); IVariable varInMain1 = stackFrame.getVariables()[0]; assertEquals("f() returned", varInMain1.getName()); // test that running the thread a bit will clear the "f() returned" thread = stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("main", stackFrame.getMethodName()); IVariable varInMain2 = stackFrame.getVariables()[0]; assertEquals("no method return value", varInMain2.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * test that if the step return is aborted by some other break point, no return value of a recursive invocation is shown * * @throws Exception */ public void testNoReturnValueAfterAbortedStepReturn() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp2A = createLineBreakpoint(49, "StepResult1"); bp2A.setEnabled(true); ILineBreakpoint bp2B = createLineBreakpoint(50, "StepResult1"); bp2B.setEnabled(true); ILineBreakpoint bp2C = createLineBreakpoint(24, "StepResult1"); bp2C.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp2A, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("j", stackFrame.getMethodName()); // trigger stepReturn, but bp2B will be hit. stackFrame.stepReturn(); resumeToLineBreakpoint(thread, bp2B); IStackFrame[] stackFrames = thread.getStackFrames(); stackFrame = (IJavaStackFrame) stackFrames[0]; assertEquals("j", stackFrame.getMethodName()); stackFrame = (IJavaStackFrame) stackFrames[1]; assertEquals("g", stackFrame.getMethodName()); // bp2C is at the target stack level of the stepReturn resumeToLineBreakpoint(thread, bp2C); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); IVariable varInH = stackFrame.getVariables()[0]; // specifically no "i() returned" must be present assertEquals("no method return value", varInH.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testNoReturnValueAfterStepReturnWithException() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp3A = createLineBreakpoint(41, "StepResult1"); bp3A.setEnabled(true); ILineBreakpoint bp3B = createLineBreakpoint(33, "StepResult1"); bp3B.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp3A, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("i", stackFrame.getMethodName()); stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("h", stackFrame.getMethodName()); IVariable varInH = stackFrame.getVariables()[0]; assertEquals("i() threw", varInH.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testReturnValueAfterStepReturnInStatic() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp4 = createLineBreakpoint(56, "StepResult1"); bp4.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp4, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("s", stackFrame.getMethodName()); thread = stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("main", stackFrame.getMethodName()); IVariable varInMain = stackFrame.getVariables()[0]; assertEquals("s() returned", varInMain.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testReturnValueAfterStepReturnViaInterface() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp5 = createLineBreakpoint(66, "StepResult1"); bp5.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp5, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("get", stackFrame.getMethodName()); thread = stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("testViaInterface", stackFrame.getMethodName()); IVariable varInMain = stackFrame.getVariables()[0]; assertEquals("get() returned", varInMain.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testHasExitedWithExceptionFor5BytesDistance() throws Exception { String typeName = "StepResult1"; ILineBreakpoint bp3 = createLineBreakpoint(41, "StepResult1"); bp3.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp3, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("i", stackFrame.getMethodName()); stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("h", stackFrame.getMethodName()); IVariable varInH = stackFrame.getVariables()[0]; assertEquals("i() threw", varInH.getName()); // will set the thread to running to get the toString result IJavaValue stringValue = ((IJavaObject) varInH.getValue()).sendMessage("toString", "()Ljava/lang/String;", null, thread, false); assertEquals("\"java.lang.RuntimeException: i\"", stringValue.toString()); // because the thread has run in between, check that after refreshing the stack, the thrown exception is still present IVariable varInH2 = stackFrame.getVariables()[0]; assertEquals("i() threw", varInH2.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testStepReturn_ExceptionWithFinallyAndEmptyCatch() throws Exception { String typeName = "StepResult2"; ILineBreakpoint bp6 = createLineBreakpoint(38, "StepResult2"); bp6.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp6, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("i", stackFrame.getMethodName()); stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // in finally clause assertEquals("g", stackFrame.getMethodName()); IVariable varInG = stackFrame.getVariables()[0]; assertEquals("i() threw", varInG.getName()); stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // after empty catch clause assertEquals("f", stackFrame.getMethodName()); IVariable varInF = stackFrame.getVariables()[0]; assertEquals("g() threw", varInF.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testStepOver_ExceptionWithFinallyAndEmptyCatch() throws Exception { String typeName = "StepResult2"; ILineBreakpoint bp6 = createLineBreakpoint(38, "StepResult2"); bp6.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp6, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("i", stackFrame.getMethodName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // in finally clause assertEquals("g", stackFrame.getMethodName()); IVariable varInG = stackFrame.getVariables()[0]; assertEquals("i() threw", varInG.getName()); stepOver(stackFrame); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // still in finally clause assertEquals("g", stackFrame.getMethodName()); IVariable varInG2 = stackFrame.getVariables()[0]; assertEquals("length() returned", varInG2.getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); // after empty catch clause assertEquals("f", stackFrame.getMethodName()); IVariable varInF = stackFrame.getVariables()[0]; assertEquals("g() threw", varInF.getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testStepOver() throws Exception { String typeName = "StepResult3"; ILineBreakpoint bp7 = createLineBreakpoint(22, "StepResult3"); bp7.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp7, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("f", stackFrame.getMethodName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("hashCode() returned", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("getClassLoader() returned", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("<init>() returned", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("newProxyInstance() returned", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("get() returned", stackFrame.getVariables()[0].getName()); assertEquals("\"hello from proxy\"", stackFrame.getVariables()[0].getValue().toString()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("h() returned", stackFrame.getVariables()[0].getName()); assertEquals("null", String.valueOf(stackFrame.getVariables()[0].getValue())); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g() returned", stackFrame.getVariables()[0].getName()); assertEquals("\"XXX\"", stackFrame.getVariables()[0].getValue().toString()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("main", stackFrame.getMethodName()); assertEquals("g() threw", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("println() returned", stackFrame.getVariables()[0].getName()); stepOver(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("currentTimeMillis() returned", stackFrame.getVariables()[0].getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } public void testStepInto() throws Exception { String typeName = "StepResult3"; ILineBreakpoint bp8 = createLineBreakpoint(31, "StepResult3"); bp8.setEnabled(true); IJavaThread thread = null; try { thread = launchToLineBreakpoint(typeName, bp8, false); IJavaStackFrame stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("f", stackFrame.getMethodName()); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("f", stackFrame.getMethodName()); assertEquals("g() returned", stackFrame.getVariables()[0].getName()); assertEquals("\"XXX\"", stackFrame.getVariables()[0].getValue().toString()); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("f", stackFrame.getMethodName()); assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("<init>", stackFrame.getMethodName()); // constructor of Exception assertFalse(stackFrame.getVariables()[0].getName().contains("returned")); stepReturn(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("g", stackFrame.getMethodName()); assertEquals("<init>() returned", stackFrame.getVariables()[0].getName()); stepInto(stackFrame); stackFrame = (IJavaStackFrame) thread.getTopStackFrame(); assertEquals("main", stackFrame.getMethodName()); assertEquals("g() threw", stackFrame.getVariables()[0].getName()); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } }