summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-10-28 17:43:26 +0000
committerZachary Turner <zturner@google.com>2015-10-28 17:43:26 +0000
commitc432c8f856e0bd84de980a9d9bb2d31b06fa95b1 (patch)
tree4efa528e074a6e2df782345e4cd97f5d85d038c4 /lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak
parenta8a3bd210086b50242903ed95048fe5e53897878 (diff)
downloadbcm5719-llvm-c432c8f856e0bd84de980a9d9bb2d31b06fa95b1.tar.gz
bcm5719-llvm-c432c8f856e0bd84de980a9d9bb2d31b06fa95b1.zip
Move lldb/test to lldb/packages/Python/lldbsuite/test.
This is the conclusion of an effort to get LLDB's Python code structured into a bona-fide Python package. This has a number of benefits, but most notably the ability to more easily share Python code between different but related pieces of LLDB's Python infrastructure (for example, `scripts` can now share code with `test`). llvm-svn: 251532
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak')
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/TestFdLeak.py75
-rw-r--r--lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/main.c28
3 files changed, 108 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/Makefile b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/Makefile
new file mode 100644
index 00000000000..0d70f259501
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/TestFdLeak.py b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/TestFdLeak.py
new file mode 100644
index 00000000000..0f1014a8182
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/TestFdLeak.py
@@ -0,0 +1,75 @@
+"""
+Test whether a process started by lldb has no extra file descriptors open.
+"""
+
+from __future__ import print_function
+
+import use_lldb_suite
+
+import os
+import lldb
+from lldbtest import *
+import lldbutil
+
+
+def python_leaky_fd_version(test):
+ import sys
+ # Python random module leaks file descriptors on some versions.
+ return sys.version_info >= (2, 7, 8) and sys.version_info < (2, 7, 10)
+
+
+class AvoidsFdLeakTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
+ @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+ @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
+ def test_fd_leak_basic (self):
+ self.do_test([])
+
+ @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
+ @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+ @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
+ def test_fd_leak_log (self):
+ self.do_test(["log enable -f '/dev/null' lldb commands"])
+
+ def do_test (self, commands):
+ self.build()
+ exe = os.path.join (os.getcwd(), "a.out")
+
+ for c in commands:
+ self.runCmd(c)
+
+ target = self.dbg.CreateTarget(exe)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ self.assertTrue(process.GetState() == lldb.eStateExited, "Process should have exited.")
+ self.assertTrue(process.GetExitStatus() == 0,
+ "Process returned non-zero status. Were incorrect file descriptors passed?")
+
+ @expectedFailure(python_leaky_fd_version, "bugs.freebsd.org/197376")
+ @expectedFlakeyLinux
+ @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+ @skipIfTargetAndroid() # Android have some other file descriptors open by the shell
+ def test_fd_leak_multitarget (self):
+ self.build()
+ exe = os.path.join (os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ breakpoint = target.BreakpointCreateBySourceRegex ('Set breakpoint here', lldb.SBFileSpec ("main.c", False))
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ process1 = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process1, PROCESS_IS_VALID)
+ self.assertTrue(process1.GetState() == lldb.eStateStopped, "Process should have been stopped.")
+
+ target2 = self.dbg.CreateTarget(exe)
+ process2 = target2.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process2, PROCESS_IS_VALID)
+
+ self.assertTrue(process2.GetState() == lldb.eStateExited, "Process should have exited.")
+ self.assertTrue(process2.GetExitStatus() == 0,
+ "Process returned non-zero status. Were incorrect file descriptors passed?")
diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/main.c b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/main.c
new file mode 100644
index 00000000000..5bdf227928e
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/functionalities/avoids-fd-leak/main.c
@@ -0,0 +1,28 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+
+int
+main (int argc, char const **argv)
+{
+ struct stat buf;
+ int i, rv = 0; // Set breakpoint here.
+
+ // Make sure stdin/stdout/stderr exist.
+ for (i = 0; i <= 2; ++i) {
+ if (fstat(i, &buf) != 0)
+ return 1;
+ }
+
+ // Make sure no other file descriptors are open.
+ for (i = 3; i <= 256; ++i) {
+ if (fstat(i, &buf) == 0 || errno != EBADF) {
+ fprintf(stderr, "File descriptor %d is open.\n", i);
+ rv = 2;
+ }
+ }
+
+ return rv;
+}
OpenPOWER on IntegriCloud