[oe] [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test

Randy MacLeod randy.macleod at windriver.com
Wed Feb 5 23:17:34 UTC 2020


On 1/25/20 3:25 AM, Tim Orling wrote:
> This test case is intentionally limited to only tesing one
> python package/recipe at a time, because the use case is to
> determine whether dependencies have been met for a minimal
> image with 'only' the package under test installed. This
> dependency checking must include the packages-split python
> standard library modules that OE/YP creates from the python
> manifest.
> 
> TODO: Be smarter about PYTHON_IMPORTS_UNDER_TEST, as this
>        should be discoverable from /usr/lib/python2.7/site-packages
>        or from the rpm/deb/ipk of the python package itself.
>        What we do NOT want to do is use pkgdata or some other
>        magical Python script that will add dependencies to the
>        test image. We need as pristine and minimalist a test
>        environment as we can get.
> 
> TODO: Use a minimal master test image and install the package under
>        test from a package feed using a package manager in the master
>        test image. This would allow for much shorter developement
>        cycles.
> 
> TODO: Parse the ImportError and give hints about what dependencies
>        are missing.

This looks useful. Do you have the python3 version done but not sent
or should Trevor see if he can get that to work?

> 
> Example configuration in local.conf:
> 
> IMAGE_CLASSES += " testimage"
> DISTRO_FEAURES_append = " ptest"
> EXTRA_IMAGE_FEATURES = "debug-tweaks"
> TESTIMAGE_AUTO = "1"
> TEST_SUITES = " ping ssh python2 ptest python2_module"
> TEST_QEMUPARAMS += "-smp 4 -m 8192"
> TEST_RUNQEMUPARAMS += "kvm gl"
> IMAGE_ROOTFS_SIZE ?= "8192"
> IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}"
> IMAGE_INSTALL_append = " ptest-runner dropbear procps coreutils iproute2 sysstat"
Is this really a minimal set of dependencies and if so, why do you need:
    procps coreutils iproute2 sysstat
?

I should probably try it before replying but
it's already been a long day!

../Randy

