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