| 
									
										
										
										
											2002-06-11 06:22:31 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2000-10-23 16:59:35 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2002-04-01 00:09:00 +00:00
										 |  |  | from array import array | 
					
						
							| 
									
										
										
										
											2004-05-31 00:35:52 +00:00
										 |  |  | from weakref import proxy | 
					
						
							| 
									
										
										
										
											2000-10-23 16:59:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-30 23:27:12 +00:00
										 |  |  | from test.test_support import verify, TESTFN, TestFailed | 
					
						
							| 
									
										
										
										
											2000-08-25 22:37:31 +00:00
										 |  |  | from UserList import UserList | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-05-31 00:35:52 +00:00
										 |  |  | # verify weak references | 
					
						
							|  |  |  | f = file(TESTFN, 'w') | 
					
						
							|  |  |  | p = proxy(f) | 
					
						
							|  |  |  | p.write('teststring') | 
					
						
							|  |  |  | verify(f.tell(), p.tell()) | 
					
						
							|  |  |  | f.close() | 
					
						
							|  |  |  | f = None | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     p.tell() | 
					
						
							|  |  |  | except ReferenceError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     raise TestFailed('file proxy still exists when the file is gone') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-04 04:16:52 +00:00
										 |  |  | # verify expected attributes exist | 
					
						
							|  |  |  | f = file(TESTFN, 'w') | 
					
						
							|  |  |  | softspace = f.softspace | 
					
						
							|  |  |  | f.name     # merely shouldn't blow up | 
					
						
							|  |  |  | f.mode     # ditto | 
					
						
							|  |  |  | f.closed   # ditto | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # verify softspace is writable | 
					
						
							|  |  |  | f.softspace = softspace    # merely shouldn't blow up | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # verify the others aren't | 
					
						
							|  |  |  | for attr in 'name', 'mode', 'closed': | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         setattr(f, attr, 'oops') | 
					
						
							| 
									
										
										
										
											2005-04-20 19:41:36 +00:00
										 |  |  |     except (AttributeError, TypeError): | 
					
						
							| 
									
										
										
										
											2003-05-04 04:16:52 +00:00
										 |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2005-04-20 19:41:36 +00:00
										 |  |  |         raise TestFailed('expected exception setting file attr %r' % attr) | 
					
						
							| 
									
										
										
										
											2003-05-04 04:16:52 +00:00
										 |  |  | f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-05-20 03:07:06 +00:00
										 |  |  | # check invalid mode strings | 
					
						
							|  |  |  | for mode in ("", "aU", "wU+"): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         f = file(TESTFN, mode) | 
					
						
							|  |  |  |     except ValueError: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         raise TestFailed('%r is an invalid file mode' % mode) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-25 22:37:31 +00:00
										 |  |  | # verify writelines with instance sequence | 
					
						
							|  |  |  | l = UserList(['1', '2']) | 
					
						
							|  |  |  | f = open(TESTFN, 'wb') | 
					
						
							|  |  |  | f.writelines(l) | 
					
						
							|  |  |  | f.close() | 
					
						
							|  |  |  | f = open(TESTFN, 'rb') | 
					
						
							|  |  |  | buf = f.read() | 
					
						
							|  |  |  | f.close() | 
					
						
							| 
									
										
										
										
											2001-01-17 19:11:13 +00:00
										 |  |  | verify(buf == '12') | 
					
						
							| 
									
										
										
										
											2000-08-25 22:37:31 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-01 00:09:00 +00:00
										 |  |  | # verify readinto | 
					
						
							|  |  |  | a = array('c', 'x'*10) | 
					
						
							|  |  |  | f = open(TESTFN, 'rb') | 
					
						
							|  |  |  | n = f.readinto(a) | 
					
						
							|  |  |  | f.close() | 
					
						
							|  |  |  | verify(buf == a.tostring()[:n]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-25 22:37:31 +00:00
										 |  |  | # verify writelines with integers | 
					
						
							|  |  |  | f = open(TESTFN, 'wb') | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f.writelines([1, 2, 3]) | 
					
						
							|  |  |  | except TypeError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     print "writelines accepted sequence of integers" | 
					
						
							|  |  |  | f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # verify writelines with integers in UserList | 
					
						
							|  |  |  | f = open(TESTFN, 'wb') | 
					
						
							|  |  |  | l = UserList([1,2,3]) | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f.writelines(l) | 
					
						
							|  |  |  | except TypeError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     print "writelines accepted sequence of integers" | 
					
						
							|  |  |  | f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # verify writelines with non-string object | 
					
						
							|  |  |  | class NonString: pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | f = open(TESTFN, 'wb') | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f.writelines([NonString(), NonString()]) | 
					
						
							|  |  |  | except TypeError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     print "writelines accepted sequence of non-string objects" | 
					
						
							|  |  |  | f.close() | 
					
						
							| 
									
										
										
										
											2000-10-23 16:59:35 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-11-09 19:34:43 +00:00
										 |  |  | # verify that we get a sensible error message for bad mode argument | 
					
						
							| 
									
										
										
										
											2001-11-09 16:17:24 +00:00
										 |  |  | bad_mode = "qwerty" | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     open(TESTFN, bad_mode) | 
					
						
							|  |  |  | except IOError, msg: | 
					
						
							| 
									
										
										
										
											2001-11-09 19:34:43 +00:00
										 |  |  |     if msg[0] != 0: | 
					
						
							|  |  |  |         s = str(msg) | 
					
						
							|  |  |  |         if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: | 
					
						
							|  |  |  |             print "bad error message for invalid mode: %s" % s | 
					
						
							|  |  |  |     # if msg[0] == 0, we're probably on Windows where there may be | 
					
						
							|  |  |  |     # no obvious way to discover why open() failed. | 
					
						
							| 
									
										
										
										
											2001-11-09 16:17:24 +00:00
										 |  |  | else: | 
					
						
							|  |  |  |     print "no error for invalid mode: %s" % bad_mode | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | f = open(TESTFN) | 
					
						
							|  |  |  | if f.name != TESTFN: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.name should be "%s"' % TESTFN | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | if f.isatty(): | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.isatty() should be false' | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if f.closed: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.closed should be false' | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-04-01 00:09:00 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     f.readinto("") | 
					
						
							|  |  |  | except TypeError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.readinto("") should raise a TypeError' | 
					
						
							| 
									
										
										
										
											2002-04-01 00:09:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | f.close() | 
					
						
							|  |  |  | if not f.closed: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.closed should be true' | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-04-04 07:01:35 +00:00
										 |  |  | # make sure that explicitly setting the buffer size doesn't cause | 
					
						
							|  |  |  | # misbehaviour especially with repeated close() calls | 
					
						
							|  |  |  | for s in (-1, 0, 1, 512): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         f = open(TESTFN, 'w', s) | 
					
						
							|  |  |  |         f.write(str(s)) | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         f = open(TESTFN, 'r', s) | 
					
						
							|  |  |  |         d = int(f.read()) | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |     except IOError, msg: | 
					
						
							|  |  |  |         raise TestFailed, 'error setting buffer size %d: %s' % (s, str(msg)) | 
					
						
							|  |  |  |     if d != s: | 
					
						
							|  |  |  |         raise TestFailed, 'readback failure using buffer size %d' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-06 15:58:24 +00:00
										 |  |  | methods = ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto', | 
					
						
							|  |  |  |            'readline', 'readlines', 'seek', 'tell', 'truncate', 'write', | 
					
						
							|  |  |  |            'xreadlines', '__iter__'] | 
					
						
							| 
									
										
										
										
											2002-06-11 06:22:31 +00:00
										 |  |  | if sys.platform.startswith('atheos'): | 
					
						
							|  |  |  |     methods.remove('truncate') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for methodname in methods: | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  |     method = getattr(f, methodname) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         method() | 
					
						
							|  |  |  |     except ValueError: | 
					
						
							|  |  |  |         pass | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |         raise TestFailed, 'file.%s() on a closed file should raise a ValueError' % methodname | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     f.writelines([]) | 
					
						
							|  |  |  | except ValueError: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2002-04-01 18:59:20 +00:00
										 |  |  |     raise TestFailed, 'file.writelines([]) on a closed file should raise a ValueError' | 
					
						
							| 
									
										
										
										
											2002-01-01 19:11:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-23 16:59:35 +00:00
										 |  |  | os.unlink(TESTFN) | 
					
						
							| 
									
										
										
										
											2003-09-07 03:30:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def bug801631(): | 
					
						
							|  |  |  |     # SF bug <http://www.python.org/sf/801631> | 
					
						
							|  |  |  |     # "file.truncate fault on windows" | 
					
						
							|  |  |  |     f = file(TESTFN, 'wb') | 
					
						
							|  |  |  |     f.write('12345678901')   # 11 bytes | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     f = file(TESTFN,'rb+') | 
					
						
							|  |  |  |     data = f.read(5) | 
					
						
							|  |  |  |     if data != '12345': | 
					
						
							|  |  |  |         raise TestFailed("Read on file opened for update failed %r" % data) | 
					
						
							|  |  |  |     if f.tell() != 5: | 
					
						
							|  |  |  |         raise TestFailed("File pos after read wrong %d" % f.tell()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     f.truncate() | 
					
						
							|  |  |  |     if f.tell() != 5: | 
					
						
							|  |  |  |         raise TestFailed("File pos after ftruncate wrong %d" % f.tell()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  |     size = os.path.getsize(TESTFN) | 
					
						
							|  |  |  |     if size != 5: | 
					
						
							|  |  |  |         raise TestFailed("File size after ftruncate wrong %d" % size) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     bug801631() | 
					
						
							|  |  |  | finally: | 
					
						
							|  |  |  |     os.unlink(TESTFN) |