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