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