1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
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()
exe_path = self.getBuildArtifact("a.out")
args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"]
hex_args = [seven.hexlify(x) for x in args]
server = self.connect_to_debug_monitor()
self.assertIsNotNone(server)
self.do_handshake()
# 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()
exe_path = self.getBuildArtifact("a.out")
args = [exe_path, "stderr:arg1", "stderr:arg2", "stderr:arg3"]
hex_args = [seven.hexlify(x) for x in args]
server = self.connect_to_debug_monitor()
self.assertIsNotNone(server)
self.do_handshake()
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"])
def test_launch_via_vRun_no_args(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: $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"])
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.assertRegexpMatches(
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()
exe_path = 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]
server = self.connect_to_debug_monitor()
self.assertIsNotNone(server)
self.do_handshake()
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()
exe_path = 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]
server = self.connect_to_debug_monitor()
self.assertIsNotNone(server)
self.do_handshake()
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")
|