Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update test_fileio.py from 3.13.7
  • Loading branch information
ShaharNaveh committed Aug 31, 2025
commit a1c11cdc4074865fd91ffc88c2d7f2dd4fe4aac4
92 changes: 54 additions & 38 deletions Lib/test/test_fileio.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
from functools import wraps

from test.support import (
cpython_only, swap_attr, gc_collect, is_emscripten, is_wasi
cpython_only, swap_attr, gc_collect, is_emscripten, is_wasi,
infinite_recursion,
)
from test.support.os_helper import (TESTFN, TESTFN_UNICODE, make_bad_fd)
from test.support.os_helper import (
TESTFN, TESTFN_ASCII, TESTFN_UNICODE, make_bad_fd,
)
from test.support.warnings_helper import check_warnings
from test.support.import_helper import import_module
from collections import UserList

import _io # C implementation of io
Expand Down Expand Up @@ -171,6 +175,16 @@ def testRepr(self):
self.assertEqual(repr(self.f),
"<%s.FileIO [closed]>" % (self.modulename,))

def test_subclass_repr(self):
class TestSubclass(self.FileIO):
pass

f = TestSubclass(TESTFN)
with f:
self.assertIn(TestSubclass.__name__, repr(f))

self.assertIn(TestSubclass.__name__, repr(f))

def testReprNoCloseFD(self):
fd = os.open(TESTFN, os.O_RDONLY)
try:
Expand All @@ -181,6 +195,7 @@ def testReprNoCloseFD(self):
finally:
os.close(fd)

@infinite_recursion(25)
def testRecursiveRepr(self):
# Issue #25455
with swap_attr(self.f, 'name', self.f):
Expand Down Expand Up @@ -348,40 +363,34 @@ class CAutoFileTests(AutoFileTests, unittest.TestCase):
FileIO = _io.FileIO
modulename = '_io'

# TODO: RUSTPYTHON
@unittest.expectedFailure
@unittest.expectedFailure # TODO: RUSTPYTHON
def testBlksize(self):
super().testBlksize()
return super().testBlksize()

# TODO: RUSTPYTHON
if sys.platform == "win32":
@unittest.expectedFailure
def testErrnoOnClosedTruncate(self):
super().testErrnoOnClosedTruncate()
@unittest.expectedFailureIfWindows("TODO: RUSTPYTHON")
def testErrnoOnClosedTruncate(self):
return super().testErrnoOnClosedTruncate()

# TODO: RUSTPYTHON
@unittest.expectedFailure
@unittest.expectedFailure # TODO: RUSTPYTHON
def testMethods(self):
super().testMethods()

# TODO: RUSTPYTHON
@unittest.expectedFailure
return super().testMethods()

@unittest.expectedFailure # TODO: RUSTPYTHON
def testOpenDirFD(self):
super().testOpenDirFD()
return super().testOpenDirFD()

@unittest.expectedFailure # TODO: RUSTPYTHON
def test_subclass_repr(self):
return super().test_subclass_repr()

@unittest.skipIf(sys.platform == "win32", "TODO: RUSTPYTHON, test setUp errors on Windows")
class PyAutoFileTests(AutoFileTests, unittest.TestCase):
FileIO = _pyio.FileIO
modulename = '_pyio'

def testOpendir(self):
super().testOpendir()


class OtherFileTests:

@unittest.skip("TODO: non-deterministic failures, FileIO.seekable()?")
def testAbles(self):
try:
f = self.FileIO(TESTFN, "w")
Expand Down Expand Up @@ -458,18 +467,15 @@ def testUnicodeOpen(self):

def testBytesOpen(self):
# Opening a bytes filename
try:
fn = TESTFN.encode("ascii")
except UnicodeEncodeError:
self.skipTest('could not encode %r to ascii' % TESTFN)
fn = TESTFN_ASCII.encode("ascii")
f = self.FileIO(fn, "w")
try:
f.write(b"abc")
f.close()
with open(TESTFN, "rb") as f:
with self.open(TESTFN_ASCII, "rb") as f:
self.assertEqual(f.read(), b"abc")
finally:
os.unlink(TESTFN)
os.unlink(TESTFN_ASCII)

@unittest.skipIf(sys.getfilesystemencoding() != 'utf-8',
"test only works for utf-8 filesystems")
Expand All @@ -483,7 +489,7 @@ def testUtf8BytesOpen(self):
try:
f.write(b"abc")
f.close()
with open(TESTFN_UNICODE, "rb") as f:
with self.open(TESTFN_UNICODE, "rb") as f:
self.assertEqual(f.read(), b"abc")
finally:
os.unlink(TESTFN_UNICODE)
Expand All @@ -500,6 +506,15 @@ def testInvalidFd(self):
import msvcrt
self.assertRaises(OSError, msvcrt.get_osfhandle, make_bad_fd())

@unittest.expectedFailure # TODO: RUSTPYTHON
def testBooleanFd(self):
for fd in False, True:
with self.assertWarnsRegex(RuntimeWarning,
'bool is used as a file descriptor') as cm:
f = self.FileIO(fd, closefd=False)
f.close()
self.assertEqual(cm.filename, __file__)

def testBadModeArgument(self):
# verify that we get a sensible error message for bad mode argument
bad_mode = "qwerty"
Expand Down Expand Up @@ -530,7 +545,7 @@ def testTruncate(self):

def testTruncateOnWindows(self):
def bug801631():
# SF bug <http://www.python.org/sf/801631>
# SF bug <https://bugs.python.org/issue801631>
# "file.truncate fault on windows"
f = self.FileIO(TESTFN, 'w')
f.write(bytes(range(11)))
Expand Down Expand Up @@ -559,13 +574,13 @@ def bug801631():

def testAppend(self):
try:
f = open(TESTFN, 'wb')
f = self.FileIO(TESTFN, 'wb')
f.write(b'spam')
f.close()
f = open(TESTFN, 'ab')
f = self.FileIO(TESTFN, 'ab')
f.write(b'eggs')
f.close()
f = open(TESTFN, 'rb')
f = self.FileIO(TESTFN, 'rb')
d = f.read()
f.close()
self.assertEqual(d, b'spameggs')
Expand Down Expand Up @@ -601,16 +616,12 @@ def __setattr__(self, name, value):
class COtherFileTests(OtherFileTests, unittest.TestCase):
FileIO = _io.FileIO
modulename = '_io'

# TODO: RUSTPYTHON
@unittest.expectedFailure
def testUnclosedFDOnException(self):
super().testUnclosedFDOnException()
open = _io.open

@cpython_only
def testInvalidFd_overflow(self):
# Issue 15989
import _testcapi
_testcapi = import_module("_testcapi")
self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MAX + 1)
self.assertRaises(TypeError, self.FileIO, _testcapi.INT_MIN - 1)

Expand All @@ -623,10 +634,15 @@ def test_open_code(self):
actual = f.read()
self.assertEqual(expected, actual)

@unittest.expectedFailure # TODO: RUSTPYTHON
def testUnclosedFDOnException(self):
return super().testUnclosedFDOnException()


class PyOtherFileTests(OtherFileTests, unittest.TestCase):
FileIO = _pyio.FileIO
modulename = '_pyio'
open = _pyio.open

def test_open_code(self):
# Check that the default behaviour of open_code matches
Expand Down