xref: /llvm-project/lldb/test/API/python_api/lldbutil/iter/TestLLDBIterator.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest the iteration protocol for some lldb container objects.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
999451b44SJordan Rupprecht
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprechtclass LLDBIteratorTestCase(TestBase):
1299451b44SJordan Rupprecht    def setUp(self):
1399451b44SJordan Rupprecht        # Call super's setUp().
1499451b44SJordan Rupprecht        TestBase.setUp(self)
1599451b44SJordan Rupprecht        # Find the line numbers to break inside main().
16*2238dcc3SJonas Devlieghere        self.line1 = line_number("main.cpp", "// Set break point at this line.")
17*2238dcc3SJonas Devlieghere        self.line2 = line_number("main.cpp", "// And that line.")
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    def test_lldb_iter_module(self):
2099451b44SJordan Rupprecht        """Test module_iter works correctly for SBTarget -> SBModule."""
2199451b44SJordan Rupprecht        self.build()
2299451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2599451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2699451b44SJordan Rupprecht
2799451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
2899451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
31*2238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        if not process:
3499451b44SJordan Rupprecht            self.fail("SBTarget.LaunchProcess() failed")
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_description
37*2238dcc3SJonas Devlieghere
3899451b44SJordan Rupprecht        yours = []
3999451b44SJordan Rupprecht        for i in range(target.GetNumModules()):
4099451b44SJordan Rupprecht            yours.append(target.GetModuleAtIndex(i))
4199451b44SJordan Rupprecht        mine = []
4299451b44SJordan Rupprecht        for m in target.module_iter():
4399451b44SJordan Rupprecht            mine.append(m)
4499451b44SJordan Rupprecht
45619e2e09SDave Lee        self.assertEqual(len(yours), len(mine))
4699451b44SJordan Rupprecht        for i in range(len(yours)):
4799451b44SJordan Rupprecht            if self.TraceOn():
4899451b44SJordan Rupprecht                print("yours[%d]='%s'" % (i, get_description(yours[i])))
4999451b44SJordan Rupprecht                print("mine[%d]='%s'" % (i, get_description(mine[i])))
500ed758b2SDave Lee            self.assertEqual(
51*2238dcc3SJonas Devlieghere                yours[i],
52*2238dcc3SJonas Devlieghere                mine[i],
53*2238dcc3SJonas Devlieghere                "UUID+FileSpec of yours[{0}] and mine[{0}] matches".format(i),
54*2238dcc3SJonas Devlieghere            )
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht    def test_lldb_iter_breakpoint(self):
5799451b44SJordan Rupprecht        """Test breakpoint_iter works correctly for SBTarget -> SBBreakpoint."""
5899451b44SJordan Rupprecht        self.build()
5999451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
6299451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
6599451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
6699451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line2)
6799451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
6899451b44SJordan Rupprecht
69619e2e09SDave Lee        self.assertEqual(target.GetNumBreakpoints(), 2)
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_description
72*2238dcc3SJonas Devlieghere
7399451b44SJordan Rupprecht        yours = []
7499451b44SJordan Rupprecht        for i in range(target.GetNumBreakpoints()):
7599451b44SJordan Rupprecht            yours.append(target.GetBreakpointAtIndex(i))
7699451b44SJordan Rupprecht        mine = []
7799451b44SJordan Rupprecht        for b in target.breakpoint_iter():
7899451b44SJordan Rupprecht            mine.append(b)
7999451b44SJordan Rupprecht
80619e2e09SDave Lee        self.assertEqual(len(yours), len(mine))
8199451b44SJordan Rupprecht        for i in range(len(yours)):
8299451b44SJordan Rupprecht            if self.TraceOn():
8399451b44SJordan Rupprecht                print("yours[%d]='%s'" % (i, get_description(yours[i])))
8499451b44SJordan Rupprecht                print("mine[%d]='%s'" % (i, get_description(mine[i])))
85*2238dcc3SJonas Devlieghere            self.assertEqual(
86*2238dcc3SJonas Devlieghere                yours[i], mine[i], "ID of yours[{0}] and mine[{0}] matches".format(i)
87*2238dcc3SJonas Devlieghere            )
8899451b44SJordan Rupprecht
89c2486011SStella Stamenova    @skipIfWindows  # This test is flaky on Windows
9099451b44SJordan Rupprecht    def test_lldb_iter_frame(self):
9199451b44SJordan Rupprecht        """Test iterator works correctly for SBProcess->SBThread->SBFrame."""
9299451b44SJordan Rupprecht        self.build()
9399451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
9699451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
9799451b44SJordan Rupprecht
9899451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
9999451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
102*2238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        if not process:
10599451b44SJordan Rupprecht            self.fail("SBTarget.LaunchProcess() failed")
10699451b44SJordan Rupprecht
10799451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import print_stacktrace
108*2238dcc3SJonas Devlieghere
10999451b44SJordan Rupprecht        stopped_due_to_breakpoint = False
11099451b44SJordan Rupprecht        for thread in process:
11199451b44SJordan Rupprecht            if self.TraceOn():
11299451b44SJordan Rupprecht                print_stacktrace(thread)
11399451b44SJordan Rupprecht            ID = thread.GetThreadID()
11499451b44SJordan Rupprecht            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
11599451b44SJordan Rupprecht                stopped_due_to_breakpoint = True
11699451b44SJordan Rupprecht            for frame in thread:
117619e2e09SDave Lee                self.assertEqual(frame.GetThread().GetThreadID(), ID)
11899451b44SJordan Rupprecht                if self.TraceOn():
11999451b44SJordan Rupprecht                    print(frame)
12099451b44SJordan Rupprecht
12199451b44SJordan Rupprecht        self.assertTrue(stopped_due_to_breakpoint)
122