Index: packages/Python/lldbsuite/test/dosep.py =================================================================== --- packages/Python/lldbsuite/test/dosep.py +++ packages/Python/lldbsuite/test/dosep.py @@ -109,13 +109,17 @@ global GET_WORKER_INDEX GET_WORKER_INDEX = get_worker_index_use_pid -def report_test_failure(name, command, output): +def report_test_failure(name, command, output, timeout): global output_lock with output_lock: if not (RESULTS_FORMATTER and RESULTS_FORMATTER.is_using_terminal()): print(file=sys.stderr) print(output, file=sys.stderr) - print("[%s FAILED]" % name, file=sys.stderr) + if timeout: + timeout_str = " (TIMEOUT)" + else: + timeout_str = "" + print("[%s FAILED]%s" % (name, timeout_str), file=sys.stderr) print("Command invoked: %s" % ' '.join(command), file=sys.stderr) update_progress(name) @@ -211,7 +215,7 @@ # only stderr does. report_test_pass(self.file_name, output[1]) else: - report_test_failure(self.file_name, command, output[1]) + report_test_failure(self.file_name, command, output[1], was_timeout) # Save off the results for the caller. self.results = ( Index: packages/Python/lldbsuite/test/dotest_channels.py =================================================================== --- packages/Python/lldbsuite/test/dotest_channels.py +++ packages/Python/lldbsuite/test/dotest_channels.py @@ -55,6 +55,14 @@ # unpickled results. raise Exception("forwarding function must be set") + # Initiate all connections by sending an ack. This allows + # the initiators of the socket to await this to ensure + # that this end is up and running (and therefore already + # into the async map). + ack_bytes = bytearray() + ack_bytes.append(chr(42)) + file_object.send(ack_bytes) + def deserialize_payload(self): """Unpickles the collected input buffer bytes and forwards.""" if len(self.ibuffer) > 0: Index: packages/Python/lldbsuite/test/issue_verification/TestRerunTimeout.py.park =================================================================== --- packages/Python/lldbsuite/test/issue_verification/TestRerunTimeout.py.park +++ packages/Python/lldbsuite/test/issue_verification/TestRerunTimeout.py.park @@ -3,19 +3,21 @@ import time -import lldbsuite.test.lldbtest as lldbtest +import lldbsuite.test.decorators as decorators import rerun_base class RerunTimeoutTestCase(rerun_base.RerunBaseTestCase): - @lldbtest.no_debug_info_test + @decorators.no_debug_info_test def test_timeout_rerun_succeeds(self): - """Tests that timeout logic kicks in and is picked up.""" + """Tests that the timeout logic kicks in and that this timeout is picked up.""" if not self.should_generate_issue(): # We pass this time. return + # We time out this time. while True: + # noinspection PyBroadException try: time.sleep(1) except: Index: packages/Python/lldbsuite/test/result_formatter.py =================================================================== --- packages/Python/lldbsuite/test/result_formatter.py +++ packages/Python/lldbsuite/test/result_formatter.py @@ -76,6 +76,18 @@ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("localhost", port)) + + # Wait for the ack from the listener side. + # This is needed to prevent a race condition + # in the main dosep.py processing loop: we + # can't allow a worker queue thread to die + # that has outstanding messages to a listener + # socket before the listener socket asyncore + # listener socket gets spun up; otherwise, + # we lose the test result info. + read_bytes = sock.recv(1) + # print("\n** socket creation: received ack: {}".format(ord(read_bytes[0])), file=sys.stderr) + return (sock, lambda: socket_closer(sock)) default_formatter_name = None