summaryrefslogtreecommitdiffstats
path: root/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py')
-rw-r--r--lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py172
1 files changed, 155 insertions, 17 deletions
diff --git a/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py b/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py
index 90f1ba2d36c..104bc8daae0 100644
--- a/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py
+++ b/lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py
@@ -131,6 +131,21 @@ class LldbGdbServerTestCase(TestBase):
{ "direction":"send", "regex":r"^\$pid:([0-9a-fA-F]+);", "capture":{1:"pid"} }],
True)
+ def add_register_info_collection_packets(self):
+ self.test_sequence.add_log_lines(
+ [ { "type":"multi_response", "query":"qRegisterInfo", "append_iteration_suffix":True,
+ "end_regex":re.compile(r"^\$(E\d+)?#[0-9a-fA-F]{2}$"),
+ "save_key":"reg_info_responses" } ],
+ True)
+
+ def parse_register_info_packets(self, context):
+ """Return an array of register info dictionaries, one per register info."""
+ reg_info_responses = context.get("reg_info_responses")
+ self.assertIsNotNone(reg_info_responses)
+
+ # Parse register infos.
+ return [parse_reg_info_response(reg_info_response) for reg_info_response in reg_info_responses]
+
def expect_gdbremote_sequence(self):
return expect_lldb_gdbserver_replay(self, self.sock, self.test_sequence, self._TIMEOUT_SECONDS, self.logger)
@@ -149,24 +164,18 @@ class LldbGdbServerTestCase(TestBase):
"invalidate-regs"
]
- def assert_valid_reg_info_packet(self, reginfo_packet):
- keyval_pairs = reginfo_packet.split(";")
- self.assertTrue(len(keyval_pairs) >= 5)
-
- values = {}
- for kv in keyval_pairs:
- (key, val) = kv.split(':')
- values[key] = val
- # Ensure key is something we expect.
+ def assert_valid_reg_info(self, reg_info):
+ # Assert we know about all the reginfo keys parsed.
+ for key in reg_info:
self.assertTrue(key in self._KNOWN_REGINFO_KEYS)
# Check the bare-minimum expected set of register info keys.
- self.assertTrue("name" in values)
- self.assertTrue("bitsize" in values)
- self.assertTrue("offset" in values)
- self.assertTrue("encoding" in values)
- self.assertTrue("format" in values)
-
+ self.assertTrue("name" in reg_info)
+ self.assertTrue("bitsize" in reg_info)
+ self.assertTrue("offset" in reg_info)
+ self.assertTrue("encoding" in reg_info)
+ self.assertTrue("format" in reg_info)
+
@debugserver_test
def test_exe_starts_debugserver(self):
@@ -574,8 +583,10 @@ class LldbGdbServerTestCase(TestBase):
# Run the stream
context = self.expect_gdbremote_sequence()
self.assertIsNotNone(context)
- self.assertIsNotNone(context.get("reginfo_0"))
- self.assert_valid_reg_info_packet(context.get("reginfo_0"))
+
+ reg_info_packet = context.get("reginfo_0")
+ self.assertIsNotNone(reg_info_packet)
+ self.assert_valid_reg_info(parse_reg_info_response(reg_info_packet))
@debugserver_test
@dsym_test
@@ -592,5 +603,132 @@ class LldbGdbServerTestCase(TestBase):
self.buildDwarf()
self.qRegisterInfo_returns_one_valid_result()
+ def qRegisterInfo_returns_all_valid_results(self):
+ server = self.start_server()
+ self.assertIsNotNone(server)
+
+ # Build launch args.
+ launch_args = [os.path.abspath('a.out')]
+
+ # Build the expected protocol stream.
+ self.add_no_ack_remote_stream()
+ self.add_verified_launch_packets(launch_args)
+ self.add_register_info_collection_packets()
+
+ # Run the stream.
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+
+ # Validate that each register info returned validates.
+ for reg_info in self.parse_register_info_packets(context):
+ self.assert_valid_reg_info(reg_info)
+
+ @debugserver_test
+ @dsym_test
+ def test_qRegisterInfo_returns_all_valid_results_debugserver_dsym(self):
+ self.init_debugserver_test()
+ self.buildDsym()
+ self.qRegisterInfo_returns_all_valid_results()
+
+ @llgs_test
+ @dwarf_test
+ @unittest2.expectedFailure()
+ def test_qRegisterInfo_returns_all_valid_results_llgs_dwarf(self):
+ self.init_llgs_test()
+ self.buildDwarf()
+ self.qRegisterInfo_returns_all_valid_results()
+
+ def qRegisterInfo_contains_required_generics(self):
+ server = self.start_server()
+ self.assertIsNotNone(server)
+
+ # Build launch args
+ launch_args = [os.path.abspath('a.out')]
+
+ # Build the expected protocol stream
+ self.add_no_ack_remote_stream()
+ self.add_verified_launch_packets(launch_args)
+ self.add_register_info_collection_packets()
+
+ # Run the packet stream.
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+
+ # Gather register info entries.
+ reg_infos = self.parse_register_info_packets(context)
+
+ # Collect all generics found.
+ generic_regs = { reg_info['generic']:1 for reg_info in reg_infos if 'generic' in reg_info }
+
+ # Ensure we have a program counter register.
+ self.assertTrue('pc' in generic_regs)
+
+ # Ensure we have a frame pointer register.
+ self.assertTrue('fp' in generic_regs)
+
+ # Ensure we have a stack pointer register.
+ self.assertTrue('sp' in generic_regs)
+
+ # Ensure we have a flags register.
+ self.assertTrue('flags' in generic_regs)
+
+
+ @debugserver_test
+ @dsym_test
+ def test_qRegisterInfo_contains_required_generics_debugserver_dsym(self):
+ self.init_debugserver_test()
+ self.buildDsym()
+ self.qRegisterInfo_contains_required_generics()
+
+ @llgs_test
+ @dwarf_test
+ @unittest2.expectedFailure()
+ def test_qRegisterInfo_contains_required_generics_llgs_dwarf(self):
+ self.init_llgs_test()
+ self.buildDwarf()
+ self.qRegisterInfo_contains_required_generics()
+
+
+ def qRegisterInfo_contains_at_least_one_register_set(self):
+ server = self.start_server()
+ self.assertIsNotNone(server)
+
+ # Build launch args
+ launch_args = [os.path.abspath('a.out')]
+
+ # Build the expected protocol stream
+ self.add_no_ack_remote_stream()
+ self.add_verified_launch_packets(launch_args)
+ self.add_register_info_collection_packets()
+
+ # Run the packet stream.
+ context = self.expect_gdbremote_sequence()
+ self.assertIsNotNone(context)
+
+ # Gather register info entries.
+ reg_infos = self.parse_register_info_packets(context)
+
+ # Collect all generics found.
+ register_sets = { reg_info['set']:1 for reg_info in reg_infos if 'set' in reg_info }
+ self.assertTrue(len(register_sets) >= 1)
+
+
+ @debugserver_test
+ @dsym_test
+ def test_qRegisterInfo_contains_at_least_one_register_set_debugserver_dsym(self):
+ self.init_debugserver_test()
+ self.buildDsym()
+ self.qRegisterInfo_contains_at_least_one_register_set()
+
+
+ @llgs_test
+ @dwarf_test
+ @unittest2.expectedFailure()
+ def test_qRegisterInfo_contains_at_least_one_register_set_llgs_dwarf(self):
+ self.init_llgs_test()
+ self.buildDwarf()
+ self.qRegisterInfo_contains_at_least_one_register_set()
+
+
if __name__ == '__main__':
unittest2.main()
OpenPOWER on IntegriCloud