blob: d09246ecc9f9167ef9b2f6a564bc0fc7707941ab [file] [log] [blame]
Jonas Devlieghere1a928f32018-04-18 17:08:49 +00001from __future__ import absolute_import
2import os
3
4import subprocess
5import sys
6
7import lit.Test
8import lit.TestRunner
9import lit.util
10from lit.formats.base import TestFormat
11
Adrian Prantl748310b2018-08-23 17:19:08 +000012def getBuildDir(cmd):
13 found = False
14 for arg in cmd:
15 if found:
16 return arg
17 if arg == '--build-dir':
18 found = True
19 return None
Jonas Devlieghere1a928f32018-04-18 17:08:49 +000020
Adrian Prantl7e6ce432018-08-27 23:06:37 +000021def mkdir_p(path):
22 import errno
23 try:
24 os.makedirs(path)
25 except OSError as e:
26 if e.errno != errno.EEXIST:
27 raise
28 if not os.path.isdir(path):
29 raise OSError(errno.ENOTDIR, "%s is not a directory"%path)
30
Jonas Devlieghere1a928f32018-04-18 17:08:49 +000031class LLDBTest(TestFormat):
32 def __init__(self, dotest_cmd):
33 self.dotest_cmd = dotest_cmd
34
35 def getTestsInDirectory(self, testSuite, path_in_suite, litConfig,
36 localConfig):
37 source_path = testSuite.getSourcePath(path_in_suite)
38 for filename in os.listdir(source_path):
39 # Ignore dot files and excluded tests.
40 if (filename.startswith('.') or filename in localConfig.excludes):
41 continue
42
43 # Ignore files that don't start with 'Test'.
44 if not filename.startswith('Test'):
45 continue
46
47 filepath = os.path.join(source_path, filename)
48 if not os.path.isdir(filepath):
49 base, ext = os.path.splitext(filename)
50 if ext in localConfig.suffixes:
51 yield lit.Test.Test(testSuite, path_in_suite +
52 (filename, ), localConfig)
53
54 def execute(self, test, litConfig):
55 if litConfig.noExecute:
56 return lit.Test.PASS, ''
57
Michal Gorny6dde8362018-06-06 09:44:14 +000058 if test.config.lldb_disable_python:
59 return (lit.Test.UNSUPPORTED, 'Python module disabled')
60
Jonas Devlieghere1a928f32018-04-18 17:08:49 +000061 if test.config.unsupported:
62 return (lit.Test.UNSUPPORTED, 'Test is unsupported')
63
64 testPath, testFile = os.path.split(test.getSourcePath())
Adrian Prantl0e45df42018-08-20 22:00:32 +000065 # On Windows, the system does not always correctly interpret
66 # shebang lines. To make sure we can execute the tests, add
67 # python exe as the first parameter of the command.
Aaron Smithba48c9b2018-04-24 17:08:05 +000068 cmd = [sys.executable] + self.dotest_cmd + [testPath, '-p', testFile]
Jonas Devlieghere1a928f32018-04-18 17:08:49 +000069
Adrian Prantl748310b2018-08-23 17:19:08 +000070 # The macOS system integrity protection (SIP) doesn't allow injecting
71 # libraries into system binaries, but this can be worked around by
72 # copying the binary into a different location.
Adrian Prantl6c7f5882018-08-23 17:51:14 +000073 if 'DYLD_INSERT_LIBRARIES' in test.config.environment and \
Adrian Prantl748310b2018-08-23 17:19:08 +000074 sys.executable.startswith('/System/'):
75 builddir = getBuildDir(cmd)
76 assert(builddir)
Adrian Prantl7e6ce432018-08-27 23:06:37 +000077 mkdir_p(builddir)
Adrian Prantl748310b2018-08-23 17:19:08 +000078 copied_python = os.path.join(builddir, 'copied-system-python')
79 import shutil
80 shutil.copy(sys.executable, os.path.join(builddir, copied_python))
81 cmd[0] = copied_python
82
Jonas Devlieghere1a928f32018-04-18 17:08:49 +000083 try:
84 out, err, exitCode = lit.util.executeCommand(
85 cmd,
86 env=test.config.environment,
87 timeout=litConfig.maxIndividualTestTime)
88 except lit.util.ExecuteCommandTimeoutException:
89 return (lit.Test.TIMEOUT, 'Reached timeout of {} seconds'.format(
90 litConfig.maxIndividualTestTime))
91
92 if exitCode:
93 return lit.Test.FAIL, out + err
94
95 passing_test_line = 'RESULT: PASSED'
96 if passing_test_line not in out and passing_test_line not in err:
97 msg = ('Unable to find %r in dotest output:\n\n%s%s' %
98 (passing_test_line, out, err))
99 return lit.Test.UNRESOLVED, msg
100
101 return lit.Test.PASS, ''