All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 0/2] ptest-runner 2.0
@ 2015-12-14 22:57 Aníbal Limón
  2015-12-14 22:57 ` [PATCHv2 1/2] ptest-runner: Add version 2.0 re-implementation in python Aníbal Limón
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Aníbal Limón @ 2015-12-14 22:57 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton, Nathan_Lynch

This v2 fixes default timeout to 5minutes also add support for wait indefinitely
when specify -1 in timeout option.

The changes can be reviewed at,

http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/ptest-runner

Aníbal Limón (2):
  ptest-runner: Add version 2.0 re-implementation in python.
  ptest-runner: Add a recipe for install ptest-runner 2.0.

 .../ptest-runner/files/ptest-runner_2.0.py         | 162 +++++++++++++++++++++
 .../ptest-runner/ptest-runner_2.0.bb               |  28 ++++
 2 files changed, 190 insertions(+)
 create mode 100755 meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py
 create mode 100644 meta/recipes-support/ptest-runner/ptest-runner_2.0.bb

-- 
2.1.4



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

* [PATCHv2 1/2] ptest-runner: Add version 2.0 re-implementation in python.
  2015-12-14 22:57 [PATCHv2 0/2] ptest-runner 2.0 Aníbal Limón
@ 2015-12-14 22:57 ` Aníbal Limón
  2015-12-14 22:57 ` [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0 Aníbal Limón
  2015-12-18 17:34 ` [PATCHv2 0/2] " Aníbal Limón
  2 siblings, 0 replies; 5+ messages in thread
From: Aníbal Limón @ 2015-12-14 22:57 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton, Nathan_Lynch

The new ptest-runner supports timeout of upstream tests executed,
it looks for stdout of process and if no information is available
in certain time (defaults to 5m) the process is treaty as blocked
and ptest-runner kills it, this handles problems of ptest-runner
being blocked indefinitly for upstream test suites.

Also an options was added for list test available, specify directory
of ptests and run only certain tests.

[YOCTO #8021]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 .../ptest-runner/files/ptest-runner_2.0.py         | 162 +++++++++++++++++++++
 1 file changed, 162 insertions(+)
 create mode 100755 meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py

diff --git a/meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py b/meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py
new file mode 100755
index 0000000..2b71970
--- /dev/null
+++ b/meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py
@@ -0,0 +1,162 @@
+#!/usr/bin/env python
+
+# Ptest-runner
+#
+# Copyright (C) 2014-2015 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import os
+import sys
+import fcntl
+import time
+
+import argparse
+import logging 
+from datetime import datetime
+
+import subprocess
+
+DEFAULT_LIBDIR='/usr/lib'
+DEFAULT_TIMEOUT_SECS = 300
+
+logging.basicConfig(format="%(message)s")
+logger = logging.getLogger()
+logger.setLevel(logging.INFO)
+
+def get_available_ptests(libdir):
+    ptests = {}
+
+    if os.path.exists(libdir) and os.path.isdir(libdir):
+        for d in os.listdir(libdir):
+            full_d = os.path.join(libdir, d)
+            if os.path.isdir(full_d) and not os.path.islink(full_d):
+                run_ptest = os.path.join(full_d, 'ptest', 'run-ptest')
+                if os.path.exists(run_ptest):
+                    ptests[d] = run_ptest
+
+    return ptests
+
+def print_ptests(ptests):
+    if ptests.keys():
+        logger.info("Available ptests:\n")
+        for p in ptests.keys():
+            logger.info("%s\t%s" % (p, ptests[p]))
+        return 0
+    else:
+        logger.error("No ptests found.\n")
+        return 1
+
+def get_ptests_to_run(available_ptests, requested_ptests):
+    if requested_ptests:
+        for rp in requested_ptests:
+            if not rp in available_ptests.keys():
+                logger.error("%s ptest isn't available." % rp)
+                return 1
+
+        for ap in available_ptests.keys():
+            if not ap in requested_ptests:
+                del available_ptests[ap]
+    return 0
+
+def run_ptests(ptests, timeout):
+    def _set_nonblocking(fp):
+        fd = process.stdout.fileno()
+        fl = fcntl.fcntl(fd, fcntl.F_GETFL)
+        fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
+
+    def _write_output(stdout):
+        import select
+        data_written = False
+
+        rlist = [stdout.fileno()]
+        (rrlist, _, _) = select.select(rlist, [], [], 0)
+
+        for fd in rrlist:
+            try:
+                sys.stdout.write(stdout.read())
+                data_written = True
+            except:
+                pass
+
+        return data_written
+
+    exit_code = 0
+
+    print "START: %s" % sys.argv[0]
+    for p in ptests.keys():
+        run_ptest = ptests[p]
+
+        print datetime.strftime(datetime.now(), "%Y-%m-%dT%H:%M")
+        print "BEGIN: %s" % run_ptest
+
+        os.chdir(os.path.dirname(run_ptest))
+
+        process = subprocess.Popen([run_ptest], stdout=subprocess.PIPE,
+                stderr=subprocess.STDOUT, shell=True, close_fds=True,
+                bufsize=-1)
+        _set_nonblocking(process.stdout)
+
+        sentinel = datetime.now()
+        while True:
+            if _write_output(process.stdout):
+                sentinel = datetime.now()
+            elif timeout >= 0 and \
+                ((datetime.now() - sentinel).total_seconds() > timeout):
+                    print "\nTIMEOUT: %s" % run_ptest
+                    process.kill()
+                    break
+
+            if process.poll() is not None:
+                break
+
+            time.sleep(0.5)
+
+        if process.returncode:
+            exit_code = process.returncode
+
+        print "END: %s" % run_ptest
+        print datetime.strftime(datetime.now(), "%Y-%m-%dT%H:%M")
+    print "STOP: %s" % sys.argv[0]
+
+    return exit_code
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description="ptest-runner runs ptests from upstream packages",
+            add_help=False,
+            epilog="Use %(prog)s [ptest1 ptest2 ...] --help to get help on a specific command")
+    parser.add_argument('ptests', metavar='ptests', help='ptests to run',
+            nargs='*')
+    parser.add_argument('-d', '--directory', help='Directory for search ptests',
+            action='store', default=DEFAULT_LIBDIR)
+    parser.add_argument('-l', '--list', help='List available ptests',
+            action='store_true')
+    parser.add_argument('-t', '--timeout',
+            help='Timeout (secs) for use when run ptests, -1 waits indefinitely', action='store', type=int,
+            default=DEFAULT_TIMEOUT_SECS)
+    parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
+                        help='show this help message and exit')
+
+    global_args, unparsed_args = parser.parse_known_args()
+
+    ptests = get_available_ptests(global_args.directory)
+    if global_args.list:
+        exit_code = print_ptests(ptests)
+        sys.exit(exit_code)
+
+    exit_code = get_ptests_to_run(ptests, global_args.ptests)
+    if exit_code:
+        sys.exit(exit_code)
+
+    sys.exit(run_ptests(ptests, global_args.timeout))
-- 
2.1.4



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

