xref: /OK3568_Linux_fs/yocto/poky/meta/lib/oeqa/selftest/cases/pkgdata.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# SPDX-License-Identifier: MIT
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun
5*4882a593Smuzhiyunimport os
6*4882a593Smuzhiyunimport tempfile
7*4882a593Smuzhiyunimport fnmatch
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunfrom oeqa.selftest.case import OESelftestTestCase
10*4882a593Smuzhiyunfrom oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunclass OePkgdataUtilTests(OESelftestTestCase):
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun    @classmethod
15*4882a593Smuzhiyun    def setUpClass(cls):
16*4882a593Smuzhiyun        super(OePkgdataUtilTests, cls).setUpClass()
17*4882a593Smuzhiyun        # Ensure we have the right data in pkgdata
18*4882a593Smuzhiyun        cls.logger.info('Running bitbake to generate pkgdata')
19*4882a593Smuzhiyun        bitbake('target-sdk-provides-dummy -c clean')
20*4882a593Smuzhiyun        bitbake('busybox zlib m4')
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun    def test_lookup_pkg(self):
23*4882a593Smuzhiyun        # Forward tests
24*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg "zlib busybox"')
25*4882a593Smuzhiyun        self.assertEqual(result.output, 'libz1\nbusybox')
26*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg zlib-dev')
27*4882a593Smuzhiyun        self.assertEqual(result.output, 'libz-dev')
28*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg nonexistentpkg', ignore_status=True)
29*4882a593Smuzhiyun        self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
30*4882a593Smuzhiyun        self.assertEqual(result.output, 'ERROR: The following packages could not be found: nonexistentpkg')
31*4882a593Smuzhiyun        # Reverse tests
32*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg -r "libz1 busybox"')
33*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib\nbusybox')
34*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg -r libz-dev')
35*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib-dev')
36*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-pkg -r nonexistentpkg', ignore_status=True)
37*4882a593Smuzhiyun        self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
38*4882a593Smuzhiyun        self.assertEqual(result.output, 'ERROR: The following packages could not be found: nonexistentpkg')
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun    def test_read_value(self):
41*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util read-value PN libz1')
42*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib')
43*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util read-value PKG libz1')
44*4882a593Smuzhiyun        self.assertEqual(result.output, 'libz1')
45*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util read-value PKGSIZE m4')
46*4882a593Smuzhiyun        pkgsize = int(result.output.strip())
47*4882a593Smuzhiyun        self.assertGreater(pkgsize, 1, "Size should be greater than 1. %s" % result.output)
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun    def test_find_path(self):
50*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util find-path /lib/libz.so.1')
51*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib: /lib/libz.so.1')
52*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util find-path /usr/bin/m4')
53*4882a593Smuzhiyun        self.assertEqual(result.output, 'm4: /usr/bin/m4')
54*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util find-path /not/exist', ignore_status=True)
55*4882a593Smuzhiyun        self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
56*4882a593Smuzhiyun        self.assertEqual(result.output, 'ERROR: Unable to find any package producing path /not/exist')
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun    def test_lookup_recipe(self):
59*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-recipe "libz-staticdev busybox"')
60*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib\nbusybox')
61*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-recipe libz-dbg')
62*4882a593Smuzhiyun        self.assertEqual(result.output, 'zlib')
63*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util lookup-recipe nonexistentpkg', ignore_status=True)
64*4882a593Smuzhiyun        self.assertEqual(result.status, 1, "Status different than 1. output: %s" % result.output)
65*4882a593Smuzhiyun        self.assertEqual(result.output, 'ERROR: The following packages could not be found: nonexistentpkg')
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun    def test_list_pkgs(self):
68*4882a593Smuzhiyun        # No arguments
69*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs')
70*4882a593Smuzhiyun        pkglist = result.output.split()
71*4882a593Smuzhiyun        self.assertIn('zlib', pkglist, "Listed packages: %s" % result.output)
72*4882a593Smuzhiyun        self.assertIn('zlib-dev', pkglist, "Listed packages: %s" % result.output)
73*4882a593Smuzhiyun        # No pkgspec, runtime
74*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -r')
75*4882a593Smuzhiyun        pkglist = result.output.split()
76*4882a593Smuzhiyun        self.assertIn('libz-dev', pkglist, "Listed packages: %s" % result.output)
77*4882a593Smuzhiyun        # With recipe specified
78*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib')
79*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
80*4882a593Smuzhiyun        try:
81*4882a593Smuzhiyun            pkglist.remove('zlib-ptest') # in case ptest is disabled
82*4882a593Smuzhiyun        except ValueError:
83*4882a593Smuzhiyun            pass
84*4882a593Smuzhiyun        self.assertEqual(pkglist, ['zlib', 'zlib-dbg', 'zlib-dev', 'zlib-doc', 'zlib-src', 'zlib-staticdev'], "Packages listed after remove: %s" % result.output)
85*4882a593Smuzhiyun        # With recipe specified, runtime
86*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib -r')
87*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
88*4882a593Smuzhiyun        try:
89*4882a593Smuzhiyun            pkglist.remove('libz-ptest') # in case ptest is disabled
90*4882a593Smuzhiyun        except ValueError:
91*4882a593Smuzhiyun            pass
92*4882a593Smuzhiyun        self.assertEqual(pkglist, ['libz-dbg', 'libz-dev', 'libz-doc', 'libz-src', 'libz-staticdev', 'libz1'], "Packages listed after remove: %s" % result.output)
93*4882a593Smuzhiyun        # With recipe specified and unpackaged
94*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib -u')
95*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
96*4882a593Smuzhiyun        self.assertIn('zlib-locale', pkglist, "Listed packages: %s" % result.output)
97*4882a593Smuzhiyun        # With recipe specified and unpackaged, runtime
98*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib -u -r')
99*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
100*4882a593Smuzhiyun        self.assertIn('libz-locale', pkglist, "Listed packages: %s" % result.output)
101*4882a593Smuzhiyun        # With recipe specified and pkgspec
102*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib "*-d*"')
103*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
104*4882a593Smuzhiyun        self.assertEqual(pkglist, ['zlib-dbg', 'zlib-dev', 'zlib-doc'], "Packages listed: %s" % result.output)
105*4882a593Smuzhiyun        # With recipe specified and pkgspec, runtime
106*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkgs -p zlib -r "*-d*"')
107*4882a593Smuzhiyun        pkglist = sorted(result.output.split())
108*4882a593Smuzhiyun        self.assertEqual(pkglist, ['libz-dbg', 'libz-dev', 'libz-doc'], "Packages listed: %s" % result.output)
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun    def test_list_pkg_files(self):
111*4882a593Smuzhiyun        def splitoutput(output):
112*4882a593Smuzhiyun            files = {}
113*4882a593Smuzhiyun            curpkg = None
114*4882a593Smuzhiyun            for line in output.splitlines():
115*4882a593Smuzhiyun                if line.startswith('\t'):
116*4882a593Smuzhiyun                    self.assertTrue(curpkg, 'Unexpected non-package line:\n%s' % line)
117*4882a593Smuzhiyun                    files[curpkg].append(line.strip())
118*4882a593Smuzhiyun                else:
119*4882a593Smuzhiyun                    self.assertTrue(line.rstrip().endswith(':'), 'Invalid package line in output:\n%s' % line)
120*4882a593Smuzhiyun                    curpkg = line.split(':')[0]
121*4882a593Smuzhiyun                    files[curpkg] = []
122*4882a593Smuzhiyun            return files
123*4882a593Smuzhiyun        bb_vars = get_bb_vars(['base_libdir', 'libdir', 'includedir', 'mandir'])
124*4882a593Smuzhiyun        base_libdir = bb_vars['base_libdir']
125*4882a593Smuzhiyun        libdir = bb_vars['libdir']
126*4882a593Smuzhiyun        includedir = bb_vars['includedir']
127*4882a593Smuzhiyun        mandir = bb_vars['mandir']
128*4882a593Smuzhiyun        # Test recipe-space package name
129*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files zlib-dev zlib-doc')
130*4882a593Smuzhiyun        files = splitoutput(result.output)
131*4882a593Smuzhiyun        self.assertIn('zlib-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
132*4882a593Smuzhiyun        self.assertIn('zlib-doc', list(files.keys()), "listed pkgs. files: %s" %result.output)
133*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['zlib-dev'])
134*4882a593Smuzhiyun        self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['zlib-doc'])
135*4882a593Smuzhiyun        # Test runtime package name
136*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files -r libz1 libz-dev')
137*4882a593Smuzhiyun        files = splitoutput(result.output)
138*4882a593Smuzhiyun        self.assertIn('libz1', list(files.keys()), "listed pkgs. files: %s" %result.output)
139*4882a593Smuzhiyun        self.assertIn('libz-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
140*4882a593Smuzhiyun        self.assertGreater(len(files['libz1']), 1)
141*4882a593Smuzhiyun        libspec = os.path.join(base_libdir, 'libz.so.1.*')
142*4882a593Smuzhiyun        found = False
143*4882a593Smuzhiyun        for fileitem in files['libz1']:
144*4882a593Smuzhiyun            if fnmatch.fnmatchcase(fileitem, libspec):
145*4882a593Smuzhiyun                found = True
146*4882a593Smuzhiyun                break
147*4882a593Smuzhiyun        self.assertTrue(found, 'Could not find zlib library file %s in libz1 package file list: %s' % (libspec, files['libz1']))
148*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['libz-dev'])
149*4882a593Smuzhiyun        # Test recipe
150*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files -p zlib')
151*4882a593Smuzhiyun        files = splitoutput(result.output)
152*4882a593Smuzhiyun        self.assertIn('zlib-dbg', list(files.keys()), "listed pkgs. files: %s" %result.output)
153*4882a593Smuzhiyun        self.assertIn('zlib-doc', list(files.keys()), "listed pkgs. files: %s" %result.output)
154*4882a593Smuzhiyun        self.assertIn('zlib-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
155*4882a593Smuzhiyun        self.assertIn('zlib-staticdev', list(files.keys()), "listed pkgs. files: %s" %result.output)
156*4882a593Smuzhiyun        self.assertIn('zlib', list(files.keys()), "listed pkgs. files: %s" %result.output)
157*4882a593Smuzhiyun        self.assertNotIn('zlib-locale', list(files.keys()), "listed pkgs. files: %s" %result.output)
158*4882a593Smuzhiyun        # (ignore ptest, might not be there depending on config)
159*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['zlib-dev'])
160*4882a593Smuzhiyun        self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['zlib-doc'])
161*4882a593Smuzhiyun        self.assertIn(os.path.join(libdir, 'libz.a'), files['zlib-staticdev'])
162*4882a593Smuzhiyun        # Test recipe, runtime
163*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files -p zlib -r')
164*4882a593Smuzhiyun        files = splitoutput(result.output)
165*4882a593Smuzhiyun        self.assertIn('libz-dbg', list(files.keys()), "listed pkgs. files: %s" %result.output)
166*4882a593Smuzhiyun        self.assertIn('libz-doc', list(files.keys()), "listed pkgs. files: %s" %result.output)
167*4882a593Smuzhiyun        self.assertIn('libz-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
168*4882a593Smuzhiyun        self.assertIn('libz-staticdev', list(files.keys()), "listed pkgs. files: %s" %result.output)
169*4882a593Smuzhiyun        self.assertIn('libz1', list(files.keys()), "listed pkgs. files: %s" %result.output)
170*4882a593Smuzhiyun        self.assertNotIn('libz-locale', list(files.keys()), "listed pkgs. files: %s" %result.output)
171*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['libz-dev'])
172*4882a593Smuzhiyun        self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['libz-doc'])
173*4882a593Smuzhiyun        self.assertIn(os.path.join(libdir, 'libz.a'), files['libz-staticdev'])
174*4882a593Smuzhiyun        # Test recipe, unpackaged
175*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files -p zlib -u')
176*4882a593Smuzhiyun        files = splitoutput(result.output)
177*4882a593Smuzhiyun        self.assertIn('zlib-dbg', list(files.keys()), "listed pkgs. files: %s" %result.output)
178*4882a593Smuzhiyun        self.assertIn('zlib-doc', list(files.keys()), "listed pkgs. files: %s" %result.output)
179*4882a593Smuzhiyun        self.assertIn('zlib-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
180*4882a593Smuzhiyun        self.assertIn('zlib-staticdev', list(files.keys()), "listed pkgs. files: %s" %result.output)
181*4882a593Smuzhiyun        self.assertIn('zlib', list(files.keys()), "listed pkgs. files: %s" %result.output)
182*4882a593Smuzhiyun        self.assertIn('zlib-locale', list(files.keys()), "listed pkgs. files: %s" %result.output) # this is the key one
183*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['zlib-dev'])
184*4882a593Smuzhiyun        self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['zlib-doc'])
185*4882a593Smuzhiyun        self.assertIn(os.path.join(libdir, 'libz.a'), files['zlib-staticdev'])
186*4882a593Smuzhiyun        # Test recipe, runtime, unpackaged
187*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util list-pkg-files -p zlib -r -u')
188*4882a593Smuzhiyun        files = splitoutput(result.output)
189*4882a593Smuzhiyun        self.assertIn('libz-dbg', list(files.keys()), "listed pkgs. files: %s" %result.output)
190*4882a593Smuzhiyun        self.assertIn('libz-doc', list(files.keys()), "listed pkgs. files: %s" %result.output)
191*4882a593Smuzhiyun        self.assertIn('libz-dev', list(files.keys()), "listed pkgs. files: %s" %result.output)
192*4882a593Smuzhiyun        self.assertIn('libz-staticdev', list(files.keys()), "listed pkgs. files: %s" %result.output)
193*4882a593Smuzhiyun        self.assertIn('libz1', list(files.keys()), "listed pkgs. files: %s" %result.output)
194*4882a593Smuzhiyun        self.assertIn('libz-locale', list(files.keys()), "listed pkgs. files: %s" %result.output) # this is the key one
195*4882a593Smuzhiyun        self.assertIn(os.path.join(includedir, 'zlib.h'), files['libz-dev'])
196*4882a593Smuzhiyun        self.assertIn(os.path.join(mandir, 'man3/zlib.3'), files['libz-doc'])
197*4882a593Smuzhiyun        self.assertIn(os.path.join(libdir, 'libz.a'), files['libz-staticdev'])
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun    def test_glob(self):
200*4882a593Smuzhiyun        tempdir = tempfile.mkdtemp(prefix='pkgdataqa')
201*4882a593Smuzhiyun        self.track_for_cleanup(tempdir)
202*4882a593Smuzhiyun        pkglistfile = os.path.join(tempdir, 'pkglist')
203*4882a593Smuzhiyun        with open(pkglistfile, 'w') as f:
204*4882a593Smuzhiyun            f.write('libz1\n')
205*4882a593Smuzhiyun            f.write('busybox\n')
206*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util glob %s "*-dev"' % pkglistfile)
207*4882a593Smuzhiyun        desiredresult = ['libz-dev', 'busybox-dev']
208*4882a593Smuzhiyun        self.assertEqual(sorted(result.output.split()), sorted(desiredresult))
209*4882a593Smuzhiyun        # The following should not error (because when we use this during rootfs construction, sometimes the complementary package won't exist)
210*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util glob %s "*-nonexistent"' % pkglistfile)
211*4882a593Smuzhiyun        self.assertEqual(result.output, '')
212*4882a593Smuzhiyun        # Test exclude option
213*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util glob %s "*-dev *-dbg" -x "^libz"' % pkglistfile)
214*4882a593Smuzhiyun        resultlist = result.output.split()
215*4882a593Smuzhiyun        self.assertNotIn('libz-dev', resultlist)
216*4882a593Smuzhiyun        self.assertNotIn('libz-dbg', resultlist)
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun    def test_specify_pkgdatadir(self):
219*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util -p %s lookup-pkg zlib' % get_bb_var('PKGDATA_DIR'))
220*4882a593Smuzhiyun        self.assertEqual(result.output, 'libz1')
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun    def test_no_param(self):
223*4882a593Smuzhiyun        result = runCmd('oe-pkgdata-util', ignore_status=True)
224*4882a593Smuzhiyun        self.assertEqual(result.status, 2, "Status different than 2. output: %s" % result.output)
225*4882a593Smuzhiyun        currpos = result.output.find('usage: oe-pkgdata-util')
226*4882a593Smuzhiyun        self.assertTrue(currpos != -1, msg = "Test is Failed. Help is not Displayed in %s" % result.output)
227