from __future__ import absolute_import
import os
import lit.Test
import lit.util
class TestFormat(object):
def getTestsForPath(self, testSuite, path_in_suite, litConfig, localConfig):
"""
Given the path to a test in the test suite, generates the Lit tests associated
to that path. There can be zero, one or more tests. For example, some testing
formats allow expanding a single path in the test suite into multiple Lit tests
(e.g. they are generated on the fly).
Note that this method is only used when Lit needs to actually perform test
discovery, which is not the case for configs with standalone tests.
"""
yield lit.Test.Test(testSuite, path_in_suite, localConfig)
###
class FileBasedTest(TestFormat):
def getTestsForPath(self, testSuite, path_in_suite, litConfig, localConfig):
"""
Expand each path in a test suite to a Lit test using that path and assuming
it is a file containing the test. File extensions excluded by the configuration
or not contained in the allowed extensions are ignored.
"""
filename = path_in_suite[-1]
# Ignore dot files and excluded tests.
if filename.startswith(".") or filename in localConfig.excludes:
return
base, ext = os.path.splitext(filename)
if ext in localConfig.suffixes:
yield lit.Test.Test(testSuite, path_in_suite, localConfig)
def getTestsInDirectory(self, testSuite, path_in_suite, litConfig, localConfig):
source_path = testSuite.getSourcePath(path_in_suite)
for filename in os.listdir(source_path):
filepath = os.path.join(source_path, filename)
if not os.path.isdir(filepath):
for t in self.getTestsForPath(testSuite, path_in_suite + (filename,), litConfig, localConfig):
yield t
###
# Check exit code of a simple executable with no input
class ExecutableTest(FileBasedTest):
def execute(self, test, litConfig):
if test.config.unsupported:
return lit.Test.UNSUPPORTED
out, err, exitCode = lit.util.executeCommand(test.getSourcePath())
if not exitCode:
return lit.Test.PASS, ""
return lit.Test.FAIL, out + err