[Piglit] [PATCH v3] Filter expected failures from JUnit output

Dylan Baker baker.dylan.c at gmail.com
Tue Sep 23 15:28:45 PDT 2014


Looks good to me. Thanks for making these changes.

Reviewed-by: Dylan Baker <baker.dylan.c at gmail.com>

On Tuesday, September 23, 2014 03:05:19 PM Mark Janes wrote:
> Piglit test results are difficult to analyze with simpler JUnit
> visualizers like those provided by Jenkins.  There are hundreds of
> failures, but the engineer is typically interested only in NEW
> failures.  Jenkins JUnit rules typically expect 100% pass rate, or
> some static threshold of failures.
> 
> Specifying test names in the [expected-failures] or [expected-crashes]
> sections of the config file enables JUnit reporting of just the test
> failures which represent new regressions.
> 
> Test names are expected in the dotted JUnit format (eg:
> "piglit.spec.ARB_fragment_program.fp-formats") and are case
> insensitive.
> ---
> 
> Thanks to Dylan Baker for review and feedback.  This patch
> incorporates his suggestions.
> 
>  framework/results.py | 46 ++++++++++++++++++++++++++++++++++++++++++++--
>  piglit.conf.example  | 12 ++++++++++++
>  2 files changed, 56 insertions(+), 2 deletions(-)
> 
> diff --git a/framework/results.py b/framework/results.py
> index b567553..fa2a9e5 100644
> --- a/framework/results.py
> +++ b/framework/results.py
> @@ -29,6 +29,7 @@ import abc
>  import threading
>  import posixpath
>  from cStringIO import StringIO
> +
>  try:
>      import simplejson as json
>  except ImportError:
> @@ -38,6 +39,7 @@ try:
>  except ImportError:
>      import xml.etree.cElementTree as etree
>  
> +from framework.core import PIGLIT_CONFIG
>  import framework.status as status
>  
>  __all__ = [
> @@ -385,6 +387,18 @@ class JUnitBackend(FSyncMixin, Backend):
>          self._file = open(os.path.join(dest, 'results.xml'), 'w')
>          FSyncMixin.__init__(self, **options)
>  
> +        # make dictionaries of all test names expected to crash/fail
> +        # for quick lookup when writing results.  Use lower-case to
> +        # provide case insensitive matches.
> +        self._expected_failures = {}
> +        if PIGLIT_CONFIG.has_section("expected-failures"):
> +            for (fail, _) in PIGLIT_CONFIG.items("expected-failures"):
> +                self._expected_failures[fail.lower()] = True
> +        self._expected_crashes = {}
> +        if PIGLIT_CONFIG.has_section("expected-crashes"):
> +            for (fail, _) in PIGLIT_CONFIG.items("expected-crashes"):
> +                self._expected_crashes[fail.lower()] = True
> +
>          # Write initial headers and other data that etree cannot write for us
>          self._file.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
>          self._file.write('<testsuites>\n')
> @@ -414,6 +428,21 @@ class JUnitBackend(FSyncMixin, Backend):
>          # set different root names.
>          classname = 'piglit.' + classname
>  
> +        expected_result = "pass"
> +
> +        # replace special characters and make case insensitive
> +        lname = (classname + "." + testname).lower()
> +        lname = lname.replace("=", ".")
> +        lname = lname.replace(":", ".")
> +
> +        if lname in self._expected_failures:
> +            expected_result = "failure"
> +            # a test can either fail or crash, but not both
> +            assert( lname not in self._expected_crashes )
> +
> +        if lname in self._expected_crashes:
> +            expected_result = "error"
> +
>          # Create the root element
>          element = etree.Element('testcase', name=testname + self._test_suffix,
>                                  classname=classname,
> @@ -432,10 +461,23 @@ class JUnitBackend(FSyncMixin, Backend):
>          # one of these statuses
>          if data['result'] == 'skip':
>              etree.SubElement(element, 'skipped')
> +
>          elif data['result'] in ['warn', 'fail', 'dmesg-warn', 'dmesg-fail']:
> -            etree.SubElement(element, 'failure')
> +            if expected_result == "failure":
> +                err.text += "\n\nWARN: passing test as an expected failure"
> +            else:
> +                etree.SubElement(element, 'failure')
> +
>          elif data['result'] == 'crash':
> -            etree.SubElement(element, 'error')
> +            if expected_result == "error":
> +                err.text += "\n\nWARN: passing test as an expected crash"
> +            else:
> +                etree.SubElement(element, 'error')
> +
> +        elif expected_result != "pass":
> +            err.text += "\n\nERROR: This test passed when it "\
> +                        "expected {0}".format(expected_result)
> +            etree.SubElement(element, 'failure')
>  
>          self._file.write(etree.tostring(element))
>          self._file.write('\n')
> diff --git a/piglit.conf.example b/piglit.conf.example
> index 9cb7dd1..a864c01 100644
> --- a/piglit.conf.example
> +++ b/piglit.conf.example
> @@ -71,3 +71,15 @@ run_test=./%(test_name)s
>  ; Options can be found running piglit run -h and reading the section for
>  ; -b/--backend
>  ;backend=json
> +
> +[expected-failures]
> +; Provide a list of test names that are expected to fail.  These tests
> +; will be listed as passing in JUnit output when they fail.  Any
> +; unexpected result (pass/crash) will be listed as a failure.  The
> +; test name must be written in the JUnit format ('.' instead of '/').
> +; Special characters for config file format ('=' and ':') must be
> +; replaced with '.'
> +
> +[expected-crashes]
> +; Like expected-failures, but specifies that a test is expected to
> +; crash.
> \ No newline at end of file
> -- 
> 2.1.0
> 
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20140923/4e7ed551/attachment.sig>


More information about the Piglit mailing list