2014-01-24 17:05:47 +00:00
import datetime
import unittest
import os
import re
import shutil
import oeqa . utils . ftools as ftools
from oeqa . selftest . base import oeSelfTest
from oeqa . utils . commands import runCmd , bitbake , get_bb_var , get_test_layer
from oeqa . selftest . sstate import SStateBase
class RebuildFromSState ( SStateBase ) :
@classmethod
def setUpClass ( self ) :
self . builddir = os . path . join ( os . environ . get ( ' BUILDDIR ' ) )
def get_dep_targets ( self , primary_targets ) :
found_targets = [ ]
bitbake ( " -g " + ' ' . join ( map ( str , primary_targets ) ) )
with open ( os . path . join ( self . builddir , ' pn-buildlist ' ) , ' r ' ) as pnfile :
found_targets = pnfile . read ( ) . splitlines ( )
return found_targets
def configure_builddir ( self , builddir ) :
2014-03-06 16:35:55 +00:00
os . mkdir ( builddir )
self . track_for_cleanup ( builddir )
2014-01-24 17:05:47 +00:00
os . mkdir ( os . path . join ( builddir , ' conf ' ) )
shutil . copyfile ( os . path . join ( os . environ . get ( ' BUILDDIR ' ) , ' conf/local.conf ' ) , os . path . join ( builddir , ' conf/local.conf ' ) )
2014-03-06 16:35:56 +00:00
config = { }
config [ ' default_sstate_dir ' ] = " SSTATE_DIR ?= \" $ {TOPDIR} /sstate-cache \" "
config [ ' null_sstate_mirrors ' ] = " SSTATE_MIRRORS = \" \" "
config [ ' default_tmp_dir ' ] = " TMPDIR = \" $ {TOPDIR} /tmp \" "
for key in config :
ftools . append_file ( os . path . join ( builddir , ' conf/selftest.inc ' ) , config [ key ] )
2014-01-24 17:05:47 +00:00
shutil . copyfile ( os . path . join ( os . environ . get ( ' BUILDDIR ' ) , ' conf/bblayers.conf ' ) , os . path . join ( builddir , ' conf/bblayers.conf ' ) )
2014-03-06 16:35:56 +00:00
try :
shutil . copyfile ( os . path . join ( os . environ . get ( ' BUILDDIR ' ) , ' conf/auto.conf ' ) , os . path . join ( builddir , ' conf/auto.conf ' ) )
except :
pass
2014-01-24 17:05:47 +00:00
def hardlink_tree ( self , src , dst ) :
2014-03-06 16:35:55 +00:00
os . mkdir ( dst )
self . track_for_cleanup ( dst )
2014-01-24 17:05:47 +00:00
for root , dirs , files in os . walk ( src ) :
if root == src :
continue
os . mkdir ( os . path . join ( dst , root . split ( src ) [ 1 ] [ 1 : ] ) )
for sstate_file in files :
os . link ( os . path . join ( root , sstate_file ) , os . path . join ( dst , root . split ( src ) [ 1 ] [ 1 : ] , sstate_file ) )
def run_test_sstate_rebuild ( self , primary_targets , relocate = False , rebuild_dependencies = False ) :
buildA = os . path . join ( self . builddir , ' buildA ' )
if relocate :
buildB = os . path . join ( self . builddir , ' buildB ' )
else :
buildB = buildA
if rebuild_dependencies :
rebuild_targets = self . get_dep_targets ( primary_targets )
else :
rebuild_targets = primary_targets
self . configure_builddir ( buildA )
runCmd ( ( " . %s /oe-init-build-env %s && " % ( get_bb_var ( ' COREBASE ' ) , buildA ) ) + ' bitbake ' + ' ' . join ( map ( str , primary_targets ) ) , shell = True , executable = ' /bin/bash ' )
self . hardlink_tree ( os . path . join ( buildA , ' sstate-cache ' ) , os . path . join ( self . builddir , ' sstate-cache-buildA ' ) )
shutil . rmtree ( buildA )
failed_rebuild = [ ]
failed_cleansstate = [ ]
for target in rebuild_targets :
self . configure_builddir ( buildB )
self . hardlink_tree ( os . path . join ( self . builddir , ' sstate-cache-buildA ' ) , os . path . join ( buildB , ' sstate-cache ' ) )
result_cleansstate = runCmd ( ( " . %s /oe-init-build-env %s && " % ( get_bb_var ( ' COREBASE ' ) , buildB ) ) + ' bitbake -ccleansstate ' + target , ignore_status = True , shell = True , executable = ' /bin/bash ' )
if not result_cleansstate . status == 0 :
failed_cleansstate . append ( target )
shutil . rmtree ( buildB )
continue
result_build = runCmd ( ( " . %s /oe-init-build-env %s && " % ( get_bb_var ( ' COREBASE ' ) , buildB ) ) + ' bitbake ' + target , ignore_status = True , shell = True , executable = ' /bin/bash ' )
if not result_build . status == 0 :
failed_rebuild . append ( target )
shutil . rmtree ( buildB )
self . assertFalse ( failed_rebuild , msg = " The following recipes have failed to rebuild: %s " % ' ' . join ( map ( str , failed_rebuild ) ) )
self . assertFalse ( failed_cleansstate , msg = " The following recipes have failed cleansstate(all others have passed both cleansstate and rebuild from sstate tests): %s " % ' ' . join ( map ( str , failed_cleansstate ) ) )
def test_sstate_relocation ( self ) :
self . run_test_sstate_rebuild ( [ ' core-image-sato-sdk ' ] , relocate = True , rebuild_dependencies = True )
def test_sstate_rebuild ( self ) :
self . run_test_sstate_rebuild ( [ ' core-image-sato-sdk ' ] , relocate = False , rebuild_dependencies = True )