175 lines · python
1import itertools2 3import gdbremote_testcase4import lldbgdbserverutils5from lldbsuite.support import seven6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8 9 10class GdbRemoteLaunchTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):11 @skipIfWindows # No pty support to test any inferior output12 @add_test_categories(["llgs"])13 def test_launch_via_A(self):14 self.build()15 server = self.connect_to_debug_monitor()16 self.assertIsNotNone(server)17 self.do_handshake()18 exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out"))19 args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"]20 hex_args = [seven.hexlify(x) for x in args]21 22 # NB: strictly speaking we should use %x here but this packet23 # is deprecated, so no point in changing lldb-server's expectations24 self.test_sequence.add_log_lines(25 [26 "read packet: $A %d,0,%s,%d,1,%s,%d,2,%s,%d,3,%s#00"27 % tuple(itertools.chain.from_iterable([(len(x), x) for x in hex_args])),28 "send packet: $OK#00",29 "read packet: $c#00",30 "send packet: $W00#00",31 ],32 True,33 )34 context = self.expect_gdbremote_sequence()35 self.assertEqual(context["O_content"], b"arg1\r\narg2\r\narg3\r\n")36 37 @skipIfWindows # No pty support to test any inferior output38 @add_test_categories(["llgs"])39 def test_launch_via_vRun(self):40 self.build()41 server = self.connect_to_debug_monitor()42 self.assertIsNotNone(server)43 self.do_handshake()44 exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out"))45 args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"]46 hex_args = [seven.hexlify(x) for x in args]47 48 self.test_sequence.add_log_lines(49 [50 "read packet: $vRun;%s;%s;%s;%s#00" % tuple(hex_args),51 {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"},52 "read packet: $c#00",53 "send packet: $W00#00",54 ],55 True,56 )57 context = self.expect_gdbremote_sequence()58 self.assertEqual(context["O_content"], b"arg1\r\narg2\r\narg3\r\n")59 60 @add_test_categories(["llgs"])61 @skipIfWindows # Sometimes returns '$E1f'.62 def test_launch_via_vRun_no_args(self):63 self.build()64 server = self.connect_to_debug_monitor()65 self.assertIsNotNone(server)66 self.do_handshake()67 exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out"))68 hex_path = seven.hexlify(exe_path)69 70 self.test_sequence.add_log_lines(71 [72 "read packet: $vRun;%s#00" % (hex_path,),73 {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"},74 "read packet: $c#00",75 "send packet: $W00#00",76 ],77 True,78 )79 self.expect_gdbremote_sequence()80 81 @add_test_categories(["llgs"])82 @skipIfRemote83 def test_launch_failure_via_vRun(self):84 self.build()85 exe_path = self.getBuildArtifact("a.out")86 hex_path = seven.hexlify(exe_path)87 88 server = self.connect_to_debug_monitor()89 self.assertIsNotNone(server)90 self.do_handshake()91 self.test_sequence.add_log_lines(92 [93 "read packet: $QEnableErrorStrings#00",94 "send packet: $OK#00",95 "read packet: $vRun;%s#00" % hex_path,96 {97 "direction": "send",98 "regex": r"^\$E..;([0-9a-fA-F]+)#",99 "capture": {1: "msg"},100 },101 ],102 True,103 )104 with open(exe_path, "ab") as exe_for_writing:105 context = self.expect_gdbremote_sequence()106 self.assertRegex(107 seven.unhexlify(context.get("msg")),108 r"(execve failed: Text file busy|The process cannot access the file because it is being used by another process.)",109 )110 111 @skipIfWindows # No pty support to test any inferior output112 @add_test_categories(["llgs"])113 def test_QEnvironment(self):114 self.build()115 server = self.connect_to_debug_monitor()116 self.assertIsNotNone(server)117 self.do_handshake()118 exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out"))119 env = {"FOO": "test", "BAR": "a=z"}120 args = [exe_path, "print-env:FOO", "print-env:BAR"]121 hex_args = [seven.hexlify(x) for x in args]122 123 for key, value in env.items():124 self.test_sequence.add_log_lines(125 [126 "read packet: $QEnvironment:%s=%s#00" % (key, value),127 "send packet: $OK#00",128 ],129 True,130 )131 self.test_sequence.add_log_lines(132 [133 "read packet: $vRun;%s#00" % (";".join(hex_args),),134 {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"},135 "read packet: $c#00",136 "send packet: $W00#00",137 ],138 True,139 )140 context = self.expect_gdbremote_sequence()141 self.assertEqual(context["O_content"], b"test\r\na=z\r\n")142 143 @skipIfWindows # No pty support to test any inferior output144 @add_test_categories(["llgs"])145 def test_QEnvironmentHexEncoded(self):146 self.build()147 server = self.connect_to_debug_monitor()148 self.assertIsNotNone(server)149 self.do_handshake()150 exe_path = lldbutil.install_to_target(self, self.getBuildArtifact("a.out"))151 env = {"FOO": "test", "BAR": "a=z", "BAZ": "a*}#z"}152 args = [exe_path, "print-env:FOO", "print-env:BAR", "print-env:BAZ"]153 hex_args = [seven.hexlify(x) for x in args]154 155 for key, value in env.items():156 hex_enc = seven.hexlify("%s=%s" % (key, value))157 self.test_sequence.add_log_lines(158 [159 "read packet: $QEnvironmentHexEncoded:%s#00" % (hex_enc,),160 "send packet: $OK#00",161 ],162 True,163 )164 self.test_sequence.add_log_lines(165 [166 "read packet: $vRun;%s#00" % (";".join(hex_args),),167 {"direction": "send", "regex": r"^\$T([0-9a-fA-F]+)"},168 "read packet: $c#00",169 "send packet: $W00#00",170 ],171 True,172 )173 context = self.expect_gdbremote_sequence()174 self.assertEqual(context["O_content"], b"test\r\na=z\r\na*}#z\r\n")175