1""" 2Test that we are able to properly report a usable dynamic type 3""" 4 5 6 7import lldb 8from lldbsuite.test.decorators import * 9from lldbsuite.test.lldbtest import * 10from lldbsuite.test import lldbutil 11 12 13class ObjCDynamicSBTypeTestCase(TestBase): 14 15 mydir = TestBase.compute_mydir(__file__) 16 17 def setUp(self): 18 # Call super's setUp(). 19 TestBase.setUp(self) 20 # We'll use the test method name as the exe_name. 21 self.exe_name = self.testMethodName 22 # Find the line number to break inside main(). 23 self.main_source = "main.m" 24 self.line = line_number(self.main_source, '// Set breakpoint here.') 25 26 @skipIf(archs="i[3-6]86") 27 def test_dyn(self): 28 """Test that we are able to properly report a usable dynamic type.""" 29 d = {'EXE': self.exe_name} 30 self.build(dictionary=d) 31 self.setTearDownCleanup(dictionary=d) 32 33 exe = self.getBuildArtifact(self.exe_name) 34 self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 35 36 lldbutil.run_break_set_by_file_and_line( 37 self, 38 self.main_source, 39 self.line, 40 num_expected_locations=1, 41 loc_exact=True) 42 43 self.runCmd("run", RUN_SUCCEEDED) 44 45 v_object = self.frame().FindVariable( 46 "object").GetDynamicValue(lldb.eDynamicCanRunTarget) 47 v_base = self.frame().FindVariable( 48 "base").GetDynamicValue(lldb.eDynamicCanRunTarget) 49 self.assertEqual( 50 v_object.GetTypeName(), "MyDerivedClass *", 51 "The NSObject is properly type-named") 52 self.assertEqual( 53 v_base.GetTypeName(), "MyDerivedClass *", 54 "The Base is properly type-named") 55 object_type = v_object.GetType() 56 base_type = v_base.GetType() 57 self.assertEqual( 58 object_type.GetName(), "MyDerivedClass *", 59 "The dynamic SBType for NSObject is for the correct type") 60 self.assertEqual( 61 base_type.GetName(), "MyDerivedClass *", 62 "The dynamic SBType for Base is for the correct type") 63 object_pointee_type = object_type.GetPointeeType() 64 base_pointee_type = base_type.GetPointeeType() 65 self.assertEqual( 66 object_pointee_type.GetName(), "MyDerivedClass", 67 "The dynamic type for NSObject figures out its pointee type just fine") 68 self.assertEqual( 69 base_pointee_type.GetName(), "MyDerivedClass", 70 "The dynamic type for Base figures out its pointee type just fine") 71 72 self.assertEqual( 73 object_pointee_type.GetDirectBaseClassAtIndex(0).GetName(), "MyBaseClass", 74 "The dynamic type for NSObject can go back to its base class") 75 self.assertEqual( 76 base_pointee_type.GetDirectBaseClassAtIndex(0).GetName(), "MyBaseClass", 77 "The dynamic type for Base can go back to its base class") 78 79 self.assertTrue(object_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex( 80 0).GetName() == "NSObject", "The dynamic type for NSObject can go up the hierarchy") 81 self.assertTrue(base_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex( 82 0).GetName() == "NSObject", "The dynamic type for Base can go up the hierarchy") 83 84 self.assertEqual( 85 object_pointee_type.GetNumberOfFields(), 2, 86 "The dynamic type for NSObject has 2 fields") 87 self.assertEqual( 88 base_pointee_type.GetNumberOfFields(), 2, 89 "The dynamic type for Base has 2 fields") 90