199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest Debugger APIs.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass DebuggerAPITestCase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1599451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def test_debugger_api_boundary_condition(self):
1899451b44SJordan Rupprecht        """Exercise SBDebugger APIs with boundary conditions."""
1999451b44SJordan Rupprecht        self.dbg.HandleCommand(None)
2099451b44SJordan Rupprecht        self.dbg.SetDefaultArchitecture(None)
2199451b44SJordan Rupprecht        self.dbg.GetScriptingLanguage(None)
2299451b44SJordan Rupprecht        self.dbg.CreateTarget(None)
2399451b44SJordan Rupprecht        self.dbg.CreateTarget(None, None, None, True, lldb.SBError())
2499451b44SJordan Rupprecht        self.dbg.CreateTargetWithFileAndTargetTriple(None, None)
2599451b44SJordan Rupprecht        self.dbg.CreateTargetWithFileAndArch(None, None)
2699451b44SJordan Rupprecht        self.dbg.FindTargetWithFileAndArch(None, None)
2799451b44SJordan Rupprecht        self.dbg.SetInternalVariable(None, None, None)
2899451b44SJordan Rupprecht        self.dbg.GetInternalVariableValue(None, None)
2999451b44SJordan Rupprecht        # FIXME (filcab): We must first allow for the swig bindings to know if
3099451b44SJordan Rupprecht        # a Python callback is set. (Check python-typemaps.swig)
3199451b44SJordan Rupprecht        # self.dbg.SetLoggingCallback(None)
3299451b44SJordan Rupprecht        self.dbg.SetPrompt(None)
3399451b44SJordan Rupprecht        self.dbg.SetCurrentPlatform(None)
3499451b44SJordan Rupprecht        self.dbg.SetCurrentPlatformSDKRoot(None)
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        fresh_dbg = lldb.SBDebugger()
3799451b44SJordan Rupprecht        self.assertEquals(len(fresh_dbg), 0)
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht    def test_debugger_delete_invalid_target(self):
4099451b44SJordan Rupprecht        """SBDebugger.DeleteTarget() should not crash LLDB given and invalid target."""
4199451b44SJordan Rupprecht        target = lldb.SBTarget()
4299451b44SJordan Rupprecht        self.assertFalse(target.IsValid())
4399451b44SJordan Rupprecht        self.dbg.DeleteTarget(target)
4436de94cfSTatyana Krasnukha
4536de94cfSTatyana Krasnukha    def test_debugger_internal_variables(self):
4636de94cfSTatyana Krasnukha        """Ensure that SBDebugger reachs the same instance of properties
4736de94cfSTatyana Krasnukha           regardless CommandInterpreter's context initialization"""
4836de94cfSTatyana Krasnukha        self.build()
4936de94cfSTatyana Krasnukha        exe = self.getBuildArtifact("a.out")
5036de94cfSTatyana Krasnukha
5136de94cfSTatyana Krasnukha        # Create a target by the debugger.
5236de94cfSTatyana Krasnukha        target = self.dbg.CreateTarget(exe)
5336de94cfSTatyana Krasnukha        self.assertTrue(target, VALID_TARGET)
5436de94cfSTatyana Krasnukha
5536de94cfSTatyana Krasnukha        property_name = "target.process.memory-cache-line-size"
5636de94cfSTatyana Krasnukha
5736de94cfSTatyana Krasnukha        def get_cache_line_size():
5836de94cfSTatyana Krasnukha            value_list = lldb.SBStringList()
5936de94cfSTatyana Krasnukha            value_list = self.dbg.GetInternalVariableValue(property_name,
6036de94cfSTatyana Krasnukha                                                           self.dbg.GetInstanceName())
6136de94cfSTatyana Krasnukha
6236de94cfSTatyana Krasnukha            self.assertEqual(value_list.GetSize(), 1)
6336de94cfSTatyana Krasnukha            try:
6436de94cfSTatyana Krasnukha                return int(value_list.GetStringAtIndex(0))
6536de94cfSTatyana Krasnukha            except ValueError as error:
6636de94cfSTatyana Krasnukha                self.fail("Value is not a number: " + error)
6736de94cfSTatyana Krasnukha
6836de94cfSTatyana Krasnukha        # Get global property value while there are no processes.
6936de94cfSTatyana Krasnukha        global_cache_line_size = get_cache_line_size()
7036de94cfSTatyana Krasnukha
7136de94cfSTatyana Krasnukha        # Run a process via SB interface. CommandInterpreter's execution context
7236de94cfSTatyana Krasnukha        # remains empty.
7336de94cfSTatyana Krasnukha        error = lldb.SBError()
7436de94cfSTatyana Krasnukha        launch_info = lldb.SBLaunchInfo(None)
7536de94cfSTatyana Krasnukha        launch_info.SetLaunchFlags(lldb.eLaunchFlagStopAtEntry)
7636de94cfSTatyana Krasnukha        process = target.Launch(launch_info, error)
7736de94cfSTatyana Krasnukha        self.assertTrue(process, PROCESS_IS_VALID)
7836de94cfSTatyana Krasnukha
7936de94cfSTatyana Krasnukha        # This should change the value of a process's local property.
8036de94cfSTatyana Krasnukha        new_cache_line_size = global_cache_line_size + 512
8136de94cfSTatyana Krasnukha        error = self.dbg.SetInternalVariable(property_name,
8236de94cfSTatyana Krasnukha                                             str(new_cache_line_size),
8336de94cfSTatyana Krasnukha                                             self.dbg.GetInstanceName())
84779bbbf2SDave Lee        self.assertSuccess(error,
8536de94cfSTatyana Krasnukha                           property_name + " value was changed successfully")
8636de94cfSTatyana Krasnukha
8736de94cfSTatyana Krasnukha        # Check that it was set actually.
8836de94cfSTatyana Krasnukha        self.assertEqual(get_cache_line_size(), new_cache_line_size)
8936de94cfSTatyana Krasnukha
9036de94cfSTatyana Krasnukha        # Run any command to initialize CommandInterpreter's execution context.
9136de94cfSTatyana Krasnukha        self.runCmd("target list")
9236de94cfSTatyana Krasnukha
9336de94cfSTatyana Krasnukha        # Test the local property again, is it set to new_cache_line_size?
9436de94cfSTatyana Krasnukha        self.assertEqual(get_cache_line_size(), new_cache_line_size)
95af921006SPavel Labath
96af921006SPavel Labath    def test_CreateTarget_platform(self):
97af921006SPavel Labath        exe = self.getBuildArtifact("a.out")
98af921006SPavel Labath        self.yaml2obj("elf.yaml", exe)
99af921006SPavel Labath        error = lldb.SBError()
100af921006SPavel Labath        target1 = self.dbg.CreateTarget(exe, None, "remote-linux",
101af921006SPavel Labath                False, error)
102af921006SPavel Labath        self.assertSuccess(error)
103af921006SPavel Labath        platform1 = target1.GetPlatform()
104af921006SPavel Labath        platform1.SetWorkingDirectory("/foo/bar")
105af921006SPavel Labath
106af921006SPavel Labath        # Reuse a platform if it matches the currently selected one...
107af921006SPavel Labath        target2 = self.dbg.CreateTarget(exe, None, "remote-linux",
108af921006SPavel Labath                False, error)
109af921006SPavel Labath        self.assertSuccess(error)
110af921006SPavel Labath        platform2 = target2.GetPlatform()
111*7d70b1a4SPavel Labath        self.assertTrue(platform2.GetWorkingDirectory().endswith("bar"),
112*7d70b1a4SPavel Labath                platform2.GetWorkingDirectory())
113af921006SPavel Labath
114af921006SPavel Labath        # ... but create a new one if it doesn't.
115af921006SPavel Labath        self.dbg.SetSelectedPlatform(lldb.SBPlatform("remote-windows"))
116af921006SPavel Labath        target3 = self.dbg.CreateTarget(exe, None, "remote-linux",
117af921006SPavel Labath                False, error)
118af921006SPavel Labath        self.assertSuccess(error)
119af921006SPavel Labath        platform3 = target3.GetPlatform()
120af921006SPavel Labath        self.assertIsNone(platform3.GetWorkingDirectory())
121af921006SPavel Labath
122af921006SPavel Labath    def test_CreateTarget_arch(self):
123af921006SPavel Labath        exe = self.getBuildArtifact("a.out")
124af921006SPavel Labath        if lldbplatformutil.getHostPlatform() == 'linux':
125af921006SPavel Labath            self.yaml2obj("macho.yaml", exe)
126af921006SPavel Labath            arch = "x86_64-apple-macosx"
127*7d70b1a4SPavel Labath            expected_platform = "remote-macosx"
128af921006SPavel Labath        else:
129af921006SPavel Labath            self.yaml2obj("elf.yaml", exe)
130af921006SPavel Labath            arch = "x86_64-pc-linux"
131*7d70b1a4SPavel Labath            expected_platform = "remote-linux"
132af921006SPavel Labath
133af921006SPavel Labath        fbsd = lldb.SBPlatform("remote-freebsd")
134af921006SPavel Labath        self.dbg.SetSelectedPlatform(fbsd)
135af921006SPavel Labath
136af921006SPavel Labath        error = lldb.SBError()
137af921006SPavel Labath        target1 = self.dbg.CreateTarget(exe, arch, None, False, error)
138af921006SPavel Labath        self.assertSuccess(error)
139af921006SPavel Labath        platform1 = target1.GetPlatform()
140*7d70b1a4SPavel Labath        self.assertEqual(platform1.GetName(), expected_platform)
141af921006SPavel Labath        platform1.SetWorkingDirectory("/foo/bar")
142af921006SPavel Labath
143af921006SPavel Labath        # Reuse a platform even if it is not currently selected.
144af921006SPavel Labath        self.dbg.SetSelectedPlatform(fbsd)
145af921006SPavel Labath        target2 = self.dbg.CreateTarget(exe, arch, None, False, error)
146af921006SPavel Labath        self.assertSuccess(error)
147af921006SPavel Labath        platform2 = target2.GetPlatform()
148*7d70b1a4SPavel Labath        self.assertEqual(platform2.GetName(), expected_platform)
149*7d70b1a4SPavel Labath        self.assertTrue(platform2.GetWorkingDirectory().endswith("bar"),
150*7d70b1a4SPavel Labath                platform2.GetWorkingDirectory())
151