199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest the iteration protocol for some lldb container objects.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass LLDBIteratorTestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def setUp(self):
1799451b44SJordan Rupprecht        # Call super's setUp().
1899451b44SJordan Rupprecht        TestBase.setUp(self)
1999451b44SJordan Rupprecht        # Find the line numbers to break inside main().
2099451b44SJordan Rupprecht        self.line1 = line_number(
2199451b44SJordan Rupprecht            'main.cpp', '// Set break point at this line.')
2299451b44SJordan Rupprecht        self.line2 = line_number('main.cpp', '// And that line.')
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht    def test_lldb_iter_module(self):
2599451b44SJordan Rupprecht        """Test module_iter works correctly for SBTarget -> SBModule."""
2699451b44SJordan Rupprecht        self.build()
2799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3099451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
3399451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
3699451b44SJordan Rupprecht        process = target.LaunchSimple(
3799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        if not process:
4099451b44SJordan Rupprecht            self.fail("SBTarget.LaunchProcess() failed")
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_description
4399451b44SJordan Rupprecht        yours = []
4499451b44SJordan Rupprecht        for i in range(target.GetNumModules()):
4599451b44SJordan Rupprecht            yours.append(target.GetModuleAtIndex(i))
4699451b44SJordan Rupprecht        mine = []
4799451b44SJordan Rupprecht        for m in target.module_iter():
4899451b44SJordan Rupprecht            mine.append(m)
4999451b44SJordan Rupprecht
50619e2e09SDave Lee        self.assertEqual(len(yours), len(mine))
5199451b44SJordan Rupprecht        for i in range(len(yours)):
5299451b44SJordan Rupprecht            if self.TraceOn():
5399451b44SJordan Rupprecht                print("yours[%d]='%s'" % (i, get_description(yours[i])))
5499451b44SJordan Rupprecht                print("mine[%d]='%s'" % (i, get_description(mine[i])))
550ed758b2SDave Lee            self.assertEqual(
560ed758b2SDave Lee                yours[i], mine[i],
5799451b44SJordan Rupprecht                "UUID+FileSpec of yours[{0}] and mine[{0}] matches".format(i))
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht    def test_lldb_iter_breakpoint(self):
6099451b44SJordan Rupprecht        """Test breakpoint_iter works correctly for SBTarget -> SBBreakpoint."""
6199451b44SJordan Rupprecht        self.build()
6299451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
6599451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
6699451b44SJordan Rupprecht
6799451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
6899451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
6999451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line2)
7099451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
7199451b44SJordan Rupprecht
72619e2e09SDave Lee        self.assertEqual(target.GetNumBreakpoints(), 2)
7399451b44SJordan Rupprecht
7499451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_description
7599451b44SJordan Rupprecht        yours = []
7699451b44SJordan Rupprecht        for i in range(target.GetNumBreakpoints()):
7799451b44SJordan Rupprecht            yours.append(target.GetBreakpointAtIndex(i))
7899451b44SJordan Rupprecht        mine = []
7999451b44SJordan Rupprecht        for b in target.breakpoint_iter():
8099451b44SJordan Rupprecht            mine.append(b)
8199451b44SJordan Rupprecht
82619e2e09SDave Lee        self.assertEqual(len(yours), len(mine))
8399451b44SJordan Rupprecht        for i in range(len(yours)):
8499451b44SJordan Rupprecht            if self.TraceOn():
8599451b44SJordan Rupprecht                print("yours[%d]='%s'" % (i, get_description(yours[i])))
8699451b44SJordan Rupprecht                print("mine[%d]='%s'" % (i, get_description(mine[i])))
87619e2e09SDave Lee            self.assertEqual(yours[i], mine[i],
8899451b44SJordan Rupprecht                            "ID of yours[{0}] and mine[{0}] matches".format(i))
8999451b44SJordan Rupprecht
90*c2486011SStella Stamenova    @skipIfWindows # This test is flaky on Windows
9199451b44SJordan Rupprecht    def test_lldb_iter_frame(self):
9299451b44SJordan Rupprecht        """Test iterator works correctly for SBProcess->SBThread->SBFrame."""
9399451b44SJordan Rupprecht        self.build()
9499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
9599451b44SJordan Rupprecht
9699451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
9799451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
10099451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
10199451b44SJordan Rupprecht
10299451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
10399451b44SJordan Rupprecht        process = target.LaunchSimple(
10499451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        if not process:
10799451b44SJordan Rupprecht            self.fail("SBTarget.LaunchProcess() failed")
10899451b44SJordan Rupprecht
10999451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import print_stacktrace
11099451b44SJordan Rupprecht        stopped_due_to_breakpoint = False
11199451b44SJordan Rupprecht        for thread in process:
11299451b44SJordan Rupprecht            if self.TraceOn():
11399451b44SJordan Rupprecht                print_stacktrace(thread)
11499451b44SJordan Rupprecht            ID = thread.GetThreadID()
11599451b44SJordan Rupprecht            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
11699451b44SJordan Rupprecht                stopped_due_to_breakpoint = True
11799451b44SJordan Rupprecht            for frame in thread:
118619e2e09SDave Lee                self.assertEqual(frame.GetThread().GetThreadID(), ID)
11999451b44SJordan Rupprecht                if self.TraceOn():
12099451b44SJordan Rupprecht                    print(frame)
12199451b44SJordan Rupprecht
12299451b44SJordan Rupprecht        self.assertTrue(stopped_due_to_breakpoint)
123