[Lldb-commits] [lldb] r254979 - Refactor ResultsFormatter creation into result_formatter.
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Mon Dec 7 17:00:35 PST 2015
I'm going to have to merge this into my patch. Can you hold off on any
other patches until I get in?
On Mon, Dec 7, 2015 at 4:56 PM Todd Fiala via lldb-commits <
lldb-commits at lists.llvm.org> wrote:
> Author: tfiala
> Date: Mon Dec 7 18:53:56 2015
> New Revision: 254979
>
> URL: http://llvm.org/viewvc/llvm-project?rev=254979&view=rev
> Log:
> Refactor ResultsFormatter creation into result_formatter.
>
> This cleans up dotest.py and is a pre-step for getting
> the test inferior runner to send post-inferior run events
> to the events collector, as this code needs to be accessed
> from within dosep.py.
>
> Modified:
> lldb/trunk/packages/Python/lldbsuite/test/dotest.py
> lldb/trunk/packages/Python/lldbsuite/test/result_formatter.py
>
> Modified: lldb/trunk/packages/Python/lldbsuite/test/dotest.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/dotest.py?rev=254979&r1=254978&r2=254979&view=diff
>
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/dotest.py (original)
> +++ lldb/trunk/packages/Python/lldbsuite/test/dotest.py Mon Dec 7
> 18:53:56 2015
> @@ -239,7 +239,6 @@ test_runner_name = None
> # Test results handling globals
> results_filename = None
> results_port = None
> -results_file_object = None
> results_formatter_name = None
> results_formatter_object = None
> results_formatter_options = None
> @@ -910,73 +909,24 @@ def createSocketToLocalPort(port):
> def setupTestResults():
> """Sets up test results-related objects based on arg settings."""
> global results_filename
> - global results_file_object
> global results_formatter_name
> global results_formatter_object
> global results_formatter_options
> global results_port
>
> - default_formatter_name = None
> - cleanup_func = None
> + # Setup the results formatter configuration.
> + config = result_formatter.FormatterConfig()
> + config.filename = results_filename
> + config.formatter_name = results_formatter_name
> + config.formatter_options = results_formatter_options
> + config.port = results_port
> +
> + # Create the results formatter.
> + formatter_spec = result_formatter.create_results_formatter(config)
> + if formatter_spec is not None and formatter_spec.formatter is not
> None:
> + results_formatter_object = formatter_spec.formatter
>
> - if results_filename:
> - # Open the results file for writing.
> - if results_filename == 'stdout':
> - results_file_object = sys.stdout
> - cleanup_func = None
> - elif results_filename == 'stderr':
> - results_file_object = sys.stderr
> - cleanup_func = None
> - else:
> - results_file_object = open(results_filename, "w")
> - cleanup_func = results_file_object.close
> - default_formatter_name =
> "lldbsuite.test.result_formatter.XunitFormatter"
> - elif results_port:
> - # Connect to the specified localhost port.
> - results_file_object, cleanup_func = createSocketToLocalPort(
> - results_port)
> - default_formatter_name = (
> - "lldbsuite.test.result_formatter.RawPickledFormatter")
> -
> - # If we have a results formatter name specified and we didn't specify
> - # a results file, we should use stdout.
> - if results_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 results_formatter_name:
> - formatter_name = results_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.
> - clazz = getattr(module, components[-1])
> -
> - # Handle formatter options for the results formatter class.
> - formatter_arg_parser = clazz.arg_parser()
> - if results_formatter_options and len(results_formatter_options) >
> 0:
> - command_line_options = results_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 = clazz(
> - results_file_object, formatter_options)
> -
> - # Start the results formatter session - we'll only have one
> - # during a given dotest process invocation.
> + # Send an intialize message to the formatter.
> initialize_event = EventBuilder.bare_event("initialize")
> if isMultiprocessTestRunner():
> if test_runner_name is not None and test_runner_name ==
> "serial":
> @@ -989,19 +939,11 @@ def setupTestResults():
> worker_count = 1
> initialize_event["worker_count"] = worker_count
>
> - results_formatter_object.handle_event(initialize_event)
> -
> - def shutdown_formatter():
> - # 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()
> + formatter_spec.formatter.handle_event(initialize_event)
>
> - atexit.register(shutdown_formatter)
> + # Make sure we clean up the formatter on shutdown.
> + if formatter_spec.cleanup_func is not None:
> + atexit.register(formatter_spec.cleanup_func)
>
>
> def getOutputPaths(lldbRootDirectory):
>
> Modified: lldb/trunk/packages/Python/lldbsuite/test/result_formatter.py
> URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/result_formatter.py?rev=254979&r1=254978&r2=254979&view=diff
>
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/result_formatter.py
> (original)
> +++ lldb/trunk/packages/Python/lldbsuite/test/result_formatter.py Mon Dec
> 7 18:53:56 2015
> @@ -13,10 +13,12 @@ from __future__ import absolute_import
>
> # System modules
> import argparse
> +import importlib
> import inspect
> import os
> import pprint
> import re
> +import socket
> import sys
> import threading
> import time
> @@ -30,6 +32,122 @@ from six.moves import cPickle
> # LLDB modules
>
>
> +class FormatterConfig(object):
> + def __init__(self):
> + self.filename = None
> + self.port = None
> + self.formatter_name = None
> + self.formatter_options = None
> +
> +
> +class CreatedFormatter(object):
> + 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.
> + """
> + def create_socket(port):
> + """Creates a socket to the localhost on the given port.
> +
> + @param port the port number of the listenering port on
> + the localhost.
> +
> + @return (socket object, socket closing function)
> + """
> + def socket_closer(open_sock):
> + """Close down an opened socket properly."""
> + open_sock.shutdown(socket.SHUT_RDWR)
> + open_sock.close()
> +
> + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> + sock.connect(("localhost", port))
> + return (sock, lambda: socket_closer(sock))
> +
> + 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.result_formatter.XunitFormatter")
> + elif config.port:
> + # Connect to the specified localhost port.
> + results_file_object, cleanup_func = create_socket(config.port)
> + default_formatter_name = (
> + "lldbsuite.test.result_formatter.RawPickledFormatter")
> +
> + # 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
> +
> +
> class EventBuilder(object):
> """Helper class to build test result event dictionaries."""
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151208/fd1fcca5/attachment-0001.html>
More information about the lldb-commits
mailing list