1*99451b44SJordan Rupprecht"""Test the SBCommandInterpreter APIs.""" 2*99451b44SJordan Rupprecht 3*99451b44SJordan Rupprechtfrom __future__ import print_function 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprechtimport lldb 7*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 8*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprechtclass CommandInterpreterAPICase(TestBase): 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 15*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht def setUp(self): 18*99451b44SJordan Rupprecht # Call super's setUp(). 19*99451b44SJordan Rupprecht TestBase.setUp(self) 20*99451b44SJordan Rupprecht # Find the line number to break on inside main.cpp. 21*99451b44SJordan Rupprecht self.line = line_number('main.c', 'Hello world.') 22*99451b44SJordan Rupprecht 23*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 24*99451b44SJordan Rupprecht def test_with_process_launch_api(self): 25*99451b44SJordan Rupprecht """Test the SBCommandInterpreter APIs.""" 26*99451b44SJordan Rupprecht self.build() 27*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 28*99451b44SJordan Rupprecht 29*99451b44SJordan Rupprecht # Create a target by the debugger. 30*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 31*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 32*99451b44SJordan Rupprecht 33*99451b44SJordan Rupprecht # Retrieve the associated command interpreter from our debugger. 34*99451b44SJordan Rupprecht ci = self.dbg.GetCommandInterpreter() 35*99451b44SJordan Rupprecht self.assertTrue(ci, VALID_COMMAND_INTERPRETER) 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht # Exercise some APIs.... 38*99451b44SJordan Rupprecht 39*99451b44SJordan Rupprecht self.assertTrue(ci.HasCommands()) 40*99451b44SJordan Rupprecht self.assertTrue(ci.HasAliases()) 41*99451b44SJordan Rupprecht self.assertTrue(ci.HasAliasOptions()) 42*99451b44SJordan Rupprecht self.assertTrue(ci.CommandExists("breakpoint")) 43*99451b44SJordan Rupprecht self.assertTrue(ci.CommandExists("target")) 44*99451b44SJordan Rupprecht self.assertTrue(ci.CommandExists("platform")) 45*99451b44SJordan Rupprecht self.assertTrue(ci.AliasExists("file")) 46*99451b44SJordan Rupprecht self.assertTrue(ci.AliasExists("run")) 47*99451b44SJordan Rupprecht self.assertTrue(ci.AliasExists("bt")) 48*99451b44SJordan Rupprecht 49*99451b44SJordan Rupprecht res = lldb.SBCommandReturnObject() 50*99451b44SJordan Rupprecht ci.HandleCommand("breakpoint set -f main.c -l %d" % self.line, res) 51*99451b44SJordan Rupprecht self.assertTrue(res.Succeeded()) 52*99451b44SJordan Rupprecht ci.HandleCommand("process launch", res) 53*99451b44SJordan Rupprecht self.assertTrue(res.Succeeded()) 54*99451b44SJordan Rupprecht 55*99451b44SJordan Rupprecht # Boundary conditions should not crash lldb! 56*99451b44SJordan Rupprecht self.assertFalse(ci.CommandExists(None)) 57*99451b44SJordan Rupprecht self.assertFalse(ci.AliasExists(None)) 58*99451b44SJordan Rupprecht ci.HandleCommand(None, res) 59*99451b44SJordan Rupprecht self.assertFalse(res.Succeeded()) 60*99451b44SJordan Rupprecht res.AppendMessage("Just appended a message.") 61*99451b44SJordan Rupprecht res.AppendMessage(None) 62*99451b44SJordan Rupprecht if self.TraceOn(): 63*99451b44SJordan Rupprecht print(res) 64*99451b44SJordan Rupprecht 65*99451b44SJordan Rupprecht process = ci.GetProcess() 66*99451b44SJordan Rupprecht self.assertTrue(process) 67*99451b44SJordan Rupprecht 68*99451b44SJordan Rupprecht import lldbsuite.test.lldbutil as lldbutil 69*99451b44SJordan Rupprecht if process.GetState() != lldb.eStateStopped: 70*99451b44SJordan Rupprecht self.fail("Process should be in the 'stopped' state, " 71*99451b44SJordan Rupprecht "instead the actual state is: '%s'" % 72*99451b44SJordan Rupprecht lldbutil.state_type_to_str(process.GetState())) 73*99451b44SJordan Rupprecht 74*99451b44SJordan Rupprecht if self.TraceOn(): 75*99451b44SJordan Rupprecht lldbutil.print_stacktraces(process) 76*99451b44SJordan Rupprecht 77*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 78*99451b44SJordan Rupprecht def test_command_output(self): 79*99451b44SJordan Rupprecht """Test command output handling.""" 80*99451b44SJordan Rupprecht ci = self.dbg.GetCommandInterpreter() 81*99451b44SJordan Rupprecht self.assertTrue(ci, VALID_COMMAND_INTERPRETER) 82*99451b44SJordan Rupprecht 83*99451b44SJordan Rupprecht # Test that a command which produces no output returns "" instead of 84*99451b44SJordan Rupprecht # None. 85*99451b44SJordan Rupprecht res = lldb.SBCommandReturnObject() 86*99451b44SJordan Rupprecht ci.HandleCommand("settings set use-color false", res) 87*99451b44SJordan Rupprecht self.assertTrue(res.Succeeded()) 88*99451b44SJordan Rupprecht self.assertIsNotNone(res.GetOutput()) 89*99451b44SJordan Rupprecht self.assertEquals(res.GetOutput(), "") 90*99451b44SJordan Rupprecht self.assertIsNotNone(res.GetError()) 91*99451b44SJordan Rupprecht self.assertEquals(res.GetError(), "") 92