Skip to content

Commit a0faa3f

Browse files
committed
Fix based on comments
1 parent 2b65d6b commit a0faa3f

File tree

2 files changed

+44
-101
lines changed

2 files changed

+44
-101
lines changed

Lib/test/test_capi/test_sys.py

Lines changed: 29 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -208,140 +208,72 @@ def test_sys_writestderr(self):
208208

209209
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
210210
def test_sys_audit(self):
211+
# Test PySys_Audit()
211212
sys_audit = _testlimitedcapi.sys_audit
212-
213213
audit_events = []
214214
def audit_hook(event, args):
215215
audit_events.append((event, args))
216216
return None
217217

218-
import sys
219218
sys.addaudithook(audit_hook)
220-
221219
try:
222-
result = sys_audit("cpython.run_command", "")
220+
result = sys_audit("test.event", "OO", 1, "a")
223221
self.assertEqual(result, 0)
224-
self.assertEqual(len(audit_events), 1)
225-
self.assertEqual(audit_events[-1][0], "cpython.run_command")
226-
self.assertEqual(audit_events[-1][1], ())
222+
self.assertEqual(audit_events[-1][0], "test.event")
223+
self.assertEqual(audit_events[-1][1], (1, "a"))
227224

228-
result = sys_audit("open", "OOO", "test.txt", "r", 0)
225+
result = sys_audit("test.no_args", "")
229226
self.assertEqual(result, 0)
230-
self.assertEqual(len(audit_events), 2)
231-
self.assertEqual(audit_events[-1][0], "open")
232-
self.assertEqual(len(audit_events[-1][1]), 3)
233-
self.assertEqual(audit_events[-1][1][0], "test.txt")
234-
self.assertEqual(audit_events[-1][1][1], "r")
235-
self.assertEqual(audit_events[-1][1][2], 0)
236-
237-
test_dict = {"key": "value"}
238-
test_list = [1, 2, 3]
239-
result = sys_audit("test.objects", "OO", test_dict, test_list)
240-
self.assertEqual(result, 0)
241-
self.assertEqual(len(audit_events), 3)
242-
self.assertEqual(audit_events[-1][0], "test.objects")
243-
self.assertEqual(audit_events[-1][1][0], test_dict)
244-
self.assertEqual(audit_events[-1][1][1], test_list)
227+
self.assertEqual(audit_events[-1][0], "test.no_args")
228+
self.assertEqual(audit_events[-1][1], ())
229+
230+
with self.assertRaises(TypeError):
231+
sys_audit(123, "O", 1)
245232

246-
result = sys_audit("test.mixed_types", "OOO", "string", 42, 123456789)
233+
result = sys_audit("テスト.イベント", "O", 42)
247234
self.assertEqual(result, 0)
248-
self.assertEqual(len(audit_events), 4)
249-
self.assertEqual(audit_events[-1][0], "test.mixed_types")
250-
self.assertEqual(audit_events[-1][1][0], "string")
251-
self.assertEqual(audit_events[-1][1][1], 42)
252-
self.assertEqual(audit_events[-1][1][2], 123456789)
235+
self.assertEqual(audit_events[-1][0], "テスト.イベント")
236+
self.assertEqual(audit_events[-1][1], (42,))
253237

238+
with self.assertRaises(UnicodeDecodeError):
239+
sys_audit(b"test.non_utf8\xff", "O", 1)
254240
finally:
255241
sys.audit_hooks = []
256242

257-
result = sys_audit("cpython.run_file", "")
258-
self.assertEqual(result, 0)
259-
260-
result = sys_audit("os.chdir", "(O)", "/tmp")
261-
self.assertEqual(result, 0)
262-
263-
result = sys_audit("ctypes.dlopen", "O", "libc.so.6")
264-
self.assertEqual(result, 0)
265-
266-
self.assertRaises(TypeError, sys_audit, 123, "O", "arg")
267-
self.assertRaises(TypeError, sys_audit, None, "O", "arg")
268-
self.assertRaises(TypeError, sys_audit, ["not", "a", "string"], "O", "arg")
269-
270-
self.assertRaises(TypeError, sys_audit, "test.event", 456, "arg")
271-
self.assertRaises(TypeError, sys_audit, "test.event", None, "arg")
272-
self.assertRaises(TypeError, sys_audit, "test.event", {"format": "string"}, "arg")
273-
274243
@unittest.skipIf(_testlimitedcapi is None, 'need _testlimitedcapi module')
275244
def test_sys_audittuple(self):
245+
# Test PySys_AuditTuple()
276246
sys_audittuple = _testlimitedcapi.sys_audittuple
277-
278-
# Test with audit hook to verify internal behavior
279247
audit_events = []
280248
def audit_hook(event, args):
281249
audit_events.append((event, args))
282250
return None
283251

284-
import sys
285252
sys.addaudithook(audit_hook)
286-
287253
try:
288-
result = sys_audittuple("cpython.run_command", ())
289-
self.assertEqual(result, 0)
290-
self.assertEqual(len(audit_events), 1)
291-
self.assertEqual(audit_events[-1][0], "cpython.run_command")
292-
self.assertEqual(audit_events[-1][1], ())
293-
294-
result = sys_audittuple("os.chdir", ("/tmp",))
254+
result = sys_audittuple("test.event", (1, "a"))
295255
self.assertEqual(result, 0)
296-
self.assertEqual(len(audit_events), 2)
297-
self.assertEqual(audit_events[-1][0], "os.chdir")
298-
self.assertEqual(audit_events[-1][1], ("/tmp",))
256+
self.assertEqual(audit_events[-1][0], "test.event")
257+
self.assertEqual(audit_events[-1][1], (1, "a"))
299258

