gh-37883: Safely skip test_resource file size tests when limits are strict (GH-145579)

This commit is contained in:
Shrey Naithani 2026-04-08 19:36:05 +05:30 committed by GitHub
parent 8687b9d731
commit 461125aaa3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,7 +4,6 @@
from test import support
from test.support import import_helper
from test.support import os_helper
import time
resource = import_helper.import_module('resource')
@ -41,7 +40,7 @@ def test_fsize_ismax(self):
# the number to a C long long and that the conversion doesn't raise
# an error.
self.assertGreater(resource.RLIM_INFINITY, 0)
self.assertEqual(resource.RLIM_INFINITY, max)
self.assertGreaterEqual(max, 0)
self.assertLessEqual(cur, max)
resource.setrlimit(resource.RLIMIT_FSIZE, (max, max))
resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
@ -50,47 +49,24 @@ def test_fsize_ismax(self):
"setting RLIMIT_FSIZE is not supported on VxWorks")
@unittest.skipUnless(hasattr(resource, 'RLIMIT_FSIZE'), 'requires resource.RLIMIT_FSIZE')
def test_fsize_enforced(self):
(cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE)
# Check to see what happens when the RLIMIT_FSIZE is small. Some
# versions of Python were terminated by an uncaught SIGXFSZ, but
# pythonrun.c has been fixed to ignore that exception. If so, the
# write() should return EFBIG when the limit is exceeded.
# At least one platform has an unlimited RLIMIT_FSIZE and attempts
# to change it raise ValueError instead.
self.addCleanup(os_helper.unlink, os_helper.TESTFN)
try:
(cur, max_lim) = resource.getrlimit(resource.RLIMIT_FSIZE)
except OSError as e:
self.skipTest(f"getrlimit(RLIMIT_FSIZE) failed: {e}")
if max_lim != resource.RLIM_INFINITY and max_lim < 1025:
self.skipTest(f"system RLIMIT_FSIZE hard limit ({max_lim}) is too small for this test")
with open(os_helper.TESTFN, "wb", buffering=0) as f:
try:
resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max))
limit_set = True
except ValueError:
limit_set = False
f = open(os_helper.TESTFN, "wb")
try:
resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max_lim))
f.write(b"X" * 1024)
try:
with self.assertRaises(OSError, msg="f.write() did not raise OSError when exceeding RLIMIT_FSIZE"):
f.write(b"Y")
f.flush()
# On some systems (e.g., Ubuntu on hppa) the flush()
# doesn't always cause the exception, but the close()
# does eventually. Try flushing several times in
# an attempt to ensure the file is really synced and
# the exception raised.
for i in range(5):
time.sleep(.1)
f.flush()
except OSError:
if not limit_set:
raise
if limit_set:
# Close will attempt to flush the byte we wrote
# Restore limit first to avoid getting a spurious error
resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
finally:
f.close()
finally:
if limit_set:
resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
os_helper.unlink(os_helper.TESTFN)
# Close will attempt to flush the byte we wrote
# Restore limit first to avoid getting a spurious error
resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max_lim))
@unittest.skipIf(sys.platform == "vxworks",
"setting RLIMIT_FSIZE is not supported on VxWorks")