[lldb/Util] Add a utility to run transparently capture and replay tests.
[lldb.git] / lldb / utils / lldb-repro / lldb-repro.py
1 #!/usr/bin/env python
2 """lldb-repro
3
4 lldb-repro is a utility to transparently capture and replay debugger sessions
5 through the command line driver. Its used to test the reproducers by running
6 the test suite twice.
7
8 During the first run, with 'capture' as its first argument, it captures a
9 reproducer for every lldb invocation and saves it to a well-know location
10 derived from the arguments and current working directory.
11
12 During the second run, with 'replay' as its first argument, the test suite is
13 run again but this time every invocation of lldb replays the previously
14 recorded session.
15 """
16
17 import sys
18 import os
19 import tempfile
20 import subprocess
21
22
23 def help():
24     print("usage: {} capture|replay [args]".fmt(sys.argv[0]))
25
26
27 def main():
28     if len(sys.argv) < 3:
29         help()
30         return 1
31
32     # Compute a hash based on the input arguments and the current working
33     # directory.
34     args = ' '.join(sys.argv[3:])
35     cwd = os.getcwd()
36     input_hash = str(hash((cwd, args)))
37
38     # Use the hash to "uniquely" identify a reproducer path.
39     reproducer_path = os.path.join(tempfile.gettempdir(), input_hash)
40
41     # Create a new lldb invocation with capture or replay enabled.
42     lldb = os.path.join(os.path.dirname(sys.argv[0]), 'lldb')
43     new_args = [sys.argv[1]]
44     if sys.argv[2] == "replay":
45         new_args.extend(['--replay', reproducer_path])
46     elif sys.argv[2] == "capture":
47         new_args.extend([
48             '--capture', '--capture-path', reproducer_path,
49             '--reproducer-auto-generate'
50         ])
51         new_args.extend(sys.argv[1:])
52     else:
53         help()
54         return 1
55
56     return subprocess.call(new_args)
57
58
59 if __name__ == '__main__':
60     exit(main())