1"""
2Test some lldb command abbreviations.
3"""
4
5import os, time
6import unittest2
7import lldb
8from lldbtest import *
9import lldbutil
10
11class AbbreviationsTestCase(TestBase):
12
13    mydir = os.path.join("functionalities", "abbreviation")
14
15    def test_nonrunning_command_abbreviations (self):
16        self.expect("ap script",
17                    startstr = "The following built-in commands may relate to 'script':",
18                    substrs = ['breakpoint command add',
19                               'breakpoint command list',
20                               'breakpoint list',
21                               'command alias',
22                               'expression',
23                               'script'])
24
25        self.runCmd("com a alias com al")
26        self.runCmd("alias gurp help")
27        self.expect("gurp target create",
28                    substrs = ['Syntax: target create <cmd-options> <filename>'])
29        self.runCmd("com u gurp")
30        self.expect("gurp",
31                    COMMAND_FAILED_AS_EXPECTED, error = True,
32                    substrs = ["error: 'gurp' is not a valid command."])
33
34        # Only one matching command: execute it.
35        self.expect("h",
36                    startstr = "The following is a list of built-in, permanent debugger commands:")
37
38        # Execute cleanup function during test tear down
39        def cleanup():
40            self.runCmd("command alias t thread select")
41        self.addTearDownHook(cleanup)
42
43        # Several matching commands: list them and error out.
44        self.runCmd("command unalias t")
45        self.expect("t",
46                    COMMAND_FAILED_AS_EXPECTED, error = True,
47                    substrs = ["Ambiguous command 't'. Possible matches:",
48                               "target", "thread", "type"])
49
50        self.expect("com sou ./change_prompt.lldb",
51                    patterns = ["Executing commands in '.*change_prompt.lldb'"])
52
53        self.expect("settings show prompt",
54                    startstr = 'prompt (string) = "[with-three-trailing-spaces]   "')
55
56
57        self.runCmd("settings clear prompt")
58        self.expect("settings show prompt",
59                    startstr = 'prompt (string) = "(lldb) "')
60
61
62        self.expect("lo li",
63                    startstr = "Logging categories for ")
64
65        self.runCmd("se se prompt 'Sycamore> '")
66        self.expect("se sh prompt",
67                    startstr = 'prompt (string) = "Sycamore> "')
68
69        self.runCmd("se cl prompt")
70        self.expect("set sh prompt",
71                    startstr = 'prompt (string) = "(lldb) "')
72
73        # We don't want to display the stdout if not in TraceOn() mode.
74        if not self.TraceOn():
75            self.HideStdout()
76
77        self.runCmd (r'''sc print "\n\n\tHello!\n"''')
78
79
80    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
81    @dsym_test
82    def test_with_dsym (self):
83        self.buildDsym ()
84        self.running_abbreviations ()
85
86    @dwarf_test
87    def test_with_dwarf (self):
88        self.buildDwarf ()
89        self.running_abbreviations ()
90
91    def running_abbreviations (self):
92        exe = os.path.join (os.getcwd(), "a.out")
93        self.expect("fil " + exe,
94                    patterns = [ "Current executable set to .*a.out.*" ])
95
96        # By default, the setting interpreter.expand-regex-aliases is false.
97        self.expect("_regexp-br product", matching=False,
98                    substrs = [ "breakpoint set --name" ])
99
100        match_object = lldbutil.run_break_set_command (self, "br s -n sum")
101        lldbutil.check_breakpoint_result (self, match_object, symbol_name='sum', symbol_match_exact=False, num_locations=1)
102
103        match_object = lldbutil.run_break_set_command (self, "br s -f main.cpp -l 32")
104        lldbutil.check_breakpoint_result (self, match_object, file_name='main.cpp', line_number=32, num_locations=1)
105
106        self.runCmd("br co a -s python 1 -o 'print frame'")
107        self.expect("br co l 1",
108                    substrs = [ "Breakpoint 1:",
109                                "Breakpoint commands:",
110                                "print frame" ])
111
112        self.runCmd("br co del 1")
113        self.expect("breakpoint command list 1",
114                    startstr = "Breakpoint 1 does not have an associated command.")
115
116        self.expect("br di",
117                    startstr = 'All breakpoints disabled. (3 breakpoints)')
118
119        self.expect("bre e",
120                    startstr = "All breakpoints enabled. (3 breakpoints)")
121
122        self.expect("break list",
123                    substrs = ["1: name = 'product', locations = 1",
124                               "2: name = 'sum', locations = 1",
125                               "3: file = 'main.cpp', line = 32, locations = 1"])
126        self.expect("br cl -l 32 -f main.cpp",
127                    startstr = "1 breakpoints cleared:",
128                    substrs = ["3: file = 'main.cpp', line = 32, locations = 1"])
129
130        # Add a future to terminate the current process being debugged.
131        #
132        # The test framework relies on detecting either "run" or "process launch"
133        # command to automatically kill the inferior upon tear down.
134        # But we'll be using "pro la" command to launch the inferior.
135        self.addTearDownHook(lambda: self.runCmd("process kill"))
136        self.expect("pro la",
137                    patterns = [ "Process .* launched: "])
138
139        self.expect("pro st",
140                    patterns = [ "Process .* stopped",
141                                 "thread #1:",
142                                 "a.out",
143                                 "sum\(a=1238, b=78392\)",
144                                 "at main.cpp\:25",
145                                 "stop reason = breakpoint 2.1" ])
146
147        # ARCH, if not specified, defaults to x86_64.
148        if self.getArchitecture() in ["", 'x86_64', 'i386']:
149            self.expect("dis -f",
150                        startstr = "a.out`sum(int, int)",
151                        substrs = [' mov',
152                                   ' addl ',
153                                   'ret'])
154
155        self.expect("i d l main.cpp",
156                    patterns = ["Line table for .*main.cpp in `a.out"])
157
158        self.expect("i d se",
159                    patterns = ["Dumping sections for [0-9]+ modules."])
160
161        self.expect("i d symf",
162                    patterns = ["Dumping debug symbols for [0-9]+ modules."])
163
164        self.expect("i d symt",
165                    patterns = ["Dumping symbol table for [0-9]+ modules."])
166
167        if sys.platform.startswith("darwin"):
168            self.expect("i li",
169                        substrs = [ 'a.out',
170                                    '/usr/lib/dyld',
171                                    '/usr/lib/libSystem.B.dylib'])
172
173
174if __name__ == '__main__':
175    import atexit
176    lldb.SBDebugger.Initialize()
177    atexit.register(lambda: lldb.SBDebugger.Terminate())
178    unittest2.main()
179
180