blob: f79edbc4bd0d9fc6493be10d44a41a9e1c153e9c [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
Steve Dowerb82e17e2019-05-23 08:45:22 -070054 def test_pickle(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070055 support.import_module("pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070056
Steve Dower9ddc4162019-05-29 08:20:35 -070057 self.do_test("test_pickle")
Steve Dowerb82e17e2019-05-23 08:45:22 -070058
59 def test_monkeypatch(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070060 self.do_test("test_monkeypatch")
Steve Dowerb82e17e2019-05-23 08:45:22 -070061
62 def test_open(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070063 self.do_test("test_open", support.TESTFN)
Steve Dowerb82e17e2019-05-23 08:45:22 -070064
65 def test_cantrace(self):
Steve Dower9ddc4162019-05-29 08:20:35 -070066 self.do_test("test_cantrace")
Steve Dowerb82e17e2019-05-23 08:45:22 -070067
Zackery Spytz08286d52019-06-21 09:31:59 -060068 def test_mmap(self):
69 self.do_test("test_mmap")
70
Steve Dowerbea33f52019-11-28 08:46:11 -080071 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
Steve Doweree17e372019-12-09 11:18:12 -080091 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
Steve Dower63ba5cc2020-03-31 12:38:53 +0100105 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)"))
Steve Dowerb82e17e2019-05-23 08:45:22 -0700117
118if __name__ == "__main__":
Steve Dowerb82e17e2019-05-23 08:45:22 -0700119 unittest.main()