TestConvenienceVariables.py revision d7470c205e4f159a4e16937d0e0d31c069df6270
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer"""Test convenience variables when you drop in from lldb prompt into an embedded interpreter."""
263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeimport os
46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeimport unittest2
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattnerimport lldb
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattnerimport pexpect
763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukmanfrom lldbtest import *
86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeclass ConvenienceVariablesCase(TestBase):
106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    mydir = os.path.join("functionalities", "embedded_interpreter")
1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman
139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    @dsym_test
159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    def test_with_dsym_and_run_command(self):
169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame."""
176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.buildDsym()
186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.convenience_variables()
196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    @dwarf_test
21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    @skipOnLinux # PR-14637: this test case fails sometimes because the input prompt "(lldb)" is missing
22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer    def test_with_dwarf_and_run_commands(self):
231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer        """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame."""
246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.buildDwarf()
256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.convenience_variables()
266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    def setUp(self):
286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        # Call super's setUp().
296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        TestBase.setUp(self)
306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        # Find the line number to break on inside main.cpp.
316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.line = line_number('main.c', 'Hello world.')
32c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke    def convenience_variables(self):
34c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        """Test convenience variables lldb.debugger, lldb.target, lldb.process, lldb.thread, and lldb.frame."""
356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        exe = os.path.join(os.getcwd(), "a.out")
36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        prompt = "(lldb) "
37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        python_prompt = ">>> "
38c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer
39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        # So that the child gets torn down after the test.
40c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        self.child = pexpect.spawn('%s %s %s' % (self.lldbHere, self.lldbOption, exe))
41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        child = self.child
42c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer        # Turn on logging for what the child sends back.
43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke        if self.TraceOn():
446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            child.logfile_read = sys.stdout
45757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke
466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        # Set the breakpoint, run the inferior, when it breaks, issue print on
479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        # the various convenience variables.
489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(prompt)
499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.sendline('breakpoint set -f main.c -l %d' % self.line)
509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(prompt)
519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.sendline('run')
529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(prompt)
539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.sendline('script')
549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(python_prompt)
559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        # Set a flag so that we know during teardown time, we need to exit the
579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        # Python interpreter, then the lldb interpreter.
589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        self.child_in_script_interpreter = True
599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson
609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.sendline('print lldb.debugger')
619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(python_prompt)
626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.expect(child.before, exe=False,
639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson            patterns = ['Debugger \(instance: .*, id: \d\)'])
646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.sendline('print lldb.target')
666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.expect_exact(python_prompt)
676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.expect(child.before, exe=False,
686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            substrs = ['a.out'])
696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.sendline('print lldb.process')
716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.expect_exact(python_prompt)
726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.expect(child.before, exe=False,
736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            patterns = ['SBProcess: pid = \d+, state = stopped, threads = \d, executable = a.out'])
746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.sendline('print lldb.thread')
766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        child.expect_exact(python_prompt)
77fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson        self.expect(child.before, exe=False,
78314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson            patterns = ['SBThread: tid = 0x[0-9a-f]+'])
796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke
809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.sendline('print lldb.frame')
819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson        child.expect_exact(python_prompt)
826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke        self.expect(child.before, exe=False,
836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke            substrs = ['frame #0', 'main.c:%d' % self.line])
84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke
86e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekeif __name__ == '__main__':
879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson    import atexit
88c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    lldb.SBDebugger.Initialize()
89c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    atexit.register(lambda: lldb.SBDebugger.Terminate())
90c8f6c44af46554036084cba21a118266f5e26c0eMichael J. Spencer    unittest2.main()
91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke