| import itertools | |
| import gdbremote_testcase | |
| import lldbgdbserverutils | |
| from lldbsuite.support import seven | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| class GdbRemoteLaunchTestCase(gdbremote_testcase.GdbRemoteTestCaseBase): | |
| @skipIfWindows # No pty support to test any inferior output | |
| @add_test_categories(["llgs"]) | |
| def test_launch_via_A(self): | |
| self.build() | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out")) | |
| args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"] | |
| hex_args = [seven.hexlify(x) for x in args] | |
| # NB: strictly speaking we should use %x here but this packet | |
| # is deprecated, so no point in changing lldb-server's expectations | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $A %d,0,%s,%d,1,%s,%d,2,%s,%d,3,%s#00" | |
| % tuple(itertools.chain.from_iterable([(len(x), x) for x in hex_args])), | |
| "send packet: $OK#00", | |
| "read packet: $c#00", | |
| "send packet: $W00#00", | |
| ], | |
| True, | |
| ) | |
| context = self.expect_gdbremote_sequence() | |
| self.assertEqual(context["O_content"], b"arg1\r\narg2\r\narg3\r\n") | |
| @skipIfWindows # No pty support to test any inferior output | |
| @add_test_categories(["llgs"]) | |
| def test_launch_via_vRun(self): | |
| self.build() | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out")) | |
| args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"] | |
| hex_args = [seven.hexlify(x) for x in args] | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $vRun;%s;%s;%s;%s#00" % tuple(hex_args), | |
| {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"}, | |
| "read packet: $c#00", | |
| "send packet: $W00#00", | |
| ], | |
| True, | |
| ) | |
| context = self.expect_gdbremote_sequence() | |
| self.assertEqual(context["O_content"], b"arg1\r\narg2\r\narg3\r\n") | |
| @add_test_categories(["llgs"]) | |
| @skipIfWindows # Sometimes returns '$E1f'. | |
| def test_launch_via_vRun_no_args(self): | |
| self.build() | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out")) | |
| hex_path = seven.hexlify(exe_path) | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $vRun;%s#00" % (hex_path,), | |
| {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"}, | |
| "read packet: $c#00", | |
| "send packet: $W00#00", | |
| ], | |
| True, | |
| ) | |
| self.expect_gdbremote_sequence() | |
| @add_test_categories(["llgs"]) | |
| @skipIfRemote | |
| def test_launch_failure_via_vRun(self): | |
| self.build() | |
| exe_path = self.getBuildArtifact("a.out") | |
| hex_path = seven.hexlify(exe_path) | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $QEnableErrorStrings#00", | |
| "send packet: $OK#00", | |
| "read packet: $vRun;%s#00" % hex_path, | |
| { | |
| "direction": "send", | |
| "regex": r"^\$E..;([0-9a-fA-F]+)#", | |
| "capture": {1: "msg"}, | |
| }, | |
| ], | |
| True, | |
| ) | |
| with open(exe_path, "ab") as exe_for_writing: | |
| context = self.expect_gdbremote_sequence() | |
| self.assertRegex( | |
| seven.unhexlify(context.get("msg")), | |
| r"(execve failed: Text file busy|The process cannot access the file because it is being used by another process.)", | |
| ) | |
| @skipIfWindows # No pty support to test any inferior output | |
| @add_test_categories(["llgs"]) | |
| def test_QEnvironment(self): | |
| self.build() | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out")) | |
| env = {"FOO": "test", "BAR": "a=z"} | |
| args = [exe_path, "print-env:FOO", "print-env:BAR"] | |
| hex_args = [seven.hexlify(x) for x in args] | |
| for key, value in env.items(): | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $QEnvironment:%s=%s#00" % (key, value), | |
| "send packet: $OK#00", | |
| ], | |
| True, | |
| ) | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $vRun;%s#00" % (";".join(hex_args),), | |
| {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"}, | |
| "read packet: $c#00", | |
| "send packet: $W00#00", | |
| ], | |
| True, | |
| ) | |
| context = self.expect_gdbremote_sequence() | |
| self.assertEqual(context["O_content"], b"test\r\na=z\r\n") | |
| @skipIfWindows # No pty support to test any inferior output | |
| @add_test_categories(["llgs"]) | |
| def test_QEnvironmentHexEncoded(self): | |
| self.build() | |
| server = self.connect_to_debug_monitor() | |
| self.assertIsNotNone(server) | |
| self.do_handshake() | |
| exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out")) | |
| env = {"FOO": "test", "BAR": "a=z", "BAZ": "a*}#z"} | |
| args = [exe_path, "print-env:FOO", "print-env:BAR", "print-env:BAZ"] | |
| hex_args = [seven.hexlify(x) for x in args] | |
| for key, value in env.items(): | |
| hex_enc = seven.hexlify("%s=%s" % (key, value)) | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $QEnvironmentHexEncoded:%s#00" % (hex_enc,), | |
| "send packet: $OK#00", | |
| ], | |
| True, | |
| ) | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $vRun;%s#00" % (";".join(hex_args),), | |
| {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"}, | |
| "read packet: $c#00", | |
| "send packet: $W00#00", | |
| ], | |
| True, | |
| ) | |
| context = self.expect_gdbremote_sequence() | |
| self.assertEqual(context["O_content"], b"test\r\na=z\r\na*}#z\r\n") |