import os import sys import subprocess from threading import Timer hostname = 'localhost' (r, w) = os.pipe() kwargs = {} if sys.version_info >= (3,2): kwargs['pass_fds'] = [w] args = sys.argv # Get debugserver, lldb-mi and FileCheck executables' paths with arguments. debugserver = ' '.join([args[1], '--pipe', str(w), hostname + ':0']) lldbmi = args[2] test_file = args[3] filecheck = 'FileCheck ' + test_file # Run debugserver, lldb-mi and FileCheck. debugserver_proc = subprocess.Popen(debugserver.split(), **kwargs) lldbmi_proc = subprocess.Popen(lldbmi, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) filecheck_proc = subprocess.Popen(filecheck, stdin=subprocess.PIPE, shell=True) timeout_sec = 30 timer = Timer(timeout_sec, exit, [filecheck_proc.returncode]) try: timer.start() # Get a tcp port chosen by debugserver. # The number quite big to get lldb-server's output and to not hang. bytes_to_read = 10 port_bytes = os.read(r, bytes_to_read) port = str(port_bytes.decode('utf-8').strip('\x00')) with open(test_file, 'r') as f: # Replace '$PORT' with a free port number and pass # test's content to lldb-mi. lldbmi_proc.stdin.write(f.read().replace('$PORT', port).encode('utf-8')) out, err = lldbmi_proc.communicate() filecheck_proc.stdin.write(out) filecheck_proc.communicate() finally: timer.cancel() debugserver_proc.kill() exit(filecheck_proc.returncode)