1ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen"""Test the SBCommandInterpreter APIs."""
2ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
3ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenimport os
4ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenimport unittest2
5ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenimport lldb
6ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenimport pexpect
7ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenfrom lldbtest import *
8ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
9ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenclass CommandInterpreterAPICase(TestBase):
10ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
11ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    mydir = os.path.join("python_api", "interpreter")
12ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
13ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
14ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    @python_api_test
1521b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dsym_test
1621b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    def test_with_dsym_and_process_launch_api(self):
17ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        """Test the SBCommandInterpreter APIs."""
18ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.buildDsym()
19ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.command_interpreter_api()
20ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
21ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    @python_api_test
2221b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen    @dwarf_test
23ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    def test_with_dwarf_and_process_launch_api(self):
24ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        """Test the SBCommandInterpreter APIs."""
25ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.buildDwarf()
26ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.command_interpreter_api()
27ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
28ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    def setUp(self):
29ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        # Call super's setUp().
30ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        TestBase.setUp(self)
31ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        # Find the line number to break on inside main.cpp.
32ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.line = line_number('main.c', 'Hello world.')
33ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
34ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    def command_interpreter_api(self):
35ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        """Test the SBCommandInterpreter APIs."""
36ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        exe = os.path.join(os.getcwd(), "a.out")
37ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
38ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        # Create a target by the debugger.
39ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        target = self.dbg.CreateTarget(exe)
40805fec7ec90a09b94bc4515fcac9b2b03bae153bJohnny Chen        self.assertTrue(target, VALID_TARGET)
41ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
42ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        # Retrieve the associated command interpreter from our debugger.
43ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        ci = self.dbg.GetCommandInterpreter()
44805fec7ec90a09b94bc4515fcac9b2b03bae153bJohnny Chen        self.assertTrue(ci, VALID_COMMAND_INTERPRETER)
45ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
46ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        # Exercise some APIs....
47ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
48ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.HasCommands())
49ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.HasAliases())
50ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.HasAliasOptions())
51ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.CommandExists("breakpoint"))
52ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.CommandExists("target"))
53ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.CommandExists("platform"))
54ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.AliasExists("file"))
55ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.AliasExists("run"))
56ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(ci.AliasExists("bt"))
57ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
58ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        res = lldb.SBCommandReturnObject()
59ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        ci.HandleCommand("breakpoint set -f main.c -l %d" % self.line, res)
60ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(res.Succeeded())
61ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        ci.HandleCommand("process launch", res)
62ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        self.assertTrue(res.Succeeded())
63ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
64bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen        # Boundary conditions should not crash lldb!
65bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen        self.assertFalse(ci.CommandExists(None))
66bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen        self.assertFalse(ci.AliasExists(None))
67bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen        ci.HandleCommand(None, res)
68bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen        self.assertFalse(res.Succeeded())
69c82670a8876d9b78a3f967a2eef054c8c0bce237Johnny Chen        res.AppendMessage("Just appended a message.")
70c82670a8876d9b78a3f967a2eef054c8c0bce237Johnny Chen        res.AppendMessage(None)
71c82670a8876d9b78a3f967a2eef054c8c0bce237Johnny Chen        if self.TraceOn():
72c82670a8876d9b78a3f967a2eef054c8c0bce237Johnny Chen            print res
73bab8cc9b05a2559759ec3252c6c519ca77479675Johnny Chen
743d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen        process = ci.GetProcess()
753d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen        self.assertTrue(process)
76ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
77ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        import lldbutil
783d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen        if process.GetState() != lldb.eStateStopped:
79ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen            self.fail("Process should be in the 'stopped' state, "
80ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen                      "instead the actual state is: '%s'" %
813d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen                      lldbutil.state_type_to_str(process.GetState()))
82ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
83ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen        if self.TraceOn():
843d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen            lldbutil.print_stacktraces(process)
85ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
86ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen
87ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chenif __name__ == '__main__':
88ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    import atexit
89ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    lldb.SBDebugger.Initialize()
90ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
91ac91027caa22212ac35de969fa53348b70e9bb28Johnny Chen    unittest2.main()
92