blob: 73dd5c5b7db30cf5224fda9a490c00382fc59cb7 [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
8
9if not hasattr(sys, "addaudithook") or not hasattr(sys, "audit"):
10 raise unittest.SkipTest("test only relevant when sys.audit is available")
11
Steve Dower9ddc4162019-05-29 08:20:35 -070012AUDIT_TESTS_PY = support.findfile("audit-tests.py")
Steve Dowerb82e17e2019-05-23 08:45:22 -070013
14
15class AuditTest(unittest.TestCase):
Steve Dower9ddc4162019-05-29 08:20:35 -070016 def do_test(self, *args):
Steve Dowerb82e17e2019-05-23 08:45:22 -070017 with subprocess.Popen(
Steve Dower9ddc4162019-05-29 08:20:35 -070018 [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args],
Steve Dowerb82e17e2019-05-23 08:45:22 -070019 encoding="utf-8",
20 stdout=subprocess.PIPE,
21 stderr=subprocess.PIPE,
22 ) as p:
23 p.wait()
Steve Dower9ddc4162019-05-29 08:20:35 -070024 sys.stdout.writelines(p.stdout)
25 sys.stderr.writelines(p.stderr)
26 if p.returncode:
Steve Dowerbea33f52019-11-28 08:46:11 -080027 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 )
Steve Dower9ddc4162019-05-29 08:20:35 -070044
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_finalize_hooks(self):
Steve Dowerbea33f52019-11-28 08:46:11 -080055 returncode, events, stderr = self.run_python("test_finalize_hooks")
56 if stderr:
57 print(stderr, file=sys.stderr)
58 if returncode:
59 self.fail(stderr)
Steve Dower9ddc4162019-05-29 08:20:35 -070060
Steve Dowerb82e17e2019-05-23 08:45:22 -070061 firstId = events[0][2]
62 self.assertSequenceEqual(
63 [
64 ("Created", " ", firstId),
65 ("cpython._PySys_ClearAuditHooks", " ", firstId),
66 ],
67 events,
68 )
69
70 def test_pickle(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070071 support.import_module("pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070072
Steve Dower9ddc4162019-05-29 08:20:35 -070073 self.do_test("test_pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070074
75 def test_monkeypatch(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070076 self.do_test("test_monkeypatch")
Steve Dowerb82e17e2019-05-23 08:45:22 -070077
78 def test_open(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070079 self.do_test("test_open", support.TESTFN)
Steve Dowerb82e17e2019-05-23 08:45:22 -070080
81 def test_cantrace(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070082 self.do_test("test_cantrace")
Steve Dowerb82e17e2019-05-23 08:45:22 -070083
Zackery Spytz08286d52019-06-21 09:31:59 -060084 def test_mmap(self):
85 self.do_test("test_mmap")
86
Steve Dowerbea33f52019-11-28 08:46:11 -080087 def test_excepthook(self):
88 returncode, events, stderr = self.run_python("test_excepthook")
89 if not returncode:
90 self.fail(f"Expected fatal exception\n{stderr}")
91
92 self.assertSequenceEqual(
93 [("sys.excepthook", " ", "RuntimeError('fatal-error')")], events
94 )
95
96 def test_unraisablehook(self):
97 returncode, events, stderr = self.run_python("test_unraisablehook")
98 if returncode:
99 self.fail(stderr)
100
101 self.assertEqual(events[0][0], "sys.unraisablehook")
102 self.assertEqual(
103 events[0][2],
104 "RuntimeError('nonfatal-error') Exception ignored for audit hook test",
105 )
106
Steve Doweree17e372019-12-09 11:18:12 -0800107 def test_winreg(self):
108 support.import_module("winreg")
109 returncode, events, stderr = self.run_python("test_winreg")
110 if returncode:
111 self.fail(stderr)
112
113 self.assertEqual(events[0][0], "winreg.OpenKey")
114 self.assertEqual(events[1][0], "winreg.OpenKey/result")
115 expected = events[1][2]
116 self.assertTrue(expected)
117 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 0"], events[2])
118 self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 10000"], events[3])
119 self.assertSequenceEqual(["winreg.PyHKEY.Detach", " ", expected], events[4])
120
Steve Dowerb82e17e2019-05-23 08:45:22 -0700121
122if __name__ == "__main__":
Steve Dowerb82e17e2019-05-23 08:45:22 -0700123 unittest.main()