13d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar""" 23d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel DunbarTest discovery functions. 33d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar""" 43d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 54b3e5f24ecedc075a3d9f1a5bdb77190a3a01f22Daniel Dunbarimport copy 63d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbarimport os 73d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbarimport sys 83d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 98c59003cc382e4b2fb15b267aa2d356e869a89ccDaniel Dunbarimport lit.run 103d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbarfrom lit.TestingConfig import TestingConfig 1147896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbarfrom lit import LitConfig, Test 123d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 133d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef dirContainsTestSuite(path, lit_config): 143d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cfgpath = os.path.join(path, lit_config.site_config_name) 153d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if os.path.exists(cfgpath): 163d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return cfgpath 173d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cfgpath = os.path.join(path, lit_config.config_name) 183d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if os.path.exists(cfgpath): 193d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return cfgpath 203d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 213d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef getTestSuite(item, litConfig, cache): 223d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar """getTestSuite(item, litConfig, cache) -> (suite, relative_path) 233d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 243d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar Find the test suite containing @arg item. 253d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 263d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar @retval (None, ...) - Indicates no test suite contains @arg item. 273d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar @retval (suite, relative_path) - The suite that @arg item is in, and its 283d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar relative path inside that suite. 293d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar """ 303d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar def search1(path): 313d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Check for a site config or a lit config. 323d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cfgpath = dirContainsTestSuite(path, litConfig) 333d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 343d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # If we didn't find a config file, keep looking. 353d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if not cfgpath: 363d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar parent,base = os.path.split(path) 373d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if parent == path: 383d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return (None, ()) 393d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 403d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar ts, relative = search(parent) 413d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return (ts, relative + (base,)) 423d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 436c749c5fbc94a9f133ed05e389aab4309f187684Daniel Dunbar # We found a test suite, create a new config for it and load it. 443d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if litConfig.debug: 453d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig.note('loading suite config %r' % cfgpath) 463d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 476c749c5fbc94a9f133ed05e389aab4309f187684Daniel Dunbar cfg = TestingConfig.fromdefaults(litConfig) 486c749c5fbc94a9f133ed05e389aab4309f187684Daniel Dunbar cfg.load_from_path(cfgpath, litConfig) 493d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar source_root = os.path.realpath(cfg.test_source_root or path) 503d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar exec_root = os.path.realpath(cfg.test_exec_root or path) 513d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return Test.TestSuite(cfg.name, source_root, exec_root, cfg), () 523d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 533d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar def search(path): 543d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Check for an already instantiated test suite. 553d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar res = cache.get(path) 563d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if res is None: 573d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cache[path] = res = search1(path) 583d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return res 593d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 603d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Canonicalize the path. 613d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar item = os.path.realpath(item) 623d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 633d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Skip files and virtual components. 643d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar components = [] 653d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar while not os.path.isdir(item): 663d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar parent,base = os.path.split(item) 673d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if parent == item: 683d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return (None, ()) 693d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar components.append(base) 703d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar item = parent 713d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar components.reverse() 723d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 733d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar ts, relative = search(item) 743d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return ts, tuple(relative + tuple(components)) 753d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 763d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef getLocalConfig(ts, path_in_suite, litConfig, cache): 773d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar def search1(path_in_suite): 783d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Get the parent config. 793d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if not path_in_suite: 803d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar parent = ts.config 813d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar else: 823d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar parent = search(path_in_suite[:-1]) 833d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 843279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar # Check if there is a local configuration file. 853d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar source_path = ts.getSourcePath(path_in_suite) 863d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cfgpath = os.path.join(source_path, litConfig.local_config_name) 873279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar 883279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar # If not, just reuse the parent config. 893279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar if not os.path.exists(cfgpath): 903279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar return parent 913279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar 923279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar # Otherwise, copy the current config and load the local configuration 933279653eb85d2f09175f6a2deb0a12b93fed9ecfDaniel Dunbar # file into it. 944b3e5f24ecedc075a3d9f1a5bdb77190a3a01f22Daniel Dunbar config = copy.copy(parent) 953d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if litConfig.debug: 963d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig.note('loading local config %r' % cfgpath) 976c749c5fbc94a9f133ed05e389aab4309f187684Daniel Dunbar config.load_from_path(cfgpath, litConfig) 986c749c5fbc94a9f133ed05e389aab4309f187684Daniel Dunbar return config 993d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1003d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar def search(path_in_suite): 1013d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar key = (ts, path_in_suite) 1023d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar res = cache.get(key) 1033d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if res is None: 1043d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar cache[key] = res = search1(path_in_suite) 1053d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return res 1063d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1073d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return search(path_in_suite) 1083d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1093d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef getTests(path, litConfig, testSuiteCache, localConfigCache): 1103d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Find the test suite for this input and its relative path. 1113d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar ts,path_in_suite = getTestSuite(path, litConfig, testSuiteCache) 1123d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if ts is None: 1133d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig.warning('unable to find test suite for %r' % path) 1143d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return (),() 1153d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1163d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if litConfig.debug: 1173d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig.note('resolved input %r to %r::%r' % (path, ts.name, 1183d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar path_in_suite)) 1193d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1203d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return ts, getTestsInSuite(ts, path_in_suite, litConfig, 1213d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar testSuiteCache, localConfigCache) 1223d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1233d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef getTestsInSuite(ts, path_in_suite, litConfig, 1243d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar testSuiteCache, localConfigCache): 1253d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Check that the source path exists (errors here are reported by the 1263d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # caller). 1273d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar source_path = ts.getSourcePath(path_in_suite) 1283d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if not os.path.exists(source_path): 1293d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return 1303d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1313d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Check if the user named a test directly. 1323d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if not os.path.isdir(source_path): 1333d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar lc = getLocalConfig(ts, path_in_suite[:-1], litConfig, localConfigCache) 1343d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar yield Test.Test(ts, path_in_suite, lc) 1353d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return 1363d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1373d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Otherwise we have a directory to search for tests, start by getting the 1383d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # local configuration. 1393d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar lc = getLocalConfig(ts, path_in_suite, litConfig, localConfigCache) 1403d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1413d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Search for tests. 1423d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if lc.test_format is not None: 1433d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for res in lc.test_format.getTestsInDirectory(ts, path_in_suite, 1443d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig, lc): 1453d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar yield res 1463d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1473d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Search subdirectories. 1483d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for filename in os.listdir(source_path): 1493d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # FIXME: This doesn't belong here? 150aa3a85e2fadcf33d18b00c1654108e85ef704361Daniel Dunbar if filename in ('Output', '.svn', '.git') or filename in lc.excludes: 1513d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar continue 1523d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1533d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Ignore non-directories. 1543d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar file_sourcepath = os.path.join(source_path, filename) 1553d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if not os.path.isdir(file_sourcepath): 1563d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar continue 1573d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1583d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Check for nested test suites, first in the execpath in case there is a 1593d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # site configuration and then in the source path. 160406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar subpath = path_in_suite + (filename,) 161406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar file_execpath = ts.getExecPath(subpath) 1623d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if dirContainsTestSuite(file_execpath, litConfig): 163406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar sub_ts, subpath_in_suite = getTestSuite(file_execpath, litConfig, 164406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar testSuiteCache) 1653d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar elif dirContainsTestSuite(file_sourcepath, litConfig): 166406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar sub_ts, subpath_in_suite = getTestSuite(file_sourcepath, litConfig, 167406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar testSuiteCache) 1683d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar else: 1693d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar sub_ts = None 1703d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 171406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar # If the this directory recursively maps back to the current test suite, 172406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar # disregard it (this can happen if the exec root is located inside the 173406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar # current test suite, for example). 174406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar if sub_ts is ts: 175406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar continue 176406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar 177406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar # Otherwise, load from the nested test suite, if present. 178406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar if sub_ts is not None: 179406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar subiter = getTestsInSuite(sub_ts, subpath_in_suite, litConfig, 180406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar testSuiteCache, localConfigCache) 181406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar else: 182406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar subiter = getTestsInSuite(ts, subpath, litConfig, testSuiteCache, 183406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar localConfigCache) 184406ef447074421f91c01c41f0e26fdef937e627cDaniel Dunbar 1853d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar N = 0 1863d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for res in subiter: 1873d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar N += 1 1883d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar yield res 1893d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if sub_ts and not N: 1903d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar litConfig.warning('test suite %r contained no tests' % sub_ts.name) 1913d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1923d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef find_tests_for_inputs(lit_config, inputs): 1933d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar """ 1943d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar find_tests_for_inputs(lit_config, inputs) -> [Test] 1953d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 1963d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar Given a configuration object and a list of input specifiers, find all the 1973d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar tests to execute. 1983d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar """ 1993d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 2003d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Expand '@...' form in inputs. 2013d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar actual_inputs = [] 2023d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for input in inputs: 203cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if input.startswith('@'): 2043d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar f = open(input[1:]) 2053d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar try: 2063d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for ln in f: 2073d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar ln = ln.strip() 2083d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if ln: 2093d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar actual_inputs.append(ln) 2103d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar finally: 2113d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar f.close() 212cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines else: 213cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines actual_inputs.append(input) 2143d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 2153d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # Load the tests from the inputs. 2163d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar tests = [] 2173d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar test_suite_cache = {} 2183d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar local_config_cache = {} 2193d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar for input in actual_inputs: 2203d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar prev = len(tests) 2213d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar tests.extend(getTests(input, lit_config, 2223d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar test_suite_cache, local_config_cache)[1]) 2233d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if prev == len(tests): 2243d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar lit_config.warning('input %r contained no tests' % input) 2253d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 2263d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar # If there were any errors during test discovery, exit now. 2273d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar if lit_config.numErrors: 2280d038e3e8852bf4fde949136ca9c2815f64febd0Daniel Dunbar sys.stderr.write('%d errors, exiting.\n' % lit_config.numErrors) 2293d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar sys.exit(2) 2303d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar 2313d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar return tests 23247896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar 23347896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbardef load_test_suite(inputs): 23447896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar import platform 23547896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar import unittest 23647896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar from lit.LitTestCase import LitTestCase 23747896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar 23847896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar # Create the global config object. 23947896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar litConfig = LitConfig.LitConfig(progname = 'lit', 24047896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar path = [], 24147896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar quiet = False, 24247896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar useValgrind = False, 24347896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar valgrindLeakCheck = False, 24447896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar valgrindArgs = [], 2458f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi noExecute = False, 24647896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar debug = False, 24747896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar isWindows = (platform.system()=='Windows'), 24847896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar params = {}) 24947896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar 2508c59003cc382e4b2fb15b267aa2d356e869a89ccDaniel Dunbar # Perform test discovery. 2518c59003cc382e4b2fb15b267aa2d356e869a89ccDaniel Dunbar run = lit.run.Run(litConfig, find_tests_for_inputs(litConfig, inputs)) 25247896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar 25347896090f30fe9f37a776b46e285b1d6d8b1ad9bDaniel Dunbar # Return a unittest test suite which just runs the tests in order. 2548c59003cc382e4b2fb15b267aa2d356e869a89ccDaniel Dunbar return unittest.TestSuite([LitTestCase(test, run) 2558c59003cc382e4b2fb15b267aa2d356e869a89ccDaniel Dunbar for test in run.tests]) 256