| #!/usr/bin/python3 |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| |
| import os |
| from pathlib import Path |
| from shutil import copyfile |
| from subprocess import check_call |
| import sys |
| import tempfile |
| |
| |
| def get_formats(backend): |
| formats = [ |
| "c", |
| "h", |
| ] |
| if backend == "dtrace": |
| formats += [ |
| "d", |
| "log-stap", |
| "simpletrace-stap", |
| "stap", |
| ] |
| if backend == "ust": |
| formats += [ |
| "ust-events-c", |
| "ust-events-h", |
| ] |
| return formats |
| |
| |
| def test_tracetool_one(tracetool, backend, fmt, src_dir, build_dir): |
| rel_filename = backend + "." + fmt |
| actual_file = Path(build_dir, rel_filename) |
| expect_file = Path(src_dir, rel_filename) |
| |
| args = [tracetool, f"--format={fmt}", f"--backends={backend}", "--group=testsuite"] |
| |
| if fmt.find("stap") != -1: |
| args += ["--binary=qemu", "--probe-prefix=qemu"] |
| |
| # Use relative files for both, as these filenames end |
| # up in '#line' statements in the output |
| args += ["trace-events", rel_filename] |
| |
| try: |
| check_call(args, cwd=build_dir) |
| actual = actual_file.read_text() |
| finally: |
| actual_file.unlink() |
| |
| if os.getenv("QEMU_TEST_REGENERATE", False): |
| print(f"# regenerate {expect_file}") |
| expect_file.write_text(actual) |
| |
| expect = expect_file.read_text() |
| |
| assert expect == actual |
| |
| |
| def test_tracetool(tracetool, backend, source_dir, build_dir): |
| fail = False |
| scenarios = len(get_formats(backend)) |
| |
| print(f"1..{scenarios}") |
| |
| src_events = Path(source_dir, "trace-events") |
| build_events = Path(build_dir, "trace-events") |
| |
| try: |
| # We need a stable relative filename under build dir |
| # for the '#line' statements, so copy over the input |
| copyfile(src_events, build_events) |
| |
| num = 1 |
| for fmt in get_formats(backend): |
| status = "not ok" |
| hint = "" |
| try: |
| test_tracetool_one(tracetool, backend, fmt, source_dir, build_dir) |
| status = "ok" |
| except Exception as e: |
| print(f"# {e}") |
| fail = True |
| hint = ( |
| " (set QEMU_TEST_REGENERATE=1 to recreate reference " |
| + "output if tracetool generator was intentionally changed)" |
| ) |
| finally: |
| print(f"{status} {num} - {backend}.{fmt}{hint}") |
| finally: |
| build_events.unlink() |
| |
| return fail |
| |
| |
| if __name__ == "__main__": |
| if len(sys.argv) != 5: |
| argv0 = sys.argv[0] |
| print("syntax: {argv0} TRACE-TOOL BACKEND SRC-DIR BUILD-DIR", file=sys.stderr) |
| sys.exit(1) |
| |
| with tempfile.TemporaryDirectory(prefix=sys.argv[4]) as tmpdir: |
| fail = test_tracetool(sys.argv[1], sys.argv[2], sys.argv[3], tmpdir) |
| if fail: |
| sys.exit(1) |
| sys.exit(0) |