generic-poky/meta/lib/oeqa/selftest/_sstatetests_noauto.py

96 lines
4.3 KiB
Python
Raw Normal View History

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):
os.mkdir(builddir)
self.track_for_cleanup(builddir)
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'))
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])
shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/bblayers.conf'), os.path.join(builddir, 'conf/bblayers.conf'))
try:
shutil.copyfile(os.path.join(os.environ.get('BUILDDIR'), 'conf/auto.conf'), os.path.join(builddir, 'conf/auto.conf'))
except:
pass
def hardlink_tree(self, src, dst):
os.mkdir(dst)
self.track_for_cleanup(dst)
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)