diff --git a/python/testSrc/com/jetbrains/env/python/debug/PyBaseDebuggerTask.java b/python/testSrc/com/jetbrains/env/python/debug/PyBaseDebuggerTask.java index fd7c30d9e3e1..04f9d86f30a9 100644 --- a/python/testSrc/com/jetbrains/env/python/debug/PyBaseDebuggerTask.java +++ b/python/testSrc/com/jetbrains/env/python/debug/PyBaseDebuggerTask.java @@ -51,6 +51,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; /** * @author traff @@ -186,26 +187,33 @@ public abstract class PyBaseDebuggerTask extends PyExecutionFixtureTestTask { return convertToList(myDebugProcess.loadFrame()); } - protected String computeValueAsync(List debugValues, String name) throws PyDebuggerException { + protected String computeValueAsync(List debugValues, String name) throws PyDebuggerException, InterruptedException { final PyDebugValue debugValue = findDebugValueByName(debugValues, name); assert debugValue != null; Semaphore variableSemaphore = new Semaphore(0); + final ArrayList> valuesForEvaluation = createAsyncValue(debugValue, variableSemaphore); + myDebugProcess.loadAsyncVariablesValues(valuesForEvaluation); + if (!variableSemaphore.tryAcquire(NORMAL_TIMEOUT, TimeUnit.MILLISECONDS)) { + throw new PyDebuggerException("Timeout exceeded, failed to load variable: " + debugValue.getName()); + } + return debugValue.getValue(); + } + + public static ArrayList> createAsyncValue(PyDebugValue debugValue, Semaphore semaphore) { ArrayList> valuesForEvaluation = new ArrayList<>(); valuesForEvaluation.add(new PyFrameAccessor.PyAsyncValue<>(debugValue, new PyDebugCallback() { @Override public void ok(String value) { debugValue.setValue(value); - variableSemaphore.release(); + semaphore.release(); } @Override public void error(PyDebuggerException exception) { - variableSemaphore.release(); + semaphore.release(); } })); - myDebugProcess.loadAsyncVariablesValues(valuesForEvaluation); - XDebuggerTestUtil.waitFor(variableSemaphore, NORMAL_TIMEOUT); - return debugValue.getValue(); + return valuesForEvaluation; } public static List convertToList(XValueChildrenList childrenList) {