xref: /llvm-project/lldb/test/API/tools/lldb-dap/attach/TestDAP_attachByPortNum.py (revision a52be0cc114cc58a35bee65c517adaeb66ee6d89)
1*a52be0ccSSanthosh Kumar Ellendula"""
2*a52be0ccSSanthosh Kumar EllendulaTest lldb-dap "port" configuration to "attach" request
3*a52be0ccSSanthosh Kumar Ellendula"""
4*a52be0ccSSanthosh Kumar Ellendula
5*a52be0ccSSanthosh Kumar Ellendula
6*a52be0ccSSanthosh Kumar Ellendulaimport dap_server
7*a52be0ccSSanthosh Kumar Ellendulafrom lldbsuite.test.decorators import *
8*a52be0ccSSanthosh Kumar Ellendulafrom lldbsuite.test.lldbtest import *
9*a52be0ccSSanthosh Kumar Ellendulafrom lldbsuite.test import lldbutil
10*a52be0ccSSanthosh Kumar Ellendulafrom lldbsuite.test import lldbplatformutil
11*a52be0ccSSanthosh Kumar Ellendulafrom lldbgdbserverutils import Pipe
12*a52be0ccSSanthosh Kumar Ellendulaimport lldbdap_testcase
13*a52be0ccSSanthosh Kumar Ellendulaimport os
14*a52be0ccSSanthosh Kumar Ellendulaimport shutil
15*a52be0ccSSanthosh Kumar Ellendulaimport subprocess
16*a52be0ccSSanthosh Kumar Ellendulaimport tempfile
17*a52be0ccSSanthosh Kumar Ellendulaimport threading
18*a52be0ccSSanthosh Kumar Ellendulaimport sys
19*a52be0ccSSanthosh Kumar Ellendulaimport socket
20*a52be0ccSSanthosh Kumar Ellendula
21*a52be0ccSSanthosh Kumar Ellendula
22*a52be0ccSSanthosh Kumar Ellendulaclass TestDAP_attachByPortNum(lldbdap_testcase.DAPTestCaseBase):
23*a52be0ccSSanthosh Kumar Ellendula    default_timeout = 20
24*a52be0ccSSanthosh Kumar Ellendula
25*a52be0ccSSanthosh Kumar Ellendula    def set_and_hit_breakpoint(self, continueToExit=True):
26*a52be0ccSSanthosh Kumar Ellendula        source = "main.c"
27*a52be0ccSSanthosh Kumar Ellendula        main_source_path = os.path.join(os.getcwd(), source)
28*a52be0ccSSanthosh Kumar Ellendula        breakpoint1_line = line_number(main_source_path, "// breakpoint 1")
29*a52be0ccSSanthosh Kumar Ellendula        lines = [breakpoint1_line]
30*a52be0ccSSanthosh Kumar Ellendula        # Set breakpoint in the thread function so we can step the threads
31*a52be0ccSSanthosh Kumar Ellendula        breakpoint_ids = self.set_source_breakpoints(main_source_path, lines)
32*a52be0ccSSanthosh Kumar Ellendula        self.assertEqual(
33*a52be0ccSSanthosh Kumar Ellendula            len(breakpoint_ids), len(lines), "expect correct number of breakpoints"
34*a52be0ccSSanthosh Kumar Ellendula        )
35*a52be0ccSSanthosh Kumar Ellendula        self.continue_to_breakpoints(breakpoint_ids)
36*a52be0ccSSanthosh Kumar Ellendula        if continueToExit:
37*a52be0ccSSanthosh Kumar Ellendula            self.continue_to_exit()
38*a52be0ccSSanthosh Kumar Ellendula
39*a52be0ccSSanthosh Kumar Ellendula    def get_debug_server_command_line_args(self):
40*a52be0ccSSanthosh Kumar Ellendula        args = []
41*a52be0ccSSanthosh Kumar Ellendula        if lldbplatformutil.getPlatform() == "linux":
42*a52be0ccSSanthosh Kumar Ellendula            args = ["gdbserver"]
43*a52be0ccSSanthosh Kumar Ellendula        elif lldbplatformutil.getPlatform() == "macosx":
44*a52be0ccSSanthosh Kumar Ellendula            args = ["--listen"]
45*a52be0ccSSanthosh Kumar Ellendula        if lldb.remote_platform:
46*a52be0ccSSanthosh Kumar Ellendula            args += ["*:0"]
47*a52be0ccSSanthosh Kumar Ellendula        else:
48*a52be0ccSSanthosh Kumar Ellendula            args += ["localhost:0"]
49*a52be0ccSSanthosh Kumar Ellendula        return args
50*a52be0ccSSanthosh Kumar Ellendula
51*a52be0ccSSanthosh Kumar Ellendula    def get_debug_server_pipe(self):
52*a52be0ccSSanthosh Kumar Ellendula        pipe = Pipe(self.getBuildDir())
53*a52be0ccSSanthosh Kumar Ellendula        self.addTearDownHook(lambda: pipe.close())
54*a52be0ccSSanthosh Kumar Ellendula        pipe.finish_connection(self.default_timeout)
55*a52be0ccSSanthosh Kumar Ellendula        return pipe
56*a52be0ccSSanthosh Kumar Ellendula
57*a52be0ccSSanthosh Kumar Ellendula    @skipIfWindows
58*a52be0ccSSanthosh Kumar Ellendula    @skipIfNetBSD
59*a52be0ccSSanthosh Kumar Ellendula    def test_by_port(self):
60*a52be0ccSSanthosh Kumar Ellendula        """
61*a52be0ccSSanthosh Kumar Ellendula        Tests attaching to a process by port.
62*a52be0ccSSanthosh Kumar Ellendula        """
63*a52be0ccSSanthosh Kumar Ellendula        self.build_and_create_debug_adaptor()
64*a52be0ccSSanthosh Kumar Ellendula        program = self.getBuildArtifact("a.out")
65*a52be0ccSSanthosh Kumar Ellendula
66*a52be0ccSSanthosh Kumar Ellendula        debug_server_tool = self.getBuiltinDebugServerTool()
67*a52be0ccSSanthosh Kumar Ellendula
68*a52be0ccSSanthosh Kumar Ellendula        pipe = self.get_debug_server_pipe()
69*a52be0ccSSanthosh Kumar Ellendula        args = self.get_debug_server_command_line_args()
70*a52be0ccSSanthosh Kumar Ellendula        args += [program]
71*a52be0ccSSanthosh Kumar Ellendula        args += ["--named-pipe", pipe.name]
72*a52be0ccSSanthosh Kumar Ellendula
73*a52be0ccSSanthosh Kumar Ellendula        self.process = self.spawnSubprocess(
74*a52be0ccSSanthosh Kumar Ellendula            debug_server_tool, args, install_remote=False
75*a52be0ccSSanthosh Kumar Ellendula        )
76*a52be0ccSSanthosh Kumar Ellendula
77*a52be0ccSSanthosh Kumar Ellendula        # Read the port number from the debug server pipe.
78*a52be0ccSSanthosh Kumar Ellendula        port = pipe.read(10, self.default_timeout)
79*a52be0ccSSanthosh Kumar Ellendula        # Trim null byte, convert to int
80*a52be0ccSSanthosh Kumar Ellendula        port = int(port[:-1])
81*a52be0ccSSanthosh Kumar Ellendula        self.assertIsNotNone(
82*a52be0ccSSanthosh Kumar Ellendula            port, " Failed to read the port number from debug server pipe"
83*a52be0ccSSanthosh Kumar Ellendula        )
84*a52be0ccSSanthosh Kumar Ellendula
85*a52be0ccSSanthosh Kumar Ellendula        self.attach(program=program, gdbRemotePort=port, sourceInitFile=True)
86*a52be0ccSSanthosh Kumar Ellendula        self.set_and_hit_breakpoint(continueToExit=True)
87*a52be0ccSSanthosh Kumar Ellendula        self.process.terminate()
88*a52be0ccSSanthosh Kumar Ellendula
89*a52be0ccSSanthosh Kumar Ellendula    @skipIfWindows
90*a52be0ccSSanthosh Kumar Ellendula    @skipIfNetBSD
91*a52be0ccSSanthosh Kumar Ellendula    def test_by_port_and_pid(self):
92*a52be0ccSSanthosh Kumar Ellendula        """
93*a52be0ccSSanthosh Kumar Ellendula        Tests attaching to a process by process ID and port number.
94*a52be0ccSSanthosh Kumar Ellendula        """
95*a52be0ccSSanthosh Kumar Ellendula        self.build_and_create_debug_adaptor()
96*a52be0ccSSanthosh Kumar Ellendula        program = self.getBuildArtifact("a.out")
97*a52be0ccSSanthosh Kumar Ellendula
98*a52be0ccSSanthosh Kumar Ellendula        # It is not necessary to launch "lldb-server" to obtain the actual port and pid for attaching.
99*a52be0ccSSanthosh Kumar Ellendula        # However, when providing the port number and pid directly, "lldb-dap" throws an error message, which is expected.
100*a52be0ccSSanthosh Kumar Ellendula        # So, used random pid and port numbers here.
101*a52be0ccSSanthosh Kumar Ellendula
102*a52be0ccSSanthosh Kumar Ellendula        pid = 1354
103*a52be0ccSSanthosh Kumar Ellendula        port = 1234
104*a52be0ccSSanthosh Kumar Ellendula
105*a52be0ccSSanthosh Kumar Ellendula        response = self.attach(
106*a52be0ccSSanthosh Kumar Ellendula            program=program,
107*a52be0ccSSanthosh Kumar Ellendula            pid=pid,
108*a52be0ccSSanthosh Kumar Ellendula            gdbRemotePort=port,
109*a52be0ccSSanthosh Kumar Ellendula            sourceInitFile=True,
110*a52be0ccSSanthosh Kumar Ellendula            expectFailure=True,
111*a52be0ccSSanthosh Kumar Ellendula        )
112*a52be0ccSSanthosh Kumar Ellendula        if not (response and response["success"]):
113*a52be0ccSSanthosh Kumar Ellendula            self.assertFalse(
114*a52be0ccSSanthosh Kumar Ellendula                response["success"], "The user can't specify both pid and port"
115*a52be0ccSSanthosh Kumar Ellendula            )
116*a52be0ccSSanthosh Kumar Ellendula
117*a52be0ccSSanthosh Kumar Ellendula    @skipIfWindows
118*a52be0ccSSanthosh Kumar Ellendula    @skipIfNetBSD
119*a52be0ccSSanthosh Kumar Ellendula    def test_by_invalid_port(self):
120*a52be0ccSSanthosh Kumar Ellendula        """
121*a52be0ccSSanthosh Kumar Ellendula        Tests attaching to a process by invalid port number 0.
122*a52be0ccSSanthosh Kumar Ellendula        """
123*a52be0ccSSanthosh Kumar Ellendula        self.build_and_create_debug_adaptor()
124*a52be0ccSSanthosh Kumar Ellendula        program = self.getBuildArtifact("a.out")
125*a52be0ccSSanthosh Kumar Ellendula
126*a52be0ccSSanthosh Kumar Ellendula        port = 0
127*a52be0ccSSanthosh Kumar Ellendula        response = self.attach(
128*a52be0ccSSanthosh Kumar Ellendula            program=program, gdbRemotePort=port, sourceInitFile=True, expectFailure=True
129*a52be0ccSSanthosh Kumar Ellendula        )
130*a52be0ccSSanthosh Kumar Ellendula        if not (response and response["success"]):
131*a52be0ccSSanthosh Kumar Ellendula            self.assertFalse(
132*a52be0ccSSanthosh Kumar Ellendula                response["success"],
133*a52be0ccSSanthosh Kumar Ellendula                "The user can't attach with invalid port (%s)" % port,
134*a52be0ccSSanthosh Kumar Ellendula            )
135*a52be0ccSSanthosh Kumar Ellendula
136*a52be0ccSSanthosh Kumar Ellendula    @skipIfWindows
137*a52be0ccSSanthosh Kumar Ellendula    @skipIfNetBSD
138*a52be0ccSSanthosh Kumar Ellendula    def test_by_illegal_port(self):
139*a52be0ccSSanthosh Kumar Ellendula        """
140*a52be0ccSSanthosh Kumar Ellendula        Tests attaching to a process by illegal/greater port number 65536
141*a52be0ccSSanthosh Kumar Ellendula        """
142*a52be0ccSSanthosh Kumar Ellendula        self.build_and_create_debug_adaptor()
143*a52be0ccSSanthosh Kumar Ellendula        program = self.getBuildArtifact("a.out")
144*a52be0ccSSanthosh Kumar Ellendula
145*a52be0ccSSanthosh Kumar Ellendula        port = 65536
146*a52be0ccSSanthosh Kumar Ellendula        args = [program]
147*a52be0ccSSanthosh Kumar Ellendula        debug_server_tool = self.getBuiltinDebugServerTool()
148*a52be0ccSSanthosh Kumar Ellendula        self.process = self.spawnSubprocess(
149*a52be0ccSSanthosh Kumar Ellendula            debug_server_tool, args, install_remote=False
150*a52be0ccSSanthosh Kumar Ellendula        )
151*a52be0ccSSanthosh Kumar Ellendula
152*a52be0ccSSanthosh Kumar Ellendula        response = self.attach(
153*a52be0ccSSanthosh Kumar Ellendula            program=program, gdbRemotePort=port, sourceInitFile=True, expectFailure=True
154*a52be0ccSSanthosh Kumar Ellendula        )
155*a52be0ccSSanthosh Kumar Ellendula        if not (response and response["success"]):
156*a52be0ccSSanthosh Kumar Ellendula            self.assertFalse(
157*a52be0ccSSanthosh Kumar Ellendula                response["success"],
158*a52be0ccSSanthosh Kumar Ellendula                "The user can't attach with illegal port (%s)" % port,
159*a52be0ccSSanthosh Kumar Ellendula            )
160*a52be0ccSSanthosh Kumar Ellendula        self.process.terminate()
161