1c7be982cSLuboš Luňák""" 2c7be982cSLuboš LuňákTest the 'gui' shortcuts 's','n','f','u','d' (step in, step over, step out, up, down) 3c7be982cSLuboš Luňák""" 4c7be982cSLuboš Luňák 5c7be982cSLuboš Luňákimport lldb 6c7be982cSLuboš Luňákfrom lldbsuite.test.decorators import * 7c7be982cSLuboš Luňákfrom lldbsuite.test.lldbtest import * 8c7be982cSLuboš Luňákfrom lldbsuite.test.lldbpexpect import PExpectTest 9c7be982cSLuboš Luňák 10c7be982cSLuboš Luňák 11*2238dcc3SJonas Devlieghereclass TestGuiBasicDebugCommandTest(PExpectTest): 12c7be982cSLuboš Luňák # PExpect uses many timeouts internally and doesn't play well 13c7be982cSLuboš Luňák # under ASAN on a loaded machine.. 14c7be982cSLuboš Luňák @skipIfAsan 15c82dbc29SPavel Labath @skipIf(bugnumber="llvm.org/pr51833") 16c7be982cSLuboš Luňák @skipIfCursesSupportMissing 17c7be982cSLuboš Luňák def test_gui(self): 18c7be982cSLuboš Luňák self.build() 19c7be982cSLuboš Luňák 20c7be982cSLuboš Luňák self.launch(executable=self.getBuildArtifact("a.out"), dimensions=(100, 500)) 21*2238dcc3SJonas Devlieghere self.expect( 22*2238dcc3SJonas Devlieghere 'br set -f main.c -p "// Break here"', substrs=["Breakpoint 1", "address ="] 23*2238dcc3SJonas Devlieghere ) 24c7be982cSLuboš Luňák self.expect("run", substrs=["stop reason ="]) 25c7be982cSLuboš Luňák 26c7be982cSLuboš Luňák escape_key = chr(27).encode() 27c7be982cSLuboš Luňák 28aaca2acdSLuboš Luňák # Start the GUI. 29c7be982cSLuboš Luňák self.child.sendline("gui") 30c7be982cSLuboš Luňák 31c7be982cSLuboš Luňák # Simulate a simple debugging session. 32c7be982cSLuboš Luňák self.child.send("s") # step 33c7be982cSLuboš Luňák self.child.expect("return 1; // In function[^\r\n]+<<< Thread 1: step in") 34c7be982cSLuboš Luňák self.child.send("u") # up 35c7be982cSLuboš Luňák self.child.expect_exact("func(); // Break here") 36c7be982cSLuboš Luňák self.child.send("d") # down 37c7be982cSLuboš Luňák self.child.expect_exact("return 1; // In function") 38c7be982cSLuboš Luňák self.child.send("f") # finish 39d689570dSJonas Devlieghere self.child.expect("<<< Thread 1: step out") 40c7be982cSLuboš Luňák self.child.send("s") # move onto the second one 41d689570dSJonas Devlieghere self.child.expect("<<< Thread 1: step in") 42c7be982cSLuboš Luňák self.child.send("n") # step over 4376bc7729SLuboš Luňák self.child.expect("// Dummy command 1[^\r\n]+<<< Thread 1: step over") 4476bc7729SLuboš Luňák self.child.send("n") 4576bc7729SLuboš Luňák 4676bc7729SLuboš Luňák # Test that 'up' + 'step out' steps out of the selected function. 4776bc7729SLuboš Luňák self.child.send("s") # move into func_up() 4876bc7729SLuboš Luňák self.child.expect("// In func_up") 4976bc7729SLuboš Luňák self.child.send("s") # move into func_down() 5076bc7729SLuboš Luňák self.child.expect("// In func_down") 5176bc7729SLuboš Luňák self.child.send("u") # up 5276bc7729SLuboš Luňák self.child.expect("// In func_up") 5376bc7729SLuboš Luňák self.child.send("f") # finish 5476bc7729SLuboš Luňák self.child.expect("// Dummy command 2[^\r\n]+<<< Thread 1: step out") 5576bc7729SLuboš Luňák self.child.send("n") 56c7be982cSLuboš Luňák 57c7be982cSLuboš Luňák # Press escape to quit the gui 58c7be982cSLuboš Luňák self.child.send(escape_key) 59c7be982cSLuboš Luňák 60c7be982cSLuboš Luňák self.expect_prompt() 61c7be982cSLuboš Luňák self.quit() 62