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