19fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwaldimport unittest
29fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwaldfrom test import test_support
3041ee5d373d7a335dcb2ad80268de29182789937Neal Norwitzimport time
49fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
53db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murrayresource = test_support.import_module('resource')
63db8a3432bd84b58bdc7da2c9872777c537a4d09R. David Murray
79fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald# This test is checking a few specific problem spots with the resource module.
89fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
99fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwaldclass ResourceTest(unittest.TestCase):
1066262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald
1166262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald    def test_args(self):
1266262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.getrlimit)
1366262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.getrlimit, 42, 42)
1466262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.setrlimit)
1566262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.setrlimit, 42, 42, 42)
1666262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald
179fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald    def test_fsize_ismax(self):
189fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        try:
199fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald            (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE)
209fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        except AttributeError:
211f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('RLIMIT_FSIZE not available')
221f70221b861a3714735251d57695b2f472d0599bZachary Ware        # RLIMIT_FSIZE should be RLIM_INFINITY, which will be a really big
231f70221b861a3714735251d57695b2f472d0599bZachary Ware        # number on a platform with large file support.  On these platforms,
241f70221b861a3714735251d57695b2f472d0599bZachary Ware        # we need to test that the get/setrlimit functions properly convert
251f70221b861a3714735251d57695b2f472d0599bZachary Ware        # the number to a C long long and that the conversion doesn't raise
261f70221b861a3714735251d57695b2f472d0599bZachary Ware        # an error.
271f70221b861a3714735251d57695b2f472d0599bZachary Ware        self.assertEqual(resource.RLIM_INFINITY, max)
281f70221b861a3714735251d57695b2f472d0599bZachary Ware        resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
299fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
309fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald    def test_fsize_enforced(self):
319fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        try:
329fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald            (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE)
339fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        except AttributeError:
341f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('RLIMIT_FSIZE not available')
351f70221b861a3714735251d57695b2f472d0599bZachary Ware        # Check to see what happens when the RLIMIT_FSIZE is small.  Some
361f70221b861a3714735251d57695b2f472d0599bZachary Ware        # versions of Python were terminated by an uncaught SIGXFSZ, but
371f70221b861a3714735251d57695b2f472d0599bZachary Ware        # pythonrun.c has been fixed to ignore that exception.  If so, the
381f70221b861a3714735251d57695b2f472d0599bZachary Ware        # write() should return EFBIG when the limit is exceeded.
39f733abb7831d6566cb0fccd0550d58ec3b7f05a4Tim Peters
401f70221b861a3714735251d57695b2f472d0599bZachary Ware        # At least one platform has an unlimited RLIMIT_FSIZE and attempts
411f70221b861a3714735251d57695b2f472d0599bZachary Ware        # to change it raise ValueError instead.
421f70221b861a3714735251d57695b2f472d0599bZachary Ware        try:
439fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald            try:
441f70221b861a3714735251d57695b2f472d0599bZachary Ware                resource.setrlimit(resource.RLIMIT_FSIZE, (1024, max))
451f70221b861a3714735251d57695b2f472d0599bZachary Ware                limit_set = True
461f70221b861a3714735251d57695b2f472d0599bZachary Ware            except ValueError:
471f70221b861a3714735251d57695b2f472d0599bZachary Ware                limit_set = False
481f70221b861a3714735251d57695b2f472d0599bZachary Ware            f = open(test_support.TESTFN, "wb")
491f70221b861a3714735251d57695b2f472d0599bZachary Ware            try:
501f70221b861a3714735251d57695b2f472d0599bZachary Ware                f.write("X" * 1024)
519fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald                try:
521f70221b861a3714735251d57695b2f472d0599bZachary Ware                    f.write("Y")
531f70221b861a3714735251d57695b2f472d0599bZachary Ware                    f.flush()
541f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # On some systems (e.g., Ubuntu on hppa) the flush()
551f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # doesn't always cause the exception, but the close()
561f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # does eventually.  Try flushing several times in
571f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # an attempt to ensure the file is really synced and
581f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # the exception raised.
591f70221b861a3714735251d57695b2f472d0599bZachary Ware                    for i in range(5):
601f70221b861a3714735251d57695b2f472d0599bZachary Ware                        time.sleep(.1)
6112adef9b8b44f0535cfb5c30437541ef67327b17Nick Coghlan                        f.flush()
621f70221b861a3714735251d57695b2f472d0599bZachary Ware                except IOError:
631f70221b861a3714735251d57695b2f472d0599bZachary Ware                    if not limit_set:
641f70221b861a3714735251d57695b2f472d0599bZachary Ware                        raise
6512adef9b8b44f0535cfb5c30437541ef67327b17Nick Coghlan                if limit_set:
661f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # Close will attempt to flush the byte we wrote
671f70221b861a3714735251d57695b2f472d0599bZachary Ware                    # Restore limit first to avoid getting a spurious error
6812adef9b8b44f0535cfb5c30437541ef67327b17Nick Coghlan                    resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
691f70221b861a3714735251d57695b2f472d0599bZachary Ware            finally:
701f70221b861a3714735251d57695b2f472d0599bZachary Ware                f.close()
711f70221b861a3714735251d57695b2f472d0599bZachary Ware        finally:
721f70221b861a3714735251d57695b2f472d0599bZachary Ware            if limit_set:
731f70221b861a3714735251d57695b2f472d0599bZachary Ware                resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max))
741f70221b861a3714735251d57695b2f472d0599bZachary Ware            test_support.unlink(test_support.TESTFN)
759fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
769fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald    def test_fsize_toobig(self):
779fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        # Be sure that setrlimit is checking for really large values
789fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        too_big = 10L**50
799fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        try:
809fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald            (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE)
819fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald        except AttributeError:
821f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('RLIMIT_FSIZE not available')
831f70221b861a3714735251d57695b2f472d0599bZachary Ware        try:
841f70221b861a3714735251d57695b2f472d0599bZachary Ware            resource.setrlimit(resource.RLIMIT_FSIZE, (too_big, max))
851f70221b861a3714735251d57695b2f472d0599bZachary Ware        except (OverflowError, ValueError):
861f70221b861a3714735251d57695b2f472d0599bZachary Ware            pass
871f70221b861a3714735251d57695b2f472d0599bZachary Ware        try:
881f70221b861a3714735251d57695b2f472d0599bZachary Ware            resource.setrlimit(resource.RLIMIT_FSIZE, (max, too_big))
891f70221b861a3714735251d57695b2f472d0599bZachary Ware        except (OverflowError, ValueError):
909fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald            pass
919fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
9266262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald    def test_getrusage(self):
9366262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.getrusage)
9466262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        self.assertRaises(TypeError, resource.getrusage, 42, 42)
9566262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        usageself = resource.getrusage(resource.RUSAGE_SELF)
9666262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        usagechildren = resource.getrusage(resource.RUSAGE_CHILDREN)
9766262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        # May not be available on all systems.
9866262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald        try:
9966262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald            usageboth = resource.getrusage(resource.RUSAGE_BOTH)
100d414302eec3276cf46c8cc8d27381a6465767288Walter Dörwald        except (ValueError, AttributeError):
10166262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald            pass
10266262ab0644af6322e064e8bb3bbb8dd9cb3c2c6Walter Dörwald
103a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka    # Issue 6083: Reference counting bug
104a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka    def test_setrusage_refcount(self):
105a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka        try:
106a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka            limits = resource.getrlimit(resource.RLIMIT_CPU)
107a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka        except AttributeError:
1081f70221b861a3714735251d57695b2f472d0599bZachary Ware            self.skipTest('RLIMIT_CPU not available')
1091f70221b861a3714735251d57695b2f472d0599bZachary Ware        class BadSequence:
1101f70221b861a3714735251d57695b2f472d0599bZachary Ware            def __len__(self):
1111f70221b861a3714735251d57695b2f472d0599bZachary Ware                return 2
1121f70221b861a3714735251d57695b2f472d0599bZachary Ware            def __getitem__(self, key):
1131f70221b861a3714735251d57695b2f472d0599bZachary Ware                if key in (0, 1):
1141f70221b861a3714735251d57695b2f472d0599bZachary Ware                    return len(tuple(range(1000000)))
1151f70221b861a3714735251d57695b2f472d0599bZachary Ware                raise IndexError
116a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka
1171f70221b861a3714735251d57695b2f472d0599bZachary Ware        resource.setrlimit(resource.RLIMIT_CPU, BadSequence())
118a07a8b4f18c9f3a6eb14080dcbef4dc23a2d3f3bSerhiy Storchaka
1199fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwalddef test_main(verbose=None):
1209fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald    test_support.run_unittest(ResourceTest)
1219fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald
1229fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwaldif __name__ == "__main__":
1239fab9a7da818fb5dcab6b95a76f7dfaf7111a461Walter Dörwald    test_main()
124