xref: /llvm-project/lldb/test/API/tools/lldb-server/TestGdbRemoteProcessInfo.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprechtimport gdbremote_testcase
299451b44SJordan Rupprechtimport lldbgdbserverutils
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
499451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
599451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtclass TestGdbRemoteProcessInfo(gdbremote_testcase.GdbRemoteTestCaseBase):
90a8a2453SPavel Labath    def test_qProcessInfo_returns_running_process(self):
100a8a2453SPavel Labath        self.build()
1199451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
1299451b44SJordan Rupprecht        self.add_process_info_collection_packets()
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht        # Run the stream
1599451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
1699451b44SJordan Rupprecht        self.assertIsNotNone(context)
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht        # Gather process info response
1999451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
2099451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        # Ensure the process id looks reasonable.
2399451b44SJordan Rupprecht        pid_text = process_info.get("pid")
2499451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
2599451b44SJordan Rupprecht        pid = int(pid_text, base=16)
2699451b44SJordan Rupprecht        self.assertNotEqual(0, pid)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # If possible, verify that the process is running.
2999451b44SJordan Rupprecht        self.assertTrue(lldbgdbserverutils.process_is_running(pid, True))
3099451b44SJordan Rupprecht
310a8a2453SPavel Labath    def test_attach_commandline_qProcessInfo_reports_correct_pid(self):
3299451b44SJordan Rupprecht        self.build()
330a8a2453SPavel Labath        self.set_inferior_startup_attach()
3499451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
3599451b44SJordan Rupprecht        self.assertIsNotNone(procs)
3699451b44SJordan Rupprecht        self.add_process_info_collection_packets()
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Run the stream
390fbbf3a9SJonas Devlieghere        context = self.expect_gdbremote_sequence()
4099451b44SJordan Rupprecht        self.assertIsNotNone(context)
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        # Gather process info response
4399451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
4499451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        # Ensure the process id matches what we expected.
47*2238dcc3SJonas Devlieghere        pid_text = process_info.get("pid", None)
4899451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
4999451b44SJordan Rupprecht        reported_pid = int(pid_text, base=16)
5099451b44SJordan Rupprecht        self.assertEqual(reported_pid, procs["inferior"].pid)
5199451b44SJordan Rupprecht
520a8a2453SPavel Labath    def test_qProcessInfo_reports_valid_endian(self):
5399451b44SJordan Rupprecht        self.build()
5499451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
5599451b44SJordan Rupprecht        self.add_process_info_collection_packets()
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht        # Run the stream
5899451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
5999451b44SJordan Rupprecht        self.assertIsNotNone(context)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        # Gather process info response
6299451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
6399451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        # Ensure the process id looks reasonable.
6699451b44SJordan Rupprecht        endian = process_info.get("endian")
6799451b44SJordan Rupprecht        self.assertIsNotNone(endian)
680a8a2453SPavel Labath        self.assertIn(endian, ["little", "big", "pdp"])
6999451b44SJordan Rupprecht
7099451b44SJordan Rupprecht    def qProcessInfo_contains_keys(self, expected_key_set):
7199451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
7299451b44SJordan Rupprecht        self.add_process_info_collection_packets()
7399451b44SJordan Rupprecht
7499451b44SJordan Rupprecht        # Run the stream
7599451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
7699451b44SJordan Rupprecht        self.assertIsNotNone(context)
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        # Gather process info response
7999451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
8099451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        # Ensure the expected keys are present and non-None within the process
8399451b44SJordan Rupprecht        # info.
8499451b44SJordan Rupprecht        missing_key_set = set()
8599451b44SJordan Rupprecht        for expected_key in expected_key_set:
8699451b44SJordan Rupprecht            if expected_key not in process_info:
8799451b44SJordan Rupprecht                missing_key_set.add(expected_key)
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        self.assertEqual(
9099451b44SJordan Rupprecht            missing_key_set,
9199451b44SJordan Rupprecht            set(),
92*2238dcc3SJonas Devlieghere            "the listed keys are missing in the qProcessInfo result",
93*2238dcc3SJonas Devlieghere        )
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht    def qProcessInfo_does_not_contain_keys(self, absent_key_set):
9699451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
9799451b44SJordan Rupprecht        self.add_process_info_collection_packets()
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        # Run the stream
10099451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
10199451b44SJordan Rupprecht        self.assertIsNotNone(context)
10299451b44SJordan Rupprecht
10399451b44SJordan Rupprecht        # Gather process info response
10499451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
10599451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
10699451b44SJordan Rupprecht
10799451b44SJordan Rupprecht        # Ensure the unexpected keys are not present
10899451b44SJordan Rupprecht        unexpected_key_set = set()
10999451b44SJordan Rupprecht        for unexpected_key in absent_key_set:
11099451b44SJordan Rupprecht            if unexpected_key in process_info:
11199451b44SJordan Rupprecht                unexpected_key_set.add(unexpected_key)
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        self.assertEqual(
11499451b44SJordan Rupprecht            unexpected_key_set,
11599451b44SJordan Rupprecht            set(),
116*2238dcc3SJonas Devlieghere            "the listed keys were present but unexpected in qProcessInfo result",
117*2238dcc3SJonas Devlieghere        )
11899451b44SJordan Rupprecht
1190a8a2453SPavel Labath    @add_test_categories(["debugserver"])
1200a8a2453SPavel Labath    def test_qProcessInfo_contains_cputype_cpusubtype(self):
12199451b44SJordan Rupprecht        self.build()
122*2238dcc3SJonas Devlieghere        self.qProcessInfo_contains_keys(set(["cputype", "cpusubtype"]))
12399451b44SJordan Rupprecht
1240a8a2453SPavel Labath    @add_test_categories(["llgs"])
1250a8a2453SPavel Labath    def test_qProcessInfo_contains_triple_ppid(self):
12699451b44SJordan Rupprecht        self.build()
127*2238dcc3SJonas Devlieghere        self.qProcessInfo_contains_keys(set(["triple", "parent-pid"]))
12899451b44SJordan Rupprecht
1290a8a2453SPavel Labath    @add_test_categories(["debugserver"])
1300a8a2453SPavel Labath    def test_qProcessInfo_does_not_contain_triple(self):
13199451b44SJordan Rupprecht        self.build()
13299451b44SJordan Rupprecht        # We don't expect to see triple on darwin.  If we do, we'll prefer triple
13399451b44SJordan Rupprecht        # to cputype/cpusubtype and skip some darwin-based ProcessGDBRemote ArchSpec setup
13499451b44SJordan Rupprecht        # for the remote Host and Process.
135*2238dcc3SJonas Devlieghere        self.qProcessInfo_does_not_contain_keys(set(["triple"]))
13699451b44SJordan Rupprecht
1370a8a2453SPavel Labath    @add_test_categories(["llgs"])
1380a8a2453SPavel Labath    def test_qProcessInfo_does_not_contain_cputype_cpusubtype(self):
13999451b44SJordan Rupprecht        self.build()
140*2238dcc3SJonas Devlieghere        self.qProcessInfo_does_not_contain_keys(set(["cputype", "cpusubtype"]))
141