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