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