xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oeqa/selftest/cases/manifest.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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