]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/TestFdLeak.py
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / packages / Python / lldbsuite / test / functionalities / avoids-fd-leak / TestFdLeak.py
1 """
2 Test whether a process started by lldb has no extra file descriptors open.
3 """
4
5 from __future__ import print_function
6
7
8 import os
9 import lldb
10 from lldbsuite.test import lldbutil
11 from lldbsuite.test.lldbtest import *
12 from lldbsuite.test.decorators import *
13
14
15 def python_leaky_fd_version(test):
16     import sys
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"
20     return None
21
22
23 class AvoidsFdLeakTestCase(TestBase):
24
25     NO_DEBUG_INFO_TESTCASE = True
26
27     mydir = TestBase.compute_mydir(__file__)
28
29     @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
30     @expectedFailureAll(
31         oslist=['freebsd'],
32         bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
33     # The check for descriptor leakage needs to be implemented differently
34     # here.
35     @skipIfWindows
36     @skipIfTargetAndroid()  # Android have some other file descriptors open by the shell
37     def test_fd_leak_basic(self):
38         self.do_test([])
39
40     @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
41     @expectedFailureAll(
42         oslist=['freebsd'],
43         bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
44     # The check for descriptor leakage needs to be implemented differently
45     # here.
46     @skipIfWindows
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"])
50
51     def do_test(self, commands):
52         self.build()
53         exe = os.path.join(os.getcwd(), "a.out")
54
55         for c in commands:
56             self.runCmd(c)
57
58         target = self.dbg.CreateTarget(exe)
59
60         process = target.LaunchSimple(
61             None, None, self.get_process_working_directory())
62         self.assertTrue(process, PROCESS_IS_VALID)
63
64         self.assertTrue(
65             process.GetState() == lldb.eStateExited,
66             "Process should have exited.")
67         self.assertTrue(
68             process.GetExitStatus() == 0,
69             "Process returned non-zero status. Were incorrect file descriptors passed?")
70
71     @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
72     @expectedFailureAll(
73         oslist=['freebsd'],
74         bugnumber="llvm.org/pr25624 still failing with Python 2.7.10")
75     # The check for descriptor leakage needs to be implemented differently
76     # here.
77     @skipIfWindows
78     @skipIfTargetAndroid()  # Android have some other file descriptors open by the shell
79     def test_fd_leak_multitarget(self):
80         self.build()
81         exe = os.path.join(os.getcwd(), "a.out")
82
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)
87
88         process1 = target.LaunchSimple(
89             None, None, self.get_process_working_directory())
90         self.assertTrue(process1, PROCESS_IS_VALID)
91         self.assertTrue(
92             process1.GetState() == lldb.eStateStopped,
93             "Process should have been stopped.")
94
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)
99
100         self.assertTrue(
101             process2.GetState() == lldb.eStateExited,
102             "Process should have exited.")
103         self.assertTrue(
104             process2.GetExitStatus() == 0,
105             "Process returned non-zero status. Were incorrect file descriptors passed?")