[Lldb-commits] [lldb] r254979 - Refactor ResultsFormatter creation into result_formatter.

Todd Fiala via lldb-commits lldb-commits at lists.llvm.org
Mon Dec 7 16:53:56 PST 2015


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."""
 




More information about the lldb-commits mailing list