• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""Tests for sys.audit and sys.addaudithook
2"""
3
4import subprocess
5import sys
6import unittest
7from test import support
8
9if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"):
10    raise unittest.SkipTest("test only relevant when sys.audit is available")
11
12AUDIT_TESTS_PY = support.findfile("audit-tests.py")
13
14
15class AuditTest(unittest.TestCase):
16    def do_test(self, *args):
17        with subprocess.Popen(
18            [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
19            encoding="utf-8",
20            stdout=subprocess.PIPE,
21            stderr=subprocess.PIPE,
22        ) as p:
23            p.wait()
24            sys.stdout.writelines(p.stdout)
25            sys.stderr.writelines(p.stderr)
26            if p.returncode:
27                self.fail("".join(p.stderr))
28
29    def run_python(self, *args):
30        events = []
31        with subprocess.Popen(
32            [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
33            encoding="utf-8",
34            stdout=subprocess.PIPE,
35            stderr=subprocess.PIPE,
36        ) as p:
37            p.wait()
38            sys.stderr.writelines(p.stderr)
39            return (
40                p.returncode,
41                [line.strip().partition(" ") for line in p.stdout],
42                "".join(p.stderr),
43            )
44
45    def test_basic(self):
46        self.do_test("test_basic")
47
48    def test_block_add_hook(self):
49        self.do_test("test_block_add_hook")
50
51    def test_block_add_hook_baseexception(self):
52        self.do_test("test_block_add_hook_baseexception")
53
54    def test_pickle(self):
55        support.import_module("pickle")
56
57        self.do_test("test_pickle")
58
59    def test_monkeypatch(self):
60        self.do_test("test_monkeypatch")
61
62    def test_open(self):
63        self.do_test("test_open", support.TESTFN)
64
65    def test_cantrace(self):
66        self.do_test("test_cantrace")
67
68    def test_mmap(self):
69        self.do_test("test_mmap")
70
71    def test_excepthook(self):
72        returncode, events, stderr = self.run_python("test_excepthook")
73        if not returncode:
74            self.fail(f"Expected fatal exception\n{stderr}")
75
76        self.assertSequenceEqual(
77            [("sys.excepthook", " ", "RuntimeError('fatal-error')")], events
78        )
79
80    def test_unraisablehook(self):
81        returncode, events, stderr = self.run_python("test_unraisablehook")
82        if returncode:
83            self.fail(stderr)
84
85        self.assertEqual(events[0][0], "sys.unraisablehook")
86        self.assertEqual(
87            events[0][2],
88            "RuntimeError('nonfatal-error') Exception ignored for audit hook test",
89        )
90
91    def test_winreg(self):
92        support.import_module("winreg")
93        returncode, events, stderr = self.run_python("test_winreg")
94        if returncode:
95            self.fail(stderr)
96
97        self.assertEqual(events[0][0], "winreg.OpenKey")
98        self.assertEqual(events[1][0], "winreg.OpenKey/result")
99        expected = events[1][2]
100        self.assertTrue(expected)
101        self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 0"], events[2])
102        self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 10000"], events[3])
103        self.assertSequenceEqual(["winreg.PyHKEY.Detach", " ", expected], events[4])
104
105    def test_socket(self):
106        support.import_module("socket")
107        returncode, events, stderr = self.run_python("test_socket")
108        if returncode:
109            self.fail(stderr)
110
111        if support.verbose:
112            print(*events, sep='\n')
113        self.assertEqual(events[0][0], "socket.gethostname")
114        self.assertEqual(events[1][0], "socket.__new__")
115        self.assertEqual(events[2][0], "socket.bind")
116        self.assertTrue(events[2][2].endswith("('127.0.0.1', 8080)"))
117
118if __name__ == "__main__":
119    unittest.main()
120