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 @add_test_categories(['pyapi']) 1899451b44SJordan Rupprecht def test_debugger_api_boundary_condition(self): 1999451b44SJordan Rupprecht """Exercise SBDebugger APIs with boundary conditions.""" 2099451b44SJordan Rupprecht self.dbg.HandleCommand(None) 2199451b44SJordan Rupprecht self.dbg.SetDefaultArchitecture(None) 2299451b44SJordan Rupprecht self.dbg.GetScriptingLanguage(None) 2399451b44SJordan Rupprecht self.dbg.CreateTarget(None) 2499451b44SJordan Rupprecht self.dbg.CreateTarget(None, None, None, True, lldb.SBError()) 2599451b44SJordan Rupprecht self.dbg.CreateTargetWithFileAndTargetTriple(None, None) 2699451b44SJordan Rupprecht self.dbg.CreateTargetWithFileAndArch(None, None) 2799451b44SJordan Rupprecht self.dbg.FindTargetWithFileAndArch(None, None) 2899451b44SJordan Rupprecht self.dbg.SetInternalVariable(None, None, None) 2999451b44SJordan Rupprecht self.dbg.GetInternalVariableValue(None, None) 3099451b44SJordan Rupprecht # FIXME (filcab): We must first allow for the swig bindings to know if 3199451b44SJordan Rupprecht # a Python callback is set. (Check python-typemaps.swig) 3299451b44SJordan Rupprecht # self.dbg.SetLoggingCallback(None) 3399451b44SJordan Rupprecht self.dbg.SetPrompt(None) 3499451b44SJordan Rupprecht self.dbg.SetCurrentPlatform(None) 3599451b44SJordan Rupprecht self.dbg.SetCurrentPlatformSDKRoot(None) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht fresh_dbg = lldb.SBDebugger() 3899451b44SJordan Rupprecht self.assertEquals(len(fresh_dbg), 0) 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht @add_test_categories(['pyapi']) 4199451b44SJordan Rupprecht def test_debugger_delete_invalid_target(self): 4299451b44SJordan Rupprecht """SBDebugger.DeleteTarget() should not crash LLDB given and invalid target.""" 4399451b44SJordan Rupprecht target = lldb.SBTarget() 4499451b44SJordan Rupprecht self.assertFalse(target.IsValid()) 4599451b44SJordan Rupprecht self.dbg.DeleteTarget(target) 46*36de94cfSTatyana Krasnukha 47*36de94cfSTatyana Krasnukha def test_debugger_internal_variables(self): 48*36de94cfSTatyana Krasnukha """Ensure that SBDebugger reachs the same instance of properties 49*36de94cfSTatyana Krasnukha regardless CommandInterpreter's context initialization""" 50*36de94cfSTatyana Krasnukha self.build() 51*36de94cfSTatyana Krasnukha exe = self.getBuildArtifact("a.out") 52*36de94cfSTatyana Krasnukha 53*36de94cfSTatyana Krasnukha # Create a target by the debugger. 54*36de94cfSTatyana Krasnukha target = self.dbg.CreateTarget(exe) 55*36de94cfSTatyana Krasnukha self.assertTrue(target, VALID_TARGET) 56*36de94cfSTatyana Krasnukha 57*36de94cfSTatyana Krasnukha property_name = "target.process.memory-cache-line-size" 58*36de94cfSTatyana Krasnukha 59*36de94cfSTatyana Krasnukha def get_cache_line_size(): 60*36de94cfSTatyana Krasnukha value_list = lldb.SBStringList() 61*36de94cfSTatyana Krasnukha value_list = self.dbg.GetInternalVariableValue(property_name, 62*36de94cfSTatyana Krasnukha self.dbg.GetInstanceName()) 63*36de94cfSTatyana Krasnukha 64*36de94cfSTatyana Krasnukha self.assertEqual(value_list.GetSize(), 1) 65*36de94cfSTatyana Krasnukha try: 66*36de94cfSTatyana Krasnukha return int(value_list.GetStringAtIndex(0)) 67*36de94cfSTatyana Krasnukha except ValueError as error: 68*36de94cfSTatyana Krasnukha self.fail("Value is not a number: " + error) 69*36de94cfSTatyana Krasnukha 70*36de94cfSTatyana Krasnukha # Get global property value while there are no processes. 71*36de94cfSTatyana Krasnukha global_cache_line_size = get_cache_line_size() 72*36de94cfSTatyana Krasnukha 73*36de94cfSTatyana Krasnukha # Run a process via SB interface. CommandInterpreter's execution context 74*36de94cfSTatyana Krasnukha # remains empty. 75*36de94cfSTatyana Krasnukha error = lldb.SBError() 76*36de94cfSTatyana Krasnukha launch_info = lldb.SBLaunchInfo(None) 77*36de94cfSTatyana Krasnukha launch_info.SetLaunchFlags(lldb.eLaunchFlagStopAtEntry) 78*36de94cfSTatyana Krasnukha process = target.Launch(launch_info, error) 79*36de94cfSTatyana Krasnukha self.assertTrue(process, PROCESS_IS_VALID) 80*36de94cfSTatyana Krasnukha 81*36de94cfSTatyana Krasnukha # This should change the value of a process's local property. 82*36de94cfSTatyana Krasnukha new_cache_line_size = global_cache_line_size + 512 83*36de94cfSTatyana Krasnukha error = self.dbg.SetInternalVariable(property_name, 84*36de94cfSTatyana Krasnukha str(new_cache_line_size), 85*36de94cfSTatyana Krasnukha self.dbg.GetInstanceName()) 86*36de94cfSTatyana Krasnukha self.assertTrue(error.Success(), 87*36de94cfSTatyana Krasnukha property_name + " value was changed successfully") 88*36de94cfSTatyana Krasnukha 89*36de94cfSTatyana Krasnukha # Check that it was set actually. 90*36de94cfSTatyana Krasnukha self.assertEqual(get_cache_line_size(), new_cache_line_size) 91*36de94cfSTatyana Krasnukha 92*36de94cfSTatyana Krasnukha # Run any command to initialize CommandInterpreter's execution context. 93*36de94cfSTatyana Krasnukha self.runCmd("target list") 94*36de94cfSTatyana Krasnukha 95*36de94cfSTatyana Krasnukha # Test the local property again, is it set to new_cache_line_size? 96*36de94cfSTatyana Krasnukha self.assertEqual(get_cache_line_size(), new_cache_line_size) 97