10b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen"""
27c52ff1d83ec262f35c9a825af107735913e7225Johnny ChenAbstract base class of basic types provides a generic type tester method.
30b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen"""
40b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen
50b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chenimport os, time
6091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chenimport re
70b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chenimport lldb
80b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chenfrom lldbtest import *
9431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Inghamimport lldbutil
100b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen
1166a03531e5199f13482e46777f350312a2b950c1Johnny Chendef Msg(var, val, using_frame_variable):
1266a03531e5199f13482e46777f350312a2b950c1Johnny Chen    return "'%s %s' matches the output (from compiled code): %s" % (
136475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        'frame variable --show-types' if using_frame_variable else 'expression' ,var, val)
14091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen
1551a9e00e10d29ba01af7bc2d5efbcf31ec1f76a4Johnny Chenclass GenericTester(TestBase):
160b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen
17091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen    # This is the pattern by design to match the " var = 'value'" output from
18091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen    # printf() stmts (see basic_type.cpp).
19091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen    pattern = re.compile(" (\*?a[^=]*) = '([^=]*)'$")
20091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen
21cdf15137e61a3302c038ee92211cb6ec77a5b04eJohnny Chen    # Assert message.
22cdf15137e61a3302c038ee92211cb6ec77a5b04eJohnny Chen    DATA_TYPE_GROKKED = "Data type from expr parser output is parsed correctly"
23cdf15137e61a3302c038ee92211cb6ec77a5b04eJohnny Chen
24d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen    def setUp(self):
25d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        # Call super's setUp().
26d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        TestBase.setUp(self)
27d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        # We'll use the test method name as the exe_name.
28d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        # There are a bunch of test cases under test/types and we don't want the
29d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        # module cacheing subsystem to be confused with executable name "a.out"
30d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen        # used for all the test cases.
31b7e27f4ed399c04362e2f40ba1d800846b819077Johnny Chen        self.exe_name = self.testMethodName
32d062ee862396d29b8c06c60b9e2c38330cf42665Johnny Chen
334fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen    def tearDown(self):
344fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        """Cleanup the test byproducts."""
354fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        TestBase.tearDown(self)
364fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        #print "Removing golden-output.txt..."
374fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        os.remove("golden-output.txt")
384fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen
39649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #==========================================================================#
40649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # Functions build_and_run() and build_and_run_expr() are generic functions #
41649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # which are called from the Test*Types*.py test cases.  The API client is  #
42649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # responsible for supplying two mandatory arguments: the source file, e.g.,#
43649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # 'int.cpp', and the atoms, e.g., set(['unsigned', 'long long']) to the    #
44649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # functions.  There are also three optional keyword arguments of interest, #
45649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # as follows:                                                              #
46649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #                                                                          #
47649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # dsym -> build for dSYM (defaulted to True)                               #
48649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         True: build dSYM file                                            #
49649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         False: build DWARF map                                           #
50649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # bc -> blockCaptured (defaulted to False)                                 #
51649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         True: testing vars of various basic types from isnide a block    #
52649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         False: testing vars of various basic types from a function       #
53649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    # qd -> quotedDisplay (defaulted to False)                                 #
54649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         True: the output from 'frame var' or 'expr var' contains a pair  #
55649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #               of single quotes around the value                          #
56649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #         False: no single quotes are to be found around the value of      #
57649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #                variable                                                  #
58649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen    #==========================================================================#
598563081f48492def461f065b22d8fc502ea6807cJohnny Chen
608563081f48492def461f065b22d8fc502ea6807cJohnny Chen    def build_and_run(self, source, atoms, dsym=True, bc=False, qd=False):
618563081f48492def461f065b22d8fc502ea6807cJohnny Chen        self.build_and_run_with_source_atoms_expr(source, atoms, expr=False, dsym=dsym, bc=bc, qd=qd)
628563081f48492def461f065b22d8fc502ea6807cJohnny Chen
638563081f48492def461f065b22d8fc502ea6807cJohnny Chen    def build_and_run_expr(self, source, atoms, dsym=True, bc=False, qd=False):
648563081f48492def461f065b22d8fc502ea6807cJohnny Chen        self.build_and_run_with_source_atoms_expr(source, atoms, expr=True, dsym=dsym, bc=bc, qd=qd)
658563081f48492def461f065b22d8fc502ea6807cJohnny Chen
668563081f48492def461f065b22d8fc502ea6807cJohnny Chen    def build_and_run_with_source_atoms_expr(self, source, atoms, expr, dsym=True, bc=False, qd=False):
67c21e523a1a7eb74d74d07990c5c12c16982ad1d9Johnny Chen        # See also Makefile and basic_type.cpp:177.
688563081f48492def461f065b22d8fc502ea6807cJohnny Chen        if bc:
698563081f48492def461f065b22d8fc502ea6807cJohnny Chen            d = {'CXX_SOURCES': source, 'EXE': self.exe_name, 'CFLAGS_EXTRAS': '-DTEST_BLOCK_CAPTURED_VARS'}
708563081f48492def461f065b22d8fc502ea6807cJohnny Chen        else:
718563081f48492def461f065b22d8fc502ea6807cJohnny Chen            d = {'CXX_SOURCES': source, 'EXE': self.exe_name}
728563081f48492def461f065b22d8fc502ea6807cJohnny Chen        if dsym:
738563081f48492def461f065b22d8fc502ea6807cJohnny Chen            self.buildDsym(dictionary=d)
748563081f48492def461f065b22d8fc502ea6807cJohnny Chen        else:
758563081f48492def461f065b22d8fc502ea6807cJohnny Chen            self.buildDwarf(dictionary=d)
768563081f48492def461f065b22d8fc502ea6807cJohnny Chen        self.setTearDownCleanup(dictionary=d)
778563081f48492def461f065b22d8fc502ea6807cJohnny Chen        if expr:
788563081f48492def461f065b22d8fc502ea6807cJohnny Chen            self.generic_type_expr_tester(self.exe_name, atoms, blockCaptured=bc, quotedDisplay=qd)
798563081f48492def461f065b22d8fc502ea6807cJohnny Chen        else:
808563081f48492def461f065b22d8fc502ea6807cJohnny Chen            self.generic_type_tester(self.exe_name, atoms, blockCaptured=bc, quotedDisplay=qd)
818563081f48492def461f065b22d8fc502ea6807cJohnny Chen
828563081f48492def461f065b22d8fc502ea6807cJohnny Chen    def generic_type_tester(self, exe_name, atoms, quotedDisplay=False, blockCaptured=False):
83091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        """Test that variables with basic types are displayed correctly."""
84091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen
854fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        self.runCmd("file %s" % exe_name, CURRENT_EXECUTABLE_SET)
864fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen
87091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # First, capture the golden output emitted by the oracle, i.e., the
88091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # series of printf statements.
894fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        self.runCmd("process launch -o golden-output.txt")
904fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        with open("golden-output.txt") as f:
914fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen            go = f.read()
924fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen
93091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # This golden list contains a list of (variable, value) pairs extracted
94091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # from the golden output.
95091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        gl = []
960b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen
97091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # Scan the golden output line by line, looking for the pattern:
98091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        #
99091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        #     variable = 'value'
100091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        #
101091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        for line in go.split(os.linesep):
1028563081f48492def461f065b22d8fc502ea6807cJohnny Chen            # We'll ignore variables of array types from inside a block.
1038563081f48492def461f065b22d8fc502ea6807cJohnny Chen            if blockCaptured and '[' in line:
1048563081f48492def461f065b22d8fc502ea6807cJohnny Chen                continue
105091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen            match = self.pattern.search(line)
106091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen            if match:
107091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen                var, val = match.group(1), match.group(2)
108091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen                gl.append((var, val))
109091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        #print "golden list:", gl
110091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen
11149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # This test uses a #include of a the "basic_type.cpp" so we need to enable
11249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # always setting inlined breakpoints.
11349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        self.runCmd('settings set target.inline-breakpoint-strategy always')
11449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # And add hooks to restore the settings during tearDown().
11549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        self.addTearDownHook(
11649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers"))
11749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
118091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # Bring the program to the point where we can issue a series of
1196475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        # 'frame variable --show-types' command.
1208563081f48492def461f065b22d8fc502ea6807cJohnny Chen        if blockCaptured:
1218563081f48492def461f065b22d8fc502ea6807cJohnny Chen            break_line = line_number ("basic_type.cpp", "// Break here to test block captured variables.")
1228563081f48492def461f065b22d8fc502ea6807cJohnny Chen        else:
1238563081f48492def461f065b22d8fc502ea6807cJohnny Chen            break_line = line_number ("basic_type.cpp", "// Here is the line we will break on to check variables.")
124431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "basic_type.cpp", break_line, num_expected_locations=1, loc_exact=True)
125e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
126c9aabf097245642531d74410ff1371a97991af64Johnny Chen        self.runCmd("run", RUN_SUCCEEDED)
127c9aabf097245642531d74410ff1371a97991af64Johnny Chen        self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
1288563081f48492def461f065b22d8fc502ea6807cJohnny Chen            substrs = [" at basic_type.cpp:%d" % break_line,
129c9aabf097245642531d74410ff1371a97991af64Johnny Chen                       "stop reason = breakpoint"])
1300b3ee55c77954ce4359499af2a0c27f1f75c10f1Johnny Chen
1316475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        #self.runCmd("frame variable --show-types")
1324ec97859ca68e299b5b2beb0313fffeea9d0119eJohnny Chen
133091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        # Now iterate through the golden list, comparing against the output from
1346475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        # 'frame variable --show-types var'.
135091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen        for var, val in gl:
1366475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            self.runCmd("frame variable --show-types %s" % var)
137091bb1de9d5cd0f974b91da621e638a22f5b03b5Johnny Chen            output = self.res.GetOutput()
138649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen
13951287a1b5f1524f2e6b14254b41a80908b060668Johnny Chen            # The input type is in a canonical form as a set of named atoms.
1408ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen            # The display type string must conatin each and every element.
1415a3a3d968116e73a80b917a8d9c54ccdd92e2a8cJohnny Chen            #
1425a3a3d968116e73a80b917a8d9c54ccdd92e2a8cJohnny Chen            # Example:
1436475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton            #     runCmd: frame variable --show-types a_array_bounded[0]
1445a3a3d968116e73a80b917a8d9c54ccdd92e2a8cJohnny Chen            #     output: (char) a_array_bounded[0] = 'a'
1455a3a3d968116e73a80b917a8d9c54ccdd92e2a8cJohnny Chen            #
1465fed90a7c7f5b496bc6e7453b7aaec2ff8e6399dJohnny Chen            try:
1475fed90a7c7f5b496bc6e7453b7aaec2ff8e6399dJohnny Chen                dt = re.match("^\((.*)\)", output).group(1)
1485fed90a7c7f5b496bc6e7453b7aaec2ff8e6399dJohnny Chen            except:
149cdf15137e61a3302c038ee92211cb6ec77a5b04eJohnny Chen                self.fail(self.DATA_TYPE_GROKKED)
150757396a950315670e3400b97b51a081a8dcb4fc3Johnny Chen
1518ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen            # Expect the display type string to contain each and every atoms.
1528ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen            self.expect(dt,
1538ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen                        "Display type: '%s' must contain the type atoms: '%s'" %
1548ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen                        (dt, atoms),
1558ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen                        exe=False,
1568ba13e6dda85f15dcd83f14d32edbbd99eed2405Johnny Chen                substrs = list(atoms))
157757396a950315670e3400b97b51a081a8dcb4fc3Johnny Chen
158757396a950315670e3400b97b51a081a8dcb4fc3Johnny Chen            # The (var, val) pair must match, too.
15919edbc5223c7ace86c983c3cc6bd9e610cd329c8Johnny Chen            nv = ("%s = '%s'" if quotedDisplay else "%s = %s") % (var, val)
16066a03531e5199f13482e46777f350312a2b950c1Johnny Chen            self.expect(output, Msg(var, val, True), exe=False,
1614ec97859ca68e299b5b2beb0313fffeea9d0119eJohnny Chen                substrs = [nv])
162b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
1638563081f48492def461f065b22d8fc502ea6807cJohnny Chen    def generic_type_expr_tester(self, exe_name, atoms, quotedDisplay=False, blockCaptured=False):
164b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        """Test that variable expressions with basic types are evaluated correctly."""
165b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
1664fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        self.runCmd("file %s" % exe_name, CURRENT_EXECUTABLE_SET)
1674fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen
168b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # First, capture the golden output emitted by the oracle, i.e., the
169b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # series of printf statements.
1704fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        self.runCmd("process launch -o golden-output.txt")
1714fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen        with open("golden-output.txt") as f:
1724fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen            go = f.read()
1734fd809c5b7e71b481f679a52409f76c4a820488dJohnny Chen
174b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # This golden list contains a list of (variable, value) pairs extracted
175b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # from the golden output.
176b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        gl = []
177b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
178b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # Scan the golden output line by line, looking for the pattern:
179b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        #
180b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        #     variable = 'value'
181b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        #
182b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        for line in go.split(os.linesep):
1838563081f48492def461f065b22d8fc502ea6807cJohnny Chen            # We'll ignore variables of array types from inside a block.
1848563081f48492def461f065b22d8fc502ea6807cJohnny Chen            if blockCaptured and '[' in line:
1858563081f48492def461f065b22d8fc502ea6807cJohnny Chen                continue
186b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen            match = self.pattern.search(line)
187b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen            if match:
188b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen                var, val = match.group(1), match.group(2)
189b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen                gl.append((var, val))
190b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        #print "golden list:", gl
191b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
19249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # This test uses a #include of a the "basic_type.cpp" so we need to enable
19349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # always setting inlined breakpoints.
19449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        self.runCmd('settings set target.inline-breakpoint-strategy always')
19549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        # And add hooks to restore the settings during tearDown().
19649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        self.addTearDownHook(
19749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            lambda: self.runCmd("settings set target.inline-breakpoint-strategy headers"))
19849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
199b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # Bring the program to the point where we can issue a series of
20034f99221dcb055d3a35b6174e0d818fdb73da878Johnny Chen        # 'expr' command.
2018563081f48492def461f065b22d8fc502ea6807cJohnny Chen        if blockCaptured:
2028563081f48492def461f065b22d8fc502ea6807cJohnny Chen            break_line = line_number ("basic_type.cpp", "// Break here to test block captured variables.")
2038563081f48492def461f065b22d8fc502ea6807cJohnny Chen        else:
2048563081f48492def461f065b22d8fc502ea6807cJohnny Chen            break_line = line_number ("basic_type.cpp", "// Here is the line we will break on to check variables.")
205431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham        lldbutil.run_break_set_by_file_and_line (self, "basic_type.cpp", break_line, num_expected_locations=1, loc_exact=True)
206431d839a33e9a274e705f7a268a1c9de2ffc2da2Jim Ingham
207c9aabf097245642531d74410ff1371a97991af64Johnny Chen        self.runCmd("run", RUN_SUCCEEDED)
208c9aabf097245642531d74410ff1371a97991af64Johnny Chen        self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
2098563081f48492def461f065b22d8fc502ea6807cJohnny Chen            substrs = [" at basic_type.cpp:%d" % break_line,
210c9aabf097245642531d74410ff1371a97991af64Johnny Chen                       "stop reason = breakpoint"])
211b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
2126475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton        #self.runCmd("frame variable --show-types")
213b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
214b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        # Now iterate through the golden list, comparing against the output from
215c401e37b99cca3482bacb7bc98cc09d69a1cd2acJohnny Chen        # 'expr var'.
216b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen        for var, val in gl:
217118d742036e0a8b04c5efb65a39fa6bbf461aa2fJohnny Chen            # Don't overwhelm the expression mechanism.
21821c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            # This slows down the test suite quite a bit, to enable it, define
21921c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            # the environment variable LLDB_TYPES_EXPR_TIME_WAIT.  For example:
22021c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            #
22121c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            #     export LLDB_TYPES_EXPR_TIME_WAIT=0.5
22221c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            #
22321c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            # causes a 0.5 second delay between 'expression' commands.
22421c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen            if "LLDB_TYPES_EXPR_TIME_WAIT" in os.environ:
22521c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen                time.sleep(float(os.environ["LLDB_TYPES_EXPR_TIME_WAIT"]))
22621c7c21234079dbd52ed25e9a121212663ba242dJohnny Chen
22766a03531e5199f13482e46777f350312a2b950c1Johnny Chen            self.runCmd("expression %s" % var)
228b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen            output = self.res.GetOutput()
229649383a85f4e685e455f0be5997fdd3c508c2627Johnny Chen
23099323d8797f5a75dcbf64937422fbc685cf132b6Johnny Chen            # The input type is in a canonical form as a set of named atoms.
231b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen            # The display type string must conatin each and every element.
232bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            #
233bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            # Example:
234bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            #     runCmd: expr a
2356e81fa35eae0a3c6ca8aee19c4bb2f231b6ab912Johnny Chen            #     output: (double) $0 = 1100.12
236bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            #
237bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            try:
2386e81fa35eae0a3c6ca8aee19c4bb2f231b6ab912Johnny Chen                dt = re.match("^\((.*)\) \$[0-9]+ = ", output).group(1)
239bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            except:
240cdf15137e61a3302c038ee92211cb6ec77a5b04eJohnny Chen                self.fail(self.DATA_TYPE_GROKKED)
241b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
242b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen            # Expect the display type string to contain each and every atoms.
243bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            self.expect(dt,
244bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen                        "Display type: '%s' must contain the type atoms: '%s'" %
245bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen                        (dt, atoms),
246bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen                        exe=False,
247bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen                substrs = list(atoms))
248b6c15f5bcdf67d4912a29623f1a24fb0316de69fJohnny Chen
249bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            # The val part must match, too.
250bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen            valPart = ("'%s'" if quotedDisplay else "%s") % val
25166a03531e5199f13482e46777f350312a2b950c1Johnny Chen            self.expect(output, Msg(var, val, False), exe=False,
252bbeb60e635279b68aa70c512cac5127d4c1f1348Johnny Chen                substrs = [valPart])
253