Skip to content

Commit 13a9c06

Browse files
committed
Add C API tests
1 parent fcd6529 commit 13a9c06

File tree

2 files changed

+95
-1
lines changed

2 files changed

+95
-1
lines changed

Lib/test/test_import/test_lazy_imports.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import types
1010
import unittest
1111

12+
try:
13+
import _testcapi
14+
except ImportError:
15+
_testcapi = None
16+
1217

1318
class LazyImportTests(unittest.TestCase):
1419
"""Tests for basic lazy import functionality."""
@@ -1630,6 +1635,30 @@ def test_normal_import_dis(self):
16301635
self.assertFail("IMPORT_NAME not found")
16311636

16321637

1638+
@unittest.skipIf(_testcapi is None, 'need the _testcapi module')
1639+
class LazyCApiTests(unittest.TestCase):
1640+
def tearDown(self):
1641+
sys.set_lazy_imports("normal")
1642+
sys.set_lazy_imports_filter(None)
1643+
1644+
def test_set_matches_sys(self):
1645+
self.assertEqual(_testcapi.PyImport_GetLazyImportsMode(), sys.get_lazy_imports())
1646+
for mode in ("normal", "all", "none"):
1647+
_testcapi.PyImport_SetLazyImportsMode(mode)
1648+
self.assertEqual(_testcapi.PyImport_GetLazyImportsMode(), sys.get_lazy_imports())
1649+
1650+
def test_filter_matches_sys(self):
1651+
self.assertEqual(_testcapi.PyImport_GetLazyImportsFilter(), sys.get_lazy_imports_filter())
1652+
1653+
def filter(*args):
1654+
pass
1655+
1656+
_testcapi.PyImport_SetLazyImportsFilter(filter)
1657+
self.assertEqual(_testcapi.PyImport_GetLazyImportsFilter(), sys.get_lazy_imports_filter())
1658+
1659+
def test_set_bad_filter(self):
1660+
self.assertRaises(ValueError, _testcapi.PyImport_SetLazyImportsFilter, 42)
1661+
16331662

16341663
if __name__ == '__main__':
16351664
unittest.main()

Modules/_testcapi/import.c

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,75 @@ pyimport_importmoduleattrstring(PyObject *self, PyObject *args)
3030
}
3131

3232

33+
static PyObject *
34+
pyimport_setlazyimportsmode(PyObject *self, PyObject *args)
35+
{
36+
PyObject *mode;
37+
if (!PyArg_ParseTuple(args, "U", &mode)) {
38+
return NULL;
39+
}
40+
if (strcmp(PyUnicode_AsUTF8(mode), "normal") == 0) {
41+
PyImport_SetLazyImportsMode(PyImport_LAZY_NORMAL);
42+
} else if (strcmp(PyUnicode_AsUTF8(mode), "all") == 0) {
43+
PyImport_SetLazyImportsMode(PyImport_LAZY_ALL);
44+
} else if (strcmp(PyUnicode_AsUTF8(mode), "none") == 0) {
45+
PyImport_SetLazyImportsMode(PyImport_LAZY_NONE);
46+
} else {
47+
PyErr_SetString(PyExc_ValueError, "invalid mode");
48+
return NULL;
49+
}
50+
51+
Py_RETURN_NONE;
52+
}
53+
54+
static PyObject *
55+
pyimport_getlazyimportsmode(PyObject *self, PyObject *args)
56+
{
57+
switch (PyImport_GetLazyImportsMode()) {
58+
case PyImport_LAZY_NORMAL:
59+
return PyUnicode_FromString("normal");
60+
case PyImport_LAZY_ALL:
61+
return PyUnicode_FromString("all");
62+
case PyImport_LAZY_NONE:
63+
return PyUnicode_FromString("none");
64+
default:
65+
PyErr_SetString(PyExc_ValueError, "unknown mode");
66+
return NULL;
67+
}
68+
}
69+
70+
static PyObject *
71+
pyimport_setlazyimportsfilter(PyObject *self, PyObject *args)
72+
{
73+
PyObject *filter;
74+
if (!PyArg_ParseTuple(args, "O", &filter)) {
75+
return NULL;
76+
}
77+
78+
if (PyImport_SetLazyImportsFilter(filter) < 0) {
79+
return NULL;
80+
}
81+
82+
Py_RETURN_NONE;
83+
}
84+
85+
static PyObject *
86+
pyimport_getlazyimportsfilter(PyObject *self, PyObject *args)
87+
{
88+
PyObject *res = PyImport_GetLazyImportsFilter();
89+
if (res == NULL) {
90+
Py_RETURN_NONE;
91+
}
92+
return res;
93+
}
94+
3395
static PyMethodDef test_methods[] = {
3496
{"PyImport_ImportModuleAttr", pyimport_importmoduleattr, METH_VARARGS},
3597
{"PyImport_ImportModuleAttrString", pyimport_importmoduleattrstring, METH_VARARGS},
98+
{"PyImport_SetLazyImportsMode", pyimport_setlazyimportsmode, METH_VARARGS},
99+
{"PyImport_GetLazyImportsMode", pyimport_getlazyimportsmode, METH_NOARGS},
100+
{"PyImport_SetLazyImportsFilter", pyimport_setlazyimportsfilter, METH_VARARGS},
101+
{"PyImport_GetLazyImportsFilter", pyimport_getlazyimportsfilter, METH_NOARGS},
36102
{NULL},
37103
};
38104

@@ -41,4 +107,3 @@ _PyTestCapi_Init_Import(PyObject *m)
41107
{
42108
return PyModule_AddFunctions(m, test_methods);
43109
}
44-

0 commit comments

Comments
 (0)