[llvm] 5c24411 - [lit] Avoid re-iterating result codes in different places

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 17 13:25:16 PDT 2020


If you make breaking changes could you please also ensure that it
continues to work with all LLVM subprojects (in this case:
llvm-test-suite).

Since there is a PyPi package for lit (https://pypi.org/project/lit/),
breaking changes may have an effect to non-LLVM projects as well, but
I don't know much compatibility guarantees we make.

Michael



Am Mi., 17. Juni 2020 um 13:41 Uhr schrieb Julian Lettner via
llvm-commits <llvm-commits at lists.llvm.org>:
>
>
> Author: Julian Lettner
> Date: 2020-06-17T11:40:19-07:00
> New Revision: 5c244115c98acf61a5d5b867c590a34a6be6f5b9
>
> URL: https://github.com/llvm/llvm-project/commit/5c244115c98acf61a5d5b867c590a34a6be6f5b9
> DIFF: https://github.com/llvm/llvm-project/commit/5c244115c98acf61a5d5b867c590a34a6be6f5b9.diff
>
> LOG: [lit] Avoid re-iterating result codes in different places
>
> Let's have one canonical place to define ResultCode instances and their
> labels.
>
> Also make ResultCode's `__init__` function self-registering to better
> support custom ResultCodes.
>
> Added:
>
>
> Modified:
>     llvm/utils/lit/lit/Test.py
>     llvm/utils/lit/lit/main.py
>     llvm/utils/lit/tests/Inputs/custom-result-category/format.py
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/llvm/utils/lit/lit/Test.py b/llvm/utils/lit/lit/Test.py
> index 4c94e9806a16..a38ea4e7717a 100644
> --- a/llvm/utils/lit/lit/Test.py
> +++ b/llvm/utils/lit/lit/Test.py
> @@ -1,6 +1,5 @@
>  import itertools
>  import os
> -from xml.sax.saxutils import quoteattr
>  from json import JSONEncoder
>
>  from lit.BooleanExpression import BooleanExpression
> @@ -10,35 +9,50 @@
>  class ResultCode(object):
>      """Test result codes."""
>
> +    # All result codes (including user-defined ones) in declaration order
> +    _all_codes = []
> +
> +    @staticmethod
> +    def all_codes():
> +        return ResultCode._all_codes
> +
>      # We override __new__ and __getnewargs__ to ensure that pickling still
>      # provides unique ResultCode objects in any particular instance.
>      _instances = {}
> -    def __new__(cls, name, isFailure):
> +
> +    def __new__(cls, name, label, isFailure):
>          res = cls._instances.get(name)
>          if res is None:
>              cls._instances[name] = res = super(ResultCode, cls).__new__(cls)
>          return res
> +
>      def __getnewargs__(self):
> -        return (self.name, self.isFailure)
> +        return (self.name, self.label, self.isFailure)
>
> -    def __init__(self, name, isFailure):
> +    def __init__(self, name, label, isFailure):
>          self.name = name
> +        self.label = label
>          self.isFailure = isFailure
> +        ResultCode._all_codes.append(self)
>
>      def __repr__(self):
>          return '%s%r' % (self.__class__.__name__,
>                           (self.name, self.isFailure))
>
> -PASS        = ResultCode('PASS', False)
> -FLAKYPASS   = ResultCode('FLAKYPASS', False)
> -XFAIL       = ResultCode('XFAIL', False)
> -FAIL        = ResultCode('FAIL', True)
> -XPASS       = ResultCode('XPASS', True)
> -UNRESOLVED  = ResultCode('UNRESOLVED', True)
> -UNSUPPORTED = ResultCode('UNSUPPORTED', False)
> -TIMEOUT     = ResultCode('TIMEOUT', True)
> -SKIPPED     = ResultCode('SKIPPED', False)
> -EXCLUDED    = ResultCode('EXCLUDED', False)
> +
> +# Successes
> +EXCLUDED    = ResultCode('EXCLUDED',    'Excluded', False)
> +SKIPPED     = ResultCode('SKIPPED',     'Skipped', False)
> +UNSUPPORTED = ResultCode('UNSUPPORTED', 'Unsupported', False)
> +PASS        = ResultCode('PASS',        'Passed', False)
> +FLAKYPASS   = ResultCode('FLAKYPASS',   'Passed With Retry', False)
> +XFAIL       = ResultCode('XFAIL',       'Expectedly Failed', False)
> +# Failures
> +UNRESOLVED  = ResultCode('UNRESOLVED',  'Unresolved', True)
> +TIMEOUT     = ResultCode('TIMEOUT',     'Timed Out', True)
> +FAIL        = ResultCode('FAIL',        'Failed', True)
> +XPASS       = ResultCode('XPASS',       'Unexpectedly Passed', True)
> +
>
>  # Test metric values.
>
>
> diff  --git a/llvm/utils/lit/lit/main.py b/llvm/utils/lit/lit/main.py
> index e1a6f2260965..860c584fbdf4 100755
> --- a/llvm/utils/lit/lit/main.py
> +++ b/llvm/utils/lit/lit/main.py
> @@ -259,46 +259,24 @@ def print_histogram(tests):
>          lit.util.printHistogram(test_times, title='Tests')
>
>
> -def add_result_category(result_code, label):
> -    assert isinstance(result_code, lit.Test.ResultCode)
> -    category = (result_code, label)
> -    result_codes.append(category)
> -
> -
> -result_codes = [
> -    # Passes
> -    (lit.Test.EXCLUDED,    'Excluded'),
> -    (lit.Test.SKIPPED,     'Skipped'),
> -    (lit.Test.UNSUPPORTED, 'Unsupported'),
> -    (lit.Test.PASS,        'Passed'),
> -    (lit.Test.FLAKYPASS,   'Passed With Retry'),
> -    (lit.Test.XFAIL,       'Expectedly Failed'),
> -    # Failures
> -    (lit.Test.UNRESOLVED,  'Unresolved'),
> -    (lit.Test.TIMEOUT,     'Timed Out'),
> -    (lit.Test.FAIL,        'Failed'),
> -    (lit.Test.XPASS,       'Unexpectedly Passed')
> -]
> -
> -
>  def print_results(tests, elapsed, opts):
> -    tests_by_code = {code: [] for code, _ in result_codes}
> +    tests_by_code = {code: [] for code in lit.Test.ResultCode.all_codes()}
>      for test in tests:
>          tests_by_code[test.result.code].append(test)
>
> -    for (code, label) in result_codes:
> -        print_group(code, label, tests_by_code[code], opts.show_results)
> +    for code in lit.Test.ResultCode.all_codes():
> +        print_group(tests_by_code[code], code, opts.show_results)
>
>      print_summary(tests_by_code, opts.quiet, elapsed)
>
>
> -def print_group(code, label, tests, show_results):
> +def print_group(tests, code, show_results):
>      if not tests:
>          return
>      if not code.isFailure and code not in show_results:
>          return
>      print('*' * 20)
> -    print('%s Tests (%d):' % (label, len(tests)))
> +    print('{} Tests ({}):'.format(code.label, len(tests)))
>      for test in tests:
>          print('  %s' % test.getFullName())
>      sys.stdout.write('\n')
> @@ -308,8 +286,9 @@ def print_summary(tests_by_code, quiet, elapsed):
>      if not quiet:
>          print('\nTesting Time: %.2fs' % elapsed)
>
> -    codes = [c for c in result_codes if not quiet or c.isFailure]
> -    groups = [(label, len(tests_by_code[code])) for code, label in codes]
> +    codes = [c for c in lit.Test.ResultCode.all_codes()
> +             if not quiet or c.isFailure]
> +    groups = [(c.label, len(tests_by_code[c])) for c in codes]
>      groups = [(label, count) for label, count in groups if count]
>      if not groups:
>          return
>
> diff  --git a/llvm/utils/lit/tests/Inputs/custom-result-category/format.py b/llvm/utils/lit/tests/Inputs/custom-result-category/format.py
> index b0c97ec71bb9..0ef1bf24f833 100644
> --- a/llvm/utils/lit/tests/Inputs/custom-result-category/format.py
> +++ b/llvm/utils/lit/tests/Inputs/custom-result-category/format.py
> @@ -1,11 +1,8 @@
>  import lit
>  import lit.formats
>
> -CUSTOM_PASS = lit.Test.ResultCode('CUSTOM_PASS', False)
> -CUSTOM_FAILURE = lit.Test.ResultCode('CUSTOM_FAILURE', True)
> -
> -lit.main.add_result_category(CUSTOM_PASS, "My Passed")
> -lit.main.add_result_category(CUSTOM_FAILURE, "My Failed")
> +CUSTOM_PASS = lit.Test.ResultCode('CUSTOM_PASS', 'My Passed', False)
> +CUSTOM_FAILURE = lit.Test.ResultCode('CUSTOM_FAILURE', 'My Failed', True)
>
>
>  class MyFormat(lit.formats.ShTest):
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list