2012-02-15 02:36:32 +00:00
""" Test Python APIs for working with formatters """
import os , sys , time
import unittest2
import lldb
from lldbtest import *
2012-09-22 00:05:11 +00:00
import lldbutil
2012-02-15 02:36:32 +00:00
class SBFormattersAPITestCase ( TestBase ) :
2013-12-10 23:19:29 +00:00
mydir = TestBase . compute_mydir ( __file__ )
2012-02-15 02:36:32 +00:00
2015-03-30 14:12:17 +00:00
@skipUnlessDarwin
2012-02-15 02:36:32 +00:00
@python_api_test
2012-04-06 19:54:10 +00:00
@dsym_test
2012-02-15 02:36:32 +00:00
def test_with_dsym_formatters_api ( self ) :
""" Test Python APIs for working with formatters """
self . buildDsym ( )
self . setTearDownCleanup ( )
self . formatters ( )
@python_api_test
2012-04-06 19:54:10 +00:00
@dwarf_test
2012-02-15 02:36:32 +00:00
def test_with_dwarf_formatters_api ( self ) :
""" Test Python APIs for working with formatters """
self . buildDwarf ( )
self . setTearDownCleanup ( )
self . formatters ( )
2012-03-27 02:35:13 +00:00
@python_api_test
def test_force_synth_off ( self ) :
""" Test that one can have the public API return non-synthetic SBValues if desired """
self . buildDwarf ( dictionary = { ' EXE ' : ' no_synth ' } )
self . setTearDownCleanup ( )
self . force_synth_off ( )
2012-02-15 02:36:32 +00:00
def setUp ( self ) :
# Call super's setUp().
TestBase . setUp ( self )
self . line = line_number ( ' main.cpp ' , ' // Set break point at this line. ' )
def formatters ( self ) :
""" Test Python APIs for working with formatters """
self . runCmd ( " file a.out " , CURRENT_EXECUTABLE_SET )
2012-09-22 00:05:11 +00:00
lldbutil . run_break_set_by_file_and_line ( self , " main.cpp " , self . line , num_expected_locations = 1 , loc_exact = True )
2012-02-15 02:36:32 +00:00
2015-05-27 22:27:41 +00:00
self . runCmd ( " run " , RUN_FAILED )
2012-02-15 02:36:32 +00:00
# The stop reason of the thread should be breakpoint.
self . expect ( " thread list " , STOPPED_DUE_TO_BREAKPOINT ,
substrs = [ ' stopped ' ,
' stop reason = breakpoint ' ] )
# This is the function to remove the custom formats in order to have a
# clean slate for the next test case.
def cleanup ( ) :
self . runCmd ( ' type format clear ' , check = False )
self . runCmd ( ' type summary clear ' , check = False )
self . runCmd ( ' type filter clear ' , check = False )
self . runCmd ( ' type synthetic clear ' , check = False )
self . runCmd ( ' type category delete foobar ' , check = False )
self . runCmd ( ' type category delete JASSynth ' , check = False )
self . runCmd ( ' type category delete newbar ' , check = False )
# Execute the cleanup function during test case tear down.
self . addTearDownHook ( cleanup )
format = lldb . SBTypeFormat ( lldb . eFormatHex )
category = self . dbg . GetDefaultCategory ( )
category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " int " ) , format )
self . expect ( " frame variable foo.A " ,
substrs = [ ' 0x00000001 ' ] )
self . expect ( " frame variable foo.E " , matching = False ,
2012-04-24 02:01:17 +00:00
substrs = [ ' b8cca70a ' ] )
2012-02-15 02:36:32 +00:00
category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " long " ) , format )
self . expect ( " frame variable foo.A " ,
substrs = [ ' 0x00000001 ' ] )
self . expect ( " frame variable foo.E " ,
2012-04-24 02:01:17 +00:00
substrs = [ ' b8cca70a ' ] )
2012-02-15 02:36:32 +00:00
format . format = lldb . eFormatOctal
category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " int " ) , format )
self . expect ( " frame variable foo.A " ,
substrs = [ ' 01 ' ] )
self . expect ( " frame variable foo.E " ,
2012-04-24 02:01:17 +00:00
substrs = [ ' b8cca70a ' ] )
2012-02-15 02:36:32 +00:00
category . DeleteTypeFormat ( lldb . SBTypeNameSpecifier ( " int " ) )
category . DeleteTypeFormat ( lldb . SBTypeNameSpecifier ( " long " ) )
self . expect ( " frame variable foo.A " , matching = False ,
substrs = [ ' 01 ' ] )
self . expect ( " frame variable foo.E " , matching = False ,
2012-04-24 02:01:17 +00:00
substrs = [ ' b8cca70a ' ] )
2012-02-15 02:36:32 +00:00
summary = lldb . SBTypeSummary . CreateWithSummaryString ( " the hello world you ' ll never see " )
summary . SetSummaryString ( ' hello world ' )
new_category = self . dbg . GetCategory ( " foobar " )
self . assertFalse ( new_category . IsValid ( ) , " getting a non-existing category worked " )
new_category = self . dbg . CreateCategory ( " foobar " )
new_category . enabled = True
new_category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " ^.*t$ " , True ) , summary )
self . expect ( " frame variable foo.A " ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.E " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.B " ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.F " ,
substrs = [ ' hello world ' ] )
new_category . enabled = False
self . expect ( " frame variable foo.A " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.E " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.B " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.F " , matching = False ,
substrs = [ ' hello world ' ] )
self . dbg . DeleteCategory ( new_category . GetName ( ) )
self . expect ( " frame variable foo.A " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.E " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.B " , matching = False ,
substrs = [ ' hello world ' ] )
self . expect ( " frame variable foo.F " , matching = False ,
substrs = [ ' hello world ' ] )
filter = lldb . SBTypeFilter ( 0 )
filter . AppendExpressionPath ( " A " )
filter . AppendExpressionPath ( " D " )
self . assertTrue ( filter . GetNumberOfExpressionPaths ( ) == 2 , " filter with two items does not have two items " )
category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) , filter )
self . expect ( " frame variable foo " ,
substrs = [ ' A = 1 ' , ' D = 6.28 ' ] )
self . expect ( " frame variable foo " , matching = False ,
substrs = [ ' B = ' , ' C = ' , ' E = ' , ' F = ' ] )
category . DeleteTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " , True ) )
self . expect ( " frame variable foo " ,
substrs = [ ' A = 1 ' , ' D = 6.28 ' ] )
self . expect ( " frame variable foo " , matching = False ,
substrs = [ ' B = ' , ' C = ' , ' E = ' , ' F = ' ] )
category . DeleteTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " , False ) )
self . expect ( " frame variable foo " ,
substrs = [ ' A = 1 ' , ' D = 6.28 ' ] )
self . expect ( " frame variable foo " , matching = True ,
substrs = [ ' B = ' , ' C = ' , ' E = ' , ' F = ' ] )
self . runCmd ( " command script import --allow-reload ./jas_synth.py " )
self . expect ( " frame variable foo " , matching = False ,
substrs = [ ' X = 1 ' ] )
self . dbg . GetCategory ( " JASSynth " ) . SetEnabled ( True )
self . expect ( " frame variable foo " , matching = True ,
substrs = [ ' X = 1 ' ] )
2012-03-27 02:35:13 +00:00
foo_var = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( ) . FindVariable ( ' foo ' )
self . assertTrue ( foo_var . IsValid ( ) , ' could not find foo ' )
self . assertTrue ( foo_var . GetNumChildren ( ) == 2 , ' synthetic value has wrong number of child items (synth) ' )
self . assertTrue ( foo_var . GetChildMemberWithName ( ' X ' ) . GetValueAsUnsigned ( ) == 1 , ' foo_synth.X has wrong value (synth) ' )
self . assertFalse ( foo_var . GetChildMemberWithName ( ' B ' ) . IsValid ( ) , ' foo_synth.B is valid but should not (synth) ' )
2012-02-15 02:36:32 +00:00
self . dbg . GetCategory ( " JASSynth " ) . SetEnabled ( False )
2012-03-27 02:35:13 +00:00
foo_var = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( ) . FindVariable ( ' foo ' )
self . assertTrue ( foo_var . IsValid ( ) , ' could not find foo ' )
self . assertFalse ( foo_var . GetNumChildren ( ) == 2 , ' still seeing synthetic value ' )
2012-02-15 02:36:32 +00:00
filter = lldb . SBTypeFilter ( 0 )
filter . AppendExpressionPath ( " A " )
filter . AppendExpressionPath ( " D " )
category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) , filter )
self . expect ( " frame variable foo " ,
substrs = [ ' A = 1 ' , ' D = 6.28 ' ] )
2012-03-27 02:35:13 +00:00
foo_var = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( ) . FindVariable ( ' foo ' )
self . assertTrue ( foo_var . IsValid ( ) , ' could not find foo ' )
self . assertTrue ( foo_var . GetNumChildren ( ) == 2 , ' synthetic value has wrong number of child items (filter) ' )
self . assertTrue ( foo_var . GetChildMemberWithName ( ' X ' ) . GetValueAsUnsigned ( ) == 0 , ' foo_synth.X has wrong value (filter) ' )
self . assertTrue ( foo_var . GetChildMemberWithName ( ' A ' ) . GetValueAsUnsigned ( ) == 1 , ' foo_synth.A has wrong value (filter) ' )
2012-02-15 02:36:32 +00:00
self . assertTrue ( filter . ReplaceExpressionPathAtIndex ( 0 , " C " ) , " failed to replace an expression path in filter " )
self . expect ( " frame variable foo " ,
substrs = [ ' A = 1 ' , ' D = 6.28 ' ] )
category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) , filter )
self . expect ( " frame variable foo " ,
substrs = [ " C = ' e ' " , ' D = 6.28 ' ] )
category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " FooType " ) , filter )
filter . ReplaceExpressionPathAtIndex ( 1 , " F " )
self . expect ( " frame variable foo " ,
substrs = [ " C = ' e ' " , ' D = 6.28 ' ] )
category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) , filter )
self . expect ( " frame variable foo " ,
substrs = [ " C = ' e ' " , ' F = 0 ' ] )
self . expect ( " frame variable bar " ,
substrs = [ " C = ' e ' " , ' D = 6.28 ' ] )
2012-03-27 02:35:13 +00:00
foo_var = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( ) . FindVariable ( ' foo ' )
self . assertTrue ( foo_var . IsValid ( ) , ' could not find foo ' )
self . assertTrue ( foo_var . GetChildMemberWithName ( ' C ' ) . GetValueAsUnsigned ( ) == ord ( ' e ' ) , ' foo_synth.C has wrong value (filter) ' )
2012-02-15 02:36:32 +00:00
chosen = self . dbg . GetFilterForType ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) )
self . assertTrue ( chosen . count == 2 , " wrong filter found for JustAStruct " )
self . assertTrue ( chosen . GetExpressionPathAtIndex ( 0 ) == ' C ' , " wrong item at index 0 for JustAStruct " )
self . assertTrue ( chosen . GetExpressionPathAtIndex ( 1 ) == ' F ' , " wrong item at index 1 for JustAStruct " )
self . assertFalse ( category . DeleteTypeFilter ( lldb . SBTypeNameSpecifier ( " NoSuchType " ) ) , " deleting a non-existing filter worked " )
self . assertFalse ( category . DeleteTypeSummary ( lldb . SBTypeNameSpecifier ( " NoSuchType " ) ) , " deleting a non-existing summary worked " )
self . assertFalse ( category . DeleteTypeFormat ( lldb . SBTypeNameSpecifier ( " NoSuchType " ) ) , " deleting a non-existing format worked " )
self . assertFalse ( category . DeleteTypeSynthetic ( lldb . SBTypeNameSpecifier ( " NoSuchType " ) ) , " deleting a non-existing synthetic worked " )
self . assertFalse ( category . DeleteTypeFilter ( lldb . SBTypeNameSpecifier ( " " ) ) , " deleting a filter for ' ' worked " )
self . assertFalse ( category . DeleteTypeSummary ( lldb . SBTypeNameSpecifier ( " " ) ) , " deleting a summary for ' ' worked " )
self . assertFalse ( category . DeleteTypeFormat ( lldb . SBTypeNameSpecifier ( " " ) ) , " deleting a format for ' ' worked " )
self . assertFalse ( category . DeleteTypeSynthetic ( lldb . SBTypeNameSpecifier ( " " ) ) , " deleting a synthetic for ' ' worked " )
try :
self . assertFalse ( category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " NoneSuchType " ) , None ) , " adding a summary valued None worked " )
except :
pass
else :
self . assertFalse ( True , " adding a summary valued None worked " )
try :
self . assertFalse ( category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " NoneSuchType " ) , None ) , " adding a filter valued None worked " )
except :
pass
else :
self . assertFalse ( True , " adding a filter valued None worked " )
try :
self . assertFalse ( category . AddTypeSynthetic ( lldb . SBTypeNameSpecifier ( " NoneSuchType " ) , None ) , " adding a synthetic valued None worked " )
except :
pass
else :
self . assertFalse ( True , " adding a synthetic valued None worked " )
try :
self . assertFalse ( category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " NoneSuchType " ) , None ) , " adding a format valued None worked " )
except :
pass
else :
self . assertFalse ( True , " adding a format valued None worked " )
self . assertFalse ( category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " EmptySuchType " ) , lldb . SBTypeSummary ( ) ) , " adding a summary without value worked " )
self . assertFalse ( category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " EmptySuchType " ) , lldb . SBTypeFilter ( ) ) , " adding a filter without value worked " )
self . assertFalse ( category . AddTypeSynthetic ( lldb . SBTypeNameSpecifier ( " EmptySuchType " ) , lldb . SBTypeSynthetic ( ) ) , " adding a synthetic without value worked " )
self . assertFalse ( category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " EmptySuchType " ) , lldb . SBTypeFormat ( ) ) , " adding a format without value worked " )
self . assertFalse ( category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " " ) , lldb . SBTypeSummary . CreateWithSummaryString ( " " ) ) , " adding a summary for an invalid type worked " )
self . assertFalse ( category . AddTypeFilter ( lldb . SBTypeNameSpecifier ( " " ) , lldb . SBTypeFilter ( 0 ) ) , " adding a filter for an invalid type worked " )
self . assertFalse ( category . AddTypeSynthetic ( lldb . SBTypeNameSpecifier ( " " ) , lldb . SBTypeSynthetic . CreateWithClassName ( " " ) ) , " adding a synthetic for an invalid type worked " )
self . assertFalse ( category . AddTypeFormat ( lldb . SBTypeNameSpecifier ( " " ) , lldb . SBTypeFormat ( lldb . eFormatHex ) ) , " adding a format for an invalid type worked " )
new_category = self . dbg . CreateCategory ( " newbar " )
new_category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) ,
lldb . SBTypeSummary . CreateWithScriptCode ( " return ' hello scripted world ' ; " ) )
self . expect ( " frame variable foo " , matching = False ,
substrs = [ ' hello scripted world ' ] )
new_category . enabled = True
self . expect ( " frame variable foo " , matching = True ,
substrs = [ ' hello scripted world ' ] )
self . expect ( " frame variable foo_ptr " , matching = True ,
substrs = [ ' hello scripted world ' ] )
new_category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) ,
lldb . SBTypeSummary . CreateWithScriptCode ( " return ' hello scripted world ' ; " ,
lldb . eTypeOptionSkipPointers ) )
self . expect ( " frame variable foo " , matching = True ,
substrs = [ ' hello scripted world ' ] )
2012-02-17 03:18:30 +00:00
frame = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( )
foo_ptr = frame . FindVariable ( " foo_ptr " )
summary = foo_ptr . GetTypeSummary ( )
self . assertFalse ( summary . IsValid ( ) , " summary found for foo* when none was planned " )
2012-02-15 02:36:32 +00:00
self . expect ( " frame variable foo_ptr " , matching = False ,
substrs = [ ' hello scripted world ' ] )
2012-02-17 03:18:30 +00:00
new_category . AddTypeSummary ( lldb . SBTypeNameSpecifier ( " JustAStruct " ) ,
lldb . SBTypeSummary . CreateWithSummaryString ( " hello static world " ,
lldb . eTypeOptionNone ) )
summary = foo_ptr . GetTypeSummary ( )
self . assertTrue ( summary . IsValid ( ) , " no summary found for foo* when one was in place " )
self . assertTrue ( summary . GetData ( ) == " hello static world " , " wrong summary found for foo* " )
2012-03-27 02:35:13 +00:00
def force_synth_off ( self ) :
""" Test that one can have the public API return non-synthetic SBValues if desired """
self . runCmd ( " file no_synth " , CURRENT_EXECUTABLE_SET )
2012-09-22 00:05:11 +00:00
lldbutil . run_break_set_by_file_and_line ( self , " main.cpp " , self . line , num_expected_locations = 1 , loc_exact = True )
2012-03-27 02:35:13 +00:00
2015-05-27 22:27:41 +00:00
self . runCmd ( " run " , RUN_FAILED )
2012-03-27 02:35:13 +00:00
# The stop reason of the thread should be breakpoint.
self . expect ( " thread list " , STOPPED_DUE_TO_BREAKPOINT ,
substrs = [ ' stopped ' ,
' stop reason = breakpoint ' ] )
# This is the function to remove the custom formats in order to have a
# clean slate for the next test case.
def cleanup ( ) :
self . runCmd ( ' type format clear ' , check = False )
self . runCmd ( ' type summary clear ' , check = False )
self . runCmd ( ' type filter clear ' , check = False )
self . runCmd ( ' type synthetic clear ' , check = False )
self . runCmd ( ' type category delete foobar ' , check = False )
self . runCmd ( ' type category delete JASSynth ' , check = False )
self . runCmd ( ' type category delete newbar ' , check = False )
self . runCmd ( ' settings set target.enable-synthetic-value true ' )
# Execute the cleanup function during test case tear down.
self . addTearDownHook ( cleanup )
frame = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( )
int_vector = frame . FindVariable ( " int_vector " )
if self . TraceOn ( ) :
print int_vector
self . assertTrue ( int_vector . GetNumChildren ( ) == 0 , ' synthetic vector is empty ' )
self . runCmd ( ' settings set target.enable-synthetic-value false ' )
frame = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( )
int_vector = frame . FindVariable ( " int_vector " )
if self . TraceOn ( ) :
print int_vector
self . assertFalse ( int_vector . GetNumChildren ( ) == 0 , ' " physical " vector is not empty ' )
self . runCmd ( ' settings set target.enable-synthetic-value true ' )
frame = self . dbg . GetSelectedTarget ( ) . GetProcess ( ) . GetSelectedThread ( ) . GetSelectedFrame ( )
int_vector = frame . FindVariable ( " int_vector " )
if self . TraceOn ( ) :
print int_vector
self . assertTrue ( int_vector . GetNumChildren ( ) == 0 , ' synthetic vector is still empty ' )
2012-02-15 02:36:32 +00:00
if __name__ == ' __main__ ' :
import atexit
lldb . SBDebugger . Initialize ( )
atexit . register ( lambda : lldb . SBDebugger . Terminate ( ) )
unittest2 . main ( )