103 lines · python
1"""2Tests debugserver support for MultiMemRead.3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11@skipUnlessDarwin12@skipIfOutOfTreeDebugserver13class TestCase(TestBase):14 def send_process_packet(self, packet_str):15 self.runCmd(f"proc plugin packet send {packet_str}", check=False)16 # The output is of the form:17 # packet: <packet_str>18 # response: <response>19 reply = self.res.GetOutput().split("\n")20 packet = reply[0].strip()21 response = reply[1].strip()22 23 self.assertTrue(packet.startswith("packet: "))24 self.assertTrue(response.startswith("response: "))25 return response[len("response: ") :]26 27 def check_invalid_packet(self, packet_str):28 reply = self.send_process_packet("packet_str")29 self.assertEqual(reply, "E03")30 31 def test_packets(self):32 self.build()33 source_file = lldb.SBFileSpec("main.c")34 target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(35 self, "break here", source_file36 )37 38 reply = self.send_process_packet("qSupported")39 self.assertIn("MultiMemRead+", reply)40 41 mem_address_var = thread.frames[0].FindVariable("memory")42 self.assertTrue(mem_address_var)43 mem_address = mem_address_var.GetValueAsUnsigned() + 4244 45 # no ":"46 self.check_invalid_packet("MultiMemRead")47 # missing ranges48 self.check_invalid_packet("MultiMemRead:")49 # needs at least one range50 self.check_invalid_packet("MultiMemRead:ranges:")51 # needs at least one range52 self.check_invalid_packet("MultiMemRead:ranges:,")53 # a range is a pair of numbers54 self.check_invalid_packet("MultiMemRead:ranges:10")55 # a range is a pair of numbers56 self.check_invalid_packet("MultiMemRead:ranges:10,")57 # range list must end with ;58 self.check_invalid_packet("MultiMemRead:ranges:10,2")59 self.check_invalid_packet("MultiMemRead:ranges:10,2,")60 self.check_invalid_packet("MultiMemRead:ranges:10,2,3")61 # ranges are pairs of numbers.62 self.check_invalid_packet("MultiMemRead:ranges:10,2,3;")63 # unrecognized field64 self.check_invalid_packet("MultiMemRead:ranges:10,2;blah:;")65 # unrecognized field66 self.check_invalid_packet("MultiMemRead:blah:;ranges:10,2;")67 68 # Zero-length reads are ok.69 reply = self.send_process_packet("MultiMemRead:ranges:0,0;")70 self.assertEqual(reply, "0;")71 72 # Debugserver is permissive with trailing commas.73 reply = self.send_process_packet("MultiMemRead:ranges:10,2,;")74 self.assertEqual(reply, "0;")75 reply = self.send_process_packet(f"MultiMemRead:ranges:{mem_address:x},2,;")76 self.assertEqual(reply, "2;ab")77 78 reply = self.send_process_packet("MultiMemRead:ranges:10,2;")79 self.assertEqual(reply, "0;")80 reply = self.send_process_packet(f"MultiMemRead:ranges:{mem_address:x},0;")81 self.assertEqual(reply, "0;")82 reply = self.send_process_packet(f"MultiMemRead:ranges:{mem_address:x},2;")83 self.assertEqual(reply, "2;ab")84 reply = self.send_process_packet(85 f"MultiMemRead:ranges:{mem_address:x},2,{mem_address+2:x},4;"86 )87 self.assertEqual(reply, "2,4;abcdef")88 reply = self.send_process_packet(89 f"MultiMemRead:ranges:{mem_address:x},2,{mem_address+2:x},4,{mem_address+6:x},8;"90 )91 self.assertEqual(reply, "2,4,8;abcdefghijklmn")92 93 # Test zero length in the middle.94 reply = self.send_process_packet(95 f"MultiMemRead:ranges:{mem_address:x},2,{mem_address+2:x},0,{mem_address+6:x},8;"96 )97 self.assertEqual(reply, "2,0,8;abghijklmn")98 # Test zero length in the end.99 reply = self.send_process_packet(100 f"MultiMemRead:ranges:{mem_address:x},2,{mem_address+2:x},4,{mem_address+6:x},0;"101 )102 self.assertEqual(reply, "2,4,0;abcdef")103