| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | from test import test_support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os, resource | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # This test is checking a few specific problem spots with the resource module. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ResourceTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2007-01-20 18:19:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_args(self): | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.getrlimit) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.getrlimit, 42, 42) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.setrlimit) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.setrlimit, 42, 42, 42) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  |     def test_fsize_ismax(self): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             # 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. | 
					
						
							|  |  |  |             self.assertEqual(resource.RLIM_INFINITY, max) | 
					
						
							|  |  |  |             resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_fsize_enforced(self): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             # 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. | 
					
						
							| 
									
										
										
										
											2007-01-30 03:03:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  |             # 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 = True | 
					
						
							|  |  |  |                 except ValueError: | 
					
						
							|  |  |  |                     limit_set = False | 
					
						
							|  |  |  |                 f = open(test_support.TESTFN, "wb") | 
					
						
							|  |  |  |                 try: | 
					
						
							| 
									
										
										
										
											2007-07-24 14:39:23 +00:00
										 |  |  |                     f.write("X" * 1024) | 
					
						
							|  |  |  |                     try: | 
					
						
							|  |  |  |                         f.write("Y") | 
					
						
							|  |  |  |                         f.flush() | 
					
						
							| 
									
										
										
										
											2008-01-26 23:13:46 +00:00
										 |  |  |                         # On some systems (e.g., Ubuntu on hppa) the flush() | 
					
						
							| 
									
										
										
										
											2008-01-27 05:02:34 +00:00
										 |  |  |                         # doesn't always cause the exception, but the close() | 
					
						
							|  |  |  |                         # does eventually.  Try closing several times in | 
					
						
							|  |  |  |                         # an attempt to ensure the file is really synced and | 
					
						
							|  |  |  |                         # the exception raised. | 
					
						
							|  |  |  |                         for i in range(5): | 
					
						
							|  |  |  |                             f.close() | 
					
						
							| 
									
										
										
										
											2007-07-24 14:39:23 +00:00
										 |  |  |                     except IOError: | 
					
						
							|  |  |  |                         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() | 
					
						
							| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  |             finally: | 
					
						
							| 
									
										
										
										
											2007-07-24 14:39:23 +00:00
										 |  |  |                 if limit_set: | 
					
						
							|  |  |  |                     resource.setrlimit(resource.RLIMIT_FSIZE, (cur, max)) | 
					
						
							| 
									
										
										
										
											2008-01-26 21:02:45 +00:00
										 |  |  |                 test_support.unlink(test_support.TESTFN) | 
					
						
							| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_fsize_toobig(self): | 
					
						
							|  |  |  |         # Be sure that setrlimit is checking for really large values | 
					
						
							|  |  |  |         too_big = 10L**50 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             (cur, max) = resource.getrlimit(resource.RLIMIT_FSIZE) | 
					
						
							|  |  |  |         except AttributeError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-20 18:19:33 +00:00
										 |  |  |     def test_getrusage(self): | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.getrusage) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, resource.getrusage, 42, 42) | 
					
						
							|  |  |  |         usageself = resource.getrusage(resource.RUSAGE_SELF) | 
					
						
							|  |  |  |         usagechildren = resource.getrusage(resource.RUSAGE_CHILDREN) | 
					
						
							|  |  |  |         # May not be available on all systems. | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             usageboth = resource.getrusage(resource.RUSAGE_BOTH) | 
					
						
							| 
									
										
										
										
											2007-01-20 19:03:17 +00:00
										 |  |  |         except (ValueError, AttributeError): | 
					
						
							| 
									
										
										
										
											2007-01-20 18:19:33 +00:00
										 |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-20 17:28:31 +00:00
										 |  |  | def test_main(verbose=None): | 
					
						
							|  |  |  |     test_support.run_unittest(ResourceTest) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |