brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · f348ce4 Raw
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