mirror of
https://github.com/python/cpython.git
synced 2025-07-15 23:35:23 +00:00
gh-111495: Add PyFile tests (#129449)
Add tests for the following functions in test_capi.test_file: * PyFile_FromFd() * PyFile_GetLine() * PyFile_NewStdPrinter() * PyFile_WriteObject() * PyFile_WriteString() * PyObject_AsFileDescriptor() Add Modules/_testlimitedcapi/file.c file. Remove test_embed.StdPrinterTests which became redundant.
This commit is contained in:
parent
4e47e05045
commit
4ca9fc08f8
11 changed files with 500 additions and 72 deletions
|
@ -1985,56 +1985,5 @@ class MiscTests(EmbeddingTestsMixin, unittest.TestCase):
|
|||
self.assertIn("unique-python-message", out)
|
||||
|
||||
|
||||
class StdPrinterTests(EmbeddingTestsMixin, unittest.TestCase):
|
||||
# Test PyStdPrinter_Type which is used by _PySys_SetPreliminaryStderr():
|
||||
# "Set up a preliminary stderr printer until we have enough
|
||||
# infrastructure for the io module in place."
|
||||
|
||||
STDOUT_FD = 1
|
||||
|
||||
def create_printer(self, fd):
|
||||
ctypes = import_helper.import_module('ctypes')
|
||||
PyFile_NewStdPrinter = ctypes.pythonapi.PyFile_NewStdPrinter
|
||||
PyFile_NewStdPrinter.argtypes = (ctypes.c_int,)
|
||||
PyFile_NewStdPrinter.restype = ctypes.py_object
|
||||
return PyFile_NewStdPrinter(fd)
|
||||
|
||||
def test_write(self):
|
||||
message = "unicode:\xe9-\u20ac-\udc80!\n"
|
||||
|
||||
stdout_fd = self.STDOUT_FD
|
||||
stdout_fd_copy = os.dup(stdout_fd)
|
||||
self.addCleanup(os.close, stdout_fd_copy)
|
||||
|
||||
rfd, wfd = os.pipe()
|
||||
self.addCleanup(os.close, rfd)
|
||||
self.addCleanup(os.close, wfd)
|
||||
try:
|
||||
# PyFile_NewStdPrinter() only accepts fileno(stdout)
|
||||
# or fileno(stderr) file descriptor.
|
||||
os.dup2(wfd, stdout_fd)
|
||||
|
||||
printer = self.create_printer(stdout_fd)
|
||||
printer.write(message)
|
||||
finally:
|
||||
os.dup2(stdout_fd_copy, stdout_fd)
|
||||
|
||||
data = os.read(rfd, 100)
|
||||
self.assertEqual(data, message.encode('utf8', 'backslashreplace'))
|
||||
|
||||
def test_methods(self):
|
||||
fd = self.STDOUT_FD
|
||||
printer = self.create_printer(fd)
|
||||
self.assertEqual(printer.fileno(), fd)
|
||||
self.assertEqual(printer.isatty(), os.isatty(fd))
|
||||
printer.flush() # noop
|
||||
printer.close() # noop
|
||||
|
||||
def test_disallow_instantiation(self):
|
||||
fd = self.STDOUT_FD
|
||||
printer = self.create_printer(fd)
|
||||
support.check_disallow_instantiation(self, type(printer))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue