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