2 Test whether a process started by lldb has no extra file descriptors open.
5 from __future__ import print_function
10 from lldbsuite.test import lldbutil
11 from lldbsuite.test.lldbtest import *
12 from lldbsuite.test.decorators import *
15 def python_leaky_fd_version(test):
17 # Python random module leaks file descriptors on some versions.
18 if sys.version_info >= (2, 7, 8) and sys.version_info < (2, 7, 10):
19 return "Python random module leaks file descriptors in this python version"
23 class AvoidsFdLeakTestCase(TestBase):
25 NO_DEBUG_INFO_TESTCASE = True
27 mydir = TestBase.compute_mydir(__file__)
29 @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
32 bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
33 # The check for descriptor leakage needs to be implemented differently
36 @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
37 def test_fd_leak_basic(self):
40 @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
43 bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
44 # The check for descriptor leakage needs to be implemented differently
47 @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
48 def test_fd_leak_log(self):
49 self.do_test(["log enable -f '/dev/null' lldb commands"])
51 def do_test(self, commands):
53 exe = os.path.join(os.getcwd(), "a.out")
58 target = self.dbg.CreateTarget(exe)
60 process = target.LaunchSimple(
61 None, None, self.get_process_working_directory())
62 self.assertTrue(process, PROCESS_IS_VALID)
65 process.GetState() == lldb.eStateExited,
66 "Process should have exited.")
68 process.GetExitStatus() == 0,
69 "Process returned non-zero status. Were incorrect file descriptors passed?")
71 @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
74 bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
75 # The check for descriptor leakage needs to be implemented differently
78 @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
79 def test_fd_leak_multitarget(self):
81 exe = os.path.join(os.getcwd(), "a.out")
83 target = self.dbg.CreateTarget(exe)
84 breakpoint = target.BreakpointCreateBySourceRegex(
85 'Set breakpoint here', lldb.SBFileSpec("main.c", False))
86 self.assertTrue(breakpoint, VALID_BREAKPOINT)
88 process1 = target.LaunchSimple(
89 None, None, self.get_process_working_directory())
90 self.assertTrue(process1, PROCESS_IS_VALID)
92 process1.GetState() == lldb.eStateStopped,
93 "Process should have been stopped.")
95 target2 = self.dbg.CreateTarget(exe)
96 process2 = target2.LaunchSimple(
97 None, None, self.get_process_working_directory())
98 self.assertTrue(process2, PROCESS_IS_VALID)
101 process2.GetState() == lldb.eStateExited,
102 "Process should have exited.")
104 process2.GetExitStatus() == 0,
105 "Process returned non-zero status. Were incorrect file descriptors passed?")