summaryrefslogtreecommitdiffstats
path: root/js/src/gdb/lib-for-tests/prologue.py
blob: c54d2a674ca23159a1ed1dbda1bfe27b6b667b60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import gdb
import os
import re
import sys
import traceback

# testlibdir is set on the GDB command line, via --eval-command python testlibdir=...
sys.path[0:0] = [testlibdir]

# Run the C++ fragment named |fragment|, stopping on entry to |function|
# ('breakpoint', by default) and then select the calling frame.
def run_fragment(fragment, function='breakpoint'):
    # Arrange to stop at a reasonable place in the test program.
    bp = gdb.Breakpoint(function);
    try:
        gdb.execute("run %s" % (fragment,))
        # Check that we did indeed stop by hitting the breakpoint we set.
        assert bp.hit_count == 1
    finally:
        bp.delete()
    gdb.execute('frame 1')

# Assert that |actual| is equal to |expected|; if not, complain in a helpful way.
def assert_eq(actual, expected):
    if actual != expected:
        raise AssertionError("""Unexpected result:
expected: %r
actual:   %r""" % (expected, actual))

# Assert that |expected| regex matches |actual| result; if not, complain in a helpful way.
def assert_match(actual, expected):
    if re.match(expected, actual, re.MULTILINE) == None:
        raise AssertionError("""Unexpected result:
expected pattern: %r
actual:           %r""" % (expected, actual))

# Assert that |value|'s pretty-printed form is |form|. If |value| is a
# string, then evaluate it with gdb.parse_and_eval to produce a value.
def assert_pretty(value, form):
    if isinstance(value, str):
        value = gdb.parse_and_eval(value)
    assert_eq(str(value), form)

# Assert that |value|'s pretty-printed form match the pattern |pattern|. If
# |value| is a string, then evaluate it with gdb.parse_and_eval to produce a
# value.
def assert_regexp_pretty(value, form):
    if isinstance(value, str):
        value = gdb.parse_and_eval(value)
    assert_match(str(value), form)

# Check that the list of registered pretty-printers includes one named
# |printer|, with a subprinter named |subprinter|.
def assert_subprinter_registered(printer, subprinter):
    # Match a line containing |printer| followed by a colon, and then a
    # series of more-indented lines containing |subprinter|.

    names = { 'printer': re.escape(printer), 'subprinter': re.escape(subprinter) }
    pat = r'^( +)%(printer)s *\n(\1 +.*\n)*\1 +%(subprinter)s *\n' % names
    output = gdb.execute('info pretty-printer', to_string=True)
    if not re.search(pat, output, re.MULTILINE):
        raise AssertionError("assert_subprinter_registered failed to find pretty-printer:\n"
                             "  %s:%s\n"
                             "'info pretty-printer' says:\n"
                             "%s" % (printer, subprinter, output))

# Request full stack traces for Python errors.
gdb.execute('set python print-stack full')

# Tell GDB not to ask the user about the things we tell it to do.
gdb.execute('set confirm off', False)

# Some print settings that make testing easier.
gdb.execute('set print static-members off')
gdb.execute('set print address off')
gdb.execute('set print pretty off')
gdb.execute('set width 0')

try:
    # testscript is set on the GDB command line, via:
    # --eval-command python testscript=...
    exec(open(testscript).read())
except AssertionError as err:
    sys.stderr.write('\nAssertion traceback:\n')
    (t, v, tb) = sys.exc_info()
    traceback.print_tb(tb)
    sys.stderr.write('\nTest assertion failed:\n')
    sys.stderr.write(str(err))
    sys.exit(1)