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