diff options
| author | Todd Fiala <todd.fiala@gmail.com> | 2014-04-29 18:21:07 +0000 |
|---|---|---|
| committer | Todd Fiala <todd.fiala@gmail.com> | 2014-04-29 18:21:07 +0000 |
| commit | 41c60c818fc42826c2ab4e0d38195bf6df38e70d (patch) | |
| tree | 0586864090624c7a4760c8cf26a3464575d55ffb | |
| parent | 4ecf0158a410bde7c67be413c785abd17c94ff2f (diff) | |
| download | bcm5719-llvm-41c60c818fc42826c2ab4e0d38195bf6df38e70d.tar.gz bcm5719-llvm-41c60c818fc42826c2ab4e0d38195bf6df38e70d.zip | |
Added gdb remote protocol tests for no output and inferior non-zero exit code.
Tests added for debugserver and lldb-gdbserver. lldb-gdbserver marked as
XFAIL on top of tree.
Added build_gdbremote_A_packet test helper to construct a gdbremote A
launch packet from a list of args.
llvm-svn: 207568
| -rw-r--r-- | lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py | 92 | ||||
| -rw-r--r-- | lldb/test/tools/lldb-gdbserver/lldbgdbserverutils.py | 24 | ||||
| -rw-r--r-- | lldb/test/tools/lldb-gdbserver/main.cpp | 30 |
3 files changed, 129 insertions, 17 deletions
diff --git a/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py b/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py index 2de3024765d..8bfebc4beee 100644 --- a/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py +++ b/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py @@ -21,8 +21,8 @@ class LldbGdbServerTestCase(TestBase): _GDBREMOTE_KILL_PACKET = "$k#6b" - _LOGGING_LEVEL = logging.WARNING - # _LOGGING_LEVEL = logging.DEBUG + # _LOGGING_LEVEL = logging.WARNING + _LOGGING_LEVEL = logging.DEBUG def setUp(self): TestBase.setUp(self) @@ -177,15 +177,12 @@ class LldbGdbServerTestCase(TestBase): server = self.start_server() self.assertIsNotNone(server) - # TODO grab the build output directory rather than current directory. - inferior_exe_name = os.path.abspath('a.out') - inferior_exe_name_hex = gdbremote_hex_encode_string(inferior_exe_name) + # build launch args + launch_args = [os.path.abspath('a.out')] log_lines = self.create_no_ack_remote_stream() log_lines.extend([ - "lldb-gdbserver < 000> read packet: {}".format( - gdbremote_packet_encode_string( - "A{},0,{}".format(len(inferior_exe_name_hex), inferior_exe_name_hex))), + "lldb-gdbserver < 0> read packet: %s" % build_gdbremote_A_packet(launch_args), "lldb-gdbserver < 6> send packet: $OK#9a"]) expect_lldb_gdbserver_replay(self, self.sock, log_lines, True, @@ -205,19 +202,86 @@ class LldbGdbServerTestCase(TestBase): self.buildDwarf() self.start_inferior() + def inferior_exit_0(self): + server = self.start_server() + self.assertIsNotNone(server) + + # build launch args + launch_args = [os.path.abspath('a.out')] + + log_lines = self.create_no_ack_remote_stream() + log_lines.extend([ + "lldb-gdbserver < 0> read packet: %s" % build_gdbremote_A_packet(launch_args), + "lldb-gdbserver < 6> send packet: $OK#00", + "lldb-gdbserver < 18> read packet: $qLaunchSuccess#a5", + "lldb-gdbserver < 6> send packet: $OK#00", + "lldb-gdbserver < 5> read packet: $vCont;c#00", + "lldb-gdbserver < 7> send packet: $W00#00"]) + + expect_lldb_gdbserver_replay(self, self.sock, log_lines, True, + self._TIMEOUT_SECONDS, self.logger) + + @debugserver_test + @dsym_test + def test_inferior_exit_0_debugserver_dsym(self): + self.init_debugserver_test() + self.buildDsym() + self.inferior_exit_0() + + @llgs_test + @dwarf_test + @unittest2.expectedFailure() + def test_inferior_exit_0_llgs_dwarf(self): + self.init_llgs_test() + self.buildDwarf() + self.inferior_exit_0() + + def inferior_exit_42(self): + server = self.start_server() + self.assertIsNotNone(server) + + RETVAL = 42 + + # build launch args + launch_args = [os.path.abspath('a.out'), "retval:%d" % RETVAL] + + log_lines = self.create_no_ack_remote_stream() + log_lines.extend([ + "lldb-gdbserver < 0> read packet: %s" % build_gdbremote_A_packet(launch_args), + "lldb-gdbserver < 6> send packet: $OK#00", + "lldb-gdbserver < 18> read packet: $qLaunchSuccess#a5", + "lldb-gdbserver < 6> send packet: $OK#00", + "lldb-gdbserver < 5> read packet: $vCont;c#00", + "lldb-gdbserver < 7> send packet: $W{0:02x}#00".format(RETVAL)]) + + expect_lldb_gdbserver_replay(self, self.sock, log_lines, True, + self._TIMEOUT_SECONDS, self.logger) + + @debugserver_test + @dsym_test + def test_inferior_exit_42_debugserver_dsym(self): + self.init_debugserver_test() + self.buildDsym() + self.inferior_exit_42() + + @llgs_test + @dwarf_test + @unittest2.expectedFailure() + def test_inferior_exit_42_llgs_dwarf(self): + self.init_llgs_test() + self.buildDwarf() + self.inferior_exit_42() + def inferior_print_exit(self): server = self.start_server() self.assertIsNotNone(server) - # TODO grab the build output directory rather than current directory. - inferior_exe_name = os.path.abspath('a.out') - inferior_exe_name_hex = gdbremote_hex_encode_string(inferior_exe_name) + # build launch args + launch_args = [os.path.abspath('a.out'), "hello, world"] log_lines = self.create_no_ack_remote_stream() log_lines.extend([ - "lldb-gdbserver < 000> read packet: {}".format( - gdbremote_packet_encode_string( - "A{},0,{}".format(len(inferior_exe_name_hex), inferior_exe_name_hex))), + "lldb-gdbserver < 0> read packet: %s" % build_gdbremote_A_packet(launch_args), "lldb-gdbserver < 6> send packet: $OK#00", "lldb-gdbserver < 18> read packet: $qLaunchSuccess#a5", "lldb-gdbserver < 6> send packet: $OK#00", diff --git a/lldb/test/tools/lldb-gdbserver/lldbgdbserverutils.py b/lldb/test/tools/lldb-gdbserver/lldbgdbserverutils.py index 4ead9805ff6..bce7a5f0698 100644 --- a/lldb/test/tools/lldb-gdbserver/lldbgdbserverutils.py +++ b/lldb/test/tools/lldb-gdbserver/lldbgdbserverutils.py @@ -241,6 +241,30 @@ def gdbremote_packet_encode_string(str): return '$' + str + '#{0:02x}'.format(checksum % 256) +def build_gdbremote_A_packet(args_list): + """Given a list of args, create a properly-formed $A packet containing each arg. + """ + payload = "A" + + # build the arg content + arg_index = 0 + for arg in args_list: + # Comma-separate the args. + if arg_index > 0: + payload += ',' + + # Hex-encode the arg. + hex_arg = gdbremote_hex_encode_string(arg) + + # Build the A entry. + payload += "{},{},{}".format(len(hex_arg), arg_index, hex_arg) + + # Next arg index, please. + arg_index += 1 + + # return the packetized payload + return gdbremote_packet_encode_string(payload) + if __name__ == '__main__': EXE_PATH = get_lldb_gdbserver_exe() if EXE_PATH: diff --git a/lldb/test/tools/lldb-gdbserver/main.cpp b/lldb/test/tools/lldb-gdbserver/main.cpp index 3dbff671899..88c397cadb9 100644 --- a/lldb/test/tools/lldb-gdbserver/main.cpp +++ b/lldb/test/tools/lldb-gdbserver/main.cpp @@ -1,7 +1,31 @@ +#include <cstdlib> +#include <cstring> #include <iostream> -int main(int argc, char **argv) +static const char *const STDERR_PREFIX = "stderr:"; +static const char *const RETVAL_PREFIX = "retval:"; + +int main (int argc, char **argv) { - std::cout << "hello, world" << std::endl; - return 0; + int return_value = 0; + + for (int i = 1; i < argc; ++i) + { + if (std::strstr (argv[i], STDERR_PREFIX)) + { + // Treat remainder as text to go to stderr. + std::cerr << (argv[i] + strlen (STDERR_PREFIX)) << std::endl; + } + else if (std::strstr (argv[i], RETVAL_PREFIX)) + { + // Treat as the return value for the program. + return_value = std::atoi (argv[i] + strlen (RETVAL_PREFIX)); + } + else + { + // Treat the argument as text for stdout. + std::cout << argv[i] << std::endl; + } + } + return return_value; } |

