[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