Skip to content

Commit f027ac3

Browse files
committed
Add PyImport_ImportFrozenModule() tests
1 parent fc2f8cd commit f027ac3

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

Lib/test/test_capi/test_import.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,26 @@ def test_importmodulenoblock(self):
106106
with check_warnings(('', DeprecationWarning)):
107107
self.check_import_func(_testlimitedcapi.PyImport_ImportModuleNoBlock)
108108

109+
def check_frozen_import(self, import_frozen_module):
110+
# Importing a frozen module executes its code, so starts by unloading
111+
# the module to execute the code in a new (temporary) module.
112+
old_zipimport = sys.modules.pop('zipimport')
113+
try:
114+
self.assertEqual(import_frozen_module('zipimport'), 1)
115+
finally:
116+
sys.modules['zipimport'] = old_zipimport
117+
118+
# not a frozen module
119+
self.assertEqual(import_frozen_module('sys'), 0)
120+
121+
def test_importfrozenmodule(self):
122+
# Test PyImport_ImportFrozenModule()
123+
self.check_frozen_import(_testlimitedcapi.PyImport_ImportFrozenModule)
124+
125+
def test_importfrozenmoduleobject(self):
126+
# Test PyImport_ImportFrozenModuleObject()
127+
self.check_frozen_import(_testlimitedcapi.PyImport_ImportFrozenModuleObject)
128+
109129
# TODO: test PyImport_ExecCodeModule()
110130
# TODO: test PyImport_ExecCodeModuleEx()
111131
# TODO: test PyImport_ExecCodeModuleWithPathnames()
@@ -115,8 +135,6 @@ def test_importmodulenoblock(self):
115135
# TODO: test PyImport_ImportModuleEx()
116136
# TODO: test PyImport_GetImporter()
117137
# TODO: test PyImport_ReloadModule()
118-
# TODO: test PyImport_ImportFrozenModuleObject()
119-
# TODO: test PyImport_ImportFrozenModule()
120138
# TODO: test PyImport_AppendInittab()
121139
# TODO: test PyImport_ExtendInittab()
122140

Modules/_testlimitedcapi/import.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,35 @@ pyimport_importmodulenoblock(PyObject *Py_UNUSED(module), PyObject *args)
118118
}
119119

120120

121+
/* Test PyImport_ImportFrozenModule() */
122+
static PyObject *
123+
pyimport_importfrozenmodule(PyObject *Py_UNUSED(module), PyObject *args)
124+
{
125+
const char *name;
126+
if (!PyArg_ParseTuple(args, "s", &name)) {
127+
return NULL;
128+
}
129+
130+
int res = PyImport_ImportFrozenModule(name);
131+
if (res < 0) {
132+
return NULL;
133+
}
134+
return PyLong_FromLong(res);
135+
}
136+
137+
138+
/* Test PyImport_ImportFrozenModuleObject() */
139+
static PyObject *
140+
pyimport_importfrozenmoduleobject(PyObject *Py_UNUSED(module), PyObject *name)
141+
{
142+
int res = PyImport_ImportFrozenModuleObject(name);
143+
if (res < 0) {
144+
return NULL;
145+
}
146+
return PyLong_FromLong(res);
147+
}
148+
149+
121150
static PyMethodDef test_methods[] = {
122151
{"PyImport_GetMagicNumber", pyimport_getmagicnumber, METH_NOARGS},
123152
{"PyImport_GetMagicTag", pyimport_getmagictag, METH_NOARGS},
@@ -129,6 +158,8 @@ static PyMethodDef test_methods[] = {
129158
{"PyImport_Import", pyimport_import, METH_O},
130159
{"PyImport_ImportModule", pyimport_importmodule, METH_VARARGS},
131160
{"PyImport_ImportModuleNoBlock", pyimport_importmodulenoblock, METH_VARARGS},
161+
{"PyImport_ImportFrozenModule", pyimport_importfrozenmodule, METH_VARARGS},
162+
{"PyImport_ImportFrozenModuleObject", pyimport_importfrozenmoduleobject, METH_O},
132163
{NULL},
133164
};
134165

0 commit comments

Comments
 (0)