1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# SPDX-License-Identifier: MIT 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunimport os 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunfrom oeqa.selftest.case import OESelftestTestCase 8*4882a593Smuzhiyunfrom oeqa.utils.commands import get_bb_var, bitbake 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunclass ManifestEntry: 11*4882a593Smuzhiyun '''A manifest item of a collection able to list missing packages''' 12*4882a593Smuzhiyun def __init__(self, entry): 13*4882a593Smuzhiyun self.file = entry 14*4882a593Smuzhiyun self.missing = [] 15*4882a593Smuzhiyun 16*4882a593Smuzhiyunclass VerifyManifest(OESelftestTestCase): 17*4882a593Smuzhiyun '''Tests for the manifest files and contents of an image''' 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun @classmethod 20*4882a593Smuzhiyun def check_manifest_entries(self, manifest, path): 21*4882a593Smuzhiyun manifest_errors = [] 22*4882a593Smuzhiyun try: 23*4882a593Smuzhiyun with open(manifest, "r") as mfile: 24*4882a593Smuzhiyun for line in mfile: 25*4882a593Smuzhiyun manifest_entry = os.path.join(path, line.split()[0]) 26*4882a593Smuzhiyun self.logger.debug("{}: looking for {}"\ 27*4882a593Smuzhiyun .format(self.classname, manifest_entry)) 28*4882a593Smuzhiyun if not os.path.isfile(manifest_entry): 29*4882a593Smuzhiyun manifest_errors.append(manifest_entry) 30*4882a593Smuzhiyun self.logger.debug("{}: {} not found"\ 31*4882a593Smuzhiyun .format(self.classname, manifest_entry)) 32*4882a593Smuzhiyun except OSError as e: 33*4882a593Smuzhiyun self.logger.debug("{}: checking of {} failed"\ 34*4882a593Smuzhiyun .format(self.classname, manifest)) 35*4882a593Smuzhiyun raise e 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun return manifest_errors 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #this will possibly move from here 40*4882a593Smuzhiyun @classmethod 41*4882a593Smuzhiyun def get_dir_from_bb_var(self, bb_var, target = None): 42*4882a593Smuzhiyun target == self.buildtarget if target == None else target 43*4882a593Smuzhiyun directory = get_bb_var(bb_var, target); 44*4882a593Smuzhiyun if not directory or not os.path.isdir(directory): 45*4882a593Smuzhiyun self.logger.debug("{}: {} points to {} when target = {}"\ 46*4882a593Smuzhiyun .format(self.classname, bb_var, directory, target)) 47*4882a593Smuzhiyun raise OSError 48*4882a593Smuzhiyun return directory 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun @classmethod 51*4882a593Smuzhiyun def setUpClass(self): 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun super(VerifyManifest, self).setUpClass() 54*4882a593Smuzhiyun self.buildtarget = 'core-image-minimal' 55*4882a593Smuzhiyun self.classname = 'VerifyManifest' 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun self.logger.info("{}: doing bitbake {} as a prerequisite of the test"\ 58*4882a593Smuzhiyun .format(self.classname, self.buildtarget)) 59*4882a593Smuzhiyun if bitbake(self.buildtarget).status: 60*4882a593Smuzhiyun self.logger.debug("{} Failed to setup {}"\ 61*4882a593Smuzhiyun .format(self.classname, self.buildtarget)) 62*4882a593Smuzhiyun self.skipTest("{}: Cannot setup testing scenario"\ 63*4882a593Smuzhiyun .format(self.classname)) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun def test_SDK_manifest_entries(self): 66*4882a593Smuzhiyun '''Verifying the SDK manifest entries exist, this may take a build''' 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun # the setup should bitbake core-image-minimal and here it is required 69*4882a593Smuzhiyun # to do an additional setup for the sdk 70*4882a593Smuzhiyun sdktask = '-c populate_sdk' 71*4882a593Smuzhiyun bbargs = sdktask + ' ' + self.buildtarget 72*4882a593Smuzhiyun self.logger.debug("{}: doing bitbake {} as a prerequisite of the test"\ 73*4882a593Smuzhiyun .format(self.classname, bbargs)) 74*4882a593Smuzhiyun if bitbake(bbargs).status: 75*4882a593Smuzhiyun self.logger.debug("{} Failed to bitbake {}"\ 76*4882a593Smuzhiyun .format(self.classname, bbargs)) 77*4882a593Smuzhiyun self.skipTest("{}: Cannot setup testing scenario"\ 78*4882a593Smuzhiyun .format(self.classname)) 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun pkgdata_dir = reverse_dir = {} 82*4882a593Smuzhiyun mfilename = mpath = m_entry = {} 83*4882a593Smuzhiyun # get manifest location based on target to query about 84*4882a593Smuzhiyun d_target= dict(target = self.buildtarget, 85*4882a593Smuzhiyun host = 'nativesdk-packagegroup-sdk-host') 86*4882a593Smuzhiyun try: 87*4882a593Smuzhiyun mdir = self.get_dir_from_bb_var('SDK_DEPLOY', self.buildtarget) 88*4882a593Smuzhiyun for k in d_target.keys(): 89*4882a593Smuzhiyun toolchain_outputname = get_bb_var('TOOLCHAIN_OUTPUTNAME', self.buildtarget) 90*4882a593Smuzhiyun mfilename[k] = "{}.{}.manifest".format(toolchain_outputname, k) 91*4882a593Smuzhiyun mpath[k] = os.path.join(mdir, mfilename[k]) 92*4882a593Smuzhiyun if not os.path.isfile(mpath[k]): 93*4882a593Smuzhiyun self.logger.debug("{}: {} does not exist".format( 94*4882a593Smuzhiyun self.classname, mpath[k])) 95*4882a593Smuzhiyun raise IOError 96*4882a593Smuzhiyun m_entry[k] = ManifestEntry(mpath[k]) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun pkgdata_dir[k] = self.get_dir_from_bb_var('PKGDATA_DIR', 99*4882a593Smuzhiyun d_target[k]) 100*4882a593Smuzhiyun reverse_dir[k] = os.path.join(pkgdata_dir[k], 101*4882a593Smuzhiyun 'runtime-reverse') 102*4882a593Smuzhiyun if not os.path.exists(reverse_dir[k]): 103*4882a593Smuzhiyun self.logger.debug("{}: {} does not exist".format( 104*4882a593Smuzhiyun self.classname, reverse_dir[k])) 105*4882a593Smuzhiyun raise IOError 106*4882a593Smuzhiyun except OSError: 107*4882a593Smuzhiyun raise self.skipTest("{}: Error in obtaining manifest dirs"\ 108*4882a593Smuzhiyun .format(self.classname)) 109*4882a593Smuzhiyun except IOError: 110*4882a593Smuzhiyun msg = "{}: Error cannot find manifests in the specified dir:\n{}"\ 111*4882a593Smuzhiyun .format(self.classname, mdir) 112*4882a593Smuzhiyun self.fail(msg) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun for k in d_target.keys(): 115*4882a593Smuzhiyun self.logger.debug("{}: Check manifest {}".format( 116*4882a593Smuzhiyun self.classname, m_entry[k].file)) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun m_entry[k].missing = self.check_manifest_entries(\ 119*4882a593Smuzhiyun m_entry[k].file,reverse_dir[k]) 120*4882a593Smuzhiyun if m_entry[k].missing: 121*4882a593Smuzhiyun msg = '{}: {} Error has the following missing entries'\ 122*4882a593Smuzhiyun .format(self.classname, m_entry[k].file) 123*4882a593Smuzhiyun logmsg = msg+':\n'+'\n'.join(m_entry[k].missing) 124*4882a593Smuzhiyun self.logger.debug(logmsg) 125*4882a593Smuzhiyun self.logger.info(msg) 126*4882a593Smuzhiyun self.fail(logmsg) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun def test_image_manifest_entries(self): 129*4882a593Smuzhiyun '''Verifying the image manifest entries exist''' 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun # get manifest location based on target to query about 132*4882a593Smuzhiyun try: 133*4882a593Smuzhiyun mdir = self.get_dir_from_bb_var('DEPLOY_DIR_IMAGE', 134*4882a593Smuzhiyun self.buildtarget) 135*4882a593Smuzhiyun mfilename = get_bb_var("IMAGE_LINK_NAME", self.buildtarget)\ 136*4882a593Smuzhiyun + ".manifest" 137*4882a593Smuzhiyun mpath = os.path.join(mdir, mfilename) 138*4882a593Smuzhiyun if not os.path.isfile(mpath): raise IOError 139*4882a593Smuzhiyun m_entry = ManifestEntry(mpath) 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun pkgdata_dir = {} 142*4882a593Smuzhiyun pkgdata_dir = self.get_dir_from_bb_var('PKGDATA_DIR', 143*4882a593Smuzhiyun self.buildtarget) 144*4882a593Smuzhiyun revdir = os.path.join(pkgdata_dir, 'runtime-reverse') 145*4882a593Smuzhiyun if not os.path.exists(revdir): raise IOError 146*4882a593Smuzhiyun except OSError: 147*4882a593Smuzhiyun raise self.skipTest("{}: Error in obtaining manifest dirs"\ 148*4882a593Smuzhiyun .format(self.classname)) 149*4882a593Smuzhiyun except IOError: 150*4882a593Smuzhiyun msg = "{}: Error cannot find manifests in dir:\n{}"\ 151*4882a593Smuzhiyun .format(self.classname, mdir) 152*4882a593Smuzhiyun self.fail(msg) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun self.logger.debug("{}: Check manifest {}"\ 155*4882a593Smuzhiyun .format(self.classname, m_entry.file)) 156*4882a593Smuzhiyun m_entry.missing = self.check_manifest_entries(\ 157*4882a593Smuzhiyun m_entry.file, revdir) 158*4882a593Smuzhiyun if m_entry.missing: 159*4882a593Smuzhiyun msg = '{}: {} Error has the following missing entries'\ 160*4882a593Smuzhiyun .format(self.classname, m_entry.file) 161*4882a593Smuzhiyun logmsg = msg+':\n'+'\n'.join(m_entry.missing) 162*4882a593Smuzhiyun self.logger.debug(logmsg) 163*4882a593Smuzhiyun self.logger.info(msg) 164*4882a593Smuzhiyun self.fail(logmsg) 165