/**
* Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.debug.ui;
import java.io.ByteArrayInputStream;
import java.util.HashSet;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IVariable;
import org.python.pydev.debug.model.PyDebugTarget;
import org.python.pydev.debug.model.PyVariable;
import org.python.pydev.debug.ui.actions.PyBreakpointRulerAction;
import org.python.pydev.editor.PyEdit;
import org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractWorkbenchTestCase;
import org.python.pydev.editorinput.PyOpenEditor;
public class DebuggerTestWorkbench extends AbstractWorkbenchTestCase {
/**
* File used to debug
*/
private IFile debugFile;
/**
* The editor that'll be created on debug
*/
private PyEdit debugEditor;
/**
* Only true when the test finishes without exceptions.
*/
private boolean finished = false;
private String currentStep = "<unspecified>";
private DebuggerTestUtils debuggerTestUtils;
/**
* Creates the debug file and editor.
*/
@Override
protected void setUp() throws Exception {
super.setUp();
debugFile = initFile.getParent().getFile(new Path("debug_file.py"));
String mod1Contents = "from pack1.pack2 import mod1\nprint mod1\nprint 'now'\n";
debugFile.create(new ByteArrayInputStream(mod1Contents.getBytes()), true, null);
debugFile.refreshLocal(IResource.DEPTH_ZERO, null);
debugEditor = (PyEdit) PyOpenEditor.doOpenEditor(debugFile);
debuggerTestUtils = new DebuggerTestUtils(debugEditor);
}
/**
* Removes the debug file and closes the debug editor
*/
@Override
protected void tearDown() throws Exception {
super.tearDown();
if (debugFile != null) {
debugFile.delete(true, null);
}
if (debugEditor != null) {
debugEditor.close(false);
}
}
/**
* In this test, a thread is started and then we wait on a busy loop until the thread finishes with the tests.
*/
public void testDebugger() throws Exception {
//start the thread that'll do the test
threadTest.start();
//wait on a busy loop until the test is finished or an exception is thrown.
goToManual(DebuggerTestUtils.TOTAL_TIME_FOR_TESTS,
new org.python.pydev.shared_core.callbacks.ICallback<Boolean, Object>() {
@Override
public Boolean call(Object arg) {
return finished || debuggerTestUtils.failException != null;
}
});
//Make it fail if we encountered some problem
if (debuggerTestUtils.failException != null) {
debuggerTestUtils.failException.printStackTrace();
fail("Current Step: " + currentStep + "\n" + debuggerTestUtils.failException.getMessage());
}
if (!finished) {
if (debuggerTestUtils.failException == null) {
fail("Current Step: " + currentStep + "\nThe test didn't finish in the available time: "
+ DebuggerTestUtils.TOTAL_TIME_FOR_TESTS / 1000 + " secs.");
}
}
}
/**
* This is the thread that'll make the test.
*/
Thread threadTest = new Thread() {
@Override
public void run() {
try {
currentStep = "launchEditorInDebug";
//make a launch for debugging
debuggerTestUtils.launchEditorInDebug();
//switch to debug perspective, because otherwise, when we hit a breakpoint it'll ask if we want to show it.
debuggerTestUtils.switchToPerspective("org.eclipse.debug.ui.DebugPerspective");
PyBreakpointRulerAction createAddBreakPointAction = debuggerTestUtils.createAddBreakPointAction(
1);
createAddBreakPointAction.run();
currentStep = "waitForLaunchAvailable";
ILaunch launch = debuggerTestUtils.waitForLaunchAvailable();
PyDebugTarget target = (PyDebugTarget) debuggerTestUtils.waitForDebugTargetAvailable(launch);
currentStep = "waitForSuspendedThread";
IThread suspendedThread = debuggerTestUtils.waitForSuspendedThread(target);
assertTrue(suspendedThread.getName().startsWith("MainThread"));
IStackFrame topStackFrame = suspendedThread.getTopStackFrame();
assertTrue("Was not expecting: " + topStackFrame.getName(),
topStackFrame.getName().indexOf("debug_file.py:2") != 0);
IVariable[] variables = topStackFrame.getVariables();
HashSet<String> varNames = new HashSet<String>();
for (IVariable variable : variables) {
PyVariable var = (PyVariable) variable;
varNames.add(var.getName());
}
HashSet<String> expected = new HashSet<String>();
expected.add("Globals");
expected.add("__doc__");
expected.add("__file__");
expected.add("__name__");
expected.add("mod1");
assertEquals(expected, varNames);
assertTrue(target.canTerminate());
target.terminate();
finished = true;
} catch (Throwable e) {
debuggerTestUtils.failException = e;
}
}
};
}