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