1"""
2Test the iteration protocol for some lldb container objects.
3"""
4
5from __future__ import print_function
6
7
8import lldb
9from lldbsuite.test.decorators import *
10from lldbsuite.test.lldbtest import *
11from lldbsuite.test import lldbutil
12
13
14class LLDBIteratorTestCase(TestBase):
15
16    mydir = TestBase.compute_mydir(__file__)
17
18    def setUp(self):
19        # Call super's setUp().
20        TestBase.setUp(self)
21        # Find the line numbers to break inside main().
22        self.line1 = line_number(
23            'main.cpp', '// Set break point at this line.')
24        self.line2 = line_number('main.cpp', '// And that line.')
25
26    @add_test_categories(['pyapi'])
27    def test_lldb_iter_module(self):
28        """Test module_iter works correctly for SBTarget -> SBModule."""
29        self.build()
30        exe = self.getBuildArtifact("a.out")
31
32        target = self.dbg.CreateTarget(exe)
33        self.assertTrue(target, VALID_TARGET)
34
35        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
36        self.assertTrue(breakpoint, VALID_BREAKPOINT)
37
38        # Now launch the process, and do not stop at entry point.
39        process = target.LaunchSimple(
40            None, None, self.get_process_working_directory())
41
42        if not process:
43            self.fail("SBTarget.LaunchProcess() failed")
44
45        from lldbsuite.test.lldbutil import get_description
46        yours = []
47        for i in range(target.GetNumModules()):
48            yours.append(target.GetModuleAtIndex(i))
49        mine = []
50        for m in target.module_iter():
51            mine.append(m)
52
53        self.assertTrue(len(yours) == len(mine))
54        for i in range(len(yours)):
55            if self.TraceOn():
56                print("yours[%d]='%s'" % (i, get_description(yours[i])))
57                print("mine[%d]='%s'" % (i, get_description(mine[i])))
58            self.assertTrue(
59                yours[i] == mine[i],
60                "UUID+FileSpec of yours[{0}] and mine[{0}] matches".format(i))
61
62    @add_test_categories(['pyapi'])
63    def test_lldb_iter_breakpoint(self):
64        """Test breakpoint_iter works correctly for SBTarget -> SBBreakpoint."""
65        self.build()
66        exe = self.getBuildArtifact("a.out")
67
68        target = self.dbg.CreateTarget(exe)
69        self.assertTrue(target, VALID_TARGET)
70
71        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
72        self.assertTrue(breakpoint, VALID_BREAKPOINT)
73        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line2)
74        self.assertTrue(breakpoint, VALID_BREAKPOINT)
75
76        self.assertTrue(target.GetNumBreakpoints() == 2)
77
78        from lldbsuite.test.lldbutil import get_description
79        yours = []
80        for i in range(target.GetNumBreakpoints()):
81            yours.append(target.GetBreakpointAtIndex(i))
82        mine = []
83        for b in target.breakpoint_iter():
84            mine.append(b)
85
86        self.assertTrue(len(yours) == len(mine))
87        for i in range(len(yours)):
88            if self.TraceOn():
89                print("yours[%d]='%s'" % (i, get_description(yours[i])))
90                print("mine[%d]='%s'" % (i, get_description(mine[i])))
91            self.assertTrue(yours[i] == mine[i],
92                            "ID of yours[{0}] and mine[{0}] matches".format(i))
93
94    @add_test_categories(['pyapi'])
95    def test_lldb_iter_frame(self):
96        """Test iterator works correctly for SBProcess->SBThread->SBFrame."""
97        self.build()
98        exe = self.getBuildArtifact("a.out")
99
100        target = self.dbg.CreateTarget(exe)
101        self.assertTrue(target, VALID_TARGET)
102
103        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
104        self.assertTrue(breakpoint, VALID_BREAKPOINT)
105
106        # Now launch the process, and do not stop at entry point.
107        process = target.LaunchSimple(
108            None, None, self.get_process_working_directory())
109
110        if not process:
111            self.fail("SBTarget.LaunchProcess() failed")
112
113        from lldbsuite.test.lldbutil import print_stacktrace
114        stopped_due_to_breakpoint = False
115        for thread in process:
116            if self.TraceOn():
117                print_stacktrace(thread)
118            ID = thread.GetThreadID()
119            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
120                stopped_due_to_breakpoint = True
121            for frame in thread:
122                self.assertTrue(frame.GetThread().GetThreadID() == ID)
123                if self.TraceOn():
124                    print(frame)
125
126        self.assertTrue(stopped_due_to_breakpoint)
127