| # |
| # SPDX-License-Identifier: MIT |
| # |
| |
| import os |
| |
| from oeqa.selftest.case import OESelftestTestCase |
| from oeqa.utils.commands import bitbake, get_bb_vars, runCmd |
| |
| # 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 |
| 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 = "" |
| IMAGE_BUILDINFO_FILE = "" |
| INIT_MANAGER = "sysvinit" |
| IMAGE_INSTALL_remove = "ssh-pregen-hostkeys" |
| |
| """) |
| |
| 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) |