[Lldb-commits] [lldb] r254979 - Refactor ResultsFormatter creation into result_formatter.
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Mon Dec 7 21:37:17 PST 2015
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.fiala at 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.fiala at gmail.com> wrote:
>
>> Yep sure thing.
>>
>> On Mon, Dec 7, 2015 at 5:00 PM, Zachary Turner <zturner at 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 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
>>>>
>>>
>>
>>
>> --
>> -Todd
>>
>
>
>
> --
> -Todd
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151208/e4a58eb3/attachment-0001.html>
More information about the lldb-commits
mailing list