199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest utility functions for the frame object.
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 FrameUtilsTestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def setUp(self):
1799451b44SJordan Rupprecht        # Call super's setUp().
1899451b44SJordan Rupprecht        TestBase.setUp(self)
1999451b44SJordan Rupprecht        # Find the line number to break inside main().
2099451b44SJordan Rupprecht        self.line = line_number('main.c',
2199451b44SJordan Rupprecht                                "// Find the line number here.")
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht    def test_frame_utils(self):
2499451b44SJordan Rupprecht        """Test utility functions for the frame object."""
2599451b44SJordan Rupprecht        self.build()
2699451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2999451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.c", self.line)
3299451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
3599451b44SJordan Rupprecht        process = target.LaunchSimple(
3699451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        if not process:
3999451b44SJordan Rupprecht            self.fail("SBTarget.LaunchProcess() failed")
40*47c4c6a7SDave Lee        self.assertState(process.GetState(), lldb.eStateStopped,
4199451b44SJordan Rupprecht                         PROCESS_STOPPED)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        import lldbsuite.test.lldbutil as lldbutil
4499451b44SJordan Rupprecht        thread = lldbutil.get_stopped_thread(
4599451b44SJordan Rupprecht            process, lldb.eStopReasonBreakpoint)
4699451b44SJordan Rupprecht        self.assertTrue(thread)
4799451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
4899451b44SJordan Rupprecht        self.assertTrue(frame0)
4999451b44SJordan Rupprecht        frame1 = thread.GetFrameAtIndex(1)
5099451b44SJordan Rupprecht        self.assertTrue(frame1)
5199451b44SJordan Rupprecht        parent = lldbutil.get_parent_frame(frame0)
5299451b44SJordan Rupprecht        self.assertTrue(parent and parent.GetFrameID() == frame1.GetFrameID())
5399451b44SJordan Rupprecht        frame0_args = lldbutil.get_args_as_string(frame0)
5499451b44SJordan Rupprecht        parent_args = lldbutil.get_args_as_string(parent)
5599451b44SJordan Rupprecht        self.assertTrue(
5699451b44SJordan Rupprecht            frame0_args and parent_args and "(int)val=1" in frame0_args)
5799451b44SJordan Rupprecht        if self.TraceOn():
5899451b44SJordan Rupprecht            lldbutil.print_stacktrace(thread)
5999451b44SJordan Rupprecht            print("Current frame: %s" % frame0_args)
6099451b44SJordan Rupprecht            print("Parent frame: %s" % parent_args)
61