All of lore.kernel.org
 help / color / mirror / Atom feed
* [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test
@ 2020-01-25  8:25 Tim Orling
  2020-02-05 23:17 ` Randy MacLeod
  0 siblings, 1 reply; 4+ messages in thread
From: Tim Orling @ 2020-01-25  8:25 UTC (permalink / raw)
  To: openembedded-devel

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-pymongo"
IMAGE_INSTALL_append = " ${PYTHON_PACKAGE_UNDER_TEST}"
PYTHON_IMPORTS_UNDER_TEST = "bson gridfs pymongo"

Signed-off-by: Tim Orling <ticotimo@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)
-- 
2.25.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test
  2020-01-25  8:25 [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test Tim Orling
@ 2020-02-05 23:17 ` Randy MacLeod
  2020-02-05 23:49   ` Tim Orling
  2020-02-05 23:54   ` Tim Orling
  0 siblings, 2 replies; 4+ messages in thread
From: Randy MacLeod @ 2020-02-05 23:17 UTC (permalink / raw)
  To: openembedded-devel, Orling, Timothy T

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@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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test
  2020-02-05 23:17 ` Randy MacLeod
@ 2020-02-05 23:49   ` Tim Orling
  2020-02-05 23:54   ` Tim Orling
  1 sibling, 0 replies; 4+ messages in thread
From: Tim Orling @ 2020-02-05 23:49 UTC (permalink / raw)
  To: Randy MacLeod; +Cc: Orling, Timothy T, openembedded-devel

On Wed, Feb 5, 2020 at 3:18 PM Randy MacLeod <randy.macleod@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?
>
>
I have not started the python3 version yet. To do what is functional here
will
be trivial changes. I'd love to see traction on the TODO list and it should
be interesting
work for Trevor to do. This tool is now in my "daily" workflow.

There is one possible issue, which is a change in the variables does not
necessarily trigger
the tests you expect. The symptom is running testimage tests the last thing
you had the variable
set to, not the current value in local.conf. There are other places in the
code base where variables
are watched and trigger changes appropriately. I did not go that far yet.

Also, the variables names between py2 and py3 would need to be different,
but that is a thing
of the past for master, so not a real issue.


> >
> > 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@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@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test
  2020-02-05 23:17 ` Randy MacLeod
  2020-02-05 23:49   ` Tim Orling
@ 2020-02-05 23:54   ` Tim Orling
  1 sibling, 0 replies; 4+ messages in thread
From: Tim Orling @ 2020-02-05 23:54 UTC (permalink / raw)
  To: Randy MacLeod; +Cc: Orling, Timothy T, openembedded-devel

On Wed, Feb 5, 2020 at 3:18 PM Randy MacLeod <randy.macleod@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@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@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-devel
>


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-02-05 23:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-25  8:25 [meta-python2][RFC] lib/oeqa/runtime/cases/python2_module.py: add test Tim Orling
2020-02-05 23:17 ` Randy MacLeod
2020-02-05 23:49   ` Tim Orling
2020-02-05 23:54   ` Tim Orling

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.