@ -146,19 +146,23 @@ class TestFunctional(unittest.TestCase):
# options.verbosity = tout.DEBUG
return control . Binman ( options , args )
def _DoTestFile ( self , fname , debug = False , map = False ) :
def _DoTestFile ( self , fname , debug = False , map = False , update_dtb = False ) :
""" Run binman with a given test file
Args :
fname : Device - tree source filename to use ( e . g . 05 _simple . dts )
debug : True to enable debugging output
map : True to output map files for the images
update_dtb : Update the position and size of each entry in the device
tree before packing it into the image
"""
args = [ ' -p ' , ' -I ' , self . _indir , ' -d ' , self . TestFile ( fname ) ]
if debug :
args . append ( ' -D ' )
if map :
args . append ( ' -m ' )
if update_dtb :
args . append ( ' -up ' )
return self . _DoBinman ( * args )
def _SetupDtb ( self , fname , outfile = ' u-boot.dtb ' ) :
@ -183,7 +187,8 @@ class TestFunctional(unittest.TestCase):
TestFunctional . _MakeInputFile ( outfile , data )
return data
def _DoReadFileDtb ( self , fname , use_real_dtb = False , map = False ) :
def _DoReadFileDtb ( self , fname , use_real_dtb = False , map = False ,
update_dtb = False ) :
""" Run binman and return the resulting image
This runs binman with a given test file and then reads the resulting
@ -199,6 +204,8 @@ class TestFunctional(unittest.TestCase):
test contents ( the U_BOOT_DTB_DATA string ) can be used .
But in some test we need the real contents .
map : True to output map files for the images
update_dtb : Update the position and size of each entry in the device
tree before packing it into the image
Returns :
Tuple :
@ -212,21 +219,22 @@ class TestFunctional(unittest.TestCase):
dtb_data = self . _SetupDtb ( fname )
try :
retcode = self . _DoTestFile ( fname , map = map )
retcode = self . _DoTestFile ( fname , map = map , update_dtb = update_dtb )
self . assertEqual ( 0 , retcode )
out_dtb_fname = control . GetFdtPath ( ' u-boot.dtb ' )
# Find the (only) image, read it and return its contents
image = control . images [ ' image ' ]
fname = tools . GetOutputFilename ( ' image.bin ' )
self . assertTrue ( os . path . exists ( fname ) )
image_ fname = tools . GetOutputFilename ( ' image.bin ' )
self . assertTrue ( os . path . exists ( image_ fname) )
if map :
map_fname = tools . GetOutputFilename ( ' image.map ' )
with open ( map_fname ) as fd :
map_data = fd . read ( )
else :
map_data = None
with open ( fname ) as fd :
return fd . read ( ) , dtb_data , map_data
with open ( image_ fname) as fd :
return fd . read ( ) , dtb_data , map_data , out_dtb_fname
finally :
# Put the test file back
if use_real_dtb :
@ -300,6 +308,26 @@ class TestFunctional(unittest.TestCase):
"""
return struct . unpack ( ' >L ' , dtb [ 4 : 8 ] ) [ 0 ]
def _GetPropTree ( self , dtb_data , node_names ) :
def AddNode ( node , path ) :
if node . name != ' / ' :
path + = ' / ' + node . name
#print 'path', path
for subnode in node . subnodes :
for prop in subnode . props . values ( ) :
if prop . name in node_names :
prop_path = path + ' / ' + subnode . name + ' : ' + prop . name
tree [ prop_path [ len ( ' /binman/ ' ) : ] ] = fdt_util . fdt32_to_cpu (
prop . value )
#print ' ', prop.name
AddNode ( subnode , path )
tree = { }
dtb = fdt . Fdt ( dtb_data )
dtb . Scan ( )
AddNode ( dtb . GetRoot ( ) , ' ' )
return tree
def testRun ( self ) :
""" Test a basic run with valid args """
result = self . _RunBinman ( ' -h ' )
@ -845,7 +873,7 @@ class TestFunctional(unittest.TestCase):
""" Test that we can cope with an image without microcode (e.g. qemu) """
with open ( self . TestFile ( ' u_boot_no_ucode_ptr ' ) ) as fd :
TestFunctional . _MakeInputFile ( ' u-boot ' , fd . read ( ) )
data , dtb , _ = self . _DoReadFileDtb ( ' 44_x86_optional_ucode.dts ' , True )
data , dtb , _ , _ = self . _DoReadFileDtb ( ' 44_x86_optional_ucode.dts ' , True )
# Now check the device tree has no microcode
self . assertEqual ( U_BOOT_NODTB_DATA , data [ : len ( U_BOOT_NODTB_DATA ) ] )
@ -980,7 +1008,7 @@ class TestFunctional(unittest.TestCase):
def testMap ( self ) :
""" Tests outputting a map of the images """
_ , _ , map_data = self . _DoReadFileDtb ( ' 55_sections.dts ' , map = True )
_ , _ , map_data , _ = self . _DoReadFileDtb ( ' 55_sections.dts ' , map = True )
self . assertEqual ( ''' Position Size Name
00000000 00000010 section @ 0
00000000 00000004 u - boot
@ -990,7 +1018,7 @@ class TestFunctional(unittest.TestCase):
def testNamePrefix ( self ) :
""" Tests that name prefixes are used """
_ , _ , map_data = self . _DoReadFileDtb ( ' 56_name_prefix.dts ' , map = True )
_ , _ , map_data , _ = self . _DoReadFileDtb ( ' 56_name_prefix.dts ' , map = True )
self . assertEqual ( ''' Position Size Name
00000000 00000010 section @ 0
00000000 00000004 ro - u - boot
@ -1013,6 +1041,35 @@ class TestFunctional(unittest.TestCase):
self . assertIn ( " Node ' /binman/_testing ' : Cannot update entry size from "
' 2 to 1 ' , str ( e . exception ) )
def testUpdateFdt ( self ) :
""" Test that we can update the device tree with pos/size info """
_ , _ , _ , out_dtb_fname = self . _DoReadFileDtb ( ' 60_fdt_update.dts ' ,
update_dtb = True )
props = self . _GetPropTree ( out_dtb_fname , [ ' pos ' , ' size ' ] )
with open ( ' /tmp/x.dtb ' , ' wb ' ) as outf :
with open ( out_dtb_fname ) as inf :
outf . write ( inf . read ( ) )
self . assertEqual ( {
' _testing:pos ' : 32 ,
' _testing:size ' : 1 ,
' section@0/u-boot:pos ' : 0 ,
' section@0/u-boot:size ' : len ( U_BOOT_DATA ) ,
' section@0:pos ' : 0 ,
' section@0:size ' : 16 ,
' section@1/u-boot:pos ' : 0 ,
' section@1/u-boot:size ' : len ( U_BOOT_DATA ) ,
' section@1:pos ' : 16 ,
' section@1:size ' : 16 ,
' size ' : 40
} , props )
def testUpdateFdtBad ( self ) :
""" Test that we detect when ProcessFdt never completes """
with self . assertRaises ( ValueError ) as e :
self . _DoReadFileDtb ( ' 61_fdt_update_bad.dts ' , update_dtb = True )
self . assertIn ( ' Could not complete processing of Fdt: remaining '
' [<_testing.Entry__testing ' , str ( e . exception ) )
if __name__ == " __main__ " :
unittest . main ( )