mirror of https://gitlab.com/qemu-project/qemu
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.8 KiB
Python
108 lines
2.8 KiB
Python
#!/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)
|