selftest/containerimage.py: Add container IMAGE_FSTYPES test

This test checks to make sure only the files expected exist in a
container image. Currently only ROOTFS_BOOTSTRAP_INSTALL, gets added to
all images without the user specifying it.

But this test should help if a developer in the future ever silently
adds more than just ROOTFS_BOOTSTRAP_INSTALL, and that the developer can
make sure it also gets removed from a container image.

[YOCTO #9502]

(From OE-Core rev: 4f5e5321fafe491f91d78a35d11afc0dc0527d4b)

Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Randy Witt 2017-01-30 13:16:28 -08:00 committed by Richard Purdie
parent 5da9c1c38b
commit 23bd7e100a
3 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,8 @@
LICENSE = "MIT"
INHIBIT_DEFAULT_DEPS = "1"
do_install_append() {
install -d ${D}${bindir}
touch ${D}${bindir}/theapp
}

View File

@ -0,0 +1,8 @@
IMAGE_INSTALL += "container-image-testpkg"
LICENSE = "MIT"
IMAGE_FSTYPES = "container"
IMAGE_LINGUAS = ""
inherit core-image

View File

@ -0,0 +1,83 @@
import os
from oeqa.selftest.base import oeSelfTest
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(oeSelfTest):
# 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 = ""
""")
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)