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ňákclass TestGuiBasicDebugCommandTest(PExpectTest): 11c7be982cSLuboš Luňák 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)) 21c7be982cSLuboš Luňák self.expect('br set -f main.c -p "// Break here"', substrs=["Breakpoint 1", "address ="]) 22c7be982cSLuboš Luňák self.expect("run", substrs=["stop reason ="]) 23c7be982cSLuboš Luňák 24c7be982cSLuboš Luňák escape_key = chr(27).encode() 25c7be982cSLuboš Luňák 26aaca2acdSLuboš Luňák # Start the GUI. 27c7be982cSLuboš Luňák self.child.sendline("gui") 28c7be982cSLuboš Luňák 29c7be982cSLuboš Luňák # Simulate a simple debugging session. 30c7be982cSLuboš Luňák self.child.send("s") # step 31c7be982cSLuboš Luňák self.child.expect("return 1; // In function[^\r\n]+<<< Thread 1: step in") 32c7be982cSLuboš Luňák self.child.send("u") # up 33c7be982cSLuboš Luňák self.child.expect_exact("func(); // Break here") 34c7be982cSLuboš Luňák self.child.send("d") # down 35c7be982cSLuboš Luňák self.child.expect_exact("return 1; // In function") 36c7be982cSLuboš Luňák self.child.send("f") # finish 37d689570dSJonas Devlieghere self.child.expect("<<< Thread 1: step out") 38c7be982cSLuboš Luňák self.child.send("s") # move onto the second one 39d689570dSJonas Devlieghere self.child.expect("<<< Thread 1: step in") 40c7be982cSLuboš Luňák self.child.send("n") # step over 41*76bc7729SLuboš Luňák self.child.expect("// Dummy command 1[^\r\n]+<<< Thread 1: step over") 42*76bc7729SLuboš Luňák self.child.send("n") 43*76bc7729SLuboš Luňák 44*76bc7729SLuboš Luňák # Test that 'up' + 'step out' steps out of the selected function. 45*76bc7729SLuboš Luňák self.child.send("s") # move into func_up() 46*76bc7729SLuboš Luňák self.child.expect("// In func_up") 47*76bc7729SLuboš Luňák self.child.send("s") # move into func_down() 48*76bc7729SLuboš Luňák self.child.expect("// In func_down") 49*76bc7729SLuboš Luňák self.child.send("u") # up 50*76bc7729SLuboš Luňák self.child.expect("// In func_up") 51*76bc7729SLuboš Luňák self.child.send("f") # finish 52*76bc7729SLuboš Luňák self.child.expect("// Dummy command 2[^\r\n]+<<< Thread 1: step out") 53*76bc7729SLuboš Luňák self.child.send("n") 54c7be982cSLuboš Luňák 55c7be982cSLuboš Luňák # Press escape to quit the gui 56c7be982cSLuboš Luňák self.child.send(escape_key) 57c7be982cSLuboš Luňák 58c7be982cSLuboš Luňák self.expect_prompt() 59c7be982cSLuboš Luňák self.quit() 60