xref: /openbmc/qemu/tests/tracetool/tracetool-test.py (revision 1abdde1ad42d0ebccc5e8bc574ebe805cd650102)
1#!/usr/bin/python3
2# SPDX-License-Identifier: GPL-2.0-or-later
3
4import os
5from pathlib import Path
6from shutil import copyfile
7from subprocess import check_call
8import sys
9import tempfile
10
11
12def get_formats(backend):
13    formats = [
14        "c",
15        "h",
16    ]
17    if backend in {"ftrace", "log", "simple", "syslog"}:
18        formats += ["rs"]
19    if backend == "dtrace":
20        formats += [
21            "d",
22            "log-stap",
23            "simpletrace-stap",
24            "stap",
25        ]
26    if backend == "ust":
27        formats += [
28            "ust-events-c",
29            "ust-events-h",
30        ]
31    return formats
32
33
34def test_tracetool_one(tracetool, backend, fmt, src_dir, build_dir):
35    rel_filename = backend + "." + fmt
36    actual_file = Path(build_dir, rel_filename)
37    expect_file = Path(src_dir, rel_filename)
38
39    args = [tracetool, f"--format={fmt}", f"--backends={backend}", "--group=testsuite"]
40
41    if fmt.find("stap") != -1:
42        args += ["--binary=qemu", "--probe-prefix=qemu"]
43
44    # Use relative files for both, as these filenames end
45    # up in '#line' statements in the output
46    args += ["trace-events", rel_filename]
47
48    try:
49        check_call(args, cwd=build_dir)
50        actual = actual_file.read_text()
51    finally:
52        actual_file.unlink()
53
54    if os.getenv("QEMU_TEST_REGENERATE", False):
55        print(f"# regenerate {expect_file}")
56        expect_file.write_text(actual)
57
58    expect = expect_file.read_text()
59
60    assert expect == actual
61
62
63def test_tracetool(tracetool, backend, source_dir, build_dir):
64    fail = False
65    scenarios = len(get_formats(backend))
66
67    print(f"1..{scenarios}")
68
69    src_events = Path(source_dir, "trace-events")
70    build_events = Path(build_dir, "trace-events")
71
72    try:
73        # We need a stable relative filename under build dir
74        # for the '#line' statements, so copy over the input
75        copyfile(src_events, build_events)
76
77        num = 1
78        for fmt in get_formats(backend):
79            status = "not ok"
80            hint = ""
81            try:
82                test_tracetool_one(tracetool, backend, fmt, source_dir, build_dir)
83                status = "ok"
84            except Exception as e:
85                print(f"# {e}")
86                fail = True
87                hint = (
88                    " (set QEMU_TEST_REGENERATE=1 to recreate reference "
89                    + "output if tracetool generator was intentionally changed)"
90                )
91            finally:
92                print(f"{status} {num} - {backend}.{fmt}{hint}")
93    finally:
94        build_events.unlink()
95
96    return fail
97
98
99if __name__ == "__main__":
100    if len(sys.argv) != 5:
101        argv0 = sys.argv[0]
102        print("syntax: {argv0} TRACE-TOOL BACKEND SRC-DIR BUILD-DIR", file=sys.stderr)
103        sys.exit(1)
104
105    with tempfile.TemporaryDirectory(prefix=sys.argv[4]) as tmpdir:
106        fail = test_tracetool(sys.argv[1], sys.argv[2], sys.argv[3], tmpdir)
107        if fail:
108            sys.exit(1)
109    sys.exit(0)
110