1be198e03SJordan Rupprechtimport gdbremote_testcase
2be198e03SJordan Rupprechtimport textwrap
3be198e03SJordan Rupprechtfrom lldbsuite.test.decorators import *
4be198e03SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
5be198e03SJordan Rupprechtfrom lldbsuite.test import lldbutil
6be198e03SJordan Rupprechtimport re
7be198e03SJordan Rupprechtimport xml.etree.ElementTree as ET
8be198e03SJordan Rupprecht
9be198e03SJordan Rupprecht
102238dcc3SJonas Devlieghereclass TestGdbRemoteTargetXmlPacket(gdbremote_testcase.GdbRemoteTestCaseBase):
11be198e03SJordan Rupprecht    @llgs_test
12be198e03SJordan Rupprecht    def test_g_target_xml_returns_correct_data(self):
13be198e03SJordan Rupprecht        self.build()
14be198e03SJordan Rupprecht        self.set_inferior_startup_launch()
15be198e03SJordan Rupprecht
16be198e03SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
17be198e03SJordan Rupprecht
18be198e03SJordan Rupprecht        OFFSET = 0
192238dcc3SJonas Devlieghere        LENGTH = 0x1FFFF0
202238dcc3SJonas Devlieghere        self.test_sequence.add_log_lines(
212238dcc3SJonas Devlieghere            [
22be198e03SJordan Rupprecht                "read packet: $qXfer:features:read:target.xml:{:x},{:x}#00".format(
232238dcc3SJonas Devlieghere                    OFFSET, LENGTH
242238dcc3SJonas Devlieghere                ),
25be198e03SJordan Rupprecht                {
26be198e03SJordan Rupprecht                    "direction": "send",
27ba822e24SDavid Spickett                    "regex": re.compile("^\$l(.+)#[0-9a-fA-F]{2}$", flags=re.DOTALL),
282238dcc3SJonas Devlieghere                    "capture": {1: "target_xml"},
292238dcc3SJonas Devlieghere                },
302238dcc3SJonas Devlieghere            ],
312238dcc3SJonas Devlieghere            True,
322238dcc3SJonas Devlieghere        )
33be198e03SJordan Rupprecht        context = self.expect_gdbremote_sequence()
34be198e03SJordan Rupprecht
35be198e03SJordan Rupprecht        target_xml = context.get("target_xml")
36be198e03SJordan Rupprecht
37be198e03SJordan Rupprecht        root = ET.fromstring(target_xml)
38be198e03SJordan Rupprecht        self.assertIsNotNone(root)
39be198e03SJordan Rupprecht        self.assertEqual(root.tag, "target")
40be198e03SJordan Rupprecht
41be198e03SJordan Rupprecht        architecture = root.find("architecture")
42be198e03SJordan Rupprecht        self.assertIsNotNone(architecture)
433bb48898SJonas Devlieghere        self.assertIn(self.getArchitecture(), architecture.text)
44be198e03SJordan Rupprecht
45be198e03SJordan Rupprecht        feature = root.find("feature")
46be198e03SJordan Rupprecht        self.assertIsNotNone(feature)
47be198e03SJordan Rupprecht
48be198e03SJordan Rupprecht        target_xml_registers = feature.findall("reg")
49*9c246882SJordan Rupprecht        self.assertGreater(len(target_xml_registers), 0)
50be198e03SJordan Rupprecht
51be198e03SJordan Rupprecht        # registers info collected by qRegisterInfo
52be198e03SJordan Rupprecht        self.add_register_info_collection_packets()
53be198e03SJordan Rupprecht        context = self.expect_gdbremote_sequence()
54be198e03SJordan Rupprecht        self.assertIsNotNone(context)
55be198e03SJordan Rupprecht        q_info_registers = self.parse_register_info_packets(context)
56be198e03SJordan Rupprecht
57619e2e09SDave Lee        self.assertEqual(len(target_xml_registers), len(q_info_registers))
58be198e03SJordan Rupprecht        for register in zip(target_xml_registers, q_info_registers):
59be198e03SJordan Rupprecht            xml_info_reg = register[0]
60be198e03SJordan Rupprecht            q_info_reg = register[1]
61be198e03SJordan Rupprecht            self.assertEqual(q_info_reg["name"], xml_info_reg.get("name"))
62be198e03SJordan Rupprecht            self.assertEqual(q_info_reg["set"], xml_info_reg.get("group"))
63be198e03SJordan Rupprecht            self.assertEqual(q_info_reg["format"], xml_info_reg.get("format"))
64be198e03SJordan Rupprecht            self.assertEqual(q_info_reg["bitsize"], xml_info_reg.get("bitsize"))
6578cb4562SMuhammad Omair Javaid
6610f5e08aSMuhammad Omair Javaid            if not self.isAArch64():
67be198e03SJordan Rupprecht                self.assertEqual(q_info_reg["offset"], xml_info_reg.get("offset"))
6878cb4562SMuhammad Omair Javaid
69be198e03SJordan Rupprecht            self.assertEqual(q_info_reg["encoding"], xml_info_reg.get("encoding"))
70