* [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0.
  2015-12-14 22:57 [PATCHv2 0/2] ptest-runner 2.0 Aníbal Limón
  2015-12-14 22:57 ` [PATCHv2 1/2] ptest-runner: Add version 2.0 re-implementation in python Aníbal Limón
@ 2015-12-14 22:57 ` Aníbal Limón
  2015-12-15  0:23   ` Khem Raj
  2015-12-18 17:34 ` [PATCHv2 0/2] " Aníbal Limón
  2 siblings, 1 reply; 5+ messages in thread
From: Aníbal Limón @ 2015-12-14 22:57 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton, Nathan_Lynch

[YOCTO #8021]

Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
---
 .../ptest-runner/ptest-runner_2.0.bb               | 28 ++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 meta/recipes-support/ptest-runner/ptest-runner_2.0.bb

diff --git a/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb b/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
new file mode 100644
index 0000000..64fd0df
--- /dev/null
+++ b/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
@@ -0,0 +1,28 @@
+SUMMARY = "A python script to run all installed ptests"
+
+DESCRIPTION = "The ptest-runner package installs a ptest-runner \
+python script which loops through all installed ptest test suites and \
+runs them in sequence."
+
+HOMEPAGE = "https://wiki.yoctoproject.org/wiki/Ptest"
+SRC_URI += "file://ptest-runner_2.0.py"
+
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \
+                    file://${COREBASE}/meta/COPYING.GPLv2;md5=751419260aa954499f7abaabaa882bbe"
+
+INHIBIT_DEFAULT_DEPS = "1"
+RDEPENDS_${PN} = "python python-fcntl python-argparse python-logging python-datetime \
+                  python-subprocess"
+
+S = "${WORKDIR}"
+
+do_install () {
+    mkdir -p ${D}${bindir}
+    install -m 0755 ${WORKDIR}/ptest-runner_2.0.py ${D}${bindir}/ptest-runner
+}
+
+do_patch[noexec] = "1"
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+do_build[noexec] = "1"
-- 
2.1.4



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

* Re: [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0.
  2015-12-14 22:57 ` [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0 Aníbal Limón
@ 2015-12-15  0:23   ` Khem Raj
  0 siblings, 0 replies; 5+ messages in thread
From: Khem Raj @ 2015-12-15  0:23 UTC (permalink / raw)
  To: Aníbal Limón; +Cc: paul.eggleton, Nathan_Lynch, openembedded-core

[-- Attachment #1: Type: text/plain, Size: 2089 bytes --]


> On Dec 14, 2015, at 2:57 PM, Aníbal Limón <anibal.limon@linux.intel.com> wrote:
> 
> [YOCTO #8021]
> 
> Signed-off-by: Aníbal Limón <anibal.limon@linux.intel.com>
> ---
> .../ptest-runner/ptest-runner_2.0.bb               | 28 ++++++++++++++++++++++
> 1 file changed, 28 insertions(+)
> create mode 100644 meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
> 
> diff --git a/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb b/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
> new file mode 100644
> index 0000000..64fd0df
> --- /dev/null
> +++ b/meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
> @@ -0,0 +1,28 @@
> +SUMMARY = "A python script to run all installed ptests"
> +
> +DESCRIPTION = "The ptest-runner package installs a ptest-runner \
> +python script which loops through all installed ptest test suites and \
> +runs them in sequence."
> +
> +HOMEPAGE = "https://wiki.yoctoproject.org/wiki/Ptest"
> +SRC_URI += "file://ptest-runner_2.0.py"
> +
> +LICENSE = "GPLv2"
> +LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \
> +                    file://${COREBASE}/meta/COPYING.GPLv2;md5=751419260aa954499f7abaabaa882bbe"
> +
> +INHIBIT_DEFAULT_DEPS = "1"
> +RDEPENDS_${PN} = "python python-fcntl python-argparse python-logging python-datetime \
> +                  python-subprocess"
> +
> +S = "${WORKDIR}"
> +
> +do_install () {
> +    mkdir -p ${D}${bindir}
> +    install -m 0755 ${WORKDIR}/ptest-runner_2.0.py ${D}${bindir}/ptest-runner

both above can be replaced with single install

install -D -m 0755 ${WORKDIR}/ptest-runner_2.0.py ${D}${bindir}/ptest-runner

> +}
> +
> +do_patch[noexec] = "1"
> +do_configure[noexec] = "1"
> +do_compile[noexec] = "1"
> +do_build[noexec] = “1"

may they should be deleted instead of being nops

> --
> 2.1.4
> 
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


[-- Attachment #2: Message signed with OpenPGP using GPGMail --]
[-- Type: application/pgp-signature, Size: 211 bytes --]

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

* Re: [PATCHv2 0/2] ptest-runner 2.0
  2015-12-14 22:57 [PATCHv2 0/2] ptest-runner 2.0 Aníbal Limón
  2015-12-14 22:57 ` [PATCHv2 1/2] ptest-runner: Add version 2.0 re-implementation in python Aníbal Limón
  2015-12-14 22:57 ` [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0 Aníbal Limón
@ 2015-12-18 17:34 ` Aníbal Limón
  2 siblings, 0 replies; 5+ messages in thread
From: Aníbal Limón @ 2015-12-18 17:34 UTC (permalink / raw)
  To: openembedded-core; +Cc: paul.eggleton, Nathan_Lynch

ping


On 12/14/2015 04:57 PM, Aníbal Limón wrote:
> This v2 fixes default timeout to 5minutes also add support for wait indefinitely
> when specify -1 in timeout option.
> 
> The changes can be reviewed at,
> 
> http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=alimon/ptest-runner
> 
> Aníbal Limón (2):
>   ptest-runner: Add version 2.0 re-implementation in python.
>   ptest-runner: Add a recipe for install ptest-runner 2.0.
> 
>  .../ptest-runner/files/ptest-runner_2.0.py         | 162 +++++++++++++++++++++
>  .../ptest-runner/ptest-runner_2.0.bb               |  28 ++++
>  2 files changed, 190 insertions(+)
>  create mode 100755 meta/recipes-support/ptest-runner/files/ptest-runner_2.0.py
>  create mode 100644 meta/recipes-support/ptest-runner/ptest-runner_2.0.bb
> 


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

end of thread, other threads:[~2015-12-18 17:33 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-14 22:57 [PATCHv2 0/2] ptest-runner 2.0 Aníbal Limón
2015-12-14 22:57 ` [PATCHv2 1/2] ptest-runner: Add version 2.0 re-implementation in python Aníbal Limón
2015-12-14 22:57 ` [PATCHv2 2/2] ptest-runner: Add a recipe for install ptest-runner 2.0 Aníbal Limón
2015-12-15  0:23   ` Khem Raj
2015-12-18 17:34 ` [PATCHv2 0/2] " Aníbal Limón

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.