1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTests stepping with scripted thread plans. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtimport lldb 6*99451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 7*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 8*99451b44SJordan Rupprecht 9*99451b44SJordan Rupprechtclass StepScriptedTestCase(TestBase): 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprecht def setUp(self): 16*99451b44SJordan Rupprecht TestBase.setUp(self) 17*99451b44SJordan Rupprecht self.main_source_file = lldb.SBFileSpec("main.c") 18*99451b44SJordan Rupprecht self.runCmd("command script import Steps.py") 19*99451b44SJordan Rupprecht 20*99451b44SJordan Rupprecht def test_standard_step_out(self): 21*99451b44SJordan Rupprecht """Tests stepping with the scripted thread plan laying over a standard 22*99451b44SJordan Rupprecht thread plan for stepping out.""" 23*99451b44SJordan Rupprecht self.build() 24*99451b44SJordan Rupprecht self.step_out_with_scripted_plan("Steps.StepOut") 25*99451b44SJordan Rupprecht 26*99451b44SJordan Rupprecht def test_scripted_step_out(self): 27*99451b44SJordan Rupprecht """Tests stepping with the scripted thread plan laying over an another 28*99451b44SJordan Rupprecht scripted thread plan for stepping out.""" 29*99451b44SJordan Rupprecht self.build() 30*99451b44SJordan Rupprecht self.step_out_with_scripted_plan("Steps.StepScripted") 31*99451b44SJordan Rupprecht 32*99451b44SJordan Rupprecht def step_out_with_scripted_plan(self, name): 33*99451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 34*99451b44SJordan Rupprecht "Set a breakpoint here", 35*99451b44SJordan Rupprecht self.main_source_file) 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 38*99451b44SJordan Rupprecht self.assertEqual("foo", frame.GetFunctionName()) 39*99451b44SJordan Rupprecht 40*99451b44SJordan Rupprecht err = thread.StepUsingScriptedThreadPlan(name) 41*99451b44SJordan Rupprecht self.assertTrue(err.Success(), err.GetCString()) 42*99451b44SJordan Rupprecht 43*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 44*99451b44SJordan Rupprecht self.assertEqual("main", frame.GetFunctionName()) 45*99451b44SJordan Rupprecht 46*99451b44SJordan Rupprecht 47*99451b44SJordan Rupprecht def test_misspelled_plan_name(self): 48*99451b44SJordan Rupprecht """Test that we get a useful error if we misspell the plan class name""" 49*99451b44SJordan Rupprecht self.build() 50*99451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 51*99451b44SJordan Rupprecht "Set a breakpoint here", 52*99451b44SJordan Rupprecht self.main_source_file) 53*99451b44SJordan Rupprecht stop_id = process.GetStopID() 54*99451b44SJordan Rupprecht # Pass a non-existent class for the plan class: 55*99451b44SJordan Rupprecht err = thread.StepUsingScriptedThreadPlan("NoSuchModule.NoSuchPlan") 56*99451b44SJordan Rupprecht 57*99451b44SJordan Rupprecht # Make sure we got a good error: 58*99451b44SJordan Rupprecht self.assertTrue(err.Fail(), "We got a failure state") 59*99451b44SJordan Rupprecht msg = err.GetCString() 60*99451b44SJordan Rupprecht self.assertTrue("NoSuchModule.NoSuchPlan" in msg, "Mentioned missing class") 61*99451b44SJordan Rupprecht 62*99451b44SJordan Rupprecht # Make sure we didn't let the process run: 63*99451b44SJordan Rupprecht self.assertEqual(stop_id, process.GetStopID(), "Process didn't run") 64*99451b44SJordan Rupprecht 65*99451b44SJordan Rupprecht def test_checking_variable(self): 66*99451b44SJordan Rupprecht """Test that we can call SBValue API's from a scripted thread plan - using SBAPI's to step""" 67*99451b44SJordan Rupprecht self.do_test_checking_variable(False) 68*99451b44SJordan Rupprecht 69*99451b44SJordan Rupprecht def test_checking_variable_cli(self): 70*99451b44SJordan Rupprecht """Test that we can call SBValue API's from a scripted thread plan - using cli to step""" 71*99451b44SJordan Rupprecht self.do_test_checking_variable(True) 72*99451b44SJordan Rupprecht 73*99451b44SJordan Rupprecht def do_test_checking_variable(self, use_cli): 74*99451b44SJordan Rupprecht self.build() 75*99451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, 76*99451b44SJordan Rupprecht "Set a breakpoint here", 77*99451b44SJordan Rupprecht self.main_source_file) 78*99451b44SJordan Rupprecht 79*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 80*99451b44SJordan Rupprecht self.assertEqual("foo", frame.GetFunctionName()) 81*99451b44SJordan Rupprecht foo_val = frame.FindVariable("foo") 82*99451b44SJordan Rupprecht self.assertTrue(foo_val.GetError().Success(), "Got the foo variable") 83*99451b44SJordan Rupprecht self.assertEqual(foo_val.GetValueAsUnsigned(), 10, "foo starts at 10") 84*99451b44SJordan Rupprecht 85*99451b44SJordan Rupprecht if use_cli: 86*99451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 87*99451b44SJordan Rupprecht self.dbg.GetCommandInterpreter().HandleCommand( 88*99451b44SJordan Rupprecht "thread step-scripted -C Steps.StepUntil -k variable_name -v foo", 89*99451b44SJordan Rupprecht result) 90*99451b44SJordan Rupprecht self.assertTrue(result.Succeeded()) 91*99451b44SJordan Rupprecht else: 92*99451b44SJordan Rupprecht args_data = lldb.SBStructuredData() 93*99451b44SJordan Rupprecht data = lldb.SBStream() 94*99451b44SJordan Rupprecht data.Print('{"variable_name" : "foo"}') 95*99451b44SJordan Rupprecht error = args_data.SetFromJSON(data) 96*99451b44SJordan Rupprecht self.assertTrue(error.Success(), "Made the args_data correctly") 97*99451b44SJordan Rupprecht 98*99451b44SJordan Rupprecht err = thread.StepUsingScriptedThreadPlan("Steps.StepUntil", args_data, True) 99*99451b44SJordan Rupprecht self.assertTrue(err.Success(), err.GetCString()) 100*99451b44SJordan Rupprecht 101*99451b44SJordan Rupprecht # We should not have exited: 102*99451b44SJordan Rupprecht self.assertEqual(process.GetState(), lldb.eStateStopped, "We are stopped") 103*99451b44SJordan Rupprecht 104*99451b44SJordan Rupprecht # We should still be in foo: 105*99451b44SJordan Rupprecht self.assertEqual("foo", frame.GetFunctionName()) 106*99451b44SJordan Rupprecht 107*99451b44SJordan Rupprecht # And foo should have changed: 108*99451b44SJordan Rupprecht self.assertTrue(foo_val.GetValueDidChange(), "Foo changed") 109