Author: Pavel Labath Date: 2020-07-20T14:56:49+02:00 New Revision: 9199457bfb5a77121a950df5417fadbf8174cdde
URL: https://github.com/llvm/llvm-project/commit/9199457bfb5a77121a950df5417fadbf8174cdde DIFF: https://github.com/llvm/llvm-project/commit/9199457bfb5a77121a950df5417fadbf8174cdde.diff LOG: [LLDB/test] Simplify result formatter code Now that the main test results are reported through lit, and we only have one formatter class, this code is unnecessarily baroque. Added: Modified: lldb/packages/Python/lldbsuite/test/dotest.py lldb/packages/Python/lldbsuite/test_event/formatter/__init__.py lldb/packages/Python/lldbsuite/test_event/formatter/results_formatter.py Removed: ################################################################################ diff --git a/lldb/packages/Python/lldbsuite/test/dotest.py b/lldb/packages/Python/lldbsuite/test/dotest.py index 67f227cad715..3989ce1bc4d5 100644 --- a/lldb/packages/Python/lldbsuite/test/dotest.py +++ b/lldb/packages/Python/lldbsuite/test/dotest.py @@ -47,6 +47,7 @@ from lldbsuite.test_event import formatter from . import test_result from lldbsuite.test_event.event_builder import EventBuilder +from lldbsuite.test_event.formatter.results_formatter import ResultsFormatter from ..support import seven @@ -453,27 +454,6 @@ def parseOptionsAndInitTestdirs(): lldbtest_config.codesign_identity = args.codesign_identity - -def setupTestResults(): - """Sets up test results-related objects based on arg settings.""" - - # Create the results formatter. - formatter_spec = formatter.create_results_formatter( - "lldbsuite.test_event.formatter.results_formatter.ResultsFormatter") - if formatter_spec is not None and formatter_spec.formatter is not None: - configuration.results_formatter_object = formatter_spec.formatter - - # Send an initialize message to the formatter. - initialize_event = EventBuilder.bare_event("initialize") - initialize_event["worker_count"] = 1 - - formatter_spec.formatter.handle_event(initialize_event) - - # Make sure we clean up the formatter on shutdown. - if formatter_spec.cleanup_func is not None: - atexit.register(formatter_spec.cleanup_func) - - def setupSysPath(): """ Add LLDB.framework/Resources/Python to the search paths for modules. @@ -933,8 +913,7 @@ def run_suite(): # parseOptionsAndInitTestdirs() - # Setup test results (test results formatter and output handling). - setupTestResults() + configuration.results_formatter_object = ResultsFormatter(sys.stdout) setupSysPath() diff --git a/lldb/packages/Python/lldbsuite/test_event/formatter/__init__.py b/lldb/packages/Python/lldbsuite/test_event/formatter/__init__.py index d6609d353c85..a1feb389321d 100644 --- a/lldb/packages/Python/lldbsuite/test_event/formatter/__init__.py +++ b/lldb/packages/Python/lldbsuite/test_event/formatter/__init__.py @@ -4,63 +4,3 @@ SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception """ -from __future__ import print_function -from __future__ import absolute_import - -# System modules -import importlib -import socket -import sys - -# Third-party modules - -# LLDB modules - - -# Ignore method count on DTOs. -# pylint: disable=too-few-public-methods -class CreatedFormatter(object): - """Provides transfer object for returns from create_results_formatter().""" - - def __init__(self, formatter, cleanup_func): - self.formatter = formatter - self.cleanup_func = cleanup_func - - -def create_results_formatter(formatter_name): - """Sets up a test results formatter. - - @param config an instance of FormatterConfig - that indicates how to setup the ResultsFormatter. - - @return an instance of CreatedFormatter. - """ - - # Create an instance of the class. - # First figure out the package/module. - components = formatter_name.split(".") - module = importlib.import_module(".".join(components[:-1])) - - # Create the class name we need to load. - cls = getattr(module, components[-1]) - - # Handle formatter options for the results formatter class. - formatter_arg_parser = cls.arg_parser() - command_line_options = [] - - formatter_options = formatter_arg_parser.parse_args( - command_line_options) - - # Create the TestResultsFormatter given the processed options. - results_formatter_object = cls(sys.stdout, formatter_options) - - def shutdown_formatter(): - """Shuts down the formatter when it is no longer needed.""" - # Tell the formatter to write out anything it may have - # been saving until the very end (e.g. xUnit results - # can't complete its output until this point). - results_formatter_object.send_terminate_as_needed() - - return CreatedFormatter( - results_formatter_object, - shutdown_formatter) diff --git a/lldb/packages/Python/lldbsuite/test_event/formatter/results_formatter.py b/lldb/packages/Python/lldbsuite/test_event/formatter/results_formatter.py index 140a31928740..5032df6451c2 100644 --- a/lldb/packages/Python/lldbsuite/test_event/formatter/results_formatter.py +++ b/lldb/packages/Python/lldbsuite/test_event/formatter/results_formatter.py @@ -44,18 +44,10 @@ class ResultsFormatter(object): ResultFormatter lifetime looks like the following: # The result formatter is created. - # The argparse options dictionary is generated from calling - # the SomeResultFormatter.arg_parser() with the options data - # passed to dotest.py via the "--results-formatter-options" - # argument. See the help on that for syntactic requirements - # on getting that parsed correctly. - formatter = SomeResultFormatter(file_like_object, argparse_options_dict) # Single call to session start, before parsing any events. formatter.begin_session() - formatter.handle_event({"event":"initialize",...}) - # Zero or more calls specified for events recorded during the test session. # The parallel test runner manages getting results from all the inferior # dotest processes, so from a new format perspective, don't worry about @@ -76,10 +68,6 @@ class ResultsFormatter(object): The lldb test framework passes these test events in real time, so they arrive as they come in. - In the case of the parallel test runner, the dotest inferiors - add a 'pid' field to the dictionary that indicates which inferior - pid generated the event. - Note more events may be added in the future to support richer test reporting functionality. One example: creating a true flaky test result category so that unexpected successes really mean the test @@ -100,29 +88,13 @@ class ResultsFormatter(object): expectations about when the call should be chained. """ - @classmethod - def arg_parser(cls): - """@return arg parser used to parse formatter-specific options.""" - parser = argparse.ArgumentParser( - description='{} options'.format(cls.__name__), - usage=('dotest.py --results-formatter-options=' - '"--option1 value1 [--option2 value2 [...]]"')) - parser.add_argument( - "--dump-results", - action="store_true", - help=('dump the raw results data after printing ' - 'the summary output.')) - return parser - - def __init__(self, out_file, options): + def __init__(self, out_file): super(ResultsFormatter, self).__init__() self.out_file = out_file - self.options = options self.using_terminal = False if not self.out_file: raise Exception("ResultsFormatter created with no file object") self.start_time_by_test = {} - self.terminate_called = False # Track the most recent test start event by worker index. # We'll use this to assign TIMEOUT and exceptional @@ -341,9 +313,7 @@ def handle_event(self, test_event): self._maybe_remap_expected_failure(test_event) event_type = test_event.get("event", "") - if event_type == "terminate": - self.terminate_called = True - elif event_type in EventBuilder.RESULT_TYPES: + if event_type in EventBuilder.RESULT_TYPES: # Clear the most recently started test for the related # worker. worker_index = test_event.get("worker_index", None) @@ -440,12 +410,6 @@ def is_using_terminal(self): output should be avoided.""" return self.using_terminal - def send_terminate_as_needed(self): - """sends the terminate event if it hasn't been received yet.""" - if not self.terminate_called: - terminate_event = EventBuilder.bare_event("terminate") - self.handle_event(terminate_event) - # Derived classes may require self access # pylint: disable=no-self-use # noinspection PyMethodMayBeStatic,PyMethodMayBeStatic @@ -707,15 +671,6 @@ def print_results(self, out_file): self._print_summary_counts( out_file, categories, result_events_by_status, extra_results) - if self.options.dump_results: - # Debug dump of the key/result info for all categories. - self._print_banner(out_file, "Results Dump") - for status, events_by_key in result_events_by_status.items(): - out_file.write("\nSTATUS: {}\n".format(status)) - for key, event in events_by_key: - out_file.write("key: {}\n".format(key)) - out_file.write("event: {}\n".format(event)) - def clear_file_level_issues(self, tests_for_rerun, out_file): """Clear file-charged issues in any of the test rerun files. _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits