This is more straight forward refactor of the startup sequence that reverts parts ofba29e60f9a. 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 in087a5d2ec7I think we've narrowed down the main source of test instability that motivated the startup sequence change.
68 lines
2.1 KiB
Python
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.",
|
|
)
|