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):
999451b44SJordan Rupprecht
10*0a8a2453SPavel Labath    def test_qProcessInfo_returns_running_process(self):
11*0a8a2453SPavel Labath        self.build()
1299451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
1399451b44SJordan Rupprecht        self.add_process_info_collection_packets()
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht        # Run the stream
1699451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
1799451b44SJordan Rupprecht        self.assertIsNotNone(context)
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        # Gather process info response
2099451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
2199451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        # Ensure the process id looks reasonable.
2499451b44SJordan Rupprecht        pid_text = process_info.get("pid")
2599451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
2699451b44SJordan Rupprecht        pid = int(pid_text, base=16)
2799451b44SJordan Rupprecht        self.assertNotEqual(0, pid)
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        # If possible, verify that the process is running.
3099451b44SJordan Rupprecht        self.assertTrue(lldbgdbserverutils.process_is_running(pid, True))
3199451b44SJordan Rupprecht
32*0a8a2453SPavel Labath    def test_attach_commandline_qProcessInfo_reports_correct_pid(self):
3399451b44SJordan Rupprecht        self.build()
34*0a8a2453SPavel Labath        self.set_inferior_startup_attach()
3599451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
3699451b44SJordan Rupprecht        self.assertIsNotNone(procs)
3799451b44SJordan Rupprecht        self.add_process_info_collection_packets()
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Run the stream
400fbbf3a9SJonas Devlieghere        context = self.expect_gdbremote_sequence()
4199451b44SJordan Rupprecht        self.assertIsNotNone(context)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        # Gather process info response
4499451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
4599451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        # Ensure the process id matches what we expected.
4899451b44SJordan Rupprecht        pid_text = process_info.get('pid', None)
4999451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
5099451b44SJordan Rupprecht        reported_pid = int(pid_text, base=16)
5199451b44SJordan Rupprecht        self.assertEqual(reported_pid, procs["inferior"].pid)
5299451b44SJordan Rupprecht
53*0a8a2453SPavel Labath    def test_qProcessInfo_reports_valid_endian(self):
5499451b44SJordan Rupprecht        self.build()
5599451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
5699451b44SJordan Rupprecht        self.add_process_info_collection_packets()
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        # Run the stream
5999451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
6099451b44SJordan Rupprecht        self.assertIsNotNone(context)
6199451b44SJordan Rupprecht
6299451b44SJordan Rupprecht        # Gather process info response
6399451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
6499451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        # Ensure the process id looks reasonable.
6799451b44SJordan Rupprecht        endian = process_info.get("endian")
6899451b44SJordan Rupprecht        self.assertIsNotNone(endian)
69*0a8a2453SPavel Labath        self.assertIn(endian, ["little", "big", "pdp"])
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht    def qProcessInfo_contains_keys(self, expected_key_set):
7299451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior()
7399451b44SJordan Rupprecht        self.add_process_info_collection_packets()
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        # Run the stream
7699451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
7799451b44SJordan Rupprecht        self.assertIsNotNone(context)
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        # Gather process info response
8099451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
8199451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        # Ensure the expected keys are present and non-None within the process
8499451b44SJordan Rupprecht        # info.
8599451b44SJordan Rupprecht        missing_key_set = set()
8699451b44SJordan Rupprecht        for expected_key in expected_key_set:
8799451b44SJordan Rupprecht            if expected_key not in process_info:
8899451b44SJordan Rupprecht                missing_key_set.add(expected_key)
8999451b44SJordan Rupprecht
9099451b44SJordan Rupprecht        self.assertEqual(
9199451b44SJordan Rupprecht            missing_key_set,
9299451b44SJordan Rupprecht            set(),
9399451b44SJordan Rupprecht            "the listed keys are missing in the qProcessInfo result")
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(),
11699451b44SJordan Rupprecht            "the listed keys were present but unexpected in qProcessInfo result")
11799451b44SJordan Rupprecht
118*0a8a2453SPavel Labath    @add_test_categories(["debugserver"])
119*0a8a2453SPavel Labath    def test_qProcessInfo_contains_cputype_cpusubtype(self):
12099451b44SJordan Rupprecht        self.build()
12199451b44SJordan Rupprecht        self.qProcessInfo_contains_keys(set(['cputype', 'cpusubtype']))
12299451b44SJordan Rupprecht
123*0a8a2453SPavel Labath    @add_test_categories(["llgs"])
124*0a8a2453SPavel Labath    def test_qProcessInfo_contains_triple_ppid(self):
12599451b44SJordan Rupprecht        self.build()
12699451b44SJordan Rupprecht        self.qProcessInfo_contains_keys(set(['triple', 'parent-pid']))
12799451b44SJordan Rupprecht
128*0a8a2453SPavel Labath    @add_test_categories(["debugserver"])
129*0a8a2453SPavel Labath    def test_qProcessInfo_does_not_contain_triple(self):
13099451b44SJordan Rupprecht        self.build()
13199451b44SJordan Rupprecht        # We don't expect to see triple on darwin.  If we do, we'll prefer triple
13299451b44SJordan Rupprecht        # to cputype/cpusubtype and skip some darwin-based ProcessGDBRemote ArchSpec setup
13399451b44SJordan Rupprecht        # for the remote Host and Process.
13499451b44SJordan Rupprecht        self.qProcessInfo_does_not_contain_keys(set(['triple']))
13599451b44SJordan Rupprecht
136*0a8a2453SPavel Labath    @add_test_categories(["llgs"])
137*0a8a2453SPavel Labath    def test_qProcessInfo_does_not_contain_cputype_cpusubtype(self):
13899451b44SJordan Rupprecht        self.build()
13999451b44SJordan Rupprecht        self.qProcessInfo_does_not_contain_keys(set(['cputype', 'cpusubtype']))
140