199451b44SJordan Rupprecht"""Test Python APIs for working with formatters""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtfrom __future__ import print_function 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass SBFormattersAPITestCase(TestBase): 1399451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprecht def setUp(self): 1699451b44SJordan Rupprecht # Call super's setUp(). 1799451b44SJordan Rupprecht TestBase.setUp(self) 1899451b44SJordan Rupprecht self.line = line_number('main.cpp', '// Set break point at this line.') 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht def test_formatters_api(self): 2199451b44SJordan Rupprecht """Test Python APIs for working with formatters""" 2299451b44SJordan Rupprecht self.build() 2399451b44SJordan Rupprecht self.setTearDownCleanup() 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht """Test Python APIs for working with formatters""" 2699451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("a.out"), 2799451b44SJordan Rupprecht CURRENT_EXECUTABLE_SET) 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 3099451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, 3199451b44SJordan Rupprecht loc_exact=True) 3299451b44SJordan Rupprecht 3399451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 3699451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 3799451b44SJordan Rupprecht substrs=['stopped', 3899451b44SJordan Rupprecht 'stop reason = breakpoint']) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 4199451b44SJordan Rupprecht # clean slate for the next test case. 4299451b44SJordan Rupprecht def cleanup(): 4399451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 4499451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 4599451b44SJordan Rupprecht self.runCmd('type filter clear', check=False) 4699451b44SJordan Rupprecht self.runCmd('type synthetic clear', check=False) 4799451b44SJordan Rupprecht self.runCmd('type category delete foobar', check=False) 4899451b44SJordan Rupprecht self.runCmd('type category delete JASSynth', check=False) 4999451b44SJordan Rupprecht self.runCmd('type category delete newbar', check=False) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 5299451b44SJordan Rupprecht self.addTearDownHook(cleanup) 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht format = lldb.SBTypeFormat(lldb.eFormatHex) 5599451b44SJordan Rupprecht category = self.dbg.GetDefaultCategory() 5699451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht self.expect("frame variable foo.A", 5999451b44SJordan Rupprecht substrs=['0x00000001']) 6099451b44SJordan Rupprecht self.expect("frame variable foo.E", matching=False, 6199451b44SJordan Rupprecht substrs=['b8cca70a']) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("long"), format) 6499451b44SJordan Rupprecht self.expect("frame variable foo.A", 6599451b44SJordan Rupprecht substrs=['0x00000001']) 6699451b44SJordan Rupprecht self.expect("frame variable foo.E", 6799451b44SJordan Rupprecht substrs=['b8cca70a']) 6899451b44SJordan Rupprecht 6999451b44SJordan Rupprecht format.SetFormat(lldb.eFormatOctal) 7099451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format) 7199451b44SJordan Rupprecht self.expect("frame variable foo.A", 7299451b44SJordan Rupprecht substrs=[' 01']) 7399451b44SJordan Rupprecht self.expect("frame variable foo.E", 7499451b44SJordan Rupprecht substrs=['b8cca70a']) 7599451b44SJordan Rupprecht 7699451b44SJordan Rupprecht category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("int")) 7799451b44SJordan Rupprecht category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("long")) 7899451b44SJordan Rupprecht self.expect("frame variable foo.A", matching=False, 7999451b44SJordan Rupprecht substrs=[' 01']) 8099451b44SJordan Rupprecht self.expect("frame variable foo.E", matching=False, 8199451b44SJordan Rupprecht substrs=['b8cca70a']) 8299451b44SJordan Rupprecht 8399451b44SJordan Rupprecht summary = lldb.SBTypeSummary.CreateWithSummaryString( 8499451b44SJordan Rupprecht "the hello world you'll never see") 8599451b44SJordan Rupprecht summary.SetSummaryString('hello world') 8699451b44SJordan Rupprecht new_category = self.dbg.GetCategory("foobar") 8799451b44SJordan Rupprecht self.assertFalse( 8899451b44SJordan Rupprecht new_category.IsValid(), 8999451b44SJordan Rupprecht "getting a non-existing category worked") 9099451b44SJordan Rupprecht new_category = self.dbg.CreateCategory("foobar") 9199451b44SJordan Rupprecht new_category.SetEnabled(True) 9299451b44SJordan Rupprecht new_category.AddTypeSummary( 9399451b44SJordan Rupprecht lldb.SBTypeNameSpecifier( 9499451b44SJordan Rupprecht "^.*t$", 9599451b44SJordan Rupprecht True, # is_regexp 9699451b44SJordan Rupprecht ), summary) 9799451b44SJordan Rupprecht 9899451b44SJordan Rupprecht self.expect("frame variable foo.A", 9999451b44SJordan Rupprecht substrs=['hello world']) 10099451b44SJordan Rupprecht self.expect("frame variable foo.E", matching=False, 10199451b44SJordan Rupprecht substrs=['hello world']) 10299451b44SJordan Rupprecht self.expect("frame variable foo.B", 10399451b44SJordan Rupprecht substrs=['hello world']) 10499451b44SJordan Rupprecht self.expect("frame variable foo.F", 10599451b44SJordan Rupprecht substrs=['hello world']) 10699451b44SJordan Rupprecht new_category.SetEnabled(False) 10799451b44SJordan Rupprecht self.expect("frame variable foo.A", matching=False, 10899451b44SJordan Rupprecht substrs=['hello world']) 10999451b44SJordan Rupprecht self.expect("frame variable foo.E", matching=False, 11099451b44SJordan Rupprecht substrs=['hello world']) 11199451b44SJordan Rupprecht self.expect("frame variable foo.B", matching=False, 11299451b44SJordan Rupprecht substrs=['hello world']) 11399451b44SJordan Rupprecht self.expect("frame variable foo.F", matching=False, 11499451b44SJordan Rupprecht substrs=['hello world']) 11599451b44SJordan Rupprecht self.dbg.DeleteCategory(new_category.GetName()) 11699451b44SJordan Rupprecht self.expect("frame variable foo.A", matching=False, 11799451b44SJordan Rupprecht substrs=['hello world']) 11899451b44SJordan Rupprecht self.expect("frame variable foo.E", matching=False, 11999451b44SJordan Rupprecht substrs=['hello world']) 12099451b44SJordan Rupprecht self.expect("frame variable foo.B", matching=False, 12199451b44SJordan Rupprecht substrs=['hello world']) 12299451b44SJordan Rupprecht self.expect("frame variable foo.F", matching=False, 12399451b44SJordan Rupprecht substrs=['hello world']) 12499451b44SJordan Rupprecht 12599451b44SJordan Rupprecht filter = lldb.SBTypeFilter(0) 12699451b44SJordan Rupprecht filter.AppendExpressionPath("A") 12799451b44SJordan Rupprecht filter.AppendExpressionPath("D") 128*0ed758b2SDave Lee self.assertEqual( 129*0ed758b2SDave Lee filter.GetNumberOfExpressionPaths(), 2, 13099451b44SJordan Rupprecht "filter with two items does not have two items") 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 13399451b44SJordan Rupprecht self.expect("frame variable foo", 13499451b44SJordan Rupprecht substrs=['A = 1', 'D = 6.28']) 13599451b44SJordan Rupprecht self.expect("frame variable foo", matching=False, 13699451b44SJordan Rupprecht substrs=['B = ', 'C = ', 'E = ', 'F = ']) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht category.DeleteTypeFilter( 13999451b44SJordan Rupprecht lldb.SBTypeNameSpecifier( 14099451b44SJordan Rupprecht "JustAStruct", True)) 14199451b44SJordan Rupprecht self.expect("frame variable foo", 14299451b44SJordan Rupprecht substrs=['A = 1', 'D = 6.28']) 14399451b44SJordan Rupprecht self.expect("frame variable foo", matching=False, 14499451b44SJordan Rupprecht substrs=['B = ', 'C = ', 'E = ', 'F = ']) 14599451b44SJordan Rupprecht 14699451b44SJordan Rupprecht category.DeleteTypeFilter( 14799451b44SJordan Rupprecht lldb.SBTypeNameSpecifier( 14899451b44SJordan Rupprecht "JustAStruct", False)) 14999451b44SJordan Rupprecht self.expect("frame variable foo", 15099451b44SJordan Rupprecht substrs=['A = 1', 'D = 6.28']) 15199451b44SJordan Rupprecht self.expect("frame variable foo", matching=True, 15299451b44SJordan Rupprecht substrs=['B = ', 'C = ', 'E = ', 'F = ']) 15399451b44SJordan Rupprecht 15499451b44SJordan Rupprecht self.runCmd("command script import --allow-reload ./synth.py") 15599451b44SJordan Rupprecht 15699451b44SJordan Rupprecht self.expect("frame variable foo", matching=False, 15799451b44SJordan Rupprecht substrs=['X = 1']) 15899451b44SJordan Rupprecht 15999451b44SJordan Rupprecht self.dbg.GetCategory("JASSynth").SetEnabled(True) 16099451b44SJordan Rupprecht self.expect("frame variable foo", matching=True, 16199451b44SJordan Rupprecht substrs=['X = 1']) 16299451b44SJordan Rupprecht 16399451b44SJordan Rupprecht self.dbg.GetCategory("CCCSynth").SetEnabled(True) 16499451b44SJordan Rupprecht self.expect( 16599451b44SJordan Rupprecht "frame variable ccc", 16699451b44SJordan Rupprecht matching=True, 16799451b44SJordan Rupprecht substrs=[ 16899451b44SJordan Rupprecht 'CCC object with leading value (int) a = 111', 16999451b44SJordan Rupprecht 'a = 111', 17099451b44SJordan Rupprecht 'b = 222', 17199451b44SJordan Rupprecht 'c = 333']) 17299451b44SJordan Rupprecht 17399451b44SJordan Rupprecht foo_var = self.dbg.GetSelectedTarget().GetProcess( 17499451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame().FindVariable('foo') 17599451b44SJordan Rupprecht self.assertTrue(foo_var.IsValid(), 'could not find foo') 17699451b44SJordan Rupprecht self.assertTrue( 17799451b44SJordan Rupprecht foo_var.GetDeclaration().IsValid(), 17899451b44SJordan Rupprecht 'foo declaration is invalid') 17999451b44SJordan Rupprecht 180*0ed758b2SDave Lee self.assertEqual( 181*0ed758b2SDave Lee foo_var.GetNumChildren(), 2, 18299451b44SJordan Rupprecht 'synthetic value has wrong number of child items (synth)') 183*0ed758b2SDave Lee self.assertEqual( 184*0ed758b2SDave Lee foo_var.GetChildMemberWithName('X').GetValueAsUnsigned(), 1, 18599451b44SJordan Rupprecht 'foo_synth.X has wrong value (synth)') 18699451b44SJordan Rupprecht self.assertFalse( 18799451b44SJordan Rupprecht foo_var.GetChildMemberWithName('B').IsValid(), 18899451b44SJordan Rupprecht 'foo_synth.B is valid but should not (synth)') 18999451b44SJordan Rupprecht 19099451b44SJordan Rupprecht self.dbg.GetCategory("JASSynth").SetEnabled(False) 19199451b44SJordan Rupprecht foo_var = self.dbg.GetSelectedTarget().GetProcess( 19299451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame().FindVariable('foo') 19399451b44SJordan Rupprecht self.assertTrue(foo_var.IsValid(), 'could not find foo') 19499451b44SJordan Rupprecht 19599451b44SJordan Rupprecht self.assertFalse( 19699451b44SJordan Rupprecht foo_var.GetNumChildren() == 2, 19799451b44SJordan Rupprecht 'still seeing synthetic value') 19899451b44SJordan Rupprecht 19999451b44SJordan Rupprecht filter = lldb.SBTypeFilter(0) 20099451b44SJordan Rupprecht filter.AppendExpressionPath("A") 20199451b44SJordan Rupprecht filter.AppendExpressionPath("D") 20299451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 20399451b44SJordan Rupprecht self.expect("frame variable foo", 20499451b44SJordan Rupprecht substrs=['A = 1', 'D = 6.28']) 20599451b44SJordan Rupprecht 20699451b44SJordan Rupprecht foo_var = self.dbg.GetSelectedTarget().GetProcess( 20799451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame().FindVariable('foo') 20899451b44SJordan Rupprecht self.assertTrue(foo_var.IsValid(), 'could not find foo') 20999451b44SJordan Rupprecht 210*0ed758b2SDave Lee self.assertEqual( 211*0ed758b2SDave Lee foo_var.GetNumChildren(), 2, 21299451b44SJordan Rupprecht 'synthetic value has wrong number of child items (filter)') 213*0ed758b2SDave Lee self.assertEqual( 214*0ed758b2SDave Lee foo_var.GetChildMemberWithName('X').GetValueAsUnsigned(), 0, 21599451b44SJordan Rupprecht 'foo_synth.X has wrong value (filter)') 216*0ed758b2SDave Lee self.assertEqual( 217*0ed758b2SDave Lee foo_var.GetChildMemberWithName('A').GetValueAsUnsigned(), 1, 21899451b44SJordan Rupprecht 'foo_synth.A has wrong value (filter)') 21999451b44SJordan Rupprecht 22099451b44SJordan Rupprecht self.assertTrue(filter.ReplaceExpressionPathAtIndex( 22199451b44SJordan Rupprecht 0, "C"), "failed to replace an expression path in filter") 22299451b44SJordan Rupprecht self.expect("frame variable foo", 22399451b44SJordan Rupprecht substrs=['A = 1', 'D = 6.28']) 22499451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 22599451b44SJordan Rupprecht self.expect("frame variable foo", 22699451b44SJordan Rupprecht substrs=["C = 'e'", 'D = 6.28']) 22799451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("FooType"), filter) 22899451b44SJordan Rupprecht filter.ReplaceExpressionPathAtIndex(1, "F") 22999451b44SJordan Rupprecht self.expect("frame variable foo", 23099451b44SJordan Rupprecht substrs=["C = 'e'", 'D = 6.28']) 23199451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 23299451b44SJordan Rupprecht self.expect("frame variable foo", 23399451b44SJordan Rupprecht substrs=["C = 'e'", 'F = 0']) 23499451b44SJordan Rupprecht self.expect("frame variable bar", 23599451b44SJordan Rupprecht substrs=["C = 'e'", 'D = 6.28']) 23699451b44SJordan Rupprecht 23799451b44SJordan Rupprecht foo_var = self.dbg.GetSelectedTarget().GetProcess( 23899451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame().FindVariable('foo') 23999451b44SJordan Rupprecht self.assertTrue(foo_var.IsValid(), 'could not find foo') 240*0ed758b2SDave Lee self.assertEqual( 241*0ed758b2SDave Lee foo_var.GetChildMemberWithName('C').GetValueAsUnsigned(), ord('e'), 24299451b44SJordan Rupprecht 'foo_synth.C has wrong value (filter)') 24399451b44SJordan Rupprecht 24499451b44SJordan Rupprecht chosen = self.dbg.GetFilterForType( 24599451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct")) 246*0ed758b2SDave Lee self.assertEqual( 247*0ed758b2SDave Lee chosen.count, 2, 24899451b44SJordan Rupprecht "wrong filter found for JustAStruct") 249*0ed758b2SDave Lee self.assertEqual( 250*0ed758b2SDave Lee chosen.GetExpressionPathAtIndex(0), 'C', 25199451b44SJordan Rupprecht "wrong item at index 0 for JustAStruct") 252*0ed758b2SDave Lee self.assertEqual( 253*0ed758b2SDave Lee chosen.GetExpressionPathAtIndex(1), 'F', 25499451b44SJordan Rupprecht "wrong item at index 1 for JustAStruct") 25599451b44SJordan Rupprecht 25699451b44SJordan Rupprecht self.assertFalse( 25799451b44SJordan Rupprecht category.DeleteTypeFilter( 25899451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoSuchType")), 25999451b44SJordan Rupprecht "deleting a non-existing filter worked") 26099451b44SJordan Rupprecht self.assertFalse( 26199451b44SJordan Rupprecht category.DeleteTypeSummary( 26299451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoSuchType")), 26399451b44SJordan Rupprecht "deleting a non-existing summary worked") 26499451b44SJordan Rupprecht self.assertFalse( 26599451b44SJordan Rupprecht category.DeleteTypeFormat( 26699451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoSuchType")), 26799451b44SJordan Rupprecht "deleting a non-existing format worked") 26899451b44SJordan Rupprecht self.assertFalse( 26999451b44SJordan Rupprecht category.DeleteTypeSynthetic( 27099451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoSuchType")), 27199451b44SJordan Rupprecht "deleting a non-existing synthetic worked") 27299451b44SJordan Rupprecht 27399451b44SJordan Rupprecht self.assertFalse( 27499451b44SJordan Rupprecht category.DeleteTypeFilter( 27599451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("")), 27699451b44SJordan Rupprecht "deleting a filter for '' worked") 27799451b44SJordan Rupprecht self.assertFalse( 27899451b44SJordan Rupprecht category.DeleteTypeSummary( 27999451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("")), 28099451b44SJordan Rupprecht "deleting a summary for '' worked") 28199451b44SJordan Rupprecht self.assertFalse( 28299451b44SJordan Rupprecht category.DeleteTypeFormat( 28399451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("")), 28499451b44SJordan Rupprecht "deleting a format for '' worked") 28599451b44SJordan Rupprecht self.assertFalse( 28699451b44SJordan Rupprecht category.DeleteTypeSynthetic( 28799451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("")), 28899451b44SJordan Rupprecht "deleting a synthetic for '' worked") 28999451b44SJordan Rupprecht 29099451b44SJordan Rupprecht try: 29199451b44SJordan Rupprecht self.assertFalse( 29299451b44SJordan Rupprecht category.AddTypeSummary( 29399451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoneSuchType"), 29499451b44SJordan Rupprecht None), 29599451b44SJordan Rupprecht "adding a summary valued None worked") 29699451b44SJordan Rupprecht except: 29799451b44SJordan Rupprecht pass 29899451b44SJordan Rupprecht else: 29999451b44SJordan Rupprecht self.assertFalse(True, "adding a summary valued None worked") 30099451b44SJordan Rupprecht 30199451b44SJordan Rupprecht try: 30299451b44SJordan Rupprecht self.assertFalse( 30399451b44SJordan Rupprecht category.AddTypeFilter( 30499451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoneSuchType"), 30599451b44SJordan Rupprecht None), 30699451b44SJordan Rupprecht "adding a filter valued None worked") 30799451b44SJordan Rupprecht except: 30899451b44SJordan Rupprecht pass 30999451b44SJordan Rupprecht else: 31099451b44SJordan Rupprecht self.assertFalse(True, "adding a filter valued None worked") 31199451b44SJordan Rupprecht 31299451b44SJordan Rupprecht try: 31399451b44SJordan Rupprecht self.assertFalse( 31499451b44SJordan Rupprecht category.AddTypeSynthetic( 31599451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoneSuchType"), 31699451b44SJordan Rupprecht None), 31799451b44SJordan Rupprecht "adding a synthetic valued None worked") 31899451b44SJordan Rupprecht except: 31999451b44SJordan Rupprecht pass 32099451b44SJordan Rupprecht else: 32199451b44SJordan Rupprecht self.assertFalse(True, "adding a synthetic valued None worked") 32299451b44SJordan Rupprecht 32399451b44SJordan Rupprecht try: 32499451b44SJordan Rupprecht self.assertFalse( 32599451b44SJordan Rupprecht category.AddTypeFormat( 32699451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("NoneSuchType"), 32799451b44SJordan Rupprecht None), 32899451b44SJordan Rupprecht "adding a format valued None worked") 32999451b44SJordan Rupprecht except: 33099451b44SJordan Rupprecht pass 33199451b44SJordan Rupprecht else: 33299451b44SJordan Rupprecht self.assertFalse(True, "adding a format valued None worked") 33399451b44SJordan Rupprecht 33499451b44SJordan Rupprecht self.assertFalse( 33599451b44SJordan Rupprecht category.AddTypeSummary( 33699451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("EmptySuchType"), 33799451b44SJordan Rupprecht lldb.SBTypeSummary()), 33899451b44SJordan Rupprecht "adding a summary without value worked") 33999451b44SJordan Rupprecht self.assertFalse( 34099451b44SJordan Rupprecht category.AddTypeFilter( 34199451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("EmptySuchType"), 34299451b44SJordan Rupprecht lldb.SBTypeFilter()), 34399451b44SJordan Rupprecht "adding a filter without value worked") 34499451b44SJordan Rupprecht self.assertFalse( 34599451b44SJordan Rupprecht category.AddTypeSynthetic( 34699451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("EmptySuchType"), 34799451b44SJordan Rupprecht lldb.SBTypeSynthetic()), 34899451b44SJordan Rupprecht "adding a synthetic without value worked") 34999451b44SJordan Rupprecht self.assertFalse( 35099451b44SJordan Rupprecht category.AddTypeFormat( 35199451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("EmptySuchType"), 35299451b44SJordan Rupprecht lldb.SBTypeFormat()), 35399451b44SJordan Rupprecht "adding a format without value worked") 35499451b44SJordan Rupprecht 35599451b44SJordan Rupprecht self.assertFalse( 35699451b44SJordan Rupprecht category.AddTypeSummary( 35799451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 35899451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithSummaryString("")), 35999451b44SJordan Rupprecht "adding a summary for an invalid type worked") 36099451b44SJordan Rupprecht self.assertFalse( 36199451b44SJordan Rupprecht category.AddTypeFilter( 36299451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 36399451b44SJordan Rupprecht lldb.SBTypeFilter(0)), 36499451b44SJordan Rupprecht "adding a filter for an invalid type worked") 36599451b44SJordan Rupprecht self.assertFalse( 36699451b44SJordan Rupprecht category.AddTypeSynthetic( 36799451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 36899451b44SJordan Rupprecht lldb.SBTypeSynthetic.CreateWithClassName("")), 36999451b44SJordan Rupprecht "adding a synthetic for an invalid type worked") 37099451b44SJordan Rupprecht self.assertFalse( 37199451b44SJordan Rupprecht category.AddTypeFormat( 37299451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 37399451b44SJordan Rupprecht lldb.SBTypeFormat( 37499451b44SJordan Rupprecht lldb.eFormatHex)), 37599451b44SJordan Rupprecht "adding a format for an invalid type worked") 37699451b44SJordan Rupprecht 37799451b44SJordan Rupprecht new_category = self.dbg.CreateCategory("newbar") 37899451b44SJordan Rupprecht new_category.AddTypeSummary( 37999451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 38099451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';")) 38199451b44SJordan Rupprecht self.expect("frame variable foo", matching=False, 38299451b44SJordan Rupprecht substrs=['hello scripted world']) 38399451b44SJordan Rupprecht new_category.SetEnabled(True) 38499451b44SJordan Rupprecht self.expect("frame variable foo", matching=True, 38599451b44SJordan Rupprecht substrs=['hello scripted world']) 38699451b44SJordan Rupprecht 38799451b44SJordan Rupprecht self.expect("frame variable foo_ptr", matching=True, 38899451b44SJordan Rupprecht substrs=['hello scripted world']) 38999451b44SJordan Rupprecht new_category.AddTypeSummary( 39099451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 39199451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithScriptCode( 39299451b44SJordan Rupprecht "return 'hello scripted world';", 39399451b44SJordan Rupprecht lldb.eTypeOptionSkipPointers)) 39499451b44SJordan Rupprecht self.expect("frame variable foo", matching=True, 39599451b44SJordan Rupprecht substrs=['hello scripted world']) 39699451b44SJordan Rupprecht 39799451b44SJordan Rupprecht frame = self.dbg.GetSelectedTarget().GetProcess( 39899451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame() 39999451b44SJordan Rupprecht foo_ptr = frame.FindVariable("foo_ptr") 40099451b44SJordan Rupprecht summary = foo_ptr.GetTypeSummary() 40199451b44SJordan Rupprecht 40299451b44SJordan Rupprecht self.assertFalse( 40399451b44SJordan Rupprecht summary.IsValid(), 40499451b44SJordan Rupprecht "summary found for foo* when none was planned") 40599451b44SJordan Rupprecht 40699451b44SJordan Rupprecht self.expect("frame variable foo_ptr", matching=False, 40799451b44SJordan Rupprecht substrs=['hello scripted world']) 40899451b44SJordan Rupprecht 40999451b44SJordan Rupprecht new_category.AddTypeSummary( 41099451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 41199451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithSummaryString( 41299451b44SJordan Rupprecht "hello static world", 41399451b44SJordan Rupprecht lldb.eTypeOptionNone)) 41499451b44SJordan Rupprecht 41599451b44SJordan Rupprecht summary = foo_ptr.GetTypeSummary() 41699451b44SJordan Rupprecht 41799451b44SJordan Rupprecht self.assertTrue( 41899451b44SJordan Rupprecht summary.IsValid(), 41999451b44SJordan Rupprecht "no summary found for foo* when one was in place") 420*0ed758b2SDave Lee self.assertEqual( 421*0ed758b2SDave Lee summary.GetData(), "hello static world", 42299451b44SJordan Rupprecht "wrong summary found for foo*") 42399451b44SJordan Rupprecht 42499451b44SJordan Rupprecht self.expect("frame variable e1", substrs=["I am an empty Empty1 {}"]) 42599451b44SJordan Rupprecht self.expect("frame variable e2", substrs=["I am an empty Empty2"]) 42699451b44SJordan Rupprecht self.expect( 42799451b44SJordan Rupprecht "frame variable e2", 42899451b44SJordan Rupprecht substrs=["I am an empty Empty2 {}"], 42999451b44SJordan Rupprecht matching=False) 43099451b44SJordan Rupprecht 43199451b44SJordan Rupprecht self.assertTrue( 43299451b44SJordan Rupprecht self.dbg.GetCategory( 43399451b44SJordan Rupprecht lldb.eLanguageTypeObjC) is not None, 43499451b44SJordan Rupprecht "ObjC category is None") 43599451b44SJordan Rupprecht 43699451b44SJordan Rupprecht def test_force_synth_off(self): 43799451b44SJordan Rupprecht """Test that one can have the public API return non-synthetic SBValues if desired""" 43899451b44SJordan Rupprecht self.build(dictionary={'EXE': 'no_synth'}) 43999451b44SJordan Rupprecht self.setTearDownCleanup() 44099451b44SJordan Rupprecht 44199451b44SJordan Rupprecht self.runCmd("file " + self.getBuildArtifact("no_synth"), 44299451b44SJordan Rupprecht CURRENT_EXECUTABLE_SET) 44399451b44SJordan Rupprecht 44499451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 44599451b44SJordan Rupprecht self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True) 44699451b44SJordan Rupprecht 44799451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 44899451b44SJordan Rupprecht 44999451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 45099451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 45199451b44SJordan Rupprecht substrs=['stopped', 45299451b44SJordan Rupprecht 'stop reason = breakpoint']) 45399451b44SJordan Rupprecht 45499451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 45599451b44SJordan Rupprecht # clean slate for the next test case. 45699451b44SJordan Rupprecht def cleanup(): 45799451b44SJordan Rupprecht self.runCmd('type format clear', check=False) 45899451b44SJordan Rupprecht self.runCmd('type summary clear', check=False) 45999451b44SJordan Rupprecht self.runCmd('type filter clear', check=False) 46099451b44SJordan Rupprecht self.runCmd('type synthetic clear', check=False) 46199451b44SJordan Rupprecht self.runCmd('type category delete foobar', check=False) 46299451b44SJordan Rupprecht self.runCmd('type category delete JASSynth', check=False) 46399451b44SJordan Rupprecht self.runCmd('type category delete newbar', check=False) 46499451b44SJordan Rupprecht self.runCmd('settings set target.enable-synthetic-value true') 46599451b44SJordan Rupprecht 46699451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 46799451b44SJordan Rupprecht self.addTearDownHook(cleanup) 46899451b44SJordan Rupprecht 46999451b44SJordan Rupprecht frame = self.dbg.GetSelectedTarget().GetProcess( 47099451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame() 47199451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 47299451b44SJordan Rupprecht if self.TraceOn(): 47399451b44SJordan Rupprecht print(int_vector) 474*0ed758b2SDave Lee self.assertEqual( 475*0ed758b2SDave Lee int_vector.GetNumChildren(), 0, 47699451b44SJordan Rupprecht 'synthetic vector is empty') 47799451b44SJordan Rupprecht 47899451b44SJordan Rupprecht self.runCmd('settings set target.enable-synthetic-value false') 47999451b44SJordan Rupprecht frame = self.dbg.GetSelectedTarget().GetProcess( 48099451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame() 48199451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 48299451b44SJordan Rupprecht if self.TraceOn(): 48399451b44SJordan Rupprecht print(int_vector) 48499451b44SJordan Rupprecht self.assertFalse( 48599451b44SJordan Rupprecht int_vector.GetNumChildren() == 0, 48699451b44SJordan Rupprecht '"physical" vector is not empty') 48799451b44SJordan Rupprecht 48899451b44SJordan Rupprecht self.runCmd('settings set target.enable-synthetic-value true') 48999451b44SJordan Rupprecht frame = self.dbg.GetSelectedTarget().GetProcess( 49099451b44SJordan Rupprecht ).GetSelectedThread().GetSelectedFrame() 49199451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 49299451b44SJordan Rupprecht if self.TraceOn(): 49399451b44SJordan Rupprecht print(int_vector) 494*0ed758b2SDave Lee self.assertEqual( 495*0ed758b2SDave Lee int_vector.GetNumChildren(), 0, 49699451b44SJordan Rupprecht 'synthetic vector is still empty') 497