import os
import resource

from test.test_support import TESTFN

# This test is checking a few specific problem spots.  RLIMIT_FSIZE
# should be RLIM_INFINITY, which will be a really big number on a
# platform with large file support.  On these platforms, we need to
# test that the get/setrlimit functions properly convert the number to
# a C long long and that the conversion doesn't raise an error.

try:
    cur, max = resource.getrlimit(resource.RLIMIT_FSIZE)
except AttributeError:
    pass
else:
    print resource.RLIM_INFINITY == max
    resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))

# Now 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.

try:
    try:
        resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max))
        limit_set = 1
    except ValueError:
        limit_set = 0
    f = open(TESTFN, "wb")
    f.write("X" * 1024)
    try:
        f.write("Y")
        f.flush()
    except IOError:
        if not limit_set:
            raise
    f.close()
    os.unlink(TESTFN)
finally:
    resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))

# And be sure that setrlimit is checking for really large values
too_big = 10L**50
try:
    resource.setrlimit(resource.RLIMIT_FSIZE, (too_big, max))
except (OverflowError, ValueError):
    pass
try:
    resource.setrlimit(resource.RLIMIT_FSIZE, (max, too_big))
except (OverflowError, ValueError):
    pass
