""" Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. See https://llvm.org/LICENSE.txt for license information. 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 FormatterConfig(object): """Provides formatter configuration info to create_results_formatter().""" def __init__(self): self.filename = None self.formatter_name = None self.formatter_options = None # 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(config): """Sets up a test results formatter. @param config an instance of FormatterConfig that indicates how to setup the ResultsFormatter. @return an instance of CreatedFormatter. """ default_formatter_name = None results_file_object = None cleanup_func = None if config.filename: # Open the results file for writing. if config.filename == 'stdout': results_file_object = sys.stdout cleanup_func = None elif config.filename == 'stderr': results_file_object = sys.stderr cleanup_func = None else: results_file_object = open(config.filename, "w") cleanup_func = results_file_object.close default_formatter_name = ( "lldbsuite.test_event.formatter.xunit.XunitFormatter") # If we have a results formatter name specified and we didn't specify # a results file, we should use stdout. if config.formatter_name is not None and results_file_object is None: # Use stdout. results_file_object = sys.stdout cleanup_func = None if results_file_object: # We care about the formatter. Choose user-specified or, if # none specified, use the default for the output type. if config.formatter_name: formatter_name = config.formatter_name else: formatter_name = default_formatter_name # 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() if config.formatter_options and len(config.formatter_options) > 0: command_line_options = config.formatter_options else: command_line_options = [] formatter_options = formatter_arg_parser.parse_args( command_line_options) # Create the TestResultsFormatter given the processed options. results_formatter_object = cls( results_file_object, 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() # And now close out the output file-like object. if cleanup_func is not None: cleanup_func() return CreatedFormatter( results_formatter_object, shutdown_formatter) else: return None