blob: 4ba62c408526d35f2325952c8e5252ca6c8274ef [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 Dowerb82e17e2019-05-23 08:45:22 -070057 def test_pickle(self):
Hai Shifcce8c62020-08-08 05:55:35 +080058 import_helper.import_module("pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070059
Steve Dower9ddc4162019-05-29 08:20:35 -070060 self.do_test("test_pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070061
62 def test_monkeypatch(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070063 self.do_test("test_monkeypatch")
Steve Dowerb82e17e2019-05-23 08:45:22 -070064
65 def test_open(self):
Hai Shifcce8c62020-08-08 05:55:35 +080066 self.do_test("test_open", os_helper.TESTFN)
Steve Dowerb82e17e2019-05-23 08:45:22 -070067
68 def test_cantrace(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070069 self.do_test("test_cantrace")
Steve Dowerb82e17e2019-05-23 08:45:22 -070070
Zackery Spytz08286d52019-06-21 09:31:59 -060071 def test_mmap(self):
72 self.do_test("test_mmap")
73
Steve Dowerbea33f52019-11-28 08:46:11 -080074 def test_excepthook(self):
75 returncode, events, stderr = self.run_python("test_excepthook")
76 if not returncode:
77 self.fail(f"Expected fatal exception\n{stderr}")
78
79 self.assertSequenceEqual(
80 [("sys.excepthook", " ", "RuntimeError('fatal-error')")], events
81 )
82
83 def test_unraisablehook(self):
84 returncode, events, stderr = self.run_python("test_unraisablehook")
85 if returncode:
86 self.fail(stderr)
87
88 self.assertEqual(events[0][0], "sys.unraisablehook")
89 self.assertEqual(
90 events[0][2],
91 "RuntimeError('nonfatal-error') Exception ignored for audit hook test",
92 )
93
Steve Doweree17e372019-12-09 11:18:12 -080094 def test_winreg(self):
Hai Shifcce8c62020-08-08 05:55:35 +080095 import_helper.import_module("winreg")
Steve Doweree17e372019-12-09 11:18:12 -080096 returncode, events, stderr = self.run_python("test_winreg")
97 if returncode:
98 self.fail(stderr)
99
100 self.assertEqual(events[0][0], "winreg.OpenKey")
101 self.assertEqual(events[1][0], "winreg.OpenKey/result")
102 expected = events[1][2]
103 self.assertTrue(expected)
104 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 0"], events[2])
105 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 10000"], events[3])
106 self.assertSequenceEqual(["winreg.PyHKEY.Detach", " ", expected], events[4])
107
Steve Dower63ba5cc2020-03-31 12:38:53 +0100108 def test_socket(self):
Hai Shifcce8c62020-08-08 05:55:35 +0800109 import_helper.import_module("socket")
Steve Dower63ba5cc2020-03-31 12:38:53 +0100110 returncode, events, stderr = self.run_python("test_socket")
111 if returncode:
112 self.fail(stderr)
113
114 if support.verbose:
115 print(*events, sep='\n')
116 self.assertEqual(events[0][0], "socket.gethostname")
117 self.assertEqual(events[1][0], "socket.__new__")
118 self.assertEqual(events[2][0], "socket.bind")
119 self.assertTrue(events[2][2].endswith("('127.0.0.1', 8080)"))
Steve Dowerb82e17e2019-05-23 08:45:22 -0700120
Pablo Galindob4f90892021-03-10 00:53:57 +0000121 def test_gc(self):
122 returncode, events, stderr = self.run_python("test_gc")
123 if returncode:
124 self.fail(stderr)
125
126 if support.verbose:
127 print(*events, sep='\n')
128 self.assertEqual(
129 [event[0] for event in events],
130 ["gc.get_objects", "gc.get_referrers", "gc.get_referents"]
131 )
132
Erlend Egeberg Aasland7244c002021-04-27 01:16:46 +0200133
Saiyang Gou927b8412021-04-23 03:19:08 -0700134 def test_http(self):
135 import_helper.import_module("http.client")
136 returncode, events, stderr = self.run_python("test_http_client")
137 if returncode:
138 self.fail(stderr)
139
140 if support.verbose:
141 print(*events, sep='\n')
142 self.assertEqual(events[0][0], "http.client.connect")
143 self.assertEqual(events[0][2], "www.python.org 80")
144 self.assertEqual(events[1][0], "http.client.send")
145 if events[1][2] != '[cannot send]':
146 self.assertIn('HTTP', events[1][2])
147
Pablo Galindob4f90892021-03-10 00:53:57 +0000148
Erlend Egeberg Aasland7244c002021-04-27 01:16:46 +0200149 def test_sqlite3(self):
150 try:
151 import sqlite3
152 except ImportError:
153 return
154 returncode, events, stderr = self.run_python("test_sqlite3")
155 if returncode:
156 self.fail(stderr)
157
158 if support.verbose:
159 print(*events, sep='\n')
160 actual = [ev[0] for ev in events]
161 expected = ["sqlite3.connect", "sqlite3.connect/handle"]
162
163 if hasattr(sqlite3.Connection, "enable_load_extension"):
164 expected += [
165 "sqlite3.enable_load_extension",
166 "sqlite3.load_extension",
167 ]
168 self.assertEqual(actual, expected)
169
170
Steve Dowerb82e17e2019-05-23 08:45:22 -0700171if __name__ == "__main__":
Steve Dowerb82e17e2019-05-23 08:45:22 -0700172 unittest.main()