blob: e8f3f0fbc3fd38ab63ec8b891d5c47e05fe3ceb3 [file]
"""
Test lldb-dap "port" configuration to "attach" request
"""
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbplatformutil
from lldbgdbserverutils import Pipe
import lldbdap_testcase
import lldb
@skip(bugnumber="https://github.com/llvm/llvm-project/issues/138803")
class TestDAP_attachByPortNum(lldbdap_testcase.DAPTestCaseBase):
def set_and_hit_breakpoint(self, continueToExit=True):
self.dap_server.wait_for_stopped()
source = "main.c"
breakpoint1_line = line_number(source, "// breakpoint 1")
lines = [breakpoint1_line]
# Set breakpoint in the thread function so we can step the threads
breakpoint_ids = self.set_source_breakpoints(source, lines)
self.assertEqual(
len(breakpoint_ids), len(lines), "expect correct number of breakpoints"
)
self.continue_to_breakpoints(breakpoint_ids)
if continueToExit:
self.continue_to_exit()
def get_debug_server_command_line_args(self):
args = []
if lldbplatformutil.getPlatform() == "linux":
args = ["gdbserver"]
if lldb.remote_platform:
args += ["*:0"]
else:
args += ["localhost:0"]
return args
def get_debug_server_pipe(self):
pipe = Pipe(self.getBuildDir())
self.addTearDownHook(lambda: pipe.close())
pipe.finish_connection(self.DEFAULT_TIMEOUT)
return pipe
@skipIfWindows
@skipIfNetBSD
def test_by_port(self):
"""
Tests attaching to a process by port.
"""
program = self.build_and_create_debug_adapter_for_attach()
debug_server_tool = self.getBuiltinDebugServerTool()
pipe = self.get_debug_server_pipe()
args = self.get_debug_server_command_line_args()
args += [program]
args += ["--named-pipe", pipe.name]
self.process = self.spawnSubprocess(
debug_server_tool, args, install_remote=False
)
# Read the port number from the debug server pipe.
port = pipe.read(10, self.DEFAULT_TIMEOUT)
# Trim null byte, convert to int
port = int(port[:-1])
self.assertIsNotNone(
port, " Failed to read the port number from debug server pipe"
)
self.attach(
program=program,
gdbRemotePort=port,
sourceInitFile=True,
stopOnEntry=True,
)
self.set_and_hit_breakpoint(continueToExit=True)
@skipIfWindows
@skipIfNetBSD
def test_fails_if_both_port_and_pid_are_set(self):
"""
Tests attaching to a process by process ID and port number.
"""
program = self.build_and_create_debug_adapter_for_attach()
# It is not necessary to launch "lldb-server" to obtain the actual port
# and pid for attaching. However, when providing the port number and pid
# directly, "lldb-dap" throws an error message, which is expected. So,
# used random pid and port numbers here.
pid = 1354
port = 1234
response = self.attach(
program=program,
pid=pid,
gdbRemotePort=port,
sourceInitFile=True,
waitForResponse=True,
)
self.assertFalse(
response["success"], "The user can't specify both pid and port"
)
@skipIfWindows
@skipIfNetBSD
def test_by_invalid_port(self):
"""
Tests attaching to a process by invalid port number 0.
"""
program = self.build_and_create_debug_adapter_for_attach()
port = 0
response = self.attach(
program=program,
gdbRemotePort=port,
sourceInitFile=True,
waitForResponse=True,
)
self.assertFalse(
response["success"],
"The user can't attach with invalid port (%s)" % port,
)
@skipIfWindows
@skipIfNetBSD
def test_by_illegal_port(self):
"""
Tests attaching to a process by illegal/greater port number 65536
"""
program = self.build_and_create_debug_adapter_for_attach()
port = 65536
args = [program]
debug_server_tool = self.getBuiltinDebugServerTool()
self.process = self.spawnSubprocess(
debug_server_tool, args, install_remote=False
)
response = self.attach(
program=program,
gdbRemotePort=port,
sourceInitFile=True,
waitForResponse=True,
)
self.assertFalse(
response["success"],
"The user can't attach with illegal port (%s)" % port,
)