300-
result = sys_audittuple("open", ("test.txt", "r", 0))
259+
result = sys_audittuple("test.null_tuple")
301260
self.assertEqual(result, 0)
302-
self.assertEqual(len(audit_events), 3)
303-
self.assertEqual(audit_events[-1][0], "open")
304-
self.assertEqual(audit_events[-1][1], ("test.txt", "r", 0))
261+
self.assertEqual(audit_events[-1][0], "test.null_tuple")
262+
self.assertEqual(audit_events[-1][1], ())
305263

306-
test_dict = {"key": "value"}
307-
test_list = [1, 2, 3]
308-
result = sys_audittuple("test.objects", (test_dict, test_list))
309-
self.assertEqual(result, 0)
310-
self.assertEqual(len(audit_events), 4)
311-
self.assertEqual(audit_events[-1][0], "test.objects")
312-
self.assertEqual(audit_events[-1][1][0], test_dict)
313-
self.assertEqual(audit_events[-1][1][1], test_list)
264+
with self.assertRaises(TypeError):
265+
sys_audittuple("test.bad_tuple", [1, 2])
314266

315-
result = sys_audittuple("test.complex", ("text", 3.14, True, None))
267+
result = sys_audittuple("テスト.イベント", (42,))
316268
self.assertEqual(result, 0)
317-
self.assertEqual(len(audit_events), 5)
318-
self.assertEqual(audit_events[-1][0], "test.complex")
319-
self.assertEqual(audit_events[-1][1][0], "text")
320-
self.assertEqual(audit_events[-1][1][1], 3.14)
321-
self.assertEqual(audit_events[-1][1][2], True)
322-
self.assertEqual(audit_events[-1][1][3], None)
269+
self.assertEqual(audit_events[-1][0], "テスト.イベント")
270+
self.assertEqual(audit_events[-1][1], (42,))
323271

272+
with self.assertRaises(UnicodeDecodeError):
273+
sys_audittuple(b"test.non_utf8\xff", (1,))
324274
finally:
325275
sys.audit_hooks = []
326276

327-
result = sys_audittuple("cpython.run_file", ())
328-
self.assertEqual(result, 0)
329-
330-
result = sys_audittuple("ctypes.dlopen", ("libc.so.6",))
331-
self.assertEqual(result, 0)
332-
333-
result = sys_audittuple("sqlite3.connect", ("test.db",))
334-
self.assertEqual(result, 0)
335-
336-
self.assertRaises(TypeError, sys_audittuple, 123, ("arg",))
337-
self.assertRaises(TypeError, sys_audittuple, None, ("arg",))
338-
self.assertRaises(TypeError, sys_audittuple, ["not", "a", "string"], ("arg",))
339-
340-
self.assertRaises(TypeError, sys_audittuple, "test.event", "not_a_tuple")
341-
self.assertRaises(TypeError, sys_audittuple, "test.event", ["list", "not", "tuple"])
342-
self.assertRaises(TypeError, sys_audittuple, "test.event", {"dict": "not_tuple"})
343-
self.assertRaises(TypeError, sys_audittuple, "test.event", None)
344-
345277

346278
if __name__ == "__main__":
347279
unittest.main()

Modules/_testlimitedcapi/sys.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,19 @@ static PyObject *
111111
sys_audit(PyObject *Py_UNUSED(module), PyObject *args)
112112
{
113113
const char *event;
114+
Py_ssize_t event_len;
114115
const char *argFormat;
116+
Py_ssize_t format_len;
115117
PyObject *arg1 = NULL, *arg2 = NULL, *arg3 = NULL;
116118

117-
if (!PyArg_ParseTuple(args, "ss|OOO", &event, &argFormat, &arg1, &arg2, &arg3)) {
119+
if (!PyArg_ParseTuple(args, "z#z#|OOO", &event, &event_len, &argFormat, &format_len, &arg1, &arg2, &arg3)) {
118120
return NULL;
119121
}
120122

123+
if (event == NULL) {
124+
RETURN_INT(0);
125+
}
126+
121127
int result;
122128
if (arg1 == NULL) {
123129
result = PySys_Audit(event, argFormat);
@@ -136,13 +142,18 @@ static PyObject *
136142
sys_audittuple(PyObject *Py_UNUSED(module), PyObject *args)
137143
{
138144
const char *event;
139-
PyObject *tuple_args;
145+
Py_ssize_t event_len;
146+
PyObject *tuple_args = NULL;
140147

141-
if (!PyArg_ParseTuple(args, "sO", &event, &tuple_args)) {
148+
if (!PyArg_ParseTuple(args, "z#|O", &event, &event_len, &tuple_args)) {
142149
return NULL;
143150
}
144151

145-
if (!PyTuple_Check(tuple_args)) {
152+
if (event == NULL) {
153+
RETURN_INT(0);
154+
}
155+
156+
if (tuple_args != NULL && !PyTuple_Check(tuple_args)) {
146157
PyErr_SetString(PyExc_TypeError, "second argument must be a tuple");
147158
return NULL;
148159
}

0 commit comments

Comments
 (0)