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