Files
clang-p2996/lldb/test/API/tools/lldb-dap/send-event/TestDAP_sendEvent.py
John Harrison 0e0b501bf5 [lldb-dap] Take two at refactoring the startup sequence. (#140331)
This is more straight forward refactor of the startup sequence that
reverts parts of ba29e60f9a. Unlike my
previous attempt, I ended up removing the pending request queue and not
including an `AsyncReqeustHandler` because I don't think we actually
need that at the moment.

The key is that during the startup flow there are 2 parallel operations
happening in the DAP that have different triggers.

* The `initialize` request is sent and once the response is received the
`launch` or `attach` is sent.
* When the `initialized` event is recieved the `setBreakpionts` and
other config requests are made followed by the `configurationDone`
event.

I moved the `initialized` event back to happen in the `PostRun` of the
`launch` or `attach` request handlers. This ensures that we have a valid
target by the time the configuration calls are made. I added also added
a few extra validations that to the `configurationeDone` handler to
ensure we're in an expected state.

I've also fixed up the tests to match the new flow. With the other
additional test fixes in 087a5d2ec7 I
think we've narrowed down the main source of test instability that
motivated the startup sequence change.
2025-05-16 19:28:34 -07:00

68 lines
2.1 KiB
Python

"""
Test lldb-dap send-event integration.
"""
import json
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
import lldbdap_testcase
class TestDAP_sendEvent(lldbdap_testcase.DAPTestCaseBase):
@skipIfWindows
def test_send_event(self):
"""
Test sending a custom event.
"""
program = self.getBuildArtifact("a.out")
source = "main.c"
breakpoint_line = line_number(source, "// breakpoint")
custom_event_body = {
"key": 321,
"arr": [True],
}
self.build_and_launch(
program,
stopCommands=[
"lldb-dap send-event my-custom-event-no-body",
"lldb-dap send-event my-custom-event '{}'".format(
json.dumps(custom_event_body)
),
],
)
self.set_source_breakpoints(source, [breakpoint_line])
self.continue_to_next_stop()
custom_event = self.dap_server.wait_for_event(
filter=["my-custom-event-no-body"]
)
self.assertEqual(custom_event["event"], "my-custom-event-no-body")
self.assertIsNone(custom_event.get("body", None))
custom_event = self.dap_server.wait_for_event(filter=["my-custom-event"])
self.assertEqual(custom_event["event"], "my-custom-event")
self.assertEqual(custom_event["body"], custom_event_body)
@skipIfWindows
def test_send_internal_event(self):
"""
Test sending an internal event produces an error.
"""
program = self.getBuildArtifact("a.out")
source = "main.c"
self.build_and_launch(program)
breakpoint_line = line_number(source, "// breakpoint")
self.set_source_breakpoints(source, [breakpoint_line])
self.continue_to_next_stop()
resp = self.dap_server.request_evaluate(
"`lldb-dap send-event stopped", context="repl"
)
self.assertRegex(
resp["body"]["result"],
r"Invalid use of lldb-dap send-event, event \"stopped\" should be handled by lldb-dap internally.",
)