blob: 5aaa3406afc130c71961af2e131ca83b3f263ffa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.api.debugger.jpda;
import junit.framework.Test;
import org.netbeans.api.debugger.ActionsManager;
import org.netbeans.api.debugger.ActionsManagerListener;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.junit.NbTestCase;
/**
* Tests JPDA stepping actions: step in, step out and step over.
*
* @author Maros Sandor, Jan Jancura
*/
public class AsynchStepTest extends NbTestCase {
private DebuggerManager dm = DebuggerManager.getDebuggerManager ();
private String sourceRoot = System.getProperty ("test.dir.src");
private JPDASupport support;
public AsynchStepTest (String s) {
super (s);
}
public static Test suite() {
return JPDASupport.createTestSuite(AsynchStepTest.class);
}
public void testStepOver () throws Exception {
try {
JPDASupport.removeAllBreakpoints ();
Utils.BreakPositions bp = Utils.getBreakPositions(sourceRoot +
"org/netbeans/api/debugger/jpda/testapps/AsynchStepApp.java");
LineBreakpoint lb = bp.getLineBreakpoints().get(0);
dm.addBreakpoint (lb);
support = JPDASupport.attach
("org.netbeans.api.debugger.jpda.testapps.AsynchStepApp");
support.waitState (JPDADebugger.STATE_STOPPED);
assertEquals("Breakpoint "+lb+" is invalid, message: "+lb.getValidityMessage(), LineBreakpoint.VALIDITY.VALID, lb.getValidity());
dm.removeBreakpoint (lb);
assertNotNull("No Current Thread.", support.getDebugger ().getCurrentThread());
assertNotNull("No Current Call Stack Frame.", support.getDebugger ().getCurrentCallStackFrame());
assertEquals (
"Execution stopped in wrong class",
support.getDebugger ().getCurrentCallStackFrame ().
getClassName (),
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp"
);
int line = lb.getLineNumber();
assertEquals (
"Execution stopped at wrong line",
line,
support.getDebugger ().getCurrentCallStackFrame ().
getLineNumber (null)
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
++line
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
++line
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
++line
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
++line
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
++line
);
support.doContinue ();
support.waitState (JPDADebugger.STATE_DISCONNECTED);
} finally {
if (support != null) {
support.doFinish ();
}
}
}
public void testStepInto () throws Exception {
try {
JPDASupport.removeAllBreakpoints ();
Utils.BreakPositions bp = Utils.getBreakPositions(sourceRoot +
"org/netbeans/api/debugger/jpda/testapps/AsynchStepApp.java");
LineBreakpoint lb = bp.getLineBreakpoints().get(0);
dm.addBreakpoint (lb);
support = JPDASupport.attach
("org.netbeans.api.debugger.jpda.testapps.AsynchStepApp");
support.waitState (JPDADebugger.STATE_STOPPED);
dm.removeBreakpoint (lb);
assertEquals (
"Execution stopped in wrong class",
support.getDebugger ().getCurrentCallStackFrame ().
getClassName (),
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp"
);
int line = lb.getLineNumber();
assertEquals (
"Execution stopped at wrong line",
line,
support.getDebugger ().getCurrentCallStackFrame ().
getLineNumber (null)
);
stepCheck (
ActionsManager.ACTION_STEP_INTO,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Into1")
);
// stepCheck (ActionsManager.ACTION_STEP_INTO, "java.lang.Object", -1);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Over1")
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
line
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
line + 1
);
stepCheck (
ActionsManager.ACTION_STEP_INTO,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Into2")
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Over2")
);
stepCheck (
ActionsManager.ACTION_STEP_INTO,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Into3")
);
support.doContinue ();
support.waitState (JPDADebugger.STATE_DISCONNECTED);
} finally {
if (support != null) {
support.doFinish ();
}
}
}
public void testStepOut () throws Exception {
try {
JPDASupport.removeAllBreakpoints ();
Utils.BreakPositions bp = Utils.getBreakPositions(sourceRoot +
"org/netbeans/api/debugger/jpda/testapps/AsynchStepApp.java");
LineBreakpoint lb = bp.getLineBreakpoints().get(0);
dm.addBreakpoint (lb);
support = JPDASupport.attach
("org.netbeans.api.debugger.jpda.testapps.AsynchStepApp");
support.waitState (JPDADebugger.STATE_STOPPED);
dm.removeBreakpoint (lb);
assertEquals (
"Execution stopped in wrong class",
support.getDebugger ().getCurrentCallStackFrame ().
getClassName (),
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp"
);
int line = lb.getLineNumber();
assertEquals (
"Execution stopped at wrong line",
line,
support.getDebugger ().getCurrentCallStackFrame ().
getLineNumber (null)
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
line + 1
);
stepCheck (
ActionsManager.ACTION_STEP_INTO,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Into2")
);
stepCheck (
ActionsManager.ACTION_STEP_OVER,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Over2")
);
stepCheck (
ActionsManager.ACTION_STEP_INTO,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Into3")
);
stepCheck (
ActionsManager.ACTION_STEP_OUT,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
bp.getStopLine("Over2")
);
stepCheck (
ActionsManager.ACTION_STEP_OUT,
"org.netbeans.api.debugger.jpda.testapps.AsynchStepApp",
line + 1
);
support.doContinue ();
support.waitState (JPDADebugger.STATE_DISCONNECTED);
} finally {
if (support != null) {
support.doFinish ();
}
}
}
private void stepCheck (
final Object stepType,
String clsExpected,
int lineExpected
) {
final boolean[] waitLock = new boolean[] { false };
support.stepAsynch (stepType, new ActionsManagerListener() {
public void actionPerformed(Object action) {
if (stepType == action) {
synchronized (waitLock) {
waitLock[0] = true;
waitLock.notify();
}
}
}
public void actionStateChanged(Object action, boolean enabled) {
}
});
synchronized (waitLock) {
try {
waitLock.wait(10000);
} catch (InterruptedException iex) {
}
assertEquals("Asynchronous action did not notify...", true, waitLock[0]);
}
// The asynchronous action has finished, wait for the debugger to stop...
support.waitState (JPDADebugger.STATE_STOPPED);
assertEquals(
"Execution stopped in wrong class",
clsExpected,
support.getDebugger ().getCurrentCallStackFrame ().getClassName ()
);
assertEquals (
"Execution stopped at wrong line",
lineExpected,
support.getDebugger ().getCurrentCallStackFrame ().
getLineNumber (null)
);
}
}