Files
openide/python/testSrc/com/jetbrains/env/debug/PythonDebuggerAsyncioTest.java
Egor.Eliseev c856c6ac33 PY-64544 Turn on "Asyncio support for the debugger" feature by default
Merge-request: IJ-MR-121622
Merged-by: Egor Eliseev <Egor.Eliseev@jetbrains.com>

GitOrigin-RevId: b4146183e0626c8ec78e22ae828349e34f53a9e2
2024-01-10 11:29:48 +00:00

203 lines
6.4 KiB
Java

// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.jetbrains.env.debug;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.xdebugger.XDebuggerTestUtil;
import com.jetbrains.env.EnvTestTagsRequired;
import com.jetbrains.env.PyEnvTestCase;
import com.jetbrains.python.run.AbstractPythonRunConfiguration;
import com.jetbrains.python.run.PythonRunConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.junit.Test;
public class PythonDebuggerAsyncioTest extends PyEnvTestCase {
private enum TestCase {
CONSOLE,
EVALUATE,
BREAKPOINT,
GATHER
}
private static class AsyncioPyDebuggerTask extends PyDebuggerTask {
private static final String ASYNCIO_ENV = "ASYNCIO_DEBUGGER_ENV";
private static final String RELATIVE_PATH = "/debug";
private static final String SIMPLE_SCRIPT_NAME = "test_asyncio_debugger.py";
private static final String GATHER_SCRIPT_NAME = "test_asyncio_gather_debugger.py";
private static final String AWAIT_FOO = "await foo(1)";
private static final String RUN_FOO = "asyncio.run(foo(1))";
private static final String RUN_FOO_WITH_LOOP = "loop.run_until_complete(foo(1))";
private static final String GET_EVENT_LOOP = "loop = asyncio.get_event_loop()";
private static final String RUN_UNTIL_COMPLETE = "asyncio.get_event_loop().run_until_complete(foo(1))";
private final TestCase myTestCase;
private AsyncioPyDebuggerTask(TestCase testCase, String scriptName) {
super(RELATIVE_PATH, scriptName);
myTestCase = testCase;
}
@Override
protected AbstractPythonRunConfiguration createRunConfiguration(@NotNull String sdkHome, @Nullable Sdk existingSdk) {
PythonRunConfiguration runConfiguration = (PythonRunConfiguration)super.createRunConfiguration(sdkHome, existingSdk);
runConfiguration.getEnvs().put(ASYNCIO_ENV, "True");
return runConfiguration;
}
protected void testConsole() throws Exception {
consoleExec(AWAIT_FOO);
waitForOutput("2");
consoleExec(RUN_FOO);
waitForOutput("2");
consoleExec(GET_EVENT_LOOP);
consoleExec(RUN_FOO_WITH_LOOP);
waitForOutput("2");
}
protected void testEvaluate() {
Variable await_foo = eval(AWAIT_FOO);
await_foo.hasValue("2");
Variable run_foo = eval(RUN_FOO);
run_foo.hasValue("2");
Variable loop_foo = eval(RUN_UNTIL_COMPLETE);
loop_foo.hasValue("2");
}
protected void testBreakpoints() throws Exception {
resume();
waitForOutput("2");
waitForTerminate();
}
protected void testGather() throws Exception {
for (int i = 0; i < 2; i++) {
if (i != 0) {
waitForPause();
}
testConsole();
testEvaluate();
resume();
}
}
@Override
public void testing() throws Exception {
waitForPause();
switch (myTestCase) {
case CONSOLE -> testConsole();
case EVALUATE -> testEvaluate();
case BREAKPOINT -> testBreakpoints();
case GATHER -> testGather();
}
}
@Override
public void before() {
switch (myTestCase) {
case CONSOLE, EVALUATE -> toggleBreakpoint(9);
case BREAKPOINT -> {
toggleBreakpoint(8);
toggleBreakpoint(9);
XDebuggerTestUtil.setBreakpointCondition(getProject(), 8, "await foo(1) == 2");
XDebuggerTestUtil.setBreakpointCondition(getProject(), 9, "await foo(1) != 2");
XDebuggerTestUtil.setBreakpointLogExpression(getProject(), 8, "await foo(1)");
}
case GATHER -> {
setWaitForTermination(false);
toggleBreakpoint(9);
XDebuggerTestUtil.setBreakpointCondition(getProject(), 9, "await foo(1) == 2");
}
}
setWaitForTermination(false);
}
@Override
public void after() throws Exception {
getRunConfiguration().getEnvs().remove(ASYNCIO_ENV);
}
}
@EnvTestTagsRequired(tags = "python3.8")
@Test
public void testAsyncioConsole38() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.CONSOLE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.9")
@Test
public void testAsyncioConsole39() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.CONSOLE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.10")
@Test
public void testAsyncioConsole310() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.CONSOLE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.8")
@Test
public void testAsyncioEvaluate38() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.EVALUATE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.9")
@Test
public void testAsyncioEvaluate39() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.EVALUATE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.10")
@Test
public void testAsyncioEvaluate310() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.EVALUATE, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.8")
@Test
public void testAsyncioBreakpoint38() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.BREAKPOINT, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.9")
@Test
public void testAsyncioBreakpoint39() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.BREAKPOINT, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.10")
@Test
public void testAsyncioBreakpoint310() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.BREAKPOINT, AsyncioPyDebuggerTask.SIMPLE_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.8")
@Test
public void testAsyncioGather38() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.GATHER, AsyncioPyDebuggerTask.GATHER_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.9")
@Test
public void testAsyncioGather39() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.GATHER, AsyncioPyDebuggerTask.GATHER_SCRIPT_NAME));
}
@EnvTestTagsRequired(tags = "python3.10")
@Test
public void testAsyncioGather310() {
runPythonTest(new AsyncioPyDebuggerTask(TestCase.GATHER, AsyncioPyDebuggerTask.GATHER_SCRIPT_NAME));
}
}