pkgdata.py 13 KB

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