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