summaryrefslogtreecommitdiff
path: root/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py')
-rw-r--r--lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py b/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
new file mode 100644
index 000000000000..30fe3ecb1e4b
--- /dev/null
+++ b/lldb/test/API/lang/cpp/std-function-recognizer/TestStdFunctionRecognizer.py
@@ -0,0 +1,84 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class LibCxxStdFunctionRecognizerTestCase(TestBase):
+ NO_DEBUG_INFO_TESTCASE = True
+
+ @add_test_categories(["libc++"])
+ def test_backtrace(self):
+ """Test that std::function implementation details are hidden in bt"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ # Filtered.
+ self.expect(
+ "thread backtrace",
+ ordered=True,
+ substrs=["frame", "foo", "frame", "main"],
+ )
+ self.expect(
+ "thread backtrace", matching=False, patterns=["frame.*std::__1::__function"]
+ )
+ # Unfiltered.
+ self.expect(
+ "thread backtrace -u",
+ ordered=True,
+ patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
+ )
+ self.expect(
+ "thread backtrace --unfiltered",
+ ordered=True,
+ patterns=["frame.*foo", "frame.*std::__1::__function", "frame.*main"],
+ )
+
+ @add_test_categories(["libc++"])
+ def test_up_down(self):
+ """Test that std::function implementation details are skipped"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ frame = thread.GetSelectedFrame()
+ # up
+ self.assertIn("foo", frame.GetFunctionName())
+ start_idx = frame.GetFrameID()
+ i = 0
+ while i < thread.GetNumFrames():
+ self.expect("up")
+ frame = thread.GetSelectedFrame()
+ if frame.GetFunctionName() == "main":
+ break
+ end_idx = frame.GetFrameID()
+ self.assertLess(i, end_idx - start_idx, "skipped frames")
+
+ # Back down again.
+ start_idx = frame.GetFrameID()
+ for i in range(1, thread.GetNumFrames()):
+ self.expect("down")
+ frame = thread.GetSelectedFrame()
+ if "foo" in frame.GetFunctionName():
+ break
+ end_idx = frame.GetFrameID()
+ self.assertLess(i, start_idx - end_idx, "skipped frames")
+
+ @add_test_categories(["libc++"])
+ def test_api(self):
+ """Test that std::function implementation details are skipped"""
+ self.build()
+ (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+ frame = thread.GetSelectedFrame()
+ num_hidden = 0
+ for i in range(1, thread.GetNumFrames()):
+ thread.SetSelectedFrame(i)
+ frame = thread.GetSelectedFrame()
+ if frame.IsHidden():
+ num_hidden += 1
+
+ self.assertGreater(num_hidden, 0)
+ self.assertLess(num_hidden, thread.GetNumFrames())