167 lines
7.1 KiB
Python
167 lines
7.1 KiB
Python
|
import os
|
||
|
|
||
|
from oeqa.selftest.case import OESelftestTestCase
|
||
|
from oeqa.utils.commands import get_bb_var, get_bb_vars, bitbake
|
||
|
from oeqa.core.decorator.oeid import OETestID
|
||
|
|
||
|
class ManifestEntry:
|
||
|
'''A manifest item of a collection able to list missing packages'''
|
||
|
def __init__(self, entry):
|
||
|
self.file = entry
|
||
|
self.missing = []
|
||
|
|
||
|
class VerifyManifest(OESelftestTestCase):
|
||
|
'''Tests for the manifest files and contents of an image'''
|
||
|
|
||
|
@classmethod
|
||
|
def check_manifest_entries(self, manifest, path):
|
||
|
manifest_errors = []
|
||
|
try:
|
||
|
with open(manifest, "r") as mfile:
|
||
|
for line in mfile:
|
||
|
manifest_entry = os.path.join(path, line.split()[0])
|
||
|
self.logger.debug("{}: looking for {}"\
|
||
|
.format(self.classname, manifest_entry))
|
||
|
if not os.path.isfile(manifest_entry):
|
||
|
manifest_errors.append(manifest_entry)
|
||
|
self.logger.debug("{}: {} not found"\
|
||
|
.format(self.classname, manifest_entry))
|
||
|
except OSError as e:
|
||
|
self.logger.debug("{}: checking of {} failed"\
|
||
|
.format(self.classname, manifest))
|
||
|
raise e
|
||
|
|
||
|
return manifest_errors
|
||
|
|
||
|
#this will possibly move from here
|
||
|
@classmethod
|
||
|
def get_dir_from_bb_var(self, bb_var, target = None):
|
||
|
target == self.buildtarget if target == None else target
|
||
|
directory = get_bb_var(bb_var, target);
|
||
|
if not directory or not os.path.isdir(directory):
|
||
|
self.logger.debug("{}: {} points to {} when target = {}"\
|
||
|
.format(self.classname, bb_var, directory, target))
|
||
|
raise OSError
|
||
|
return directory
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(self):
|
||
|
|
||
|
super(VerifyManifest, self).setUpClass()
|
||
|
self.buildtarget = 'core-image-minimal'
|
||
|
self.classname = 'VerifyManifest'
|
||
|
|
||
|
self.logger.info("{}: doing bitbake {} as a prerequisite of the test"\
|
||
|
.format(self.classname, self.buildtarget))
|
||
|
if bitbake(self.buildtarget).status:
|
||
|
self.logger.debug("{} Failed to setup {}"\
|
||
|
.format(self.classname, self.buildtarget))
|
||
|
self.skipTest("{}: Cannot setup testing scenario"\
|
||
|
.format(self.classname))
|
||
|
|
||
|
@OETestID(1380)
|
||
|
def test_SDK_manifest_entries(self):
|
||
|
'''Verifying the SDK manifest entries exist, this may take a build'''
|
||
|
|
||
|
# the setup should bitbake core-image-minimal and here it is required
|
||
|
# to do an additional setup for the sdk
|
||
|
sdktask = '-c populate_sdk'
|
||
|
bbargs = sdktask + ' ' + self.buildtarget
|
||
|
self.logger.debug("{}: doing bitbake {} as a prerequisite of the test"\
|
||
|
.format(self.classname, bbargs))
|
||
|
if bitbake(bbargs).status:
|
||
|
self.logger.debug("{} Failed to bitbake {}"\
|
||
|
.format(self.classname, bbargs))
|
||
|
self.skipTest("{}: Cannot setup testing scenario"\
|
||
|
.format(self.classname))
|
||
|
|
||
|
|
||
|
pkgdata_dir = reverse_dir = {}
|
||
|
mfilename = mpath = m_entry = {}
|
||
|
# get manifest location based on target to query about
|
||
|
d_target= dict(target = self.buildtarget,
|
||
|
host = 'nativesdk-packagegroup-sdk-host')
|
||
|
try:
|
||
|
mdir = self.get_dir_from_bb_var('SDK_DEPLOY', self.buildtarget)
|
||
|
for k in d_target.keys():
|
||
|
bb_vars = get_bb_vars(['SDK_NAME', 'SDK_VERSION'], self.buildtarget)
|
||
|
mfilename[k] = "{}-toolchain-{}.{}.manifest".format(
|
||
|
bb_vars['SDK_NAME'],
|
||
|
bb_vars['SDK_VERSION'],
|
||
|
k)
|
||
|
mpath[k] = os.path.join(mdir, mfilename[k])
|
||
|
if not os.path.isfile(mpath[k]):
|
||
|
self.logger.debug("{}: {} does not exist".format(
|
||
|
self.classname, mpath[k]))
|
||
|
raise IOError
|
||
|
m_entry[k] = ManifestEntry(mpath[k])
|
||
|
|
||
|
pkgdata_dir[k] = self.get_dir_from_bb_var('PKGDATA_DIR',
|
||
|
d_target[k])
|
||
|
reverse_dir[k] = os.path.join(pkgdata_dir[k],
|
||
|
'runtime-reverse')
|
||
|
if not os.path.exists(reverse_dir[k]):
|
||
|
self.logger.debug("{}: {} does not exist".format(
|
||
|
self.classname, reverse_dir[k]))
|
||
|
raise IOError
|
||
|
except OSError:
|
||
|
raise self.skipTest("{}: Error in obtaining manifest dirs"\
|
||
|
.format(self.classname))
|
||
|
except IOError:
|
||
|
msg = "{}: Error cannot find manifests in the specified dir:\n{}"\
|
||
|
.format(self.classname, mdir)
|
||
|
self.fail(msg)
|
||
|
|
||
|
for k in d_target.keys():
|
||
|
self.logger.debug("{}: Check manifest {}".format(
|
||
|
self.classname, m_entry[k].file))
|
||
|
|
||
|
m_entry[k].missing = self.check_manifest_entries(\
|
||
|
m_entry[k].file,reverse_dir[k])
|
||
|
if m_entry[k].missing:
|
||
|
msg = '{}: {} Error has the following missing entries'\
|
||
|
.format(self.classname, m_entry[k].file)
|
||
|
logmsg = msg+':\n'+'\n'.join(m_entry[k].missing)
|
||
|
self.logger.debug(logmsg)
|
||
|
self.logger.info(msg)
|
||
|
self.fail(logmsg)
|
||
|
|
||
|
@OETestID(1381)
|
||
|
def test_image_manifest_entries(self):
|
||
|
'''Verifying the image manifest entries exist'''
|
||
|
|
||
|
# get manifest location based on target to query about
|
||
|
try:
|
||
|
mdir = self.get_dir_from_bb_var('DEPLOY_DIR_IMAGE',
|
||
|
self.buildtarget)
|
||
|
mfilename = get_bb_var("IMAGE_LINK_NAME", self.buildtarget)\
|
||
|
+ ".manifest"
|
||
|
mpath = os.path.join(mdir, mfilename)
|
||
|
if not os.path.isfile(mpath): raise IOError
|
||
|
m_entry = ManifestEntry(mpath)
|
||
|
|
||
|
pkgdata_dir = {}
|
||
|
pkgdata_dir = self.get_dir_from_bb_var('PKGDATA_DIR',
|
||
|
self.buildtarget)
|
||
|
revdir = os.path.join(pkgdata_dir, 'runtime-reverse')
|
||
|
if not os.path.exists(revdir): raise IOError
|
||
|
except OSError:
|
||
|
raise self.skipTest("{}: Error in obtaining manifest dirs"\
|
||
|
.format(self.classname))
|
||
|
except IOError:
|
||
|
msg = "{}: Error cannot find manifests in dir:\n{}"\
|
||
|
.format(self.classname, mdir)
|
||
|
self.fail(msg)
|
||
|
|
||
|
self.logger.debug("{}: Check manifest {}"\
|
||
|
.format(self.classname, m_entry.file))
|
||
|
m_entry.missing = self.check_manifest_entries(\
|
||
|
m_entry.file, revdir)
|
||
|
if m_entry.missing:
|
||
|
msg = '{}: {} Error has the following missing entries'\
|
||
|
.format(self.classname, m_entry.file)
|
||
|
logmsg = msg+':\n'+'\n'.join(m_entry.missing)
|
||
|
self.logger.debug(logmsg)
|
||
|
self.logger.info(msg)
|
||
|
self.fail(logmsg)
|