TestTargetCommand.py revision 6c49bf469d8b43eaab76a43f7a17ac6137a0380c
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Test some target commands: create, list, select, variable.
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import unittest2
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import lldb
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from lldbtest import *
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class targetCommandTestCase(TestBase):
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mydir = os.path.join("functionalities", "target_command")
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def setUp(self):
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Call super's setUp().
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TestBase.setUp(self)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # Find the line numbers for our breakpoints.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.line_b = line_number('b.c', '// Set break point at this line.')
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.line_c = line_number('c.c', '// Set break point at this line.')
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def test_target_command_with_dwarf(self):
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Test some target commands: create, list, select."""
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        da = {'C_SOURCES': 'a.c', 'EXE': 'a.out'}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDwarf(dictionary=da)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.addTearDownCleanup(dictionary=da)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        db = {'C_SOURCES': 'b.c', 'EXE': 'b.out'}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDwarf(dictionary=db)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.addTearDownCleanup(dictionary=db)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        dc = {'C_SOURCES': 'c.c', 'EXE': 'c.out'}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDwarf(dictionary=dc)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.addTearDownCleanup(dictionary=dc)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.do_target_command()
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # rdar://problem/9763907
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # 'target variable' command fails if the target program has been run
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def test_target_variable_command_with_dsym(self):
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Test 'target variable' command before and after starting the inferior."""
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDsym(dictionary=d)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.addTearDownCleanup(dictionary=d)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.do_target_variable_command('globals')
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def test_target_variable_command_with_dsym_no_fail(self):
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Test 'target variable' command before and after starting the inferior."""
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        d = {'C_SOURCES': 'globals.c', 'EXE': 'globals'}
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.buildDsym(dictionary=d)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.addTearDownCleanup(dictionary=d)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.do_target_variable_command_no_fail('globals')
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def do_target_command(self):
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Exercise 'target create', 'target list', 'target select' commands."""
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        exe_a = os.path.join(os.getcwd(), "a.out")
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        exe_b = os.path.join(os.getcwd(), "b.out")
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        exe_c = os.path.join(os.getcwd(), "c.out")
62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target list")
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        output = self.res.GetOutput()
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if output.startswith("No targets"):
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)            # We start from index 0.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            base = 0
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            # Find the largest index of the existing list.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            import re
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            pattern = re.compile("target #(\d+):")
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            for line in reversed(output.split(os.linesep)):
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                match = pattern.search(line)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                if match:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    # We will start from (index + 1) ....
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    base = int(match.group(1), 10) + 1
77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                    #print "base is:", base
78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                    break;
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target create " + exe_a, CURRENT_EXECUTABLE_SET)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        self.runCmd("target create " + exe_b, CURRENT_EXECUTABLE_SET)
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        self.runCmd("breakpoint set -f %s -l %d" % ('b.c', self.line_b),
85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                    BREAKPOINT_CREATED)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target create " + exe_c, CURRENT_EXECUTABLE_SET)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("breakpoint set -f %s -l %d" % ('c.c', self.line_c),
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    BREAKPOINT_CREATED)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run", RUN_SUCCEEDED)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target list")
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target select %d" % base)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("thread backtrace")
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target select %d" % (base + 2))
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            substrs = ['c.c:%d' % self.line_c,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       'stop reason = breakpoint'])
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.runCmd("target select %d" % (base + 1))
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['b.c:%d' % self.line_b,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       'stop reason = breakpoint'])
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("target list")
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def do_target_variable_command(self, exe_name):
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        """Exercise 'target variable' command before and after starting the inferior."""
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ["my_global_char", "'X'"])
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_global_str', '"abc"'])
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_static_int', '228'])
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str_ptr", matching=False,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str_ptr", matching=True,
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ['"abc"'])
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ['a'])
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("b main")
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run")
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['my_global_str', '"abc"'])
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ['my_static_int', '228'])
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.expect("target variable my_global_str_ptr", matching=False,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ['"abc"'])
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str_ptr", matching=True,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['a'])
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ["my_global_char", "'X'"])
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("c")
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # rdar://problem/9763907
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # 'target variable' command fails if the target program has been run
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_global_str', '"abc"'])
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_static_int', '228'])
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str_ptr", matching=False,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    substrs = ['"abc"'])
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str_ptr", matching=True,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['a'])
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ["my_global_char", "'X'"])
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def do_target_variable_command_no_fail(self, exe_name):
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        """Exercise 'target variable' command before and after starting the inferior."""
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        self.runCmd("file " + exe_name, CURRENT_EXECUTABLE_SET)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ["my_global_char", "'X'"])
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_global_str', '"abc"'])
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_static_int', '228'])
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str_ptr", matching=False,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str_ptr", matching=True,
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['a'])
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("b main")
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.runCmd("run")
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # New feature: you don't need to specify the variable(s) to 'target vaiable'.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        # It will find all the global and static variables in the current compile unit.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable",
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            substrs = ['my_global_char',
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       'my_global_str',
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       'my_global_str_ptr',
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       'my_static_int'])
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['my_global_str', '"abc"'])
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_static_int", VARIABLES_DISPLAYED_CORRECTLY,
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['my_static_int', '228'])
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_str_ptr", matching=False,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str_ptr", matching=True,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['"abc"'])
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable *my_global_str", VARIABLES_DISPLAYED_CORRECTLY,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ['a'])
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        self.expect("target variable my_global_char", VARIABLES_DISPLAYED_CORRECTLY,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    substrs = ["my_global_char", "'X'"])
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__':
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    import atexit
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lldb.SBDebugger.Initialize()
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    atexit.register(lambda: lldb.SBDebugger.Terminate())
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unittest2.main()
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)