1b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarfrom __future__ import absolute_import
200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbarimport os
37805cdcab55fe796919c870c1b64c66aa2faa04cNAKAMURA Takumiimport sys
400a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
5b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.Test
6b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.TestRunner
7b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.Util
800a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
97805cdcab55fe796919c870c1b64c66aa2faa04cNAKAMURA TakumikIsWindows = sys.platform in ['win32', 'cygwin']
101ca8559de5cdcb2b68673d8bf815b7ef2fd93643Daniel Dunbar
1100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbarclass GoogleTest(object):
1200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar    def __init__(self, test_sub_dir, test_suffix):
13fb4d9816e79af3562e277631878b1a632bbcd8e1NAKAMURA Takumi        self.test_sub_dir = os.path.normcase(str(test_sub_dir)).split(';')
1400a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        self.test_suffix = str(test_suffix)
1500a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
161ca8559de5cdcb2b68673d8bf815b7ef2fd93643Daniel Dunbar        # On Windows, assume tests will also end in '.exe'.
171ca8559de5cdcb2b68673d8bf815b7ef2fd93643Daniel Dunbar        if kIsWindows:
181ca8559de5cdcb2b68673d8bf815b7ef2fd93643Daniel Dunbar            self.test_suffix += '.exe'
191ca8559de5cdcb2b68673d8bf815b7ef2fd93643Daniel Dunbar
208d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin    def getGTestTests(self, path, litConfig, localConfig):
2100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        """getGTestTests(path) - [name]
228d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin
238d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin        Return the tests available in gtest executable.
248d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin
258d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin        Args:
268d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin          path: String path to a gtest executable
278d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin          litConfig: LitConfig instance
288d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin          localConfig: TestingConfig instance"""
2900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
3099ea6898e18ec1496907a90efedf5b21a2040ea0Daniel Dunbar        try:
31b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar            lines = lit.Util.capture([path, '--gtest_list_tests'],
32b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                                     env=localConfig.environment)
3318fac3c0d22dbdc9b7939042e2e20f443f700761Michael J. Spencer            if kIsWindows:
3418fac3c0d22dbdc9b7939042e2e20f443f700761Michael J. Spencer              lines = lines.replace('\r', '')
3518fac3c0d22dbdc9b7939042e2e20f443f700761Michael J. Spencer            lines = lines.split('\n')
3699ea6898e18ec1496907a90efedf5b21a2040ea0Daniel Dunbar        except:
3799ea6898e18ec1496907a90efedf5b21a2040ea0Daniel Dunbar            litConfig.error("unable to discover google-tests in %r" % path)
3899ea6898e18ec1496907a90efedf5b21a2040ea0Daniel Dunbar            raise StopIteration
3999ea6898e18ec1496907a90efedf5b21a2040ea0Daniel Dunbar
4000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        nested_tests = []
4100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        for ln in lines:
4200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            if not ln.strip():
4300a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                continue
4400a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
4500a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            prefix = ''
4600a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            index = 0
4700a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            while ln[index*2:index*2+2] == '  ':
4800a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                index += 1
4900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            while len(nested_tests) > index:
5000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                nested_tests.pop()
51c8417d7165e156739cd768713db0113383ede07eMichael J. Spencer
5200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            ln = ln[index*2:]
5300a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            if ln.endswith('.'):
5400a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                nested_tests.append(ln)
5500a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            else:
5600a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                yield ''.join(nested_tests) + ln
5700a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
58d5ae2c3a75ccc70290fb19e9424418e9f3b5c17bGalina Kistanova    # Note: path_in_suite should not include the executable name.
59f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov    def getTestsInExecutable(self, testSuite, path_in_suite, execpath,
60f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                             litConfig, localConfig):
61f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov        if not execpath.endswith(self.test_suffix):
62f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov            return
63f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov        (dirname, basename) = os.path.split(execpath)
64f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov        # Discover the tests in this executable.
65f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov        for testname in self.getGTestTests(execpath, litConfig, localConfig):
66d5ae2c3a75ccc70290fb19e9424418e9f3b5c17bGalina Kistanova            testPath = path_in_suite + (basename, testname)
67b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar            yield lit.Test.Test(testSuite, testPath, localConfig)
68d5ae2c3a75ccc70290fb19e9424418e9f3b5c17bGalina Kistanova
6900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar    def getTestsInDirectory(self, testSuite, path_in_suite,
7000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                            litConfig, localConfig):
7100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        source_path = testSuite.getSourcePath(path_in_suite)
7200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        for filename in os.listdir(source_path):
73f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov            filepath = os.path.join(source_path, filename)
74f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov            if os.path.isdir(filepath):
75f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                # Iterate over executables in a directory.
76280423558dc9004ed686f474b0508ac7a298108aNAKAMURA Takumi                if not os.path.normcase(filename) in self.test_sub_dir:
77280423558dc9004ed686f474b0508ac7a298108aNAKAMURA Takumi                    continue
78d5ae2c3a75ccc70290fb19e9424418e9f3b5c17bGalina Kistanova                dirpath_in_suite = path_in_suite + (filename, )
79f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                for subfilename in os.listdir(filepath):
8000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                    execpath = os.path.join(filepath, subfilename)
81f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                    for test in self.getTestsInExecutable(
82d5ae2c3a75ccc70290fb19e9424418e9f3b5c17bGalina Kistanova                            testSuite, dirpath_in_suite, execpath,
83f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                            litConfig, localConfig):
84f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                      yield test
85f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov            elif ('.' in self.test_sub_dir):
86f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                for test in self.getTestsInExecutable(
87c1a0806ff53bef0abc805a4062cd42b05ef8088bAlexey Samsonov                        testSuite, path_in_suite, filepath,
88f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                        litConfig, localConfig):
89f68cd7543de05dc39e7de6f62ea9380973f38dbeAlexey Samsonov                    yield test
9000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
9100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar    def execute(self, test, litConfig):
9200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        testPath,testName = os.path.split(test.getSourcePath())
93d1ba06bf131a9d217426529d2e28af1f2eeed47aJeffrey Yasskin        while not os.path.exists(testPath):
94d1ba06bf131a9d217426529d2e28af1f2eeed47aJeffrey Yasskin            # Handle GTest parametrized and typed tests, whose name includes
95d1ba06bf131a9d217426529d2e28af1f2eeed47aJeffrey Yasskin            # some '/'s.
966bccb4c2373532b972ecf84e8428f800e5e9995fJeffrey Yasskin            testPath, namePrefix = os.path.split(testPath)
976bccb4c2373532b972ecf84e8428f800e5e9995fJeffrey Yasskin            testName = os.path.join(namePrefix, testName)
9800a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
9900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        cmd = [testPath, '--gtest_filter=' + testName]
100355471741b00fbdb0085c6a24b1fdce0c78e84f3Jeffrey Yasskin        if litConfig.useValgrind:
10132989deb9641cf3878686b5634311a7a125f8f02Jeffrey Yasskin            cmd = litConfig.valgrindArgs + cmd
102355471741b00fbdb0085c6a24b1fdce0c78e84f3Jeffrey Yasskin
1038f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi        if litConfig.noExecute:
10467578407995766682d237bf184916a30e763e8d4NAKAMURA Takumi            return lit.Test.PASS, ''
1058f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi
106b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        out, err, exitCode = lit.TestRunner.executeCommand(
1078d280fb50a1c35a4b598bf722038b7f0d71e90d0Jeffrey Yasskin            cmd, env=test.config.environment)
108c8417d7165e156739cd768713db0113383ede07eMichael J. Spencer
10900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        if not exitCode:
110b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar            return lit.Test.PASS,''
11100a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
112b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        return lit.Test.FAIL, out + err
11300a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
11400a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar###
11500a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
11600a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbarclass FileBasedTest(object):
11700a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar    def getTestsInDirectory(self, testSuite, path_in_suite,
11800a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                            litConfig, localConfig):
11900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        source_path = testSuite.getSourcePath(path_in_suite)
12000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        for filename in os.listdir(source_path):
121f104f5b17acdc613f76f733cd1c7ea1e4370ab07Daniel Dunbar            # Ignore dot files and excluded tests.
122f104f5b17acdc613f76f733cd1c7ea1e4370ab07Daniel Dunbar            if (filename.startswith('.') or
123f104f5b17acdc613f76f733cd1c7ea1e4370ab07Daniel Dunbar                filename in localConfig.excludes):
124cacaa5bff2d1d57d9e547aa084f67a7bcee44003Daniel Dunbar                continue
125cacaa5bff2d1d57d9e547aa084f67a7bcee44003Daniel Dunbar
12600a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            filepath = os.path.join(source_path, filename)
12700a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar            if not os.path.isdir(filepath):
12800a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                base,ext = os.path.splitext(filename)
12900a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar                if ext in localConfig.suffixes:
130b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                    yield lit.Test.Test(testSuite, path_in_suite + (filename,),
131b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                                        localConfig)
13200a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
13300a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbarclass ShTest(FileBasedTest):
134ee504b8cd78f5d54e4ae6ed2cfff88a9e8226771Daniel Dunbar    def __init__(self, execute_external = False):
13500a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar        self.execute_external = execute_external
13600a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
13700a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar    def execute(self, test, litConfig):
138b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        return lit.TestRunner.executeShTest(test, litConfig,
139b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                                            self.execute_external)
14000a42449ecd9aa243d844ffd1e473fd88fe1a2b1Daniel Dunbar
1417c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar###
1427c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1437c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbarimport re
1447c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbarimport tempfile
1457c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1462cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbarclass OneCommandPerFileTest:
1477c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar    # FIXME: Refactor into generic test for running some command on a directory
1487c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar    # of inputs.
1497c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1502cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar    def __init__(self, command, dir, recursive=False,
1512cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar                 pattern=".*", useTempInput=False):
1522cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        if isinstance(command, str):
1532cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            self.command = [command]
1542cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        else:
1552cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            self.command = list(command)
1562381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar        if dir is not None:
1572381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar            dir = str(dir)
1582381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar        self.dir = dir
1597c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar        self.recursive = bool(recursive)
1607c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar        self.pattern = re.compile(pattern)
1612cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        self.useTempInput = useTempInput
1627c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1637c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar    def getTestsInDirectory(self, testSuite, path_in_suite,
1647c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                            litConfig, localConfig):
1652381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar        dir = self.dir
1662381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar        if dir is None:
1672381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar            dir = testSuite.getSourcePath(path_in_suite)
1682381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar
1692381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar        for dirname,subdirs,filenames in os.walk(dir):
1707c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar            if not self.recursive:
1717c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                subdirs[:] = []
1727c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
173a7193e40e2fa00a1fbb296416d711cc4e3f2a3c0Daniel Dunbar            subdirs[:] = [d for d in subdirs
174a7193e40e2fa00a1fbb296416d711cc4e3f2a3c0Daniel Dunbar                          if (d != '.svn' and
175a7193e40e2fa00a1fbb296416d711cc4e3f2a3c0Daniel Dunbar                              d not in localConfig.excludes)]
176048bac35df3896d0258312e861e7e876e0cdaff9Daniel Dunbar
1777c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar            for filename in filenames:
178cacaa5bff2d1d57d9e547aa084f67a7bcee44003Daniel Dunbar                if (filename.startswith('.') or
179cacaa5bff2d1d57d9e547aa084f67a7bcee44003Daniel Dunbar                    not self.pattern.match(filename) or
1807c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                    filename in localConfig.excludes):
1817c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                    continue
1827c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1837c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                path = os.path.join(dirname,filename)
1842381379d1d2a3a4ac447e82906bc989369865ad4Daniel Dunbar                suffix = path[len(dir):]
1857c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                if suffix.startswith(os.sep):
1867c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                    suffix = suffix[1:]
187b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                test = lit.Test.Test(
188b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                    testSuite, path_in_suite + tuple(suffix.split(os.sep)),
189b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                    localConfig)
1907c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                # FIXME: Hack?
1917c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                test.source_path = path
1927c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar                yield test
1937c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
1942cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar    def createTempInput(self, tmp, test):
1952cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        abstract
1962cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar
1977c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar    def execute(self, test, litConfig):
198048bac35df3896d0258312e861e7e876e0cdaff9Daniel Dunbar        if test.config.unsupported:
199b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar            return (lit.Test.UNSUPPORTED, 'Test is unsupported')
200048bac35df3896d0258312e861e7e876e0cdaff9Daniel Dunbar
2012cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        cmd = list(self.command)
2022cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar
2032cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        # If using temp input, create a temporary file and hand it to the
2042cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        # subclass.
2052cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        if self.useTempInput:
2062cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            tmp = tempfile.NamedTemporaryFile(suffix='.cpp')
2072cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            self.createTempInput(tmp, test)
2082cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            tmp.flush()
2092cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            cmd.append(tmp.name)
210473a09d80a8d3ecb37ac0d01289c79f7cc4fc645Daniel Dunbar        elif hasattr(test, 'source_path'):
2112cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            cmd.append(test.source_path)
212473a09d80a8d3ecb37ac0d01289c79f7cc4fc645Daniel Dunbar        else:
213473a09d80a8d3ecb37ac0d01289c79f7cc4fc645Daniel Dunbar            cmd.append(test.getSourcePath())
2147c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
215b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        out, err, exitCode = lit.TestRunner.executeCommand(cmd)
2167c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
2177c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar        diags = out + err
2187c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar        if not exitCode and not diags.strip():
219b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar            return lit.Test.PASS,''
2207c748661ce1e8898479106bc808cce9b55110f5cDaniel Dunbar
2212cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        # Try to include some useful information.
2222cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        report = """Command: %s\n""" % ' '.join(["'%s'" % a
2232cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar                                                 for a in cmd])
2242cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        if self.useTempInput:
2252cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            report += """Temporary File: %s\n""" % tmp.name
2262cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar            report += "--\n%s--\n""" % open(tmp.name).read()
2272cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar        report += """Output:\n--\n%s--""" % diags
2282cb097d5cddfc9ac7d9f4973f9f8a3d2c9feea72Daniel Dunbar
229b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        return lit.Test.FAIL, report
230