17db96d56Sopenharmony_ci"""This script contains the actual auditing tests. 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciIt should not be imported directly, but should be run by the test_audit 47db96d56Sopenharmony_cimodule with arguments identifying each test. 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci""" 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ciimport contextlib 97db96d56Sopenharmony_ciimport os 107db96d56Sopenharmony_ciimport sys 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciclass TestHook: 147db96d56Sopenharmony_ci """Used in standard hook tests to collect any logged events. 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci Should be used in a with block to ensure that it has no impact 177db96d56Sopenharmony_ci after the test completes. 187db96d56Sopenharmony_ci """ 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci def __init__(self, raise_on_events=None, exc_type=RuntimeError): 217db96d56Sopenharmony_ci self.raise_on_events = raise_on_events or () 227db96d56Sopenharmony_ci self.exc_type = exc_type 237db96d56Sopenharmony_ci self.seen = [] 247db96d56Sopenharmony_ci self.closed = False 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci def __enter__(self, *a): 277db96d56Sopenharmony_ci sys.addaudithook(self) 287db96d56Sopenharmony_ci return self 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci def __exit__(self, *a): 317db96d56Sopenharmony_ci self.close() 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci def close(self): 347db96d56Sopenharmony_ci self.closed = True 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci @property 377db96d56Sopenharmony_ci def seen_events(self): 387db96d56Sopenharmony_ci return [i[0] for i in self.seen] 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci def __call__(self, event, args): 417db96d56Sopenharmony_ci if self.closed: 427db96d56Sopenharmony_ci return 437db96d56Sopenharmony_ci self.seen.append((event, args)) 447db96d56Sopenharmony_ci if event in self.raise_on_events: 457db96d56Sopenharmony_ci raise self.exc_type("saw event " + event) 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci# Simple helpers, since we are not in unittest here 497db96d56Sopenharmony_cidef assertEqual(x, y): 507db96d56Sopenharmony_ci if x != y: 517db96d56Sopenharmony_ci raise AssertionError(f"{x!r} should equal {y!r}") 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_cidef assertIn(el, series): 557db96d56Sopenharmony_ci if el not in series: 567db96d56Sopenharmony_ci raise AssertionError(f"{el!r} should be in {series!r}") 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_cidef assertNotIn(el, series): 607db96d56Sopenharmony_ci if el in series: 617db96d56Sopenharmony_ci raise AssertionError(f"{el!r} should not be in {series!r}") 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_cidef assertSequenceEqual(x, y): 657db96d56Sopenharmony_ci if len(x) != len(y): 667db96d56Sopenharmony_ci raise AssertionError(f"{x!r} should equal {y!r}") 677db96d56Sopenharmony_ci if any(ix != iy for ix, iy in zip(x, y)): 687db96d56Sopenharmony_ci raise AssertionError(f"{x!r} should equal {y!r}") 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci@contextlib.contextmanager 727db96d56Sopenharmony_cidef assertRaises(ex_type): 737db96d56Sopenharmony_ci try: 747db96d56Sopenharmony_ci yield 757db96d56Sopenharmony_ci assert False, f"expected {ex_type}" 767db96d56Sopenharmony_ci except BaseException as ex: 777db96d56Sopenharmony_ci if isinstance(ex, AssertionError): 787db96d56Sopenharmony_ci raise 797db96d56Sopenharmony_ci assert type(ex) is ex_type, f"{ex} should be {ex_type}" 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_cidef test_basic(): 837db96d56Sopenharmony_ci with TestHook() as hook: 847db96d56Sopenharmony_ci sys.audit("test_event", 1, 2, 3) 857db96d56Sopenharmony_ci assertEqual(hook.seen[0][0], "test_event") 867db96d56Sopenharmony_ci assertEqual(hook.seen[0][1], (1, 2, 3)) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_cidef test_block_add_hook(): 907db96d56Sopenharmony_ci # Raising an exception should prevent a new hook from being added, 917db96d56Sopenharmony_ci # but will not propagate out. 927db96d56Sopenharmony_ci with TestHook(raise_on_events="sys.addaudithook") as hook1: 937db96d56Sopenharmony_ci with TestHook() as hook2: 947db96d56Sopenharmony_ci sys.audit("test_event") 957db96d56Sopenharmony_ci assertIn("test_event", hook1.seen_events) 967db96d56Sopenharmony_ci assertNotIn("test_event", hook2.seen_events) 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_cidef test_block_add_hook_baseexception(): 1007db96d56Sopenharmony_ci # Raising BaseException will propagate out when adding a hook 1017db96d56Sopenharmony_ci with assertRaises(BaseException): 1027db96d56Sopenharmony_ci with TestHook( 1037db96d56Sopenharmony_ci raise_on_events="sys.addaudithook", exc_type=BaseException 1047db96d56Sopenharmony_ci ) as hook1: 1057db96d56Sopenharmony_ci # Adding this next hook should raise BaseException 1067db96d56Sopenharmony_ci with TestHook() as hook2: 1077db96d56Sopenharmony_ci pass 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_cidef test_marshal(): 1117db96d56Sopenharmony_ci import marshal 1127db96d56Sopenharmony_ci o = ("a", "b", "c", 1, 2, 3) 1137db96d56Sopenharmony_ci payload = marshal.dumps(o) 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci with TestHook() as hook: 1167db96d56Sopenharmony_ci assertEqual(o, marshal.loads(marshal.dumps(o))) 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci try: 1197db96d56Sopenharmony_ci with open("test-marshal.bin", "wb") as f: 1207db96d56Sopenharmony_ci marshal.dump(o, f) 1217db96d56Sopenharmony_ci with open("test-marshal.bin", "rb") as f: 1227db96d56Sopenharmony_ci assertEqual(o, marshal.load(f)) 1237db96d56Sopenharmony_ci finally: 1247db96d56Sopenharmony_ci os.unlink("test-marshal.bin") 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci actual = [(a[0], a[1]) for e, a in hook.seen if e == "marshal.dumps"] 1277db96d56Sopenharmony_ci assertSequenceEqual(actual, [(o, marshal.version)] * 2) 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci actual = [a[0] for e, a in hook.seen if e == "marshal.loads"] 1307db96d56Sopenharmony_ci assertSequenceEqual(actual, [payload]) 1317db96d56Sopenharmony_ci 1327db96d56Sopenharmony_ci actual = [e for e, a in hook.seen if e == "marshal.load"] 1337db96d56Sopenharmony_ci assertSequenceEqual(actual, ["marshal.load"]) 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_cidef test_pickle(): 1377db96d56Sopenharmony_ci import pickle 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci class PicklePrint: 1407db96d56Sopenharmony_ci def __reduce_ex__(self, p): 1417db96d56Sopenharmony_ci return str, ("Pwned!",) 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci payload_1 = pickle.dumps(PicklePrint()) 1447db96d56Sopenharmony_ci payload_2 = pickle.dumps(("a", "b", "c", 1, 2, 3)) 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci # Before we add the hook, ensure our malicious pickle loads 1477db96d56Sopenharmony_ci assertEqual("Pwned!", pickle.loads(payload_1)) 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci with TestHook(raise_on_events="pickle.find_class") as hook: 1507db96d56Sopenharmony_ci with assertRaises(RuntimeError): 1517db96d56Sopenharmony_ci # With the hook enabled, loading globals is not allowed 1527db96d56Sopenharmony_ci pickle.loads(payload_1) 1537db96d56Sopenharmony_ci # pickles with no globals are okay 1547db96d56Sopenharmony_ci pickle.loads(payload_2) 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_cidef test_monkeypatch(): 1587db96d56Sopenharmony_ci class A: 1597db96d56Sopenharmony_ci pass 1607db96d56Sopenharmony_ci 1617db96d56Sopenharmony_ci class B: 1627db96d56Sopenharmony_ci pass 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_ci class C(A): 1657db96d56Sopenharmony_ci pass 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci a = A() 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci with TestHook() as hook: 1707db96d56Sopenharmony_ci # Catch name changes 1717db96d56Sopenharmony_ci C.__name__ = "X" 1727db96d56Sopenharmony_ci # Catch type changes 1737db96d56Sopenharmony_ci C.__bases__ = (B,) 1747db96d56Sopenharmony_ci # Ensure bypassing __setattr__ is still caught 1757db96d56Sopenharmony_ci type.__dict__["__bases__"].__set__(C, (B,)) 1767db96d56Sopenharmony_ci # Catch attribute replacement 1777db96d56Sopenharmony_ci C.__init__ = B.__init__ 1787db96d56Sopenharmony_ci # Catch attribute addition 1797db96d56Sopenharmony_ci C.new_attr = 123 1807db96d56Sopenharmony_ci # Catch class changes 1817db96d56Sopenharmony_ci a.__class__ = B 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci actual = [(a[0], a[1]) for e, a in hook.seen if e == "object.__setattr__"] 1847db96d56Sopenharmony_ci assertSequenceEqual( 1857db96d56Sopenharmony_ci [(C, "__name__"), (C, "__bases__"), (C, "__bases__"), (a, "__class__")], actual 1867db96d56Sopenharmony_ci ) 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_cidef test_open(): 1907db96d56Sopenharmony_ci # SSLContext.load_dh_params uses _Py_fopen_obj rather than normal open() 1917db96d56Sopenharmony_ci try: 1927db96d56Sopenharmony_ci import ssl 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci load_dh_params = ssl.create_default_context().load_dh_params 1957db96d56Sopenharmony_ci except ImportError: 1967db96d56Sopenharmony_ci load_dh_params = None 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci # Try a range of "open" functions. 1997db96d56Sopenharmony_ci # All of them should fail 2007db96d56Sopenharmony_ci with TestHook(raise_on_events={"open"}) as hook: 2017db96d56Sopenharmony_ci for fn, *args in [ 2027db96d56Sopenharmony_ci (open, sys.argv[2], "r"), 2037db96d56Sopenharmony_ci (open, sys.executable, "rb"), 2047db96d56Sopenharmony_ci (open, 3, "wb"), 2057db96d56Sopenharmony_ci (open, sys.argv[2], "w", -1, None, None, None, False, lambda *a: 1), 2067db96d56Sopenharmony_ci (load_dh_params, sys.argv[2]), 2077db96d56Sopenharmony_ci ]: 2087db96d56Sopenharmony_ci if not fn: 2097db96d56Sopenharmony_ci continue 2107db96d56Sopenharmony_ci with assertRaises(RuntimeError): 2117db96d56Sopenharmony_ci fn(*args) 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ci actual_mode = [(a[0], a[1]) for e, a in hook.seen if e == "open" and a[1]] 2147db96d56Sopenharmony_ci actual_flag = [(a[0], a[2]) for e, a in hook.seen if e == "open" and not a[1]] 2157db96d56Sopenharmony_ci assertSequenceEqual( 2167db96d56Sopenharmony_ci [ 2177db96d56Sopenharmony_ci i 2187db96d56Sopenharmony_ci for i in [ 2197db96d56Sopenharmony_ci (sys.argv[2], "r"), 2207db96d56Sopenharmony_ci (sys.executable, "r"), 2217db96d56Sopenharmony_ci (3, "w"), 2227db96d56Sopenharmony_ci (sys.argv[2], "w"), 2237db96d56Sopenharmony_ci (sys.argv[2], "rb") if load_dh_params else None, 2247db96d56Sopenharmony_ci ] 2257db96d56Sopenharmony_ci if i is not None 2267db96d56Sopenharmony_ci ], 2277db96d56Sopenharmony_ci actual_mode, 2287db96d56Sopenharmony_ci ) 2297db96d56Sopenharmony_ci assertSequenceEqual([], actual_flag) 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_cidef test_cantrace(): 2337db96d56Sopenharmony_ci traced = [] 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci def trace(frame, event, *args): 2367db96d56Sopenharmony_ci if frame.f_code == TestHook.__call__.__code__: 2377db96d56Sopenharmony_ci traced.append(event) 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ci old = sys.settrace(trace) 2407db96d56Sopenharmony_ci try: 2417db96d56Sopenharmony_ci with TestHook() as hook: 2427db96d56Sopenharmony_ci # No traced call 2437db96d56Sopenharmony_ci eval("1") 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_ci # No traced call 2467db96d56Sopenharmony_ci hook.__cantrace__ = False 2477db96d56Sopenharmony_ci eval("2") 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci # One traced call 2507db96d56Sopenharmony_ci hook.__cantrace__ = True 2517db96d56Sopenharmony_ci eval("3") 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci # Two traced calls (writing to private member, eval) 2547db96d56Sopenharmony_ci hook.__cantrace__ = 1 2557db96d56Sopenharmony_ci eval("4") 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci # One traced call (writing to private member) 2587db96d56Sopenharmony_ci hook.__cantrace__ = 0 2597db96d56Sopenharmony_ci finally: 2607db96d56Sopenharmony_ci sys.settrace(old) 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci assertSequenceEqual(["call"] * 4, traced) 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_cidef test_mmap(): 2667db96d56Sopenharmony_ci import mmap 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci with TestHook() as hook: 2697db96d56Sopenharmony_ci mmap.mmap(-1, 8) 2707db96d56Sopenharmony_ci assertEqual(hook.seen[0][1][:2], (-1, 8)) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_cidef test_excepthook(): 2747db96d56Sopenharmony_ci def excepthook(exc_type, exc_value, exc_tb): 2757db96d56Sopenharmony_ci if exc_type is not RuntimeError: 2767db96d56Sopenharmony_ci sys.__excepthook__(exc_type, exc_value, exc_tb) 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci def hook(event, args): 2797db96d56Sopenharmony_ci if event == "sys.excepthook": 2807db96d56Sopenharmony_ci if not isinstance(args[2], args[1]): 2817db96d56Sopenharmony_ci raise TypeError(f"Expected isinstance({args[2]!r}, " f"{args[1]!r})") 2827db96d56Sopenharmony_ci if args[0] != excepthook: 2837db96d56Sopenharmony_ci raise ValueError(f"Expected {args[0]} == {excepthook}") 2847db96d56Sopenharmony_ci print(event, repr(args[2])) 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci sys.addaudithook(hook) 2877db96d56Sopenharmony_ci sys.excepthook = excepthook 2887db96d56Sopenharmony_ci raise RuntimeError("fatal-error") 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_cidef test_unraisablehook(): 2927db96d56Sopenharmony_ci from _testcapi import write_unraisable_exc 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci def unraisablehook(hookargs): 2957db96d56Sopenharmony_ci pass 2967db96d56Sopenharmony_ci 2977db96d56Sopenharmony_ci def hook(event, args): 2987db96d56Sopenharmony_ci if event == "sys.unraisablehook": 2997db96d56Sopenharmony_ci if args[0] != unraisablehook: 3007db96d56Sopenharmony_ci raise ValueError(f"Expected {args[0]} == {unraisablehook}") 3017db96d56Sopenharmony_ci print(event, repr(args[1].exc_value), args[1].err_msg) 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci sys.addaudithook(hook) 3047db96d56Sopenharmony_ci sys.unraisablehook = unraisablehook 3057db96d56Sopenharmony_ci write_unraisable_exc(RuntimeError("nonfatal-error"), "for audit hook test", None) 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_cidef test_winreg(): 3097db96d56Sopenharmony_ci from winreg import OpenKey, EnumKey, CloseKey, HKEY_LOCAL_MACHINE 3107db96d56Sopenharmony_ci 3117db96d56Sopenharmony_ci def hook(event, args): 3127db96d56Sopenharmony_ci if not event.startswith("winreg."): 3137db96d56Sopenharmony_ci return 3147db96d56Sopenharmony_ci print(event, *args) 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci sys.addaudithook(hook) 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_ci k = OpenKey(HKEY_LOCAL_MACHINE, "Software") 3197db96d56Sopenharmony_ci EnumKey(k, 0) 3207db96d56Sopenharmony_ci try: 3217db96d56Sopenharmony_ci EnumKey(k, 10000) 3227db96d56Sopenharmony_ci except OSError: 3237db96d56Sopenharmony_ci pass 3247db96d56Sopenharmony_ci else: 3257db96d56Sopenharmony_ci raise RuntimeError("Expected EnumKey(HKLM, 10000) to fail") 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci kv = k.Detach() 3287db96d56Sopenharmony_ci CloseKey(kv) 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_cidef test_socket(): 3327db96d56Sopenharmony_ci import socket 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci def hook(event, args): 3357db96d56Sopenharmony_ci if event.startswith("socket."): 3367db96d56Sopenharmony_ci print(event, *args) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci sys.addaudithook(hook) 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci socket.gethostname() 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci # Don't care if this fails, we just want the audit message 3437db96d56Sopenharmony_ci sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 3447db96d56Sopenharmony_ci try: 3457db96d56Sopenharmony_ci # Don't care if this fails, we just want the audit message 3467db96d56Sopenharmony_ci sock.bind(('127.0.0.1', 8080)) 3477db96d56Sopenharmony_ci except Exception: 3487db96d56Sopenharmony_ci pass 3497db96d56Sopenharmony_ci finally: 3507db96d56Sopenharmony_ci sock.close() 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_cidef test_gc(): 3547db96d56Sopenharmony_ci import gc 3557db96d56Sopenharmony_ci 3567db96d56Sopenharmony_ci def hook(event, args): 3577db96d56Sopenharmony_ci if event.startswith("gc."): 3587db96d56Sopenharmony_ci print(event, *args) 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci sys.addaudithook(hook) 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci gc.get_objects(generation=1) 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci x = object() 3657db96d56Sopenharmony_ci y = [x] 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci gc.get_referrers(x) 3687db96d56Sopenharmony_ci gc.get_referents(y) 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci 3717db96d56Sopenharmony_cidef test_http_client(): 3727db96d56Sopenharmony_ci import http.client 3737db96d56Sopenharmony_ci 3747db96d56Sopenharmony_ci def hook(event, args): 3757db96d56Sopenharmony_ci if event.startswith("http.client."): 3767db96d56Sopenharmony_ci print(event, *args[1:]) 3777db96d56Sopenharmony_ci 3787db96d56Sopenharmony_ci sys.addaudithook(hook) 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci conn = http.client.HTTPConnection('www.python.org') 3817db96d56Sopenharmony_ci try: 3827db96d56Sopenharmony_ci conn.request('GET', '/') 3837db96d56Sopenharmony_ci except OSError: 3847db96d56Sopenharmony_ci print('http.client.send', '[cannot send]') 3857db96d56Sopenharmony_ci finally: 3867db96d56Sopenharmony_ci conn.close() 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_cidef test_sqlite3(): 3907db96d56Sopenharmony_ci import sqlite3 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci def hook(event, *args): 3937db96d56Sopenharmony_ci if event.startswith("sqlite3."): 3947db96d56Sopenharmony_ci print(event, *args) 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci sys.addaudithook(hook) 3977db96d56Sopenharmony_ci cx1 = sqlite3.connect(":memory:") 3987db96d56Sopenharmony_ci cx2 = sqlite3.Connection(":memory:") 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci # Configured without --enable-loadable-sqlite-extensions 4017db96d56Sopenharmony_ci if hasattr(sqlite3.Connection, "enable_load_extension"): 4027db96d56Sopenharmony_ci cx1.enable_load_extension(False) 4037db96d56Sopenharmony_ci try: 4047db96d56Sopenharmony_ci cx1.load_extension("test") 4057db96d56Sopenharmony_ci except sqlite3.OperationalError: 4067db96d56Sopenharmony_ci pass 4077db96d56Sopenharmony_ci else: 4087db96d56Sopenharmony_ci raise RuntimeError("Expected sqlite3.load_extension to fail") 4097db96d56Sopenharmony_ci 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_cidef test_sys_getframe(): 4127db96d56Sopenharmony_ci import sys 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci def hook(event, args): 4157db96d56Sopenharmony_ci if event.startswith("sys."): 4167db96d56Sopenharmony_ci print(event, args[0].f_code.co_name) 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci sys.addaudithook(hook) 4197db96d56Sopenharmony_ci sys._getframe() 4207db96d56Sopenharmony_ci 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_cidef test_syslog(): 4237db96d56Sopenharmony_ci import syslog 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci def hook(event, args): 4267db96d56Sopenharmony_ci if event.startswith("syslog."): 4277db96d56Sopenharmony_ci print(event, *args) 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci sys.addaudithook(hook) 4307db96d56Sopenharmony_ci syslog.openlog('python') 4317db96d56Sopenharmony_ci syslog.syslog('test') 4327db96d56Sopenharmony_ci syslog.setlogmask(syslog.LOG_DEBUG) 4337db96d56Sopenharmony_ci syslog.closelog() 4347db96d56Sopenharmony_ci # implicit open 4357db96d56Sopenharmony_ci syslog.syslog('test2') 4367db96d56Sopenharmony_ci # open with default ident 4377db96d56Sopenharmony_ci syslog.openlog(logoption=syslog.LOG_NDELAY, facility=syslog.LOG_LOCAL0) 4387db96d56Sopenharmony_ci sys.argv = None 4397db96d56Sopenharmony_ci syslog.openlog() 4407db96d56Sopenharmony_ci syslog.closelog() 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_cidef test_not_in_gc(): 4447db96d56Sopenharmony_ci import gc 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci hook = lambda *a: None 4477db96d56Sopenharmony_ci sys.addaudithook(hook) 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci for o in gc.get_objects(): 4507db96d56Sopenharmony_ci if isinstance(o, list): 4517db96d56Sopenharmony_ci assert hook not in o 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ciif __name__ == "__main__": 4557db96d56Sopenharmony_ci from test.support import suppress_msvcrt_asserts 4567db96d56Sopenharmony_ci 4577db96d56Sopenharmony_ci suppress_msvcrt_asserts() 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci test = sys.argv[1] 4607db96d56Sopenharmony_ci globals()[test]() 461