> PYTHON_PACKAGE_UNDER_TEST = "python-pymongo"
> IMAGE_INSTALL_append = " ${PYTHON_PACKAGE_UNDER_TEST}"
> PYTHON_IMPORTS_UNDER_TEST = "bson gridfs pymongo"
> 
> Signed-off-by: Tim Orling <ticotimo at gmail.com>
> ---
>   lib/oeqa/runtime/cases/python2_module.py | 97 ++++++++++++++++++++++++
>   1 file changed, 97 insertions(+)
>   create mode 100644 lib/oeqa/runtime/cases/python2_module.py
> 
> diff --git a/lib/oeqa/runtime/cases/python2_module.py b/lib/oeqa/runtime/cases/python2_module.py
> new file mode 100644
> index 00000000..59ae00fb
> --- /dev/null
> +++ b/lib/oeqa/runtime/cases/python2_module.py
> @@ -0,0 +1,97 @@
> +#
> +# SPDX-License-Identifier: MIT
> +#
> +
> +import os
> +
> +from oeqa.runtime.case import OERuntimeTestCase
> +from oeqa.core.decorator.depends import OETestDepends
> +from oeqa.core.decorator.data import OETestDataDepends
> +from oeqa.runtime.decorator.package import OEHasPackage
> +
> +
> +class PythonModuleTest(OERuntimeTestCase):
> +    """This test case is intentionally limited to only tesing one
> +       python package/recipe at a time, because the use case is to
> +       determine whether dependencies have been met for a minimal
> +       image with 'only' the package under test installed. This
> +       dependency checking must include the packages-split python
> +       standard library modules that OE/YP creates from the python
> +       manifest.
> +
> +       TODO: Be smarter about PYTHON_IMPORTS_UNDER_TEST, as this
> +             should be discoverable from /usr/lib/python2.7/site-packages
> +             or from the rpm/deb/ipk of the python package itself.
> +             What we do NOT want to do is use pkgdata or some other
> +             magical Python script that will add dependencies to the
> +             test image. We need as pristine and minimalist a test
> +             environment as we can get.
> +
> +       TODO: Use a minimal master test image and install the package under
> +             test from a package feed using a package manager in the master
> +             test image. This would allow for much shorter developement
> +             cycles.
> +
> +       TODO: Parse the ImportError and give hints about what dependencies
> +             are missing.
> +
> +
> +       Example configuration in local.conf:
> +
> +       IMAGE_CLASSES += " testimage"
> +       DISTRO_FEAURES_append = " ptest"
> +       EXTRA_IMAGE_FEATURES = "debug-tweaks"
> +       TESTIMAGE_AUTO = "1"
> +       TEST_SUITES = " ping ssh python2 ptest python2_module"
> +       TEST_QEMUPARAMS += "-smp 4 -m 8192"
> +       TEST_RUNQEMUPARAMS += "kvm gl"
> +       IMAGE_ROOTFS_SIZE ?= "8192"
> +       IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "", d)}"
> +       IMAGE_INSTALL_append = " ptest-runner dropbear procps coreutils iproute2 sysstat"
> +       PYTHON_PACKAGE_UNDER_TEST = "python-engineio"
> +       IMAGE_INSTALL_append = " ${PYTHON_PACKAGE_UNDER_TEST}"
> +       PYTHON_IMPORTS_UNDER_TEST = "engineio"
> +    """
> +
> +    package = ""
> +    imports = []
> +
> +    @classmethod
> +    def setUp(cls):
> +        if 'PYTHON_PACKAGE_UNDER_TEST' in cls.tc.td:
> +            cls.package = cls.tc.td.get('PYTHON_PACKAGE_UNDER_TEST')
> +            cls.logger.debug('Running import test on "%s" recipe' % cls.package)
> +        else:
> +            cls.logger.error('No recipe to test found in configuration.\n'
> +                             'Please set in PYTHON_PACKAGE_UNDER_TEST')
> +        if 'PYTHON_IMPORTS_UNDER_TEST' in cls.tc.td:
> +            cls.imports = cls.tc.td.get('PYTHON_IMPORTS_UNDER_TEST').split()
> +            if isinstance(cls.imports, list) and len(cls.imports) > 0:
> +                cls.logger.info('Importing from %s' % cls.imports)
> +            else:
> +                cls.logger.error("PYTHON_IMPORTS_UNDER_TEST should be a space delimited list")
> +                cls.logger.error("typeof(PYTHON_IMPORTS_UNDER_TEST) is %s" % type(cls.imports))
> +        else:
> +            cls.logger.error("No modules to import found in configuration.\n"
> +                             "Please set in variable PYTHON_IMPORTS_UNDER_TEST")
> +
> +
> +class PythonModuleImportTest(PythonModuleTest):
> +    @OETestDepends(['ssh.SSHTest.test_ssh'])
> +    @OETestDepends(['python2.PythonTest.test_python'])
> +    @OETestDataDepends(['PYTHON_PACKAGE_UNDER_TEST'])
> +    @OETestDataDepends(['PYTHON_IMPORTS_UNDER_TEST'])
> +    def test_python_module(self):
> +        # We can't use the OEHasPackage decorator, because 'package' isn't defined
> +        # until the class has already been instantiated
> +        msg = 'Checking if "%s" is installed' % self.package
> +        self.logger.debug(msg)
> +        if not self.package in self.tc.image_packages:
> +            msg = 'Test requires "%s" to be installed' % self.package
> +            self.skipTest(msg)
> +
> +        for python_import in self.imports:
> +            cmd = 'python -c "import %s"' % python_import
> +            status, output = self.target.run(cmd)
> +            msg = 'Exit status was not 0. Output: %s' % output
> +            self.assertEqual(status, 0, msg=msg)
> 


-- 
# Randy MacLeod
# Wind River Linux


More information about the Openembedded-devel mailing list