Python debugger tests added. Cidr debugger tests refactored.

This commit is contained in:
Dmitry Trofimov
2011-04-27 16:56:35 +04:00
parent a894e3a152
commit 69ad09be6b
6 changed files with 431 additions and 0 deletions
@@ -0,0 +1,33 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed 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 com.intellij.xdebugger;
import com.intellij.xdebugger.frame.XValue;
/**
* @author traff
*/
public abstract class XNamedValue extends XValue {
protected final String myName;
public XNamedValue(String name) {
myName = name;
}
public String getName() {
return myName;
}
}
@@ -0,0 +1,224 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed 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 com.intellij.xdebugger;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.UsefulTestCase;
import com.intellij.util.ui.UIUtil;
import com.intellij.xdebugger.breakpoints.XBreakpoint;
import com.intellij.xdebugger.breakpoints.XBreakpointManager;
import com.intellij.xdebugger.breakpoints.XBreakpointType;
import com.intellij.xdebugger.breakpoints.XLineBreakpointType;
import com.intellij.xdebugger.evaluation.XDebuggerEvaluator;
import com.intellij.xdebugger.frame.XExecutionStack;
import com.intellij.xdebugger.frame.XNavigatable;
import com.intellij.xdebugger.frame.XStackFrame;
import com.intellij.xdebugger.frame.XValue;
import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointImpl;
import com.intellij.xdebugger.ui.DebuggerIcons;
import junit.framework.Assert;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class XDebuggerTestUtil {
private static final int TIMEOUT = 25000;
private XDebuggerTestUtil() {
}
public static <B extends XBreakpoint<?>> void assertBreakpointValidity(Project project,
VirtualFile file,
int line,
boolean validity,
String errorMessage,
Class<? extends XBreakpointType<B, ?>> breakpointType) {
XLineBreakpointType type = (XLineBreakpointType)XDebuggerUtil.getInstance().findBreakpointType(breakpointType);
XBreakpointManager manager = XDebuggerManager.getInstance(project).getBreakpointManager();
XLineBreakpointImpl breakpoint = (XLineBreakpointImpl)manager.findBreakpointAtLine(type, file, line);
Assert.assertNotNull(breakpoint);
Assert.assertEquals(validity ? DebuggerIcons.VERIFIED_BREAKPOINT_ICON : DebuggerIcons.INVALID_BREAKPOINT_ICON, breakpoint.getIcon());
Assert.assertEquals(errorMessage, breakpoint.getErrorMessage());
}
public static void toggleBreakpoint(Project project, VirtualFile file, int line) {
XDebuggerUtil.getInstance().toggleLineBreakpoint(project, file, line);
}
public static void assertPosition(XSourcePosition pos, VirtualFile file, int line) {
Assert.assertNotNull(pos);
Assert.assertEquals(file, pos.getFile());
if (line != -1) Assert.assertEquals(line, pos.getLine());
}
public static void assertCurrentPosition(XDebugSession session, VirtualFile file, int line) {
assertPosition(session.getCurrentPosition(), file, line);
}
public static XExecutionStack getActiveThread(XDebugSession session) {
return session.getSuspendContext().getActiveExecutionStack();
}
public static List<XStackFrame> collectStacks(XDebugSession session) throws InterruptedException {
return collectStacks(getActiveThread(session));
}
public static List<XStackFrame> collectStacks(XExecutionStack thread, XDebugSession session) throws InterruptedException {
if (thread == null) thread = getActiveThread(session);
return collectStacks(thread);
}
public static List<XStackFrame> collectStacks(XExecutionStack thread) throws InterruptedException {
XTestStackFrameContainer container = new XTestStackFrameContainer();
thread.computeStackFrames(0, container);
return container.waitFor(TIMEOUT * 2).first;
}
public static Pair<XValue, String> evaluate(XDebugSession session, String expression) throws InterruptedException {
XDebuggerEvaluator evaluator = session.getCurrentStackFrame().getEvaluator();
XTestEvaluationCallback callback = new XTestEvaluationCallback();
evaluator.evaluate(expression, callback, session.getCurrentPosition());
return callback.waitFor(TIMEOUT);
}
public static void waitForSwing() throws InterruptedException, InvocationTargetException {
final com.intellij.util.concurrency.Semaphore s = new com.intellij.util.concurrency.Semaphore();
s.down();
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
s.up();
}
});
s.waitForUnsafe();
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
public void run() {
}
});
}
@NotNull
public static XValue findVar(Collection<XValue> vars, String name) {
for (XValue each : vars) {
if (each instanceof XNamedValue) {
if (((XNamedValue)each).getName().equals(name)) return each;
}
}
throw new AssertionError("var '" + name + "' not found");
}
public static XTestValueNode computePresentation(XValue value) throws InterruptedException {
XTestValueNode node = new XTestValueNode();
if (value instanceof XNamedValue) {
node.myName = ((XNamedValue)value).getName();
}
value.computePresentation(node);
Assert.assertTrue(node.waitFor(TIMEOUT));
return node;
}
public static void assertVariable(XValue var, String name, String type, String value, Boolean hasChildren) throws InterruptedException {
XTestValueNode node = computePresentation(var);
Assert.assertEquals(name, node.myName);
if (type != null) Assert.assertEquals(type, node.myType);
if (value != null) Assert.assertEquals(value, node.myValue);
if (hasChildren != null) Assert.assertEquals((boolean)hasChildren, node.myHasChildren);
}
public static void assertVariableValue(XValue var, String name, String value) throws InterruptedException {
assertVariable(var, name, null, value, null);
}
public static void assertVariableValue(Collection<XValue> vars, String name, String value) throws InterruptedException {
assertVariableValue(findVar(vars, name), name, value);
}
public static void assertVariableValueMatches(Collection<XValue> vars, String name, String valuePattern) throws InterruptedException {
assertVariableValueMatches(findVar(vars, name), name, valuePattern);
}
public static void assertVariableValueMatches(XValue var, String name, String valuePattern) throws InterruptedException {
XTestValueNode node = computePresentation(var);
Assert.assertEquals(name, node.myName);
Assert.assertTrue(node.myValue, node.myValue.matches(valuePattern));
}
public static void assertVariables(List<XValue> vars, String... names) throws InterruptedException {
List<String> expectedNames = new ArrayList<String>(Arrays.asList(names));
List<String> actualNames = new ArrayList<String>();
for (XValue each : vars) {
actualNames.add(computePresentation(each).myName);
}
Collections.sort(actualNames);
Collections.sort(expectedNames);
UsefulTestCase.assertOrderedEquals(actualNames, expectedNames);
}
public static void assertSourcePosition(final XValue value, VirtualFile file, int offset) {
final XTestNavigatable n = new XTestNavigatable();
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
value.computeSourcePosition(n);
}
});
Assert.assertNotNull(n.myPosition);
Assert.assertEquals(file, n.myPosition.getFile());
Assert.assertEquals(offset, n.myPosition.getOffset());
}
public static boolean waitFor(Semaphore semaphore, long timeoutInMillis) throws InterruptedException {
return semaphore.tryAcquire(timeoutInMillis, TimeUnit.MILLISECONDS);
}
public static void assertVariable(Collection<XValue> vars, String name, String type, String value, Boolean hasChildren)
throws InterruptedException {
assertVariable(findVar(vars, name), name, type, value, hasChildren);
}
public static class XTestStackFrameContainer extends XTestContainer<XStackFrame> implements XExecutionStack.XStackFrameContainer {
public void addStackFrames(@NotNull List<? extends XStackFrame> stackFrames, boolean last) {
addChildren(stackFrames, last);
}
public void errorOccured(String errorMessage) {
setErrorMessage(errorMessage);
}
}
public static class XTestNavigatable implements XNavigatable {
private XSourcePosition myPosition;
@Override
public void setSourcePosition(@Nullable XSourcePosition sourcePosition) {
myPosition = sourcePosition;
}
public XSourcePosition getPosition() {
return myPosition;
}
}
}
@@ -0,0 +1,20 @@
package com.intellij.xdebugger;
import com.intellij.xdebugger.frame.XCompositeNode;
import com.intellij.xdebugger.frame.XValue;
import com.intellij.xdebugger.frame.XValueChildrenList;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class XTestCompositeNode extends XTestContainer<XValue> implements XCompositeNode {
@Override
public void addChildren(@NotNull XValueChildrenList children, boolean last) {
final List<XValue> list = new ArrayList<XValue>();
for (int i = 0; i < children.size(); i++) {
list.add(children.getValue(i));
}
addChildren(list, last);
}
}
@@ -0,0 +1,58 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed 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 com.intellij.xdebugger;
import com.intellij.openapi.util.Pair;
import com.intellij.util.SmartList;
import com.intellij.xdebugger.frame.XDebuggerTreeNodeHyperlink;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.concurrent.Semaphore;
public class XTestContainer<T> {
private final List<T> myChildren = new SmartList<T>();
private String myErrorMessage;
private final Semaphore myFinished = new Semaphore(0);
public void addChildren(List<? extends T> children, boolean last) {
myChildren.addAll(children);
if (last) myFinished.release();
}
public void tooManyChildren(int remaining) {
myFinished.release();
}
public void setErrorMessage(@NotNull String errorMessage, @Nullable XDebuggerTreeNodeHyperlink link) {
setErrorMessage(errorMessage);
}
public void setErrorMessage(@NotNull String errorMessage) {
myErrorMessage = errorMessage;
myFinished.release();
}
public boolean isObsolete() {
return false;
}
public Pair<List<T>, String> waitFor(long timeout) throws InterruptedException {
XDebuggerTestUtil.waitFor(myFinished, timeout);
return new Pair<List<T>, String>(myChildren, myErrorMessage);
}
}
@@ -0,0 +1,31 @@
package com.intellij.xdebugger;
import com.intellij.openapi.util.Pair;
import com.intellij.xdebugger.frame.XValue;
import junit.framework.Assert;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.Semaphore;
public class XTestEvaluationCallback extends com.intellij.xdebugger.impl.ui.tree.nodes.XEvaluationCallbackBase {
private XValue myResult;
private String myErrorMessage;
private final Semaphore myFinished = new Semaphore(0);
@Override
public void evaluated(@NotNull XValue result) {
myResult = result;
myFinished.release();
}
@Override
public void errorOccurred(@NotNull String errorMessage) {
myErrorMessage = errorMessage;
myFinished.release();
}
public Pair<XValue, String> waitFor(long timeoutInMilliseconds) throws InterruptedException {
Assert.assertTrue(XDebuggerTestUtil.waitFor(myFinished, timeoutInMilliseconds));
return Pair.create(myResult, myErrorMessage);
}
}
@@ -0,0 +1,65 @@
package com.intellij.xdebugger;
import com.intellij.xdebugger.frame.XFullValueEvaluator;
import com.intellij.xdebugger.frame.XValueNode;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.concurrent.Semaphore;
public class XTestValueNode implements XValueNode {
public String myName;
public String myType;
public String myValue;
public boolean myHasChildren;
private final Semaphore myFinished = new Semaphore(0);
@Override
public void setPresentation(@Nullable Icon icon, @NonNls @Nullable String type, @NonNls @NotNull String value, boolean hasChildren) {
myType = type;
myValue = value;
myHasChildren = hasChildren;
myFinished.release();
}
@Override
public void setPresentation(@Nullable Icon icon,
@NonNls @Nullable String type,
@NonNls @NotNull String separator,
@NonNls @NotNull String value,
boolean hasChildren) {
setPresentation(icon, type, value, hasChildren);
}
public void setPresentation(@NonNls @NotNull String name,
@Nullable Icon icon,
@NonNls @Nullable String type,
@NonNls @NotNull String value,
boolean hasChildren) {
setPresentation(icon, type, value, hasChildren);
}
public void setPresentation(@NonNls @NotNull String name,
@Nullable Icon icon,
@NonNls @Nullable String type,
@NonNls @NotNull String separator,
@NonNls @NotNull String value,
boolean hasChildren) {
setPresentation(icon, type, value, hasChildren);
}
public void setFullValueEvaluator(@NotNull XFullValueEvaluator fullValueEvaluator) {
}
public boolean isObsolete() {
return false;
}
public boolean waitFor(long timeoutInMillis) throws InterruptedException {
return XDebuggerTestUtil.waitFor(myFinished, timeoutInMillis);
}
}