199451b44SJordan Rupprecht"""Test Python APIs for working with formatters""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtimport lldb 499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 799451b44SJordan Rupprecht 899451b44SJordan Rupprecht 999451b44SJordan Rupprechtclass SBFormattersAPITestCase(TestBase): 1099451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht def setUp(self): 1399451b44SJordan Rupprecht # Call super's setUp(). 1499451b44SJordan Rupprecht TestBase.setUp(self) 152238dcc3SJonas Devlieghere self.line = line_number("main.cpp", "// Set break point at this line.") 1699451b44SJordan Rupprecht 1799451b44SJordan Rupprecht def test_formatters_api(self): 1899451b44SJordan Rupprecht """Test Python APIs for working with formatters""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht self.setTearDownCleanup() 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht """Test Python APIs for working with formatters""" 232238dcc3SJonas Devlieghere self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 262238dcc3SJonas Devlieghere self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True 272238dcc3SJonas Devlieghere ) 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 322238dcc3SJonas Devlieghere self.expect( 332238dcc3SJonas Devlieghere "thread list", 342238dcc3SJonas Devlieghere STOPPED_DUE_TO_BREAKPOINT, 352238dcc3SJonas Devlieghere substrs=["stopped", "stop reason = breakpoint"], 362238dcc3SJonas Devlieghere ) 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 3999451b44SJordan Rupprecht # clean slate for the next test case. 4099451b44SJordan Rupprecht def cleanup(): 412238dcc3SJonas Devlieghere self.runCmd("type format clear", check=False) 422238dcc3SJonas Devlieghere self.runCmd("type summary clear", check=False) 432238dcc3SJonas Devlieghere self.runCmd("type filter clear", check=False) 442238dcc3SJonas Devlieghere self.runCmd("type synthetic clear", check=False) 452238dcc3SJonas Devlieghere self.runCmd("type category delete foobar", check=False) 462238dcc3SJonas Devlieghere self.runCmd("type category delete JASSynth", check=False) 472238dcc3SJonas Devlieghere self.runCmd("type category delete newbar", check=False) 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 5099451b44SJordan Rupprecht self.addTearDownHook(cleanup) 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht format = lldb.SBTypeFormat(lldb.eFormatHex) 5399451b44SJordan Rupprecht category = self.dbg.GetDefaultCategory() 5499451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format) 5599451b44SJordan Rupprecht 562238dcc3SJonas Devlieghere self.expect("frame variable foo.A", substrs=["0x00000001"]) 572238dcc3SJonas Devlieghere self.expect("frame variable foo.E", matching=False, substrs=["b8cca70a"]) 5899451b44SJordan Rupprecht 5999451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("long"), format) 602238dcc3SJonas Devlieghere self.expect("frame variable foo.A", substrs=["0x00000001"]) 612238dcc3SJonas Devlieghere self.expect("frame variable foo.E", substrs=["b8cca70a"]) 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht format.SetFormat(lldb.eFormatOctal) 6499451b44SJordan Rupprecht category.AddTypeFormat(lldb.SBTypeNameSpecifier("int"), format) 652238dcc3SJonas Devlieghere self.expect("frame variable foo.A", substrs=[" 01"]) 662238dcc3SJonas Devlieghere self.expect("frame variable foo.E", substrs=["b8cca70a"]) 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("int")) 6999451b44SJordan Rupprecht category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("long")) 702238dcc3SJonas Devlieghere self.expect("frame variable foo.A", matching=False, substrs=[" 01"]) 712238dcc3SJonas Devlieghere self.expect("frame variable foo.E", matching=False, substrs=["b8cca70a"]) 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht summary = lldb.SBTypeSummary.CreateWithSummaryString( 742238dcc3SJonas Devlieghere "the hello world you'll never see" 752238dcc3SJonas Devlieghere ) 762238dcc3SJonas Devlieghere summary.SetSummaryString("hello world") 7799451b44SJordan Rupprecht new_category = self.dbg.GetCategory("foobar") 7899451b44SJordan Rupprecht self.assertFalse( 792238dcc3SJonas Devlieghere new_category.IsValid(), "getting a non-existing category worked" 802238dcc3SJonas Devlieghere ) 8199451b44SJordan Rupprecht new_category = self.dbg.CreateCategory("foobar") 8299451b44SJordan Rupprecht new_category.SetEnabled(True) 8399451b44SJordan Rupprecht new_category.AddTypeSummary( 8499451b44SJordan Rupprecht lldb.SBTypeNameSpecifier( 8599451b44SJordan Rupprecht "^.*t$", 8699451b44SJordan Rupprecht True, # is_regexp 872238dcc3SJonas Devlieghere ), 882238dcc3SJonas Devlieghere summary, 892238dcc3SJonas Devlieghere ) 9099451b44SJordan Rupprecht 912238dcc3SJonas Devlieghere self.expect("frame variable foo.A", substrs=["hello world"]) 922238dcc3SJonas Devlieghere self.expect("frame variable foo.E", matching=False, substrs=["hello world"]) 932238dcc3SJonas Devlieghere self.expect("frame variable foo.B", substrs=["hello world"]) 942238dcc3SJonas Devlieghere self.expect("frame variable foo.F", substrs=["hello world"]) 9599451b44SJordan Rupprecht new_category.SetEnabled(False) 962238dcc3SJonas Devlieghere self.expect("frame variable foo.A", matching=False, substrs=["hello world"]) 972238dcc3SJonas Devlieghere self.expect("frame variable foo.E", matching=False, substrs=["hello world"]) 982238dcc3SJonas Devlieghere self.expect("frame variable foo.B", matching=False, substrs=["hello world"]) 992238dcc3SJonas Devlieghere self.expect("frame variable foo.F", matching=False, substrs=["hello world"]) 10099451b44SJordan Rupprecht self.dbg.DeleteCategory(new_category.GetName()) 1012238dcc3SJonas Devlieghere self.expect("frame variable foo.A", matching=False, substrs=["hello world"]) 1022238dcc3SJonas Devlieghere self.expect("frame variable foo.E", matching=False, substrs=["hello world"]) 1032238dcc3SJonas Devlieghere self.expect("frame variable foo.B", matching=False, substrs=["hello world"]) 1042238dcc3SJonas Devlieghere self.expect("frame variable foo.F", matching=False, substrs=["hello world"]) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht filter = lldb.SBTypeFilter(0) 10799451b44SJordan Rupprecht filter.AppendExpressionPath("A") 10899451b44SJordan Rupprecht filter.AppendExpressionPath("D") 1090ed758b2SDave Lee self.assertEqual( 1102238dcc3SJonas Devlieghere filter.GetNumberOfExpressionPaths(), 1112238dcc3SJonas Devlieghere 2, 1122238dcc3SJonas Devlieghere "filter with two items does not have two items", 1132238dcc3SJonas Devlieghere ) 11499451b44SJordan Rupprecht 11599451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 1162238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"]) 1172238dcc3SJonas Devlieghere self.expect( 1182238dcc3SJonas Devlieghere "frame variable foo", 1192238dcc3SJonas Devlieghere matching=False, 1202238dcc3SJonas Devlieghere substrs=["B = ", "C = ", "E = ", "F = "], 1212238dcc3SJonas Devlieghere ) 12299451b44SJordan Rupprecht 1232238dcc3SJonas Devlieghere category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct", True)) 1242238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"]) 1252238dcc3SJonas Devlieghere self.expect( 1262238dcc3SJonas Devlieghere "frame variable foo", 1272238dcc3SJonas Devlieghere matching=False, 1282238dcc3SJonas Devlieghere substrs=["B = ", "C = ", "E = ", "F = "], 1292238dcc3SJonas Devlieghere ) 13099451b44SJordan Rupprecht 1312238dcc3SJonas Devlieghere category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct", False)) 1322238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"]) 1332238dcc3SJonas Devlieghere self.expect( 1342238dcc3SJonas Devlieghere "frame variable foo", 1352238dcc3SJonas Devlieghere matching=True, 1362238dcc3SJonas Devlieghere substrs=["B = ", "C = ", "E = ", "F = "], 1372238dcc3SJonas Devlieghere ) 13899451b44SJordan Rupprecht 13999451b44SJordan Rupprecht self.runCmd("command script import --allow-reload ./synth.py") 14099451b44SJordan Rupprecht 1412238dcc3SJonas Devlieghere self.expect("frame variable foo", matching=False, substrs=["X = 1"]) 14299451b44SJordan Rupprecht 14399451b44SJordan Rupprecht self.dbg.GetCategory("JASSynth").SetEnabled(True) 1442238dcc3SJonas Devlieghere self.expect("frame variable foo", matching=True, substrs=["X = 1"]) 14599451b44SJordan Rupprecht 146*82af5598SVincent Belliard self.dbg.GetCategory("CCCSynth2").SetEnabled(True) 147*82af5598SVincent Belliard self.expect( 148*82af5598SVincent Belliard "frame variable ccc", 149*82af5598SVincent Belliard matching=True, 150*82af5598SVincent Belliard substrs=[ 151*82af5598SVincent Belliard "CCC object with leading synthetic value (int) b = 222", 152*82af5598SVincent Belliard "a = 111", 153*82af5598SVincent Belliard "b = 222", 154*82af5598SVincent Belliard "c = 333", 155*82af5598SVincent Belliard ], 156*82af5598SVincent Belliard ) 157*82af5598SVincent Belliard self.dbg.GetCategory("CCCSynth2").SetEnabled(False) 158*82af5598SVincent Belliard 15999451b44SJordan Rupprecht self.dbg.GetCategory("CCCSynth").SetEnabled(True) 16099451b44SJordan Rupprecht self.expect( 16199451b44SJordan Rupprecht "frame variable ccc", 16299451b44SJordan Rupprecht matching=True, 16399451b44SJordan Rupprecht substrs=[ 1642238dcc3SJonas Devlieghere "CCC object with leading value (int) a = 111", 1652238dcc3SJonas Devlieghere "a = 111", 1662238dcc3SJonas Devlieghere "b = 222", 1672238dcc3SJonas Devlieghere "c = 333", 1682238dcc3SJonas Devlieghere ], 1692238dcc3SJonas Devlieghere ) 17099451b44SJordan Rupprecht 171*82af5598SVincent Belliard self.dbg.GetCategory("BarIntSynth").SetEnabled(True) 172*82af5598SVincent Belliard self.expect( 173*82af5598SVincent Belliard "frame variable bar_int", 174*82af5598SVincent Belliard matching=True, 175*82af5598SVincent Belliard substrs=[ 176*82af5598SVincent Belliard "(int) bar_int = 20 bar_int synthetic: No value", 177*82af5598SVincent Belliard ], 178*82af5598SVincent Belliard ) 179*82af5598SVincent Belliard 1802238dcc3SJonas Devlieghere foo_var = ( 1812238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 1822238dcc3SJonas Devlieghere .GetProcess() 1832238dcc3SJonas Devlieghere .GetSelectedThread() 1842238dcc3SJonas Devlieghere .GetSelectedFrame() 1852238dcc3SJonas Devlieghere .FindVariable("foo") 1862238dcc3SJonas Devlieghere ) 1872238dcc3SJonas Devlieghere self.assertTrue(foo_var.IsValid(), "could not find foo") 18899451b44SJordan Rupprecht self.assertTrue( 1892238dcc3SJonas Devlieghere foo_var.GetDeclaration().IsValid(), "foo declaration is invalid" 1902238dcc3SJonas Devlieghere ) 19199451b44SJordan Rupprecht 1920ed758b2SDave Lee self.assertEqual( 1932238dcc3SJonas Devlieghere foo_var.GetNumChildren(), 1942238dcc3SJonas Devlieghere 2, 1952238dcc3SJonas Devlieghere "synthetic value has wrong number of child items (synth)", 1962238dcc3SJonas Devlieghere ) 1970ed758b2SDave Lee self.assertEqual( 1982238dcc3SJonas Devlieghere foo_var.GetChildMemberWithName("X").GetValueAsUnsigned(), 1992238dcc3SJonas Devlieghere 1, 2002238dcc3SJonas Devlieghere "foo_synth.X has wrong value (synth)", 2012238dcc3SJonas Devlieghere ) 20299451b44SJordan Rupprecht self.assertFalse( 2032238dcc3SJonas Devlieghere foo_var.GetChildMemberWithName("B").IsValid(), 2042238dcc3SJonas Devlieghere "foo_synth.B is valid but should not (synth)", 2052238dcc3SJonas Devlieghere ) 20699451b44SJordan Rupprecht 20799451b44SJordan Rupprecht self.dbg.GetCategory("JASSynth").SetEnabled(False) 2082238dcc3SJonas Devlieghere foo_var = ( 2092238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 2102238dcc3SJonas Devlieghere .GetProcess() 2112238dcc3SJonas Devlieghere .GetSelectedThread() 2122238dcc3SJonas Devlieghere .GetSelectedFrame() 2132238dcc3SJonas Devlieghere .FindVariable("foo") 2142238dcc3SJonas Devlieghere ) 2152238dcc3SJonas Devlieghere self.assertTrue(foo_var.IsValid(), "could not find foo") 21699451b44SJordan Rupprecht 2179c246882SJordan Rupprecht self.assertNotEqual(foo_var.GetNumChildren(), 2, "still seeing synthetic value") 21899451b44SJordan Rupprecht 21999451b44SJordan Rupprecht filter = lldb.SBTypeFilter(0) 22099451b44SJordan Rupprecht filter.AppendExpressionPath("A") 22199451b44SJordan Rupprecht filter.AppendExpressionPath("D") 22299451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 2232238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"]) 22499451b44SJordan Rupprecht 2252238dcc3SJonas Devlieghere foo_var = ( 2262238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 2272238dcc3SJonas Devlieghere .GetProcess() 2282238dcc3SJonas Devlieghere .GetSelectedThread() 2292238dcc3SJonas Devlieghere .GetSelectedFrame() 2302238dcc3SJonas Devlieghere .FindVariable("foo") 2312238dcc3SJonas Devlieghere ) 2322238dcc3SJonas Devlieghere self.assertTrue(foo_var.IsValid(), "could not find foo") 23399451b44SJordan Rupprecht 2340ed758b2SDave Lee self.assertEqual( 2352238dcc3SJonas Devlieghere foo_var.GetNumChildren(), 2362238dcc3SJonas Devlieghere 2, 2372238dcc3SJonas Devlieghere "synthetic value has wrong number of child items (filter)", 2382238dcc3SJonas Devlieghere ) 2390ed758b2SDave Lee self.assertEqual( 2402238dcc3SJonas Devlieghere foo_var.GetChildMemberWithName("X").GetValueAsUnsigned(), 2412238dcc3SJonas Devlieghere 0, 2422238dcc3SJonas Devlieghere "foo_synth.X has wrong value (filter)", 2432238dcc3SJonas Devlieghere ) 2440ed758b2SDave Lee self.assertEqual( 2452238dcc3SJonas Devlieghere foo_var.GetChildMemberWithName("A").GetValueAsUnsigned(), 2462238dcc3SJonas Devlieghere 1, 2472238dcc3SJonas Devlieghere "foo_synth.A has wrong value (filter)", 2482238dcc3SJonas Devlieghere ) 24999451b44SJordan Rupprecht 2502238dcc3SJonas Devlieghere self.assertTrue( 2512238dcc3SJonas Devlieghere filter.ReplaceExpressionPathAtIndex(0, "C"), 2522238dcc3SJonas Devlieghere "failed to replace an expression path in filter", 2532238dcc3SJonas Devlieghere ) 2542238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["A = 1", "D = 6.28"]) 25599451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 2562238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["C = 'e'", "D = 6.28"]) 25799451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("FooType"), filter) 25899451b44SJordan Rupprecht filter.ReplaceExpressionPathAtIndex(1, "F") 2592238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["C = 'e'", "D = 6.28"]) 26099451b44SJordan Rupprecht category.AddTypeFilter(lldb.SBTypeNameSpecifier("JustAStruct"), filter) 2612238dcc3SJonas Devlieghere self.expect("frame variable foo", substrs=["C = 'e'", "F = 0"]) 2622238dcc3SJonas Devlieghere self.expect("frame variable bar", substrs=["C = 'e'", "D = 6.28"]) 26399451b44SJordan Rupprecht 2642238dcc3SJonas Devlieghere foo_var = ( 2652238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 2662238dcc3SJonas Devlieghere .GetProcess() 2672238dcc3SJonas Devlieghere .GetSelectedThread() 2682238dcc3SJonas Devlieghere .GetSelectedFrame() 2692238dcc3SJonas Devlieghere .FindVariable("foo") 2702238dcc3SJonas Devlieghere ) 2712238dcc3SJonas Devlieghere self.assertTrue(foo_var.IsValid(), "could not find foo") 2720ed758b2SDave Lee self.assertEqual( 2732238dcc3SJonas Devlieghere foo_var.GetChildMemberWithName("C").GetValueAsUnsigned(), 2742238dcc3SJonas Devlieghere ord("e"), 2752238dcc3SJonas Devlieghere "foo_synth.C has wrong value (filter)", 2762238dcc3SJonas Devlieghere ) 27799451b44SJordan Rupprecht 2782238dcc3SJonas Devlieghere chosen = self.dbg.GetFilterForType(lldb.SBTypeNameSpecifier("JustAStruct")) 2792238dcc3SJonas Devlieghere self.assertEqual(chosen.count, 2, "wrong filter found for JustAStruct") 2800ed758b2SDave Lee self.assertEqual( 2812238dcc3SJonas Devlieghere chosen.GetExpressionPathAtIndex(0), 2822238dcc3SJonas Devlieghere "C", 2832238dcc3SJonas Devlieghere "wrong item at index 0 for JustAStruct", 2842238dcc3SJonas Devlieghere ) 2850ed758b2SDave Lee self.assertEqual( 2862238dcc3SJonas Devlieghere chosen.GetExpressionPathAtIndex(1), 2872238dcc3SJonas Devlieghere "F", 2882238dcc3SJonas Devlieghere "wrong item at index 1 for JustAStruct", 2892238dcc3SJonas Devlieghere ) 29099451b44SJordan Rupprecht 29199451b44SJordan Rupprecht self.assertFalse( 2922238dcc3SJonas Devlieghere category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("NoSuchType")), 2932238dcc3SJonas Devlieghere "deleting a non-existing filter worked", 2942238dcc3SJonas Devlieghere ) 29599451b44SJordan Rupprecht self.assertFalse( 2962238dcc3SJonas Devlieghere category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("NoSuchType")), 2972238dcc3SJonas Devlieghere "deleting a non-existing summary worked", 2982238dcc3SJonas Devlieghere ) 29999451b44SJordan Rupprecht self.assertFalse( 3002238dcc3SJonas Devlieghere category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("NoSuchType")), 3012238dcc3SJonas Devlieghere "deleting a non-existing format worked", 3022238dcc3SJonas Devlieghere ) 30399451b44SJordan Rupprecht self.assertFalse( 3042238dcc3SJonas Devlieghere category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("NoSuchType")), 3052238dcc3SJonas Devlieghere "deleting a non-existing synthetic worked", 3062238dcc3SJonas Devlieghere ) 30799451b44SJordan Rupprecht 30899451b44SJordan Rupprecht self.assertFalse( 3092238dcc3SJonas Devlieghere category.DeleteTypeFilter(lldb.SBTypeNameSpecifier("")), 3102238dcc3SJonas Devlieghere "deleting a filter for '' worked", 3112238dcc3SJonas Devlieghere ) 31299451b44SJordan Rupprecht self.assertFalse( 3132238dcc3SJonas Devlieghere category.DeleteTypeSummary(lldb.SBTypeNameSpecifier("")), 3142238dcc3SJonas Devlieghere "deleting a summary for '' worked", 3152238dcc3SJonas Devlieghere ) 31699451b44SJordan Rupprecht self.assertFalse( 3172238dcc3SJonas Devlieghere category.DeleteTypeFormat(lldb.SBTypeNameSpecifier("")), 3182238dcc3SJonas Devlieghere "deleting a format for '' worked", 3192238dcc3SJonas Devlieghere ) 32099451b44SJordan Rupprecht self.assertFalse( 3212238dcc3SJonas Devlieghere category.DeleteTypeSynthetic(lldb.SBTypeNameSpecifier("")), 3222238dcc3SJonas Devlieghere "deleting a synthetic for '' worked", 3232238dcc3SJonas Devlieghere ) 32499451b44SJordan Rupprecht 32599451b44SJordan Rupprecht try: 32699451b44SJordan Rupprecht self.assertFalse( 3272238dcc3SJonas Devlieghere category.AddTypeSummary(lldb.SBTypeNameSpecifier("NoneSuchType"), None), 3282238dcc3SJonas Devlieghere "adding a summary valued None worked", 3292238dcc3SJonas Devlieghere ) 33099451b44SJordan Rupprecht except: 33199451b44SJordan Rupprecht pass 33299451b44SJordan Rupprecht else: 33399451b44SJordan Rupprecht self.assertFalse(True, "adding a summary valued None worked") 33499451b44SJordan Rupprecht 33599451b44SJordan Rupprecht try: 33699451b44SJordan Rupprecht self.assertFalse( 3372238dcc3SJonas Devlieghere category.AddTypeFilter(lldb.SBTypeNameSpecifier("NoneSuchType"), None), 3382238dcc3SJonas Devlieghere "adding a filter valued None worked", 3392238dcc3SJonas Devlieghere ) 34099451b44SJordan Rupprecht except: 34199451b44SJordan Rupprecht pass 34299451b44SJordan Rupprecht else: 34399451b44SJordan Rupprecht self.assertFalse(True, "adding a filter valued None worked") 34499451b44SJordan Rupprecht 34599451b44SJordan Rupprecht try: 34699451b44SJordan Rupprecht self.assertFalse( 34799451b44SJordan Rupprecht category.AddTypeSynthetic( 3482238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier("NoneSuchType"), None 3492238dcc3SJonas Devlieghere ), 3502238dcc3SJonas Devlieghere "adding a synthetic valued None worked", 3512238dcc3SJonas Devlieghere ) 35299451b44SJordan Rupprecht except: 35399451b44SJordan Rupprecht pass 35499451b44SJordan Rupprecht else: 35599451b44SJordan Rupprecht self.assertFalse(True, "adding a synthetic valued None worked") 35699451b44SJordan Rupprecht 35799451b44SJordan Rupprecht try: 35899451b44SJordan Rupprecht self.assertFalse( 3592238dcc3SJonas Devlieghere category.AddTypeFormat(lldb.SBTypeNameSpecifier("NoneSuchType"), None), 3602238dcc3SJonas Devlieghere "adding a format valued None worked", 3612238dcc3SJonas Devlieghere ) 36299451b44SJordan Rupprecht except: 36399451b44SJordan Rupprecht pass 36499451b44SJordan Rupprecht else: 36599451b44SJordan Rupprecht self.assertFalse(True, "adding a format valued None worked") 36699451b44SJordan Rupprecht 36799451b44SJordan Rupprecht self.assertFalse( 36899451b44SJordan Rupprecht category.AddTypeSummary( 3692238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSummary() 3702238dcc3SJonas Devlieghere ), 3712238dcc3SJonas Devlieghere "adding a summary without value worked", 3722238dcc3SJonas Devlieghere ) 37399451b44SJordan Rupprecht self.assertFalse( 37499451b44SJordan Rupprecht category.AddTypeFilter( 3752238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFilter() 3762238dcc3SJonas Devlieghere ), 3772238dcc3SJonas Devlieghere "adding a filter without value worked", 3782238dcc3SJonas Devlieghere ) 37999451b44SJordan Rupprecht self.assertFalse( 38099451b44SJordan Rupprecht category.AddTypeSynthetic( 3812238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeSynthetic() 3822238dcc3SJonas Devlieghere ), 3832238dcc3SJonas Devlieghere "adding a synthetic without value worked", 3842238dcc3SJonas Devlieghere ) 38599451b44SJordan Rupprecht self.assertFalse( 38699451b44SJordan Rupprecht category.AddTypeFormat( 3872238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier("EmptySuchType"), lldb.SBTypeFormat() 3882238dcc3SJonas Devlieghere ), 3892238dcc3SJonas Devlieghere "adding a format without value worked", 3902238dcc3SJonas Devlieghere ) 39199451b44SJordan Rupprecht 39299451b44SJordan Rupprecht self.assertFalse( 39399451b44SJordan Rupprecht category.AddTypeSummary( 39499451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 3952238dcc3SJonas Devlieghere lldb.SBTypeSummary.CreateWithSummaryString(""), 3962238dcc3SJonas Devlieghere ), 3972238dcc3SJonas Devlieghere "adding a summary for an invalid type worked", 3982238dcc3SJonas Devlieghere ) 39999451b44SJordan Rupprecht self.assertFalse( 4002238dcc3SJonas Devlieghere category.AddTypeFilter(lldb.SBTypeNameSpecifier(""), lldb.SBTypeFilter(0)), 4012238dcc3SJonas Devlieghere "adding a filter for an invalid type worked", 4022238dcc3SJonas Devlieghere ) 40399451b44SJordan Rupprecht self.assertFalse( 40499451b44SJordan Rupprecht category.AddTypeSynthetic( 40599451b44SJordan Rupprecht lldb.SBTypeNameSpecifier(""), 4062238dcc3SJonas Devlieghere lldb.SBTypeSynthetic.CreateWithClassName(""), 4072238dcc3SJonas Devlieghere ), 4082238dcc3SJonas Devlieghere "adding a synthetic for an invalid type worked", 4092238dcc3SJonas Devlieghere ) 41099451b44SJordan Rupprecht self.assertFalse( 41199451b44SJordan Rupprecht category.AddTypeFormat( 4122238dcc3SJonas Devlieghere lldb.SBTypeNameSpecifier(""), lldb.SBTypeFormat(lldb.eFormatHex) 4132238dcc3SJonas Devlieghere ), 4142238dcc3SJonas Devlieghere "adding a format for an invalid type worked", 4152238dcc3SJonas Devlieghere ) 41699451b44SJordan Rupprecht 41799451b44SJordan Rupprecht new_category = self.dbg.CreateCategory("newbar") 41899451b44SJordan Rupprecht new_category.AddTypeSummary( 41999451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 4202238dcc3SJonas Devlieghere lldb.SBTypeSummary.CreateWithScriptCode("return 'hello scripted world';"), 4212238dcc3SJonas Devlieghere ) 4222238dcc3SJonas Devlieghere self.expect( 4232238dcc3SJonas Devlieghere "frame variable foo", matching=False, substrs=["hello scripted world"] 4242238dcc3SJonas Devlieghere ) 42599451b44SJordan Rupprecht new_category.SetEnabled(True) 4262238dcc3SJonas Devlieghere self.expect( 4272238dcc3SJonas Devlieghere "frame variable foo", matching=True, substrs=["hello scripted world"] 4282238dcc3SJonas Devlieghere ) 42999451b44SJordan Rupprecht 4302238dcc3SJonas Devlieghere self.expect( 4312238dcc3SJonas Devlieghere "frame variable foo_ptr", matching=True, substrs=["hello scripted world"] 4322238dcc3SJonas Devlieghere ) 43399451b44SJordan Rupprecht new_category.AddTypeSummary( 43499451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 43599451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithScriptCode( 4362238dcc3SJonas Devlieghere "return 'hello scripted world';", lldb.eTypeOptionSkipPointers 4372238dcc3SJonas Devlieghere ), 4382238dcc3SJonas Devlieghere ) 4392238dcc3SJonas Devlieghere self.expect( 4402238dcc3SJonas Devlieghere "frame variable foo", matching=True, substrs=["hello scripted world"] 4412238dcc3SJonas Devlieghere ) 44299451b44SJordan Rupprecht 4432238dcc3SJonas Devlieghere frame = ( 4442238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 4452238dcc3SJonas Devlieghere .GetProcess() 4462238dcc3SJonas Devlieghere .GetSelectedThread() 4472238dcc3SJonas Devlieghere .GetSelectedFrame() 4482238dcc3SJonas Devlieghere ) 44999451b44SJordan Rupprecht foo_ptr = frame.FindVariable("foo_ptr") 45099451b44SJordan Rupprecht summary = foo_ptr.GetTypeSummary() 45199451b44SJordan Rupprecht 45299451b44SJordan Rupprecht self.assertFalse( 4532238dcc3SJonas Devlieghere summary.IsValid(), "summary found for foo* when none was planned" 4542238dcc3SJonas Devlieghere ) 45599451b44SJordan Rupprecht 4562238dcc3SJonas Devlieghere self.expect( 4572238dcc3SJonas Devlieghere "frame variable foo_ptr", matching=False, substrs=["hello scripted world"] 4582238dcc3SJonas Devlieghere ) 45999451b44SJordan Rupprecht 46099451b44SJordan Rupprecht new_category.AddTypeSummary( 46199451b44SJordan Rupprecht lldb.SBTypeNameSpecifier("JustAStruct"), 46299451b44SJordan Rupprecht lldb.SBTypeSummary.CreateWithSummaryString( 4632238dcc3SJonas Devlieghere "hello static world", lldb.eTypeOptionNone 4642238dcc3SJonas Devlieghere ), 4652238dcc3SJonas Devlieghere ) 46699451b44SJordan Rupprecht 46799451b44SJordan Rupprecht summary = foo_ptr.GetTypeSummary() 46899451b44SJordan Rupprecht 46999451b44SJordan Rupprecht self.assertTrue( 4702238dcc3SJonas Devlieghere summary.IsValid(), "no summary found for foo* when one was in place" 4712238dcc3SJonas Devlieghere ) 4720ed758b2SDave Lee self.assertEqual( 4732238dcc3SJonas Devlieghere summary.GetData(), "hello static world", "wrong summary found for foo*" 4742238dcc3SJonas Devlieghere ) 47599451b44SJordan Rupprecht 47699451b44SJordan Rupprecht self.expect("frame variable e1", substrs=["I am an empty Empty1 {}"]) 47799451b44SJordan Rupprecht self.expect("frame variable e2", substrs=["I am an empty Empty2"]) 47899451b44SJordan Rupprecht self.expect( 4792238dcc3SJonas Devlieghere "frame variable e2", substrs=["I am an empty Empty2 {}"], matching=False 4802238dcc3SJonas Devlieghere ) 48199451b44SJordan Rupprecht 4829c246882SJordan Rupprecht self.assertIsNotNone( 4839c246882SJordan Rupprecht self.dbg.GetCategory(lldb.eLanguageTypeObjC), "ObjC category is None" 4842238dcc3SJonas Devlieghere ) 48599451b44SJordan Rupprecht 48699451b44SJordan Rupprecht def test_force_synth_off(self): 48799451b44SJordan Rupprecht """Test that one can have the public API return non-synthetic SBValues if desired""" 4882238dcc3SJonas Devlieghere self.build(dictionary={"EXE": "no_synth"}) 48999451b44SJordan Rupprecht self.setTearDownCleanup() 49099451b44SJordan Rupprecht 4912238dcc3SJonas Devlieghere self.runCmd("file " + self.getBuildArtifact("no_synth"), CURRENT_EXECUTABLE_SET) 49299451b44SJordan Rupprecht 49399451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 4942238dcc3SJonas Devlieghere self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True 4952238dcc3SJonas Devlieghere ) 49699451b44SJordan Rupprecht 49799451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 49899451b44SJordan Rupprecht 49999451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 5002238dcc3SJonas Devlieghere self.expect( 5012238dcc3SJonas Devlieghere "thread list", 5022238dcc3SJonas Devlieghere STOPPED_DUE_TO_BREAKPOINT, 5032238dcc3SJonas Devlieghere substrs=["stopped", "stop reason = breakpoint"], 5042238dcc3SJonas Devlieghere ) 50599451b44SJordan Rupprecht 50699451b44SJordan Rupprecht # This is the function to remove the custom formats in order to have a 50799451b44SJordan Rupprecht # clean slate for the next test case. 50899451b44SJordan Rupprecht def cleanup(): 5092238dcc3SJonas Devlieghere self.runCmd("type format clear", check=False) 5102238dcc3SJonas Devlieghere self.runCmd("type summary clear", check=False) 5112238dcc3SJonas Devlieghere self.runCmd("type filter clear", check=False) 5122238dcc3SJonas Devlieghere self.runCmd("type synthetic clear", check=False) 5132238dcc3SJonas Devlieghere self.runCmd("type category delete foobar", check=False) 5142238dcc3SJonas Devlieghere self.runCmd("type category delete JASSynth", check=False) 5152238dcc3SJonas Devlieghere self.runCmd("type category delete newbar", check=False) 5162238dcc3SJonas Devlieghere self.runCmd("settings set target.enable-synthetic-value true") 51799451b44SJordan Rupprecht 51899451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 51999451b44SJordan Rupprecht self.addTearDownHook(cleanup) 52099451b44SJordan Rupprecht 5212238dcc3SJonas Devlieghere frame = ( 5222238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 5232238dcc3SJonas Devlieghere .GetProcess() 5242238dcc3SJonas Devlieghere .GetSelectedThread() 5252238dcc3SJonas Devlieghere .GetSelectedFrame() 5262238dcc3SJonas Devlieghere ) 52799451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 52899451b44SJordan Rupprecht if self.TraceOn(): 52999451b44SJordan Rupprecht print(int_vector) 5302238dcc3SJonas Devlieghere self.assertEqual(int_vector.GetNumChildren(), 0, "synthetic vector is empty") 53199451b44SJordan Rupprecht 5322238dcc3SJonas Devlieghere self.runCmd("settings set target.enable-synthetic-value false") 5332238dcc3SJonas Devlieghere frame = ( 5342238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 5352238dcc3SJonas Devlieghere .GetProcess() 5362238dcc3SJonas Devlieghere .GetSelectedThread() 5372238dcc3SJonas Devlieghere .GetSelectedFrame() 5382238dcc3SJonas Devlieghere ) 53999451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 54099451b44SJordan Rupprecht if self.TraceOn(): 54199451b44SJordan Rupprecht print(int_vector) 5429c246882SJordan Rupprecht self.assertNotEqual( 5439c246882SJordan Rupprecht int_vector.GetNumChildren(), 0, '"physical" vector is not empty' 5442238dcc3SJonas Devlieghere ) 54599451b44SJordan Rupprecht 5462238dcc3SJonas Devlieghere self.runCmd("settings set target.enable-synthetic-value true") 5472238dcc3SJonas Devlieghere frame = ( 5482238dcc3SJonas Devlieghere self.dbg.GetSelectedTarget() 5492238dcc3SJonas Devlieghere .GetProcess() 5502238dcc3SJonas Devlieghere .GetSelectedThread() 5512238dcc3SJonas Devlieghere .GetSelectedFrame() 5522238dcc3SJonas Devlieghere ) 55399451b44SJordan Rupprecht int_vector = frame.FindVariable("int_vector") 55499451b44SJordan Rupprecht if self.TraceOn(): 55599451b44SJordan Rupprecht print(int_vector) 5560ed758b2SDave Lee self.assertEqual( 5572238dcc3SJonas Devlieghere int_vector.GetNumChildren(), 0, "synthetic vector is still empty" 5582238dcc3SJonas Devlieghere ) 559