1"""Helper functions for gdbstub testing
2
3"""
4from __future__ import print_function
5import gdb
6import os
7import sys
8import traceback
9
10fail_count = 0
11
12
13def report(cond, msg):
14    """Report success/fail of a test"""
15    if cond:
16        print("PASS: {}".format(msg))
17    else:
18        print("FAIL: {}".format(msg))
19        global fail_count
20        fail_count += 1
21
22
23def main(test, expected_arch=None):
24    """Run a test function
25
26    This runs as the script it sourced (via -x, via run-test.py)."""
27    try:
28        inferior = gdb.selected_inferior()
29        arch = inferior.architecture()
30        print("ATTACHED: {}".format(arch.name()))
31        if expected_arch is not None:
32            report(arch.name() == expected_arch,
33                   "connected to {}".format(expected_arch))
34    except (gdb.error, AttributeError):
35        print("SKIP: not connected")
36        exit(0)
37
38    if gdb.parse_and_eval("$pc") == 0:
39        print("SKIP: PC not set")
40        exit(0)
41
42    try:
43        test()
44    except:
45        print("GDB Exception:")
46        traceback.print_exc(file=sys.stdout)
47        global fail_count
48        fail_count += 1
49        if "QEMU_TEST_INTERACTIVE" in os.environ:
50            import code
51            code.InteractiveConsole(locals=globals()).interact()
52        raise
53
54    try:
55        gdb.execute("kill")
56    except gdb.error:
57        pass
58
59    print("All tests complete: {} failures".format(fail_count))
60    gdb.execute(f"exit {fail_count}")
61