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