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