[Piglit] [PATCH 1/2] framework: change 'regressions' to mean 'regressions in the last test run'

Ilia Mirkin imirkin at alum.mit.edu
Mon Oct 24 14:57:22 UTC 2016


So is the idea that now regressions shows regressions compared to an
initial "golden" run?

I don't like the idea of only changing regressions. These things were
previously pretty consistent...

fixes + regressions + new + disabled = changes

Now regressions is some weird other thing not part of that taxonomy.
I'd rather that invariant remain - if you change one, you change all.

On Mon, Oct 24, 2016 at 10:02 AM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> The idea is that 'regressions' can be useful when a summary is generated
> for a sequence of chronologically sorted runs of the same configuration.
> In that case, what's interesting is the state of the driver in the latest
> run. With this change, 'regressions' now shows those tests that fail (or
> crash etc.) in the latest run but have had a better result in at least one
> earlier run.
>
> In particular, this no longer shows tests that regressed in an earlier
> test but have been fixed again since then.
> ---
>  framework/summary/common.py | 29 +++++++++++++++++++++++------
>  1 file changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/framework/summary/common.py b/framework/summary/common.py
> index 8c7e2c7..d3a7b31 100644
> --- a/framework/summary/common.py
> +++ b/framework/summary/common.py
> @@ -23,20 +23,21 @@
>  """Shared functions for summary generation."""
>
>  from __future__ import (
>      absolute_import, division, print_function, unicode_literals
>  )
>  import re
>  import operator
>
>  import six
>  from six.moves import zip
> +from itertools import repeat
>
>  # a local variable status exists, prevent accidental overloading by renaming
>  # the module
>  import framework.status as so
>  from framework.core import lazy_property
>  from framework import grouptools
>
>
>  class Results(object):  # pylint: disable=too-few-public-methods
>      """Container object for results.
> @@ -69,28 +70,29 @@ class Names(object):
>      """Class containing names of tests for various statuses.
>
>      Members contain lists of sets of names that have a status.
>
>      Each status is lazily evaluated and cached.
>
>      """
>      def __init__(self, tests):
>          self.__results = tests.results
>
> -    def __diff(self, comparator, handler=None):
> +    def __diff(self, comparator, handler=None, lhs=None, rhs=None):
>          """Helper for simplifying comparators using find_diffs."""
>          ret = ['']
>          if handler is None:
> -            ret.extend(find_diffs(self.__results, self.all, comparator))
> +            ret.extend(find_diffs(self.__results, self.all, comparator,
> +                                  lhs=lhs, rhs=rhs))
>          else:
>              ret.extend(find_diffs(self.__results, self.all, comparator,
> -                                  handler=handler))
> +                                  handler=handler, lhs=lhs, rhs=rhs))
>          return ret
>
>      def __single(self, comparator):
>          """Helper for simplifying comparators using find_single."""
>          return find_single(self.__results, self.all, comparator)
>
>      @lazy_property
>      def all(self):
>          """A set of all tests in all runs."""
>          all_ = set()
> @@ -133,21 +135,22 @@ class Names(object):
>      @lazy_property
>      def skips(self):
>          # It is critical to use is not == here, otherwise so.NOTRUN will also
>          # be added to this list
>          return self.__single(lambda x: x is so.SKIP)
>
>      @lazy_property
>      def regressions(self):
>          # By ensureing tha min(x, y) is >= so.PASS we eleminate NOTRUN and SKIP
>          # from these pages
> -        return self.__diff(lambda x, y: x < y and min(x, y) >= so.PASS)
> +        return self.__diff(lambda x, y: x < y and min(x, y) >= so.PASS,
> +                           rhs=self.__results[-1])
>
>      @lazy_property
>      def fixes(self):
>          # By ensureing tha min(x, y) is >= so.PASS we eleminate NOTRUN and SKIP
>          # from these pages
>          return self.__diff(lambda x, y: x > y and min(x, y) >= so.PASS)
>
>      @lazy_property
>      def enabled(self):
>          def handler(names, name, prev, cur):
> @@ -285,41 +288,55 @@ def _result_in(name, result):
>      """If a result (or a subtest result) exists return True, else False."""
>      try:
>          # This is a little hacky, but I don't know of a better way where we
>          # ensure the value is truthy
>          _ = result.get_result(name)
>          return True
>      except KeyError:
>          return False
>
>
> -def find_diffs(results, tests, comparator, handler=lambda *a: None):
> +def find_diffs(results, tests, comparator, handler=lambda *a: None, lhs=None, rhs=None):
>      """Generate diffs between two or more sets of results.
>
>      Arguments:
>      results -- a list of results.TestrunResult instances
>      tests -- an iterable of test names. Must be iterable more than once
>      comparator -- a function with the signautre f(x, y), that returns True when
>                    the test should be added to the set of diffs
> +    lhs -- the left-hand-side result for calls to comparator.
> +           If not specified, results from the range results[:-1] will be used.
> +    rhs -- the right-hand-side result for calls to comparator.
> +           If not specified, results from the range results[1:] will be used.
> +           Note that at least one of lhs and rhs must be unspecified.
>
>      Keyword Arguemnts:
>      handler -- a function with the signature f(names, name, prev, cur). in the
>                 event of a KeyError while comparing the results with comparator,
>                 handler will be passed the (<the set of names>, <the current
>                 test name>, <the previous result>, <the current result>). This
>                 can be used to add name even when a KeyError is expected (ie,
>                 enabled tests).
>                 Default: pass
>
>      """
> +    assert (lhs is None) or (rhs is None)
>      diffs = [] # There can't be changes from nil -> 0
> -    for prev, cur in zip(results[:-1], results[1:]):
> +    if lhs is None:
> +        lhs = results[:-1]
> +    else:
> +        lhs = repeat(lhs)
> +    if rhs is None:
> +        rhs = results[1:]
> +    else:
> +        rhs = repeat(rhs)
> +    for prev, cur in zip(lhs, rhs):
>          names = set()
>          for name in tests:
>              try:
>                  if comparator(prev.get_result(name), cur.get_result(name)):
>                      names.add(name)
>              except KeyError:
>                  handler(names, name, prev, cur)
>          diffs.append(names)
>      return diffs
>
> --
> 2.7.4
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list