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