195 lines · python
1"""2Test SBFrameList API.3"""4 5import lldb6from lldbsuite.test.decorators import *7from lldbsuite.test.lldbtest import *8from lldbsuite.test import lldbutil9 10 11class FrameListAPITestCase(TestBase):12 def test_frame_list_api(self):13 """Test SBThread.GetFrames() returns a valid SBFrameList."""14 self.build()15 self.frame_list_api()16 17 def test_frame_list_iterator(self):18 """Test SBFrameList iterator functionality."""19 self.build()20 self.frame_list_iterator()21 22 def test_frame_list_indexing(self):23 """Test SBFrameList indexing and length."""24 self.build()25 self.frame_list_indexing()26 27 def test_frame_list_get_thread(self):28 """Test SBFrameList.GetThread() returns correct thread."""29 self.build()30 self.frame_list_get_thread()31 32 def setUp(self):33 TestBase.setUp(self)34 self.main_source = "main.cpp"35 36 def frame_list_api(self):37 """Test SBThread.GetFrames() returns a valid SBFrameList."""38 exe = self.getBuildArtifact("a.out")39 40 target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(41 self, "Set break point at this line", lldb.SBFileSpec(self.main_source)42 )43 44 self.assertTrue(45 thread.IsValid(), "There should be a thread stopped due to breakpoint"46 )47 48 # Test GetFrames() returns a valid SBFrameList49 frame_list = thread.GetFrames()50 self.assertTrue(frame_list.IsValid(), "Frame list should be valid")51 self.assertGreater(52 frame_list.GetSize(), 0, "Frame list should have at least one frame"53 )54 55 # Verify frame list size matches thread frame count56 self.assertEqual(57 frame_list.GetSize(),58 thread.GetNumFrames(),59 "Frame list size should match thread frame count",60 )61 62 # Verify frames are the same63 for i in range(frame_list.GetSize()):64 frame_from_list = frame_list.GetFrameAtIndex(i)65 frame_from_thread = thread.GetFrameAtIndex(i)66 self.assertTrue(67 frame_from_list.IsValid(), f"Frame {i} from list should be valid"68 )69 self.assertEqual(70 frame_from_list.GetPC(),71 frame_from_thread.GetPC(),72 f"Frame {i} PC should match",73 )74 75 def frame_list_iterator(self):76 """Test SBFrameList iterator functionality."""77 exe = self.getBuildArtifact("a.out")78 79 target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(80 self, "Set break point at this line", lldb.SBFileSpec(self.main_source)81 )82 83 self.assertTrue(84 thread.IsValid(), "There should be a thread stopped due to breakpoint"85 )86 87 frame_list = thread.GetFrames()88 89 # Test iteration90 frame_count = 091 for frame in frame_list:92 self.assertTrue(frame.IsValid(), "Each frame should be valid")93 frame_count += 194 95 self.assertEqual(96 frame_count,97 frame_list.GetSize(),98 "Iterator should visit all frames",99 )100 101 # Test that we can iterate multiple times102 second_count = 0103 for frame in frame_list:104 second_count += 1105 106 self.assertEqual(107 frame_count, second_count, "Should be able to iterate multiple times"108 )109 110 def frame_list_indexing(self):111 """Test SBFrameList indexing and length."""112 exe = self.getBuildArtifact("a.out")113 114 target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(115 self, "Set break point at this line", lldb.SBFileSpec(self.main_source)116 )117 118 self.assertTrue(119 thread.IsValid(), "There should be a thread stopped due to breakpoint"120 )121 122 frame_list = thread.GetFrames()123 124 # Test len()125 self.assertEqual(126 len(frame_list), frame_list.GetSize(), "len() should return frame count"127 )128 129 # Test positive indexing130 first_frame = frame_list[0]131 self.assertTrue(first_frame.IsValid(), "First frame should be valid")132 self.assertEqual(133 first_frame.GetPC(),134 thread.GetFrameAtIndex(0).GetPC(),135 "Indexed frame should match",136 )137 138 # Test negative indexing139 if len(frame_list) > 0:140 last_frame = frame_list[-1]141 self.assertTrue(last_frame.IsValid(), "Last frame should be valid")142 self.assertEqual(143 last_frame.GetPC(),144 thread.GetFrameAtIndex(len(frame_list) - 1).GetPC(),145 "Negative indexing should work",146 )147 148 # Test out of bounds returns None149 out_of_bounds = frame_list[10000]150 self.assertIsNone(out_of_bounds, "Out of bounds index should return None")151 152 # Test bool conversion153 self.assertTrue(bool(frame_list), "Non-empty frame list should be truthy")154 155 # Test Clear()156 frame_list.Clear()157 # Note: Clear() clears the underlying StackFrameList cache,158 # but the frame list object itself should still be valid159 self.assertTrue(160 frame_list.IsValid(), "Frame list should still be valid after Clear()"161 )162 163 def frame_list_get_thread(self):164 """Test SBFrameList.GetThread() returns correct thread."""165 exe = self.getBuildArtifact("a.out")166 167 target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(168 self, "Set break point at this line", lldb.SBFileSpec(self.main_source)169 )170 171 self.assertTrue(172 thread.IsValid(), "There should be a thread stopped due to breakpoint"173 )174 175 frame_list = thread.GetFrames()176 self.assertTrue(frame_list.IsValid(), "Frame list should be valid")177 178 # Test GetThread() returns the correct thread179 thread_from_list = frame_list.GetThread()180 self.assertTrue(181 thread_from_list.IsValid(), "Thread from frame list should be valid"182 )183 self.assertEqual(184 thread_from_list.GetThreadID(),185 thread.GetThreadID(),186 "Frame list should return the correct thread",187 )188 189 # Verify it's the same thread object190 self.assertEqual(191 thread_from_list.GetProcess().GetProcessID(),192 thread.GetProcess().GetProcessID(),193 "Thread should belong to same process",194 )195