[meta-virtualization] [PATCH] python-salttesting: Add ptest output format patch

Bruce Ashfield bruce.ashfield at gmail.com
Sun Jul 3 21:27:29 PDT 2016


merged.

Bruce

On Tue, Jun 28, 2016 at 6:54 PM, Collin Richards <collin.richards at ni.com>
wrote:

> Add a patch that allows the output of running the salt test suite to be
> in ptest format.
>
> Signed-off-by: Collin Richards <collin.richards at ni.com>
> Natinst-ReviewBoard-ID: 143279
> ---
>  ...001-Add-ptest-output-option-to-test-suite.patch | 232
> +++++++++++++++++++++
>  .../python/python-salttesting_2015.2.16.bb         |   6 +-
>  2 files changed, 237 insertions(+), 1 deletion(-)
>  create mode 100644
> meta-openstack/recipes-devtools/python/python-salttesting/0001-Add-ptest-output-option-to-test-suite.patch
>
> diff --git
> a/meta-openstack/recipes-devtools/python/python-salttesting/0001-Add-ptest-output-option-to-test-suite.patch
> b/meta-openstack/recipes-devtools/python/python-salttesting/0001-Add-ptest-output-option-to-test-suite.patch
> new file mode 100644
> index 0000000..c297320
> --- /dev/null
> +++
> b/meta-openstack/recipes-devtools/python/python-salttesting/0001-Add-ptest-output-option-to-test-suite.patch
> @@ -0,0 +1,232 @@
> +From 7e2642530bfd4ac0226b90404e7a4511e44756b6 Mon Sep 17 00:00:00 2001
> +From: Collin Richards <collin.richards at ni.com>
> +Date: Tue, 28 Jun 2016 16:02:22 -0500
> +Subject: [PATCH] Add ptest output option to test suite
> +
> +Extend salttesting to support outputing the results of running the test
> +suite in ptest format.
> +
> +Upstream-Status: Inappropriate [OE specific]
> +
> +Signed-off-by: Collin Richards <collin.richards at ni.com>
> +Natinst-ReviewBoard-ID: 143279
> +---
> + salttesting/parser/__init__.py |  12 +++
> + salttesting/ptest.py           | 168
> +++++++++++++++++++++++++++++++++++++++++
> + 2 files changed, 180 insertions(+)
> + create mode 100644 salttesting/ptest.py
> +
> +diff --git a/salttesting/parser/__init__.py
> b/salttesting/parser/__init__.py
> +index
> 1e7275b4b65ef29deb89049a70bf6a074e11873d..d8cba0cb1e4814b7065b6896186c25300048ec92
> 100644
> +--- a/salttesting/parser/__init__.py
> ++++ b/salttesting/parser/__init__.py
> +@@ -25,6 +25,7 @@ from functools import partial
> + from contextlib import closing
> +
> + from salttesting import TestLoader, TextTestRunner
> ++from salttesting.ptest import PTestRunner
> + from salttesting.version import __version_info__
> + from salttesting.xmlunit import HAS_XMLRUNNER, XMLTestRunner
> + try:
> +@@ -264,6 +265,12 @@ class SaltTestingParser(optparse.OptionParser):
> +             action='store_true',
> +             help='Do NOT show the overall tests result'
> +         )
> ++        self.output_options_group.add_option(
> ++            '--ptest-out',
> ++            dest='ptest_out',
> ++            default=False,
> ++            help='Output test results in PTest format'
> ++        )
> +         self.add_option_group(self.output_options_group)
> +
> +         self.fs_cleanup_options_group = optparse.OptionGroup(
> +@@ -491,6 +498,11 @@ class SaltTestingParser(optparse.OptionParser):
> +                 verbosity=self.options.verbosity
> +             ).run(tests)
> +             self.testsuite_results.append((header, runner))
> ++        elif self.options.ptest_out:
> ++            runner = PTestRunner(
> ++                stream=sys.stdout,
> ++                verbosity=self.options.verbosity).run(tests)
> ++            self.testsuite_results.append((header, runner))
> +         else:
> +             runner = TextTestRunner(
> +                 stream=sys.stdout,
> +diff --git a/salttesting/ptest.py b/salttesting/ptest.py
> +new file mode 100644
> +index
> 0000000000000000000000000000000000000000..9780886bc8f9d400aab2e96a33b14af980e64315
> +--- /dev/null
> ++++ b/salttesting/ptest.py
> +@@ -0,0 +1,168 @@
> ++# -*- coding: utf-8 -*-
> ++
> ++"""
> ++Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
> ++2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
> ++Reserved
> ++
> ++PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
> ++--------------------------------------------
> ++
> ++1. This LICENSE AGREEMENT is between the Python Software Foundation
> ++("PSF"), and the Individual or Organization ("Licensee") accessing and
> ++otherwise using this software ("Python") in source or binary form and
> ++its associated documentation.
> ++
> ++2. Subject to the terms and conditions of this License Agreement, PSF
> hereby
> ++grants Licensee a nonexclusive, royalty-free, world-wide license to
> reproduce,
> ++analyze, test, perform and/or display publicly, prepare derivative works,
> ++distribute, and otherwise use Python alone or in any derivative version,
> ++provided, however, that PSF's License Agreement and PSF's notice of
> copyright,
> ++i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
> 2009, 2010,
> ++2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
> ++Reserved" are retained in Python alone or in any derivative version
> prepared by
> ++Licensee.
> ++
> ++3. In the event Licensee prepares a derivative work that is based on
> ++or incorporates Python or any part thereof, and wants to make
> ++the derivative work available to others as provided herein, then
> ++Licensee hereby agrees to include in any such work a brief summary of
> ++the changes made to Python.
> ++
> ++4. PSF is making Python available to Licensee on an "AS IS"
> ++basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
> ++IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
> ++DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
> ++FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
> ++INFRINGE ANY THIRD PARTY RIGHTS.
> ++
> ++5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
> ++FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
> ++A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
> ++OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
> ++
> ++6. This License Agreement will automatically terminate upon a material
> ++breach of its terms and conditions.
> ++
> ++7. Nothing in this License Agreement shall be deemed to create any
> ++relationship of agency, partnership, or joint venture between PSF and
> ++Licensee.  This License Agreement does not grant permission to use PSF
> ++trademarks or trade name in a trademark sense to endorse or promote
> ++products or services of Licensee, or any third party.
> ++
> ++8. By copying, installing or otherwise using Python, Licensee
> ++agrees to be bound by the terms and conditions of this License
> ++Agreement.
> ++
> ++Modified Version of Python's TextTestRunner
> ++"""
> ++
> ++import time
> ++import sys
> ++import string
> ++
> ++import unittest
> ++TestResult = unittest.TestResult
> ++
> ++
> ++class _WritelnDecorator(object):
> ++    """Used to decorate file-like objects with a handy 'writeln'
> method"""
> ++    def __init__(self, stream):
> ++        self.stream = stream
> ++
> ++    def __getattr__(self, attr):
> ++        if attr in ('stream', '__getstate__'):
> ++            raise AttributeError(attr)
> ++        return getattr(self.stream, attr)
> ++
> ++    def writeln(self, arg=None):
> ++        if arg:
> ++            self.write(arg)
> ++        self.write('\n')  # text-mode streams translate to \r\n if needed
> ++
> ++
> ++class _PTestResult(TestResult):
> ++    """A test result class that can print formatted text results to a
> stream.
> ++
> ++    Used by PTestRunner.
> ++    """
> ++    separator1 = '=' * 70
> ++    separator2 = '-' * 70
> ++
> ++    def __init__(self, stream, descriptions, verbosity):
> ++        TestResult.__init__(self)
> ++        self.stream = stream
> ++        self.showAll = verbosity > 1
> ++        self.dots = verbosity == 1
> ++        self.descriptions = descriptions
> ++
> ++    def getDescription(self, test):
> ++        if self.descriptions:
> ++            return test.shortDescription() or str(test)
> ++        else:
> ++            return str(test)
> ++
> ++    def startTest(self, test):
> ++        TestResult.startTest(self, test)
> ++
> ++    def addSuccess(self, test):
> ++        TestResult.addSuccess(self, test)
> ++        if self.showAll:
> ++            self.stream.writeln("PASS:
> {0}".format(self.getDescription(test)))
> ++        elif self.dots:
> ++            self.stream.write('.')
> ++
> ++    def addError(self, test, err):
> ++        TestResult.addError(self, test, err)
> ++        if self.showAll:
> ++            self.stream.writeln("FAIL: ERROR
> {0}".format(self.getDescription(test)))
> ++        elif self.dots:
> ++            self.stream.write('E')
> ++
> ++    def addFailure(self, test, err):
> ++        TestResult.addFailure(self, test, err)
> ++        if self.showAll:
> ++            self.stream.writeln("FAIL:
> {0}".format(self.getDescription(test)))
> ++        elif self.dots:
> ++            self.stream.write('F')
> ++
> ++    def printErrors(self):
> ++        if self.dots or self.showAll:
> ++            self.stream.writeln()
> ++        self.printErrorList('ERROR', self.errors)
> ++        self.printErrorList('FAIL', self.failures)
> ++
> ++    def printErrorList(self, flavour, errors):
> ++        for test, err in errors:
> ++            self.stream.writeln(self.separator1)
> ++            self.stream.writeln("{0}: {0}".format(flavour,
> self.getDescription(test)))
> ++            self.stream.writeln(self.separator2)
> ++            self.stream.writeln("{0}".format(err))
> ++
> ++
> ++class PTestRunner:
> ++    """A test runner class that displays results in PTest format.
> ++
> ++    """
> ++    def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
> ++        self.stream = _WritelnDecorator(stream)
> ++        self.descriptions = descriptions
> ++        self.verbosity = 2
> ++
> ++    def _makeResult(self):
> ++        return _PTestResult(self.stream, self.descriptions,
> self.verbosity)
> ++
> ++    def run(self, test):
> ++        "Run the given test case or test suite."
> ++        result = self._makeResult()
> ++        startTime = time.time()
> ++        test(result)
> ++        stopTime = time.time()
> ++        timeTaken = float(stopTime - startTime)
> ++        result.printErrors()
> ++        run = result.testsRun
> ++        self.stream.writeln("Ran %d test%s in %.3fs" %
> ++                            (run, run == 1 and "" or "s", timeTaken))
> ++        self.stream.writeln(result.separator2)
> ++        self.stream.writeln()
> ++        return result
> +--
> +1.9.1
> +
> diff --git a/meta-openstack/recipes-devtools/python/
> python-salttesting_2015.2.16.bb b/meta-openstack/recipes-devtools/python/
> python-salttesting_2015.2.16.bb
> index 78ad879..2a5ed20 100644
> --- a/meta-openstack/recipes-devtools/python/
> python-salttesting_2015.2.16.bb
> +++ b/meta-openstack/recipes-devtools/python/
> python-salttesting_2015.2.16.bb
> @@ -5,7 +5,11 @@ LICENSE = "Apache-2.0"
>  LIC_FILES_CHKSUM = "file://LICENSE;md5=f36f1e9e3e30f90180efdf7e40d943e5"
>  SRCNAME = "salt-testing"
>
> -SRC_URI = "
> https://github.com/saltstack/salt-testing/archive/v${PV}.tar.gz;downloadfilename=salt-testing-v${PV}.tar.gz
> "
> +FILESEXTRAPATHS_append := "${THISDIR}/${PN}"
> +
> +SRC_URI = "
> https://github.com/saltstack/salt-testing/archive/v${PV}.tar.gz;downloadfilename=salt-testing-v${PV}.tar.gz
> \
> +           file://0001-Add-ptest-output-option-to-test-suite.patch \
> +           "
>  SRC_URI[md5sum] = "8ca55a796e9ad7ba72bc143043753ccf"
>  SRC_URI[sha256sum] =
> "0ef4be6a8a9b505ae1c328394dfad50493674af6100c7e2c220f374533d86edc"
>
> --
> 1.9.1
>
> --
> _______________________________________________
> meta-virtualization mailing list
> meta-virtualization at yoctoproject.org
> https://lists.yoctoproject.org/listinfo/meta-virtualization
>



-- 
"Thou shalt not follow the NULL pointer, for chaos and madness await thee
at its end"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/meta-virtualization/attachments/20160704/b1f4e197/attachment-0001.html>


More information about the meta-virtualization mailing list