annotate lldb/test/API/lldbtest.py @ 227:21e6aa2e49ef

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 19 Jul 2021 06:57:16 +0900
parents 2e18cbf3894f
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 from __future__ import absolute_import
anatofuz
parents:
diff changeset
2 import os
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
3 import tempfile
150
anatofuz
parents:
diff changeset
4 import subprocess
anatofuz
parents:
diff changeset
5 import sys
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
6 import platform
150
anatofuz
parents:
diff changeset
7
anatofuz
parents:
diff changeset
8 import lit.Test
anatofuz
parents:
diff changeset
9 import lit.TestRunner
anatofuz
parents:
diff changeset
10 import lit.util
anatofuz
parents:
diff changeset
11 from lit.formats.base import TestFormat
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 class LLDBTest(TestFormat):
anatofuz
parents:
diff changeset
15 def __init__(self, dotest_cmd):
anatofuz
parents:
diff changeset
16 self.dotest_cmd = dotest_cmd
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 def getTestsInDirectory(self, testSuite, path_in_suite, litConfig,
anatofuz
parents:
diff changeset
19 localConfig):
anatofuz
parents:
diff changeset
20 source_path = testSuite.getSourcePath(path_in_suite)
anatofuz
parents:
diff changeset
21 for filename in os.listdir(source_path):
anatofuz
parents:
diff changeset
22 # Ignore dot files and excluded tests.
anatofuz
parents:
diff changeset
23 if (filename.startswith('.') or filename in localConfig.excludes):
anatofuz
parents:
diff changeset
24 continue
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 # Ignore files that don't start with 'Test'.
anatofuz
parents:
diff changeset
27 if not filename.startswith('Test'):
anatofuz
parents:
diff changeset
28 continue
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 filepath = os.path.join(source_path, filename)
anatofuz
parents:
diff changeset
31 if not os.path.isdir(filepath):
anatofuz
parents:
diff changeset
32 base, ext = os.path.splitext(filename)
anatofuz
parents:
diff changeset
33 if ext in localConfig.suffixes:
anatofuz
parents:
diff changeset
34 yield lit.Test.Test(testSuite, path_in_suite +
anatofuz
parents:
diff changeset
35 (filename, ), localConfig)
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 def execute(self, test, litConfig):
anatofuz
parents:
diff changeset
38 if litConfig.noExecute:
anatofuz
parents:
diff changeset
39 return lit.Test.PASS, ''
anatofuz
parents:
diff changeset
40
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
41 if not getattr(test.config, 'lldb_enable_python', False):
150
anatofuz
parents:
diff changeset
42 return (lit.Test.UNSUPPORTED, 'Python module disabled')
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 if test.config.unsupported:
anatofuz
parents:
diff changeset
45 return (lit.Test.UNSUPPORTED, 'Test is unsupported')
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 testPath, testFile = os.path.split(test.getSourcePath())
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
48
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
49 # The Python used to run lit can be different from the Python LLDB was
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
50 # build with.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
51 executable = test.config.python_executable
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
52
150
anatofuz
parents:
diff changeset
53 # On Windows, the system does not always correctly interpret
anatofuz
parents:
diff changeset
54 # shebang lines. To make sure we can execute the tests, add
anatofuz
parents:
diff changeset
55 # python exe as the first parameter of the command.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
56 cmd = [executable] + self.dotest_cmd + [testPath, '-p', testFile]
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
57
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
58 if 'lldb-repro-capture' in test.config.available_features or \
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
59 'lldb-repro-replay' in test.config.available_features:
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
60 reproducer_path = os.path.join(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
61 test.config.lldb_reproducer_directory, testFile)
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
62 if 'lldb-repro-capture' in test.config.available_features:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
63 cmd.extend(['--capture-path', reproducer_path])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
64 else:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
65 cmd.extend(['--replay-path', reproducer_path])
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66
150
anatofuz
parents:
diff changeset
67 timeoutInfo = None
anatofuz
parents:
diff changeset
68 try:
anatofuz
parents:
diff changeset
69 out, err, exitCode = lit.util.executeCommand(
anatofuz
parents:
diff changeset
70 cmd,
anatofuz
parents:
diff changeset
71 env=test.config.environment,
anatofuz
parents:
diff changeset
72 timeout=litConfig.maxIndividualTestTime)
anatofuz
parents:
diff changeset
73 except lit.util.ExecuteCommandTimeoutException as e:
anatofuz
parents:
diff changeset
74 out = e.out
anatofuz
parents:
diff changeset
75 err = e.err
anatofuz
parents:
diff changeset
76 exitCode = e.exitCode
anatofuz
parents:
diff changeset
77 timeoutInfo = 'Reached timeout of {} seconds'.format(
anatofuz
parents:
diff changeset
78 litConfig.maxIndividualTestTime)
anatofuz
parents:
diff changeset
79
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
80 if sys.version_info.major == 2:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
81 # In Python 2, string objects can contain Unicode characters. Use
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
82 # the non-strict 'replace' decoding mode. We cannot use the strict
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
83 # mode right now because lldb's StringPrinter facility and the
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
84 # Python utf8 decoder have different interpretations of which
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
85 # characters are "printable". This leads to Python utf8 decoding
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 # exceptions even though lldb is behaving as expected.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
87 out = out.decode('utf-8', 'replace')
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
88 err = err.decode('utf-8', 'replace')
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
89
150
anatofuz
parents:
diff changeset
90 output = """Script:\n--\n%s\n--\nExit Code: %d\n""" % (
anatofuz
parents:
diff changeset
91 ' '.join(cmd), exitCode)
anatofuz
parents:
diff changeset
92 if timeoutInfo is not None:
anatofuz
parents:
diff changeset
93 output += """Timeout: %s\n""" % (timeoutInfo,)
anatofuz
parents:
diff changeset
94 output += "\n"
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 if out:
anatofuz
parents:
diff changeset
97 output += """Command Output (stdout):\n--\n%s\n--\n""" % (out,)
anatofuz
parents:
diff changeset
98 if err:
anatofuz
parents:
diff changeset
99 output += """Command Output (stderr):\n--\n%s\n--\n""" % (err,)
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 if timeoutInfo:
anatofuz
parents:
diff changeset
102 return lit.Test.TIMEOUT, output
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 if exitCode:
anatofuz
parents:
diff changeset
105 if 'XPASS:' in out or 'XPASS:' in err:
anatofuz
parents:
diff changeset
106 return lit.Test.XPASS, output
anatofuz
parents:
diff changeset
107
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
108 # Otherwise this is just a failure.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
109 return lit.Test.FAIL, output
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
110
150
anatofuz
parents:
diff changeset
111 has_unsupported_tests = 'UNSUPPORTED:' in out or 'UNSUPPORTED:' in err
anatofuz
parents:
diff changeset
112 has_passing_tests = 'PASS:' in out or 'PASS:' in err
anatofuz
parents:
diff changeset
113 if has_unsupported_tests and not has_passing_tests:
anatofuz
parents:
diff changeset
114 return lit.Test.UNSUPPORTED, output
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 passing_test_line = 'RESULT: PASSED'
anatofuz
parents:
diff changeset
117 if passing_test_line not in out and passing_test_line not in err:
anatofuz
parents:
diff changeset
118 return lit.Test.UNRESOLVED, output
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 return lit.Test.PASS, output