From 21c65196400d01cb25595c959cc55438c8274233 Mon Sep 17 00:00:00 2001 From: Artem Mukhin Date: Mon, 6 Mar 2023 00:02:21 +0100 Subject: [PATCH 1/3] GH-94808: Cover `PyOS_mystrnicmp` and `PyOS_mystricmp` --- Modules/_testcapimodule.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 10e507d6b481de..ae8178d458dbc5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -720,6 +720,42 @@ pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored)) return PyObject_Bytes(NULL); } +static PyObject * +test_pystrcmp(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + assert(PyOS_mystrnicmp("", "", 0) == 0); + assert(PyOS_mystrnicmp("", "", 1) == 0); + + assert(PyOS_mystrnicmp("insert", "ins", 3) == 0); + assert(PyOS_mystrnicmp("ins", "insert", 3) == 0); + assert(PyOS_mystrnicmp("insect", "insert", 3) == 0); + + assert(PyOS_mystrnicmp("insert", "insert", 6) == 0); + assert(PyOS_mystrnicmp("Insert", "insert", 6) == 0); + assert(PyOS_mystrnicmp("INSERT", "insert", 6) == 0); + assert(PyOS_mystrnicmp("insert", "insert", 10) == 0); + + assert(PyOS_mystrnicmp("invert", "insert", 6) == ('v' - 's')); + assert(PyOS_mystrnicmp("insert", "invert", 6) == ('s' - 'v')); + assert(PyOS_mystrnicmp("insert", "ins\0rt", 6) == 'e'); + + // GH-21845 + assert(PyOS_mystrnicmp("insert\0a", "insert\0b", 8) == 0); + + assert(PyOS_mystricmp("", "") == 0); + assert(PyOS_mystricmp("insert", "insert") == 0); + assert(PyOS_mystricmp("Insert", "insert") == 0); + assert(PyOS_mystricmp("INSERT", "insert") == 0); + assert(PyOS_mystricmp("insert", "ins") == 'e'); + assert(PyOS_mystricmp("ins", "insert") == -'e'); + + // GH-21845 + assert(PyOS_mystricmp("insert", "ins\0rt") == 'e'); + assert(PyOS_mystricmp("invert", "insert") == ('v' - 's')); + + Py_RETURN_NONE; +} + static PyObject * set_errno(PyObject *self, PyObject *args) { @@ -3457,6 +3493,7 @@ static PyMethodDef TestMethods[] = { {"function_set_defaults", function_set_defaults, METH_VARARGS, NULL}, {"function_get_kw_defaults", function_get_kw_defaults, METH_O, NULL}, {"function_set_kw_defaults", function_set_kw_defaults, METH_VARARGS, NULL}, + {"test_pystrcmp", test_pystrcmp, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; From 6a2382ec991b2fd8fcc88364f924972d9dd04d24 Mon Sep 17 00:00:00 2001 From: Artem Mukhin Date: Sat, 11 Mar 2023 14:19:21 +0100 Subject: [PATCH 2/3] Code review: extract tests to a separate file --- Modules/Setup.stdlib.in | 2 +- Modules/_testcapi/parts.h | 1 + Modules/_testcapi/pyos.c | 60 +++++++++++++++++++++++++++++++ Modules/_testcapimodule.c | 40 ++------------------- PCbuild/_testcapi.vcxproj | 1 + PCbuild/_testcapi.vcxproj.filters | 3 ++ 6 files changed, 69 insertions(+), 38 deletions(-) create mode 100644 Modules/_testcapi/pyos.c diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in index b12290d436cbeb..fe1b9f8f5380c1 100644 --- a/Modules/Setup.stdlib.in +++ b/Modules/Setup.stdlib.in @@ -169,7 +169,7 @@ @MODULE__XXTESTFUZZ_TRUE@_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c @MODULE__TESTBUFFER_TRUE@_testbuffer _testbuffer.c @MODULE__TESTINTERNALCAPI_TRUE@_testinternalcapi _testinternalcapi.c -@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c +@MODULE__TESTCAPI_TRUE@_testcapi _testcapimodule.c _testcapi/vectorcall.c _testcapi/vectorcall_limited.c _testcapi/heaptype.c _testcapi/unicode.c _testcapi/getargs.c _testcapi/pytime.c _testcapi/datetime.c _testcapi/docstring.c _testcapi/mem.c _testcapi/watchers.c _testcapi/long.c _testcapi/float.c _testcapi/structmember.c _testcapi/exceptions.c _testcapi/code.c _testcapi/pyos.c @MODULE__TESTCLINIC_TRUE@_testclinic _testclinic.c # Some testing modules MUST be built as shared libraries. diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h index c8f31dc8e39fae..60ec81dad2ba9e 100644 --- a/Modules/_testcapi/parts.h +++ b/Modules/_testcapi/parts.h @@ -38,6 +38,7 @@ int _PyTestCapi_Init_Float(PyObject *module); int _PyTestCapi_Init_Structmember(PyObject *module); int _PyTestCapi_Init_Exceptions(PyObject *module); int _PyTestCapi_Init_Code(PyObject *module); +int _PyTestCapi_Init_PyOS(PyObject *module); #ifdef LIMITED_API_AVAILABLE int _PyTestCapi_Init_VectorcallLimited(PyObject *module); diff --git a/Modules/_testcapi/pyos.c b/Modules/_testcapi/pyos.c new file mode 100644 index 00000000000000..1ea70458121543 --- /dev/null +++ b/Modules/_testcapi/pyos.c @@ -0,0 +1,60 @@ +#include "parts.h" + + +static PyObject * +test_PyOS_mystrnicmp(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + assert(PyOS_mystrnicmp("", "", 0) == 0); + assert(PyOS_mystrnicmp("", "", 1) == 0); + + assert(PyOS_mystrnicmp("insert", "ins", 3) == 0); + assert(PyOS_mystrnicmp("ins", "insert", 3) == 0); + assert(PyOS_mystrnicmp("insect", "insert", 3) == 0); + + assert(PyOS_mystrnicmp("insert", "insert", 6) == 0); + assert(PyOS_mystrnicmp("Insert", "insert", 6) == 0); + assert(PyOS_mystrnicmp("INSERT", "insert", 6) == 0); + assert(PyOS_mystrnicmp("insert", "insert", 10) == 0); + + assert(PyOS_mystrnicmp("invert", "insert", 6) == ('v' - 's')); + assert(PyOS_mystrnicmp("insert", "invert", 6) == ('s' - 'v')); + assert(PyOS_mystrnicmp("insert", "ins\0rt", 6) == 'e'); + + // GH-21845 + assert(PyOS_mystrnicmp("insert\0a", "insert\0b", 8) == 0); + + Py_RETURN_NONE; +} + +static PyObject * +test_PyOS_mystricmp(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + assert(PyOS_mystricmp("", "") == 0); + assert(PyOS_mystricmp("insert", "insert") == 0); + assert(PyOS_mystricmp("Insert", "insert") == 0); + assert(PyOS_mystricmp("INSERT", "insert") == 0); + assert(PyOS_mystricmp("insert", "ins") == 'e'); + assert(PyOS_mystricmp("ins", "insert") == -'e'); + + // GH-21845 + assert(PyOS_mystricmp("insert", "ins\0rt") == 'e'); + assert(PyOS_mystricmp("invert", "insert") == ('v' - 's')); + + Py_RETURN_NONE; +} + +static PyMethodDef test_methods[] = { + {"PyOS_mystrnicmp", test_PyOS_mystrnicmp, METH_NOARGS, NULL}, + {"PyOS_mystricmp", test_PyOS_mystricmp, METH_NOARGS, NULL}, + {NULL}, +}; + +int +_PyTestCapi_Init_PyOS(PyObject *mod) +{ + if (PyModule_AddFunctions(mod, test_methods) < 0) { + return -1; + } + + return 0; +} diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index ae8178d458dbc5..ecd2c5091bdfc8 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -720,42 +720,6 @@ pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored)) return PyObject_Bytes(NULL); } -static PyObject * -test_pystrcmp(PyObject *self, PyObject *Py_UNUSED(ignored)) -{ - assert(PyOS_mystrnicmp("", "", 0) == 0); - assert(PyOS_mystrnicmp("", "", 1) == 0); - - assert(PyOS_mystrnicmp("insert", "ins", 3) == 0); - assert(PyOS_mystrnicmp("ins", "insert", 3) == 0); - assert(PyOS_mystrnicmp("insect", "insert", 3) == 0); - - assert(PyOS_mystrnicmp("insert", "insert", 6) == 0); - assert(PyOS_mystrnicmp("Insert", "insert", 6) == 0); - assert(PyOS_mystrnicmp("INSERT", "insert", 6) == 0); - assert(PyOS_mystrnicmp("insert", "insert", 10) == 0); - - assert(PyOS_mystrnicmp("invert", "insert", 6) == ('v' - 's')); - assert(PyOS_mystrnicmp("insert", "invert", 6) == ('s' - 'v')); - assert(PyOS_mystrnicmp("insert", "ins\0rt", 6) == 'e'); - - // GH-21845 - assert(PyOS_mystrnicmp("insert\0a", "insert\0b", 8) == 0); - - assert(PyOS_mystricmp("", "") == 0); - assert(PyOS_mystricmp("insert", "insert") == 0); - assert(PyOS_mystricmp("Insert", "insert") == 0); - assert(PyOS_mystricmp("INSERT", "insert") == 0); - assert(PyOS_mystricmp("insert", "ins") == 'e'); - assert(PyOS_mystricmp("ins", "insert") == -'e'); - - // GH-21845 - assert(PyOS_mystricmp("insert", "ins\0rt") == 'e'); - assert(PyOS_mystricmp("invert", "insert") == ('v' - 's')); - - Py_RETURN_NONE; -} - static PyObject * set_errno(PyObject *self, PyObject *args) { @@ -3493,7 +3457,6 @@ static PyMethodDef TestMethods[] = { {"function_set_defaults", function_set_defaults, METH_VARARGS, NULL}, {"function_get_kw_defaults", function_get_kw_defaults, METH_O, NULL}, {"function_set_kw_defaults", function_set_kw_defaults, METH_VARARGS, NULL}, - {"test_pystrcmp", test_pystrcmp, METH_NOARGS, NULL}, {NULL, NULL} /* sentinel */ }; @@ -4123,6 +4086,9 @@ PyInit__testcapi(void) if (_PyTestCapi_Init_Code(m) < 0) { return NULL; } + if (_PyTestCapi_Init_PyOS(m) < 0) { + return NULL; + } #ifndef LIMITED_API_AVAILABLE PyModule_AddObjectRef(m, "LIMITED_API_AVAILABLE", Py_False); diff --git a/PCbuild/_testcapi.vcxproj b/PCbuild/_testcapi.vcxproj index 4cc184bfc1ac82..439cd687fda61d 100644 --- a/PCbuild/_testcapi.vcxproj +++ b/PCbuild/_testcapi.vcxproj @@ -109,6 +109,7 @@ + diff --git a/PCbuild/_testcapi.vcxproj.filters b/PCbuild/_testcapi.vcxproj.filters index fbdaf04ce37cb1..0e42e4982c21ff 100644 --- a/PCbuild/_testcapi.vcxproj.filters +++ b/PCbuild/_testcapi.vcxproj.filters @@ -57,6 +57,9 @@ Source Files + + Source Files + From 83e7f46d8673a99ae4c0c771a06a8621f56ba8e7 Mon Sep 17 00:00:00 2001 From: Artem Mukhin Date: Sat, 11 Mar 2023 19:28:15 +0100 Subject: [PATCH 3/3] Code review: fix built-in test methods names --- Modules/_testcapi/pyos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_testcapi/pyos.c b/Modules/_testcapi/pyos.c index 1ea70458121543..63140e914875db 100644 --- a/Modules/_testcapi/pyos.c +++ b/Modules/_testcapi/pyos.c @@ -44,8 +44,8 @@ test_PyOS_mystricmp(PyObject *self, PyObject *Py_UNUSED(ignored)) } static PyMethodDef test_methods[] = { - {"PyOS_mystrnicmp", test_PyOS_mystrnicmp, METH_NOARGS, NULL}, - {"PyOS_mystricmp", test_PyOS_mystricmp, METH_NOARGS, NULL}, + {"test_PyOS_mystrnicmp", test_PyOS_mystrnicmp, METH_NOARGS, NULL}, + {"test_PyOS_mystricmp", test_PyOS_mystricmp, METH_NOARGS, NULL}, {NULL}, };