81 lines
2.3 KiB
Python
81 lines
2.3 KiB
Python
"""
|
|
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)
|