blob: c5ce26323b5f9ec6015d623549420de3727e3980 [file] [log] [blame]
Steve Dowerb82e17e2019-05-23 08:45:22 -07001"""Tests for sys.audit and sys.addaudithook
2"""
3
Steve Dowerb82e17e2019-05-23 08:45:22 -07004import subprocess
5import sys
6import unittest
7from test import support
Hai Shifcce8c62020-08-08 05:55:35 +08008from test.support import import_helper
9from test.support import os_helper
10
Steve Dowerb82e17e2019-05-23 08:45:22 -070011
12if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"):
13 raise unittest.SkipTest("test only relevant when sys.audit is available")
14
Steve Dower9ddc4162019-05-29 08:20:35 -070015AUDIT_TESTS_PY = support.findfile("audit-tests.py")
Steve Dowerb82e17e2019-05-23 08:45:22 -070016
17
18class AuditTest(unittest.TestCase):
Steve Dower9ddc4162019-05-29 08:20:35 -070019 def do_test(self, *args):
Steve Dowerb82e17e2019-05-23 08:45:22 -070020 with subprocess.Popen(
Steve Dower9ddc4162019-05-29 08:20:35 -070021 [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
Steve Dowerb82e17e2019-05-23 08:45:22 -070022 encoding="utf-8",
23 stdout=subprocess.PIPE,
24 stderr=subprocess.PIPE,
25 ) as p:
26 p.wait()
Steve Dower9ddc4162019-05-29 08:20:35 -070027 sys.stdout.writelines(p.stdout)
28 sys.stderr.writelines(p.stderr)
29 if p.returncode:
Steve Dowerbea33f52019-11-28 08:46:11 -080030 self.fail("".join(p.stderr))
31
32 def run_python(self, *args):
33 events = []
34 with subprocess.Popen(
35 [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
36 encoding="utf-8",
37 stdout=subprocess.PIPE,
38 stderr=subprocess.PIPE,
39 ) as p:
40 p.wait()
41 sys.stderr.writelines(p.stderr)
42 return (
43 p.returncode,
44 [line.strip().partition(" ") for line in p.stdout],
45 "".join(p.stderr),
46 )
Steve Dower9ddc4162019-05-29 08:20:35 -070047
48 def test_basic(self):
49 self.do_test("test_basic")
50
51 def test_block_add_hook(self):
52 self.do_test("test_block_add_hook")
53
54 def test_block_add_hook_baseexception(self):
55 self.do_test("test_block_add_hook_baseexception")
56
Steve Dowera5764d32021-06-30 18:52:25 +010057 def test_marshal(self):
58 import_helper.import_module("marshal")
59
60 self.do_test("test_marshal")
61
Steve Dowerb82e17e2019-05-23 08:45:22 -070062 def test_pickle(self):
Hai Shifcce8c62020-08-08 05:55:35 +080063 import_helper.import_module("pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070064
Steve Dower9ddc4162019-05-29 08:20:35 -070065 self.do_test("test_pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070066
67 def test_monkeypatch(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070068 self.do_test("test_monkeypatch")
Steve Dowerb82e17e2019-05-23 08:45:22 -070069
70 def test_open(self):
Hai Shifcce8c62020-08-08 05:55:35 +080071 self.do_test("test_open", os_helper.TESTFN)
Steve Dowerb82e17e2019-05-23 08:45:22 -070072
73 def test_cantrace(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070074 self.do_test("test_cantrace")
Steve Dowerb82e17e2019-05-23 08:45:22 -070075
Zackery Spytz08286d52019-06-21 09:31:59 -060076 def test_mmap(self):
77 self.do_test("test_mmap")
78
Steve Dowerbea33f52019-11-28 08:46:11 -080079 def test_excepthook(self):
80 returncode, events, stderr = self.run_python("test_excepthook")
81 if not returncode:
82 self.fail(f"Expected fatal exception\n{stderr}")
83
84 self.assertSequenceEqual(
85 [("sys.excepthook", " ", "RuntimeError('fatal-error')")], events
86 )
87
88 def test_unraisablehook(self):
89 returncode, events, stderr = self.run_python("test_unraisablehook")
90 if returncode:
91 self.fail(stderr)
92
93 self.assertEqual(events[0][0], "sys.unraisablehook")
94 self.assertEqual(
95 events[0][2],
96 "RuntimeError('nonfatal-error') Exception ignored for audit hook test",
97 )
98
Steve Doweree17e372019-12-09 11:18:12 -080099 def test_winreg(self):
Hai Shifcce8c62020-08-08 05:55:35 +0800100 import_helper.import_module("winreg")
Steve Doweree17e372019-12-09 11:18:12 -0800101 returncode, events, stderr = self.run_python("test_winreg")
102 if returncode:
103 self.fail(stderr)
104
105 self.assertEqual(events[0][0], "winreg.OpenKey")
106 self.assertEqual(events[1][0], "winreg.OpenKey/result")
107 expected = events[1][2]
108 self.assertTrue(expected)
109 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 0"], events[2])
110 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 10000"], events[3])
111 self.assertSequenceEqual(["winreg.PyHKEY.Detach", " ", expected], events[4])
112
Steve Dower63ba5cc2020-03-31 12:38:53 +0100113 def test_socket(self):
Hai Shifcce8c62020-08-08 05:55:35 +0800114 import_helper.import_module("socket")
Steve Dower63ba5cc2020-03-31 12:38:53 +0100115 returncode, events, stderr = self.run_python("test_socket")
116 if returncode:
117 self.fail(stderr)
118
119 if support.verbose:
120 print(*events, sep='\n')
121 self.assertEqual(events[0][0], "socket.gethostname")
122 self.assertEqual(events[1][0], "socket.__new__")
123 self.assertEqual(events[2][0], "socket.bind")
124 self.assertTrue(events[2][2].endswith("('127.0.0.1', 8080)"))
Steve Dowerb82e17e2019-05-23 08:45:22 -0700125
Pablo Galindob4f90892021-03-10 00:53:57 +0000126 def test_gc(self):
127 returncode, events, stderr = self.run_python("test_gc")
128 if returncode:
129 self.fail(stderr)
130
131 if support.verbose:
132 print(*events, sep='\n')
133 self.assertEqual(
134 [event[0] for event in events],
135 ["gc.get_objects", "gc.get_referrers", "gc.get_referents"]
136 )
137
Erlend Egeberg Aasland7244c002021-04-27 01:16:46 +0200138
Saiyang Gou927b8412021-04-23 03:19:08 -0700139 def test_http(self):
140 import_helper.import_module("http.client")
141 returncode, events, stderr = self.run_python("test_http_client")
142 if returncode:
143 self.fail(stderr)
144
145 if support.verbose:
146 print(*events, sep='\n')
147 self.assertEqual(events[0][0], "http.client.connect")
148 self.assertEqual(events[0][2], "www.python.org 80")
149 self.assertEqual(events[1][0], "http.client.send")
150 if events[1][2] != '[cannot send]':
151 self.assertIn('HTTP', events[1][2])
152
Pablo Galindob4f90892021-03-10 00:53:57 +0000153
Erlend Egeberg Aasland7244c002021-04-27 01:16:46 +0200154 def test_sqlite3(self):
155 try:
156 import sqlite3
157 except ImportError:
158 return
159 returncode, events, stderr = self.run_python("test_sqlite3")
160 if returncode:
161 self.fail(stderr)
162
163 if support.verbose:
164 print(*events, sep='\n')
165 actual = [ev[0] for ev in events]
Erlend Egeberg Aaslandc96cc082021-05-02 23:25:17 +0200166 expected = ["sqlite3.connect", "sqlite3.connect/handle"] * 2
Erlend Egeberg Aasland7244c002021-04-27 01:16:46 +0200167
168 if hasattr(sqlite3.Connection, "enable_load_extension"):
169 expected += [
170 "sqlite3.enable_load_extension",
171 "sqlite3.load_extension",
172 ]
173 self.assertEqual(actual, expected)
174
175
Steve Dowerb82e17e2019-05-23 08:45:22 -0700176if __name__ == "__main__":
Steve Dowerb82e17e2019-05-23 08:45:22 -0700177 unittest.main()