Fix misuse of python subprocess module (caused "leaking" processes and garbling the terminal)
- fixed cleanup of Popen objects by pushing spawn logic into test Base and out of test cases
- connect subprocess stdin to PIPE (rather than the parent's STDIN) to fix silent terminal issue
Tested on Linux and Mac OS X
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@175301 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/lldbtest.py b/test/lldbtest.py
index fbfb269..af71627 100644
--- a/test/lldbtest.py
+++ b/test/lldbtest.py
@@ -614,6 +614,9 @@
self.dicts = []
self.doTearDownCleanups = False
+ # List of spawned subproces.Popen objects
+ self.subprocesses = []
+
# Create a string buffer to record the session info, to be dumped into a
# test case specific file if test failure is encountered.
self.session = StringIO.StringIO()
@@ -667,6 +670,31 @@
child.sendline(hook)
child.expect_exact(child_prompt)
+ def cleanupSubprocesses(self):
+ # Ensure any subprocesses are cleaned up
+ for p in self.subprocesses:
+ if p.poll() == None:
+ p.terminate()
+ del p
+ del self.subprocesses[:]
+
+ def spawnSubprocess(self, executable, args=[]):
+ """ Creates a subprocess.Popen object with the specified executable and arguments,
+ saves it in self.subprocesses, and returns the object.
+ NOTE: if using this function, ensure you also call:
+
+ self.addTearDownHook(self.cleanupSubprocesses)
+
+ otherwise the test suite will leak processes.
+ """
+
+ # Don't display the stdout if not in TraceOn() mode.
+ proc = Popen([executable] + args,
+ stdout = open(os.devnull) if not self.TraceOn() else None,
+ stdin = PIPE)
+ self.subprocesses.append(proc)
+ return proc
+
def HideStdout(self):
"""Hide output to stdout from the user.