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