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