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