146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata""" 246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico GranataTest lldb Python commands. 346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata""" 446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granataimport os, time 646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granataimport unittest2 746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granataimport lldb 846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granatafrom lldbtest import * 946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 1046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granataclass CmdPythonTestCase(TestBase): 1146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 121e90cce7a92bf74510f2ca01ba2ae06eebffb983Johnny Chen mydir = os.path.join("functionalities", "command_script") 1346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 1446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 15a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen @dsym_test 1646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata def test_with_dsym (self): 1746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.buildDsym () 1846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.pycmd_tests () 1946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 20a3ed7d834b0e0c6924ac95629e740682bbcd15baJohnny Chen @dwarf_test 216bc4dcdfbcdfa455299d2123011b82a77351ee72Daniel Malea @skipIfLinux # causes buildbot failures, skip until we can investigate it 2246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata def test_with_dwarf (self): 2346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.buildDwarf () 2446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.pycmd_tests () 2546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 2646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata def pycmd_tests (self): 2746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata exe = os.path.join (os.getcwd(), "a.out") 2846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect("file " + exe, 2946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata patterns = [ "Current executable set to .*a.out" ]) 3046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 3146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.runCmd("command source py_import") 3246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 3330640cce87a2a8ea138334ac55225983a585d77eJohnny Chen # This is the function to remove the custom commands in order to have a 3430640cce87a2a8ea138334ac55225983a585d77eJohnny Chen # clean slate for the next test case. 3530640cce87a2a8ea138334ac55225983a585d77eJohnny Chen def cleanup(): 3630640cce87a2a8ea138334ac55225983a585d77eJohnny Chen self.runCmd('command script delete welcome', check=False) 3730640cce87a2a8ea138334ac55225983a585d77eJohnny Chen self.runCmd('command script delete targetname', check=False) 3830640cce87a2a8ea138334ac55225983a585d77eJohnny Chen self.runCmd('command script delete longwait', check=False) 396010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd('command script delete mysto', check=False) 406010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd('command script delete tell_sync', check=False) 416010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd('command script delete tell_async', check=False) 426010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd('command script delete tell_curr', check=False) 432fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen self.runCmd('command script delete bug11569', check=False) 4430640cce87a2a8ea138334ac55225983a585d77eJohnny Chen 4530640cce87a2a8ea138334ac55225983a585d77eJohnny Chen # Execute the cleanup function during test case tear down. 4630640cce87a2a8ea138334ac55225983a585d77eJohnny Chen self.addTearDownHook(cleanup) 4730640cce87a2a8ea138334ac55225983a585d77eJohnny Chen 488b5c29d670643d4c7c1c54b4f866ee65544cc902Daniel Malea # Interact with debugger in synchronous mode 498b5c29d670643d4c7c1c54b4f866ee65544cc902Daniel Malea self.setAsync(False) 508b5c29d670643d4c7c1c54b4f866ee65544cc902Daniel Malea 51752296193c7d9fff8c3486f04e392977cd973f0dJohnny Chen # We don't want to display the stdout if not in TraceOn() mode. 52752296193c7d9fff8c3486f04e392977cd973f0dJohnny Chen if not self.TraceOn(): 53752296193c7d9fff8c3486f04e392977cd973f0dJohnny Chen self.HideStdout() 54752296193c7d9fff8c3486f04e392977cd973f0dJohnny Chen 5546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('welcome Enrico', 5646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['Hello Enrico, welcome to LLDB']); 5746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 5846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect("help welcome", 5946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['Just a docstring for welcome_impl', 6046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 'A command that says hello to LLDB users']) 6146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 621ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata self.expect("help", 631ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata substrs = ['Run Python function welcome.welcome_impl', 641ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 'welcome']) 651ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 661ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata self.expect("help -a", 671ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata substrs = ['Run Python function welcome.welcome_impl', 681ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 'welcome']) 691ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 701ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata self.expect("help -u", matching=False, 711ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata substrs = ['Run Python function welcome.welcome_impl', 721ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 'welcome']) 731ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata 7446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.runCmd("command script delete welcome"); 7546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 7646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('welcome Enrico', matching=False, error=True, 7746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['Hello Enrico, welcome to LLDB']); 7846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 7946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('targetname', 8046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['a.out']) 8146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 8246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('targetname fail', error=True, 8346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['a test for error in command']) 8446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 8546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('command script list', 8646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['targetname', 8746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 'Run Python function welcome.target_name_impl']) 8846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 8946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect("help targetname", 9046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['Run Python function welcome.target_name_imp', 91c315bdc8aa2ba51fca4d47bf61afa31c9118c0bdEnrico Granata 'This command takes','\'raw\' input', 9246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 'quote stuff']) 9346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 9446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect("longwait", 9546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['Done; if you saw the delays I am doing OK']) 9646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 976010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd("b main") 986010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd("run") 996010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd("mysto 3") 1006010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect("frame variable array", 1016010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata substrs = ['[0] = 79630','[1] = 388785018','[2] = 0']) 1026010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.runCmd("mysto 3") 1036010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect("frame variable array", 1046010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata substrs = ['[0] = 79630','[4] = 388785018','[5] = 0']) 1056010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata 1066010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata# we cannot use the stepover command to check for async execution mode since LLDB 1076010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata# seems to get confused when events start to queue up 1086010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect("tell_sync", 1096010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata substrs = ['running sync']) 1106010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect("tell_async", 1116010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata substrs = ['running async']) 1126010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect("tell_curr", 1138b5c29d670643d4c7c1c54b4f866ee65544cc902Daniel Malea substrs = ['I am running sync']) 1146010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata 115004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea # Test that a python command can redefine itself 116004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.expect('command script add -f foobar welcome') 1176010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata 11846623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.runCmd("command script clear") 11946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 120004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea # Test that re-defining an existing command works 121004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.runCmd('command script add my_command --function welcome.welcome_impl') 122004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.expect('my_command Blah', substrs = ['Hello Blah, welcome to LLDB']) 123004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea 124004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.runCmd('command script add my_command --function welcome.target_name_impl') 125004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.expect('my_command', substrs = ['a.out']) 126004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea 127004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea self.runCmd("command script clear") 128004ccb3fcca8c8004cb6cdb1f383b02e792a0452Daniel Malea 12946623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata self.expect('command script list', matching=False, 13046623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata substrs = ['targetname', 13146623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 'longwait']) 13246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 1336010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata self.expect('command script add -f foobar frame', error=True, 1346010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata substrs = ['cannot add command']) 1356010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata 1362fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen # http://llvm.org/bugs/show_bug.cgi?id=11569 1372fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen # LLDBSwigPythonCallCommand crashes when a command script returns an object 1382fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen self.runCmd('command script add -f bug11569 bug11569') 1392fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen # This should not crash. 1402fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen self.runCmd('bug11569', check=False) 1412fcf412d77ef17500c8d0dde82f0ac775f1261e7Johnny Chen 14246623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granataif __name__ == '__main__': 14346623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata import atexit 14446623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata lldb.SBDebugger.Initialize() 14546623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata atexit.register(lambda: lldb.SBDebugger.Terminate()) 14646623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata unittest2.main() 14746623be1656d64a261c0d5e0150c49e9abc82ca1Enrico Granata 148