[Lldb-commits] [lldb] r254979 - Refactor ResultsFormatter creation into result_formatter.
Todd Fiala via lldb-commits
lldb-commits at lists.llvm.org
Mon Dec 7 21:21:07 PST 2015
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151207/c0df3509/attachment-0001.html>
More information about the lldb-commits
mailing list