File: apptest_audit.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (129 lines) | stat: -rw-r--r-- 3,478 bytes parent folder | download
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import sys
import __pypy__

class TestHook:
    __test__ = False

    def __init__(self, raise_on_events=None, exc_type=RuntimeError):
        self.raise_on_events = raise_on_events or ()
        self.exc_type = exc_type
        self.seen = []
        self.closed = False

    def __enter__(self, *a):
        sys.addaudithook(self)
        return self

    def __exit__(self, *a):
        self.close()
        if hasattr(__pypy__, '_testing_clear_audithooks'):
            __pypy__._testing_clear_audithooks()

    def close(self):
        self.closed = True

    @property
    def seen_events(self):
        return [i[0] for i in self.seen]

    def __call__(self, event, args):
        if self.closed:
            return
        self.seen.append((event, args))
        if event in self.raise_on_events:
            raise self.exc_type("saw event " + event)


def test_simple_hook():
    with TestHook() as hook:
        sys.audit("test_event", 1, 2, 3)
        assert hook.seen[0][0] == "test_event"
        assert hook.seen[0][1] == (1, 2, 3)

def test_two_hooks():
    l = []
    def f(event, args):
        l.append((1, event, args))
    def g(event, args):
        l.append((2, event, args))
    sys.addaudithook(f)
    sys.addaudithook(g)
    try:
        sys.audit("test")
        assert l[-1] == (2, "test", ())
        assert l[-2] == (1, "test", ())
    finally:
        if hasattr(__pypy__, '_testing_clear_audithooks'):
            __pypy__._testing_clear_audithooks()

def test_block_add_hook():
    # Raising an exception should prevent a new hook from being added,
    # but will not propagate out.
    with TestHook(raise_on_events="sys.addaudithook") as hook1:
        with TestHook() as hook2:
            sys.audit("test_event")
            assert "test_event" in hook1.seen_events
            assert hook2.seen_events == []

def test_id_hook():
    with TestHook() as hook:
        x = id(hook)
        assert hook.seen[0] == ("builtins.id", (x, ))

def test_eval():
    def ret1():
        return 1

    with TestHook() as hook:
        res = eval(ret1.__code__)
        assert res == 1
    assert hook.seen == [("exec", (ret1.__code__, ))]

def test_exec():
    def ret1():
        return 1

    with TestHook() as hook:
        exec(ret1.__code__)
    assert hook.seen == [("exec", (ret1.__code__, ))]

def test_donttrace():
    trace_events = []
    audit_events = []
    def trace(frame, evt, *args):
        trace_events.append((evt, frame.f_code, frame.f_lineno))
        return trace
    def audit(evt, *args):
        audit_events.append(evt)
    sys.addaudithook(audit)
    sys.settrace(trace)
    try:
        sys.audit("Überraschung!")
    finally:
        sys.settrace(None)
        if hasattr(__pypy__, '_testing_clear_audithooks'):
            __pypy__._testing_clear_audithooks()
    print(trace_events)
    assert len(trace_events) == 0

def test_cantrace():
    trace_events = []
    audit_events = []
    def trace(frame, evt, *args):
        trace_events.append((evt, frame.f_code, frame.f_lineno))
        return trace
    def audit(evt, *args):
        audit_events.append(evt)
    audit.__cantrace__ = 132
    sys.addaudithook(audit)
    sys.settrace(trace)
    try:
        sys.audit("Überraschung!")
    finally:
        sys.settrace(None)
        if hasattr(__pypy__, '_testing_clear_audithooks'):
            __pypy__._testing_clear_audithooks()
    print(trace_events)
    assert len(trace_events) == 3 # call, line, return