""" The LLVM Compiler Infrastructure This file is distributed under the University of Illinois Open Source License. See LICENSE.TXT for details. """ from __future__ import print_function from __future__ import absolute_import # System modules import os # Our modules from .results_formatter import ResultsFormatter from six.moves import cPickle class RawPickledFormatter(ResultsFormatter): """Formats events as a pickled stream. The parallel test runner has inferiors pickle their results and send them over a socket back to the parallel test. The parallel test runner then aggregates them into the final results formatter (e.g. xUnit). """ @classmethod def arg_parser(cls): """@return arg parser used to parse formatter-specific options.""" parser = super(RawPickledFormatter, cls).arg_parser() return parser class StreamSerializer(object): @staticmethod def serialize(test_event, out_file): # Send it as # {serialized_length_of_serialized_bytes}{serialized_bytes} import struct msg = cPickle.dumps(test_event) packet = struct.pack("!I%ds" % len(msg), len(msg), msg) out_file.send(packet) class BlockSerializer(object): @staticmethod def serialize(test_event, out_file): cPickle.dump(test_event, out_file) def __init__(self, out_file, options, file_is_stream): super( RawPickledFormatter, self).__init__( out_file, options, file_is_stream) self.pid = os.getpid() if file_is_stream: self.serializer = self.StreamSerializer() else: self.serializer = self.BlockSerializer() def handle_event(self, test_event): super(RawPickledFormatter, self).handle_event(test_event) # Convert initialize/terminate events into job_begin/job_end events. event_type = test_event["event"] if event_type is None: return if event_type == "initialize": test_event["event"] = "job_begin" elif event_type == "terminate": test_event["event"] = "job_end" # Tack on the pid. test_event["pid"] = self.pid # Serialize the test event. self.serializer.serialize(test_event, self.out_file)