Files
clang-p2996/lldb/test/API/tools/lldb-dap/commands/TestDAP_commands.py
Jordan Rupprecht e427e934f6 [lldb][dap] Avoid concurrent HandleCommand calls (#83162)
The `EventThreadFunction` can end up calling `HandleCommand`
concurrently with the main request processing thread. The underlying API
does not appear to be thread safe, so add a narrowly scoped mutex lock
to prevent calling it in this place from more than one thread.

Fixes #81686. Prior to this, TestDAP_launch.py is 4% flaky. After, it
passes in 1000 runs.
2024-02-27 12:43:05 -06:00

81 lines
3.2 KiB
Python

import os
import dap_server
import lldbdap_testcase
from lldbsuite.test import lldbtest, lldbutil
from lldbsuite.test.decorators import *
class TestDAP_commands(lldbdap_testcase.DAPTestCaseBase):
def test_command_directive_quiet_on_success(self):
program = self.getBuildArtifact("a.out")
command_quiet = (
"settings set target.show-hex-variable-values-with-leading-zeroes false"
)
command_not_quiet = (
"settings set target.show-hex-variable-values-with-leading-zeroes true"
)
self.build_and_launch(
program,
initCommands=["?" + command_quiet, command_not_quiet],
terminateCommands=["?" + command_quiet, command_not_quiet],
stopCommands=["?" + command_quiet, command_not_quiet],
exitCommands=["?" + command_quiet, command_not_quiet],
)
full_output = self.collect_console(duration=1.0)
self.assertNotIn(command_quiet, full_output)
self.assertIn(command_not_quiet, full_output)
def do_test_abort_on_error(
self,
use_init_commands=False,
use_launch_commands=False,
use_pre_run_commands=False,
use_post_run_commands=False,
):
program = self.getBuildArtifact("a.out")
command_quiet = (
"settings set target.show-hex-variable-values-with-leading-zeroes false"
)
command_abort_on_error = "settings set foo bar"
commands = ["?!" + command_quiet, "!" + command_abort_on_error]
self.build_and_launch(
program,
initCommands=commands if use_init_commands else None,
launchCommands=commands if use_launch_commands else None,
preRunCommands=commands if use_pre_run_commands else None,
postRunCommands=commands if use_post_run_commands else None,
expectFailure=True,
)
full_output = self.collect_console(duration=1.0)
self.assertNotIn(command_quiet, full_output)
self.assertIn(command_abort_on_error, full_output)
def test_command_directive_abort_on_error_init_commands(self):
self.do_test_abort_on_error(use_init_commands=True)
def test_command_directive_abort_on_error_launch_commands(self):
self.do_test_abort_on_error(use_launch_commands=True)
def test_command_directive_abort_on_error_pre_run_commands(self):
self.do_test_abort_on_error(use_pre_run_commands=True)
def test_command_directive_abort_on_error_post_run_commands(self):
self.do_test_abort_on_error(use_post_run_commands=True)
def test_command_directive_abort_on_error_attach_commands(self):
program = self.getBuildArtifact("a.out")
command_quiet = (
"settings set target.show-hex-variable-values-with-leading-zeroes false"
)
command_abort_on_error = "settings set foo bar"
self.build_and_create_debug_adaptor()
self.attach(
program,
attachCommands=["?!" + command_quiet, "!" + command_abort_on_error],
expectFailure=True,
)
full_output = self.collect_console(duration=1.0)
self.assertNotIn(command_quiet, full_output)
self.assertIn(command_abort_on_error, full_output)