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