I'll hold off a bit on major changes for now. I'm going to start working on non-controversial command line options tomorrow, but no more major code moves. I worked on this today since I wanted to get final agreement on the command line options first.
On Mon, Dec 7, 2015 at 9:21 PM Todd Fiala <todd.fi...@gmail.com> wrote: > (We're highly intersecting right now - I've got some other goo that I > figured I'd hold off on since I'm sure we're hitting the same files). > > On Mon, Dec 7, 2015 at 9:21 PM, Todd Fiala <todd.fi...@gmail.com> wrote: > >> Yep sure thing. >> >> On Mon, Dec 7, 2015 at 5:00 PM, Zachary Turner <ztur...@google.com> >> wrote: >> >>> 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@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@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >>>> >>> >> >> >> -- >> -Todd >> > > > > -- > -Todd >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits