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

Tim Orling ticotimo at gmail.com
Wed Feb 5 23:54:28 UTC 2020


On Wed, Feb 5, 2020 at 3:18 PM Randy MacLeod <randy.macleod at windriver.com>
wrote:

> 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
> ?
>
>
Those are required to make the QEMU runner dump any missing things, like
TUN/TAP. So no, not required. The
host_dump stuff isn't really all that helpful anyway. If you can run
"testimage" with KVM, TUN/TAP and virgl/gl then
you have all the speed ups that I was trying to make sure were working on
the platform running these tests (with gitlab ci runner)

The fact that the docker-executor in gitlab does not allow the --add-groups
option to the docker command line gets in the way
anyway... so you would have to run the container privileged and I'm not
going to do that ;)

The user in the docker container does not have permissions on  /dev/kvm,
etc. But that has nothing to do with this code :)


> 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
> --
> _______________________________________________
> Openembedded-devel mailing list
> Openembedded-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>


More information about the Openembedded-devel mailing list