1import gdbremote_testcase 2import textwrap 3from lldbsuite.test.decorators import * 4from lldbsuite.test.lldbtest import * 5from lldbsuite.test import lldbutil 6import re 7import xml.etree.ElementTree as ET 8 9 10class TestGdbRemoteTargetXmlPacket(gdbremote_testcase.GdbRemoteTestCaseBase): 11 @llgs_test 12 def test_g_target_xml_returns_correct_data(self): 13 self.build() 14 self.set_inferior_startup_launch() 15 16 procs = self.prep_debug_monitor_and_inferior() 17 18 OFFSET = 0 19 LENGTH = 0x1FFFF0 20 self.test_sequence.add_log_lines( 21 [ 22 "read packet: $qXfer:features:read:target.xml:{:x},{:x}#00".format( 23 OFFSET, LENGTH 24 ), 25 { 26 "direction": "send", 27 "regex": re.compile("^\$l(.+)#[0-9a-fA-F]{2}$", flags=re.DOTALL), 28 "capture": {1: "target_xml"}, 29 }, 30 ], 31 True, 32 ) 33 context = self.expect_gdbremote_sequence() 34 35 target_xml = context.get("target_xml") 36 37 root = ET.fromstring(target_xml) 38 self.assertIsNotNone(root) 39 self.assertEqual(root.tag, "target") 40 41 architecture = root.find("architecture") 42 self.assertIsNotNone(architecture) 43 self.assertIn(self.getArchitecture(), architecture.text) 44 45 feature = root.find("feature") 46 self.assertIsNotNone(feature) 47 48 target_xml_registers = feature.findall("reg") 49 self.assertGreater(len(target_xml_registers), 0) 50 51 # registers info collected by qRegisterInfo 52 self.add_register_info_collection_packets() 53 context = self.expect_gdbremote_sequence() 54 self.assertIsNotNone(context) 55 q_info_registers = self.parse_register_info_packets(context) 56 57 self.assertEqual(len(target_xml_registers), len(q_info_registers)) 58 for register in zip(target_xml_registers, q_info_registers): 59 xml_info_reg = register[0] 60 q_info_reg = register[1] 61 self.assertEqual(q_info_reg["name"], xml_info_reg.get("name")) 62 self.assertEqual(q_info_reg["set"], xml_info_reg.get("group")) 63 self.assertEqual(q_info_reg["format"], xml_info_reg.get("format")) 64 self.assertEqual(q_info_reg["bitsize"], xml_info_reg.get("bitsize")) 65 66 if not self.isAArch64(): 67 self.assertEqual(q_info_reg["offset"], xml_info_reg.get("offset")) 68 69 self.assertEqual(q_info_reg["encoding"], xml_info_reg.get("encoding")) 70