pkgdata.py 13 KB

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