bpo-43762: Add audit events for loading of sqlite3 extensions (GH-25246)
diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py
index 2addf97..ed42451 100644
--- a/Lib/test/audit-tests.py
+++ b/Lib/test/audit-tests.py
@@ -359,6 +359,27 @@ def hook(event, args):
conn.close()
+def test_sqlite3():
+ import sqlite3
+
+ def hook(event, *args):
+ if event.startswith("sqlite3."):
+ print(event, *args)
+
+ sys.addaudithook(hook)
+ cx = sqlite3.connect(":memory:")
+
+ # Configured without --enable-loadable-sqlite-extensions
+ if hasattr(sqlite3.Connection, "enable_load_extension"):
+ cx.enable_load_extension(False)
+ try:
+ cx.load_extension("test")
+ except sqlite3.OperationalError:
+ pass
+ else:
+ raise RuntimeError("Expected sqlite3.load_extension to fail")
+
+
if __name__ == "__main__":
from test.support import suppress_msvcrt_asserts
diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py
index 456a5da..4ba62c4 100644
--- a/Lib/test/test_audit.py
+++ b/Lib/test/test_audit.py
@@ -130,6 +130,7 @@ def test_gc(self):
["gc.get_objects", "gc.get_referrers", "gc.get_referents"]
)
+
def test_http(self):
import_helper.import_module("http.client")
returncode, events, stderr = self.run_python("test_http_client")
@@ -145,5 +146,27 @@ def test_http(self):
self.assertIn('HTTP', events[1][2])
+ def test_sqlite3(self):
+ try:
+ import sqlite3
+ except ImportError:
+ return
+ returncode, events, stderr = self.run_python("test_sqlite3")
+ if returncode:
+ self.fail(stderr)
+
+ if support.verbose:
+ print(*events, sep='\n')
+ actual = [ev[0] for ev in events]
+ expected = ["sqlite3.connect", "sqlite3.connect/handle"]
+
+ if hasattr(sqlite3.Connection, "enable_load_extension"):
+ expected += [
+ "sqlite3.enable_load_extension",
+ "sqlite3.load_extension",
+ ]
+ self.assertEqual(actual, expected)
+
+
if __name__ == "__main__":
unittest.main()