text: import os
  
  from oeqa.selftest.case import OESelftestTestCase
  from oeqa.utils.commands import bitbake, get_bb_vars, runCmd
  from oeqa.core.decorator.oeid import OETestID
  
  # This test builds an image with using the "container" IMAGE_FSTYPE, and
  # ensures that then files in the image are only the ones expected.
  #
  # The only package added to the image is container_image_testpkg, which
  # contains one file. However, due to some other things not cleaning up during
  # rootfs creation, there is some cruft. Ideally bugs will be filed and the
  # cruft removed, but for now we whitelist some known set.
  #
  # Also for performance reasons we're only checking the cruft when using ipk.
  # When using deb, and rpm it is a bit different and we could test all
  # of them, but this test is more to catch if other packages get added by
  # default other than what is in ROOTFS_BOOTSTRAP_INSTALL.
  #
  class ContainerImageTests(OESelftestTestCase):
  
      # Verify that when specifying a IMAGE_TYPEDEP_ of the form "foo.bar" that
      # the conversion type bar gets added as a dep as well
      @OETestID(1619)
      def test_expected_files(self):
  
          def get_each_path_part(path):
              if path:
                  part = [ '.' + path + '/' ]
                  result = get_each_path_part(path.rsplit('/', 1)[0])
                  if result:
                      return part + result
                  else:
                      return part
              else:
                  return None
  
          self.write_config("""PREFERRED_PROVIDER_virtual/kernel = "linux-dummy"
  IMAGE_FSTYPES = "container"
  PACKAGE_CLASSES = "package_ipk"
  IMAGE_FEATURES = ""
  """)
  
          bbvars = get_bb_vars(['bindir', 'sysconfdir', 'localstatedir',
                                'DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'],
                                target='container-test-image')
          expected_files = [
                      './',
                      '.{bindir}/theapp',
                      '.{sysconfdir}/default/',
                      '.{sysconfdir}/default/postinst',
                      '.{sysconfdir}/ld.so.cache',
                      '.{sysconfdir}/timestamp',
                      '.{sysconfdir}/version',
                      './run/',
                      '.{localstatedir}/cache/',
                      '.{localstatedir}/cache/ldconfig/',
                      '.{localstatedir}/cache/ldconfig/aux-cache',
                      '.{localstatedir}/cache/opkg/',
                      '.{localstatedir}/lib/',
                      '.{localstatedir}/lib/opkg/'
                  ]
  
          expected_files = [ x.format(bindir=bbvars['bindir'],
                                      sysconfdir=bbvars['sysconfdir'],
                                      localstatedir=bbvars['localstatedir'])
                                      for x in expected_files ]
  
          # Since tar lists all directories individually, make sure each element
          # from bindir, sysconfdir, etc is added
          expected_files += get_each_path_part(bbvars['bindir'])
          expected_files += get_each_path_part(bbvars['sysconfdir'])
          expected_files += get_each_path_part(bbvars['localstatedir'])
  
          expected_files = sorted(expected_files)
  
          # Build the image of course
          bitbake('container-test-image')
  
          image = os.path.join(bbvars['DEPLOY_DIR_IMAGE'],
                               bbvars['IMAGE_LINK_NAME'] + '.tar.bz2')
  
          # Ensure the files in the image are what we expect
          result = runCmd("tar tf {} | sort".format(image), shell=True)
          self.assertEqual(result.output.split('\n'), expected_files)
  