-
-
Notifications
You must be signed in to change notification settings - Fork 33.6k
gh-136336: add tests for PySys_Audit() and PySys_AuditTuple() #136337
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
|
|
@@ -12,11 +12,6 @@ | |||
| NULL = None | ||||
|
|
||||
| class CAPITest(unittest.TestCase): | ||||
| # TODO: Test the following functions: | ||||
| # | ||||
| # PySys_Audit() | ||||
| # PySys_AuditTuple() | ||||
|
|
||||
| maxDiff = None | ||||
|
|
||||
| @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module') | ||||
|
|
@@ -211,6 +206,74 @@ def test_sys_writestderr(self): | |||
| # Test PySys_WriteStderr() | ||||
| self._test_sys_writestream('PySys_WriteStderr', 'stderr') | ||||
|
|
||||
| @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module') | ||||
| def test_sys_audit(self): | ||||
| # Test PySys_Audit() | ||||
| sys_audit = _testlimitedcapi.sys_audit | ||||
| audit_events = [] | ||||
| def audit_hook(event, args): | ||||
| audit_events.append((event, args)) | ||||
| return None | ||||
|
|
||||
| sys.addaudithook(audit_hook) | ||||
| try: | ||||
| result = sys_audit("test.event", "OO", 1, "a") | ||||
| self.assertEqual(result, 0) | ||||
| self.assertEqual(audit_events[-1][0], "test.event") | ||||
| self.assertEqual(audit_events[-1][1], (1, "a")) | ||||
|
|
||||
| result = sys_audit("test.no_args", "") | ||||
| self.assertEqual(result, 0) | ||||
| self.assertEqual(audit_events[-1][0], "test.no_args") | ||||
| self.assertEqual(audit_events[-1][1], ()) | ||||
|
|
||||
| with self.assertRaises(TypeError): | ||||
| sys_audit(123, "O", 1) | ||||
|
|
||||
| result = sys_audit("テスト.イベント", "O", 42) | ||||
| self.assertEqual(result, 0) | ||||
| self.assertEqual(audit_events[-1][0], "テスト.イベント") | ||||
| self.assertEqual(audit_events[-1][1], (42,)) | ||||
|
|
||||
| with self.assertRaises(UnicodeDecodeError): | ||||
| sys_audit(b"test.non_utf8\xff", "O", 1) | ||||
| finally: | ||||
|
||||
| sys.audit_hooks = [] | ||||
|
|
||||
| @unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module') | ||||
| def test_sys_audittuple(self): | ||||
| # Test PySys_AuditTuple() | ||||
| sys_audittuple = _testlimitedcapi.sys_audittuple | ||||
| audit_events = [] | ||||
| def audit_hook(event, args): | ||||
| audit_events.append((event, args)) | ||||
| return None | ||||
|
||||
| return None |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add also test for sys_audittuple(NULL, (1,)). If it crashes, just add a comment, like in other tests above.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately, this does not work. There is no way to remove the audit hook. This is why these functions remained untested -- because the only way to test them is to use a subprocess. Look like other audit tests are implemented.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -5,6 +5,7 @@ | |||||||||||||||||
| #endif | ||||||||||||||||||
| #include "parts.h" | ||||||||||||||||||
| #include "util.h" | ||||||||||||||||||
| #include "audit.h" | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
| static PyObject * | ||||||||||||||||||
|
|
@@ -106,6 +107,59 @@ sys_getxoptions(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(ignored)) | |||||||||||||||||
| return Py_XNewRef(result); | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| static PyObject * | ||||||||||||||||||
| sys_audit(PyObject *Py_UNUSED(module), PyObject *args) | ||||||||||||||||||
| { | ||||||||||||||||||
| const char *event; | ||||||||||||||||||
| Py_ssize_t event_len; | ||||||||||||||||||
| const char *argFormat; | ||||||||||||||||||
| Py_ssize_t format_len; | ||||||||||||||||||
| PyObject *arg1 = NULL, *arg2 = NULL, *arg3 = NULL; | ||||||||||||||||||
|
|
||||||||||||||||||
| if (!PyArg_ParseTuple(args, "z#z#|OOO", &event, &event_len, &argFormat, &format_len, &arg1, &arg2, &arg3)) { | ||||||||||||||||||
| return NULL; | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
| if (event == NULL) { | ||||||||||||||||||
| RETURN_INT(0); | ||||||||||||||||||
| } | ||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
| if (event == NULL) { | |
| RETURN_INT(0); | |
| } |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should test how PySys_AuditTuple() handles this.
| if (event == NULL) { | |
| RETURN_INT(0); | |
| } | |
| if (tuple_args != NULL && !PyTuple_Check(tuple_args)) { | |
| PyErr_SetString(PyExc_TypeError, "second argument must be a tuple"); | |
| return NULL; | |
| } |
Uh oh!
There was an error while loading. Please reload this page.