| 
									
										
										
										
											2009-06-12 20:41:52 +00:00
										 |  |  | # NOTE: this file tests the new `io` library backported from Python 3.x. | 
					
						
							|  |  |  | # Similar tests for the builtin file object can be found in test_file2k.py. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | from __future__ import print_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-11 06:22:31 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2000-10-23 16:59:35 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | import io | 
					
						
							|  |  |  | import _pyio as pyio | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-07 17:03:15 +00:00
										 |  |  | from test.test_support import TESTFN, run_unittest | 
					
						
							| 
									
										
										
										
											2000-08-25 22:37:31 +00:00
										 |  |  | from UserList import UserList | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | class AutoFileTests(unittest.TestCase): | 
					
						
							|  |  |  |     # file tests for which a test file is automatically set up | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         self.f = self.open(TESTFN, 'wb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							| 
									
										
										
										
											2006-06-09 03:51:41 +00:00
										 |  |  |         if self.f: | 
					
						
							|  |  |  |             self.f.close() | 
					
						
							|  |  |  |         os.remove(TESTFN) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testWeakRefs(self): | 
					
						
							|  |  |  |         # verify weak references | 
					
						
							|  |  |  |         p = proxy(self.f) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         p.write(b'teststring') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         self.assertEquals(self.f.tell(), p.tell()) | 
					
						
							|  |  |  |         self.f.close() | 
					
						
							|  |  |  |         self.f = None | 
					
						
							|  |  |  |         self.assertRaises(ReferenceError, getattr, p, 'tell') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testAttributes(self): | 
					
						
							|  |  |  |         # verify expected attributes exist | 
					
						
							|  |  |  |         f = self.f | 
					
						
							|  |  |  |         f.name     # merely shouldn't blow up | 
					
						
							|  |  |  |         f.mode     # ditto | 
					
						
							|  |  |  |         f.closed   # ditto | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testReadinto(self): | 
					
						
							|  |  |  |         # verify readinto | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         self.f.write(b'12') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         self.f.close() | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         a = array('b', b'x'*10) | 
					
						
							|  |  |  |         self.f = self.open(TESTFN, 'rb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         n = self.f.readinto(a) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         self.assertEquals(b'12', a.tostring()[:n]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testReadinto_text(self): | 
					
						
							|  |  |  |         # verify readinto refuses text files | 
					
						
							|  |  |  |         a = array('b', b'x'*10) | 
					
						
							|  |  |  |         self.f.close() | 
					
						
							|  |  |  |         self.f = self.open(TESTFN, 'r') | 
					
						
							|  |  |  |         if hasattr(self.f, "readinto"): | 
					
						
							|  |  |  |             self.assertRaises(TypeError, self.f.readinto, a) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testWritelinesUserList(self): | 
					
						
							|  |  |  |         # verify writelines with instance sequence | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         l = UserList([b'1', b'2']) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         self.f.writelines(l) | 
					
						
							|  |  |  |         self.f.close() | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         self.f = self.open(TESTFN, 'rb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         buf = self.f.read() | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         self.assertEquals(buf, b'12') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testWritelinesIntegers(self): | 
					
						
							|  |  |  |         # verify writelines with integers | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.f.writelines, [1, 2, 3]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testWritelinesIntegersUserList(self): | 
					
						
							|  |  |  |         # verify writelines with integers in UserList | 
					
						
							|  |  |  |         l = UserList([1,2,3]) | 
					
						
							|  |  |  |         self.assertRaises(TypeError, self.f.writelines, l) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testWritelinesNonString(self): | 
					
						
							|  |  |  |         # verify writelines with non-string object | 
					
						
							| 
									
										
										
										
											2006-06-09 03:51:41 +00:00
										 |  |  |         class NonString: | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-09 03:51:41 +00:00
										 |  |  |         self.assertRaises(TypeError, self.f.writelines, | 
					
						
							|  |  |  |                           [NonString(), NonString()]) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testErrors(self): | 
					
						
							|  |  |  |         f = self.f | 
					
						
							|  |  |  |         self.assertEquals(f.name, TESTFN) | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(not f.isatty()) | 
					
						
							|  |  |  |         self.assertTrue(not f.closed) | 
					
						
							| 
									
										
										
										
											2006-06-09 02:11:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         if hasattr(f, "readinto"): | 
					
						
							|  |  |  |             self.assertRaises((IOError, TypeError), f.readinto, "") | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         f.close() | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(f.closed) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def testMethods(self): | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         methods = [('fileno', ()), | 
					
						
							|  |  |  |                    ('flush', ()), | 
					
						
							|  |  |  |                    ('isatty', ()), | 
					
						
							|  |  |  |                    ('next', ()), | 
					
						
							|  |  |  |                    ('read', ()), | 
					
						
							|  |  |  |                    ('write', (b"",)), | 
					
						
							|  |  |  |                    ('readline', ()), | 
					
						
							|  |  |  |                    ('readlines', ()), | 
					
						
							|  |  |  |                    ('seek', (0,)), | 
					
						
							|  |  |  |                    ('tell', ()), | 
					
						
							|  |  |  |                    ('write', (b"",)), | 
					
						
							|  |  |  |                    ('writelines', ([],)), | 
					
						
							|  |  |  |                    ('__iter__', ()), | 
					
						
							|  |  |  |                    ] | 
					
						
							|  |  |  |         if not sys.platform.startswith('atheos'): | 
					
						
							|  |  |  |             methods.append(('truncate', ())) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-09 18:29:52 +00:00
										 |  |  |         # __exit__ should close the file | 
					
						
							|  |  |  |         self.f.__exit__(None, None, None) | 
					
						
							| 
									
										
										
										
											2009-06-30 22:57:08 +00:00
										 |  |  |         self.assertTrue(self.f.closed) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         for methodname, args in methods: | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             method = getattr(self.f, methodname) | 
					
						
							|  |  |  |             # should raise on closed file | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             self.assertRaises(ValueError, method, *args) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-09 18:29:52 +00:00
										 |  |  |         # file is closed, __exit__ shouldn't do anything | 
					
						
							|  |  |  |         self.assertEquals(self.f.__exit__(None, None, None), None) | 
					
						
							|  |  |  |         # it must also return None if an exception was given | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2010-02-03 05:37:26 +00:00
										 |  |  |             1 // 0 | 
					
						
							| 
									
										
										
										
											2006-06-09 18:29:52 +00:00
										 |  |  |         except: | 
					
						
							|  |  |  |             self.assertEquals(self.f.__exit__(*sys.exc_info()), None) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 03:30:15 +00:00
										 |  |  |     def testReadWhenWriting(self): | 
					
						
							|  |  |  |         self.assertRaises(IOError, self.f.read) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | class CAutoFileTests(AutoFileTests): | 
					
						
							|  |  |  |     open = io.open | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | class PyAutoFileTests(AutoFileTests): | 
					
						
							|  |  |  |     open = staticmethod(pyio.open) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class OtherFileTests(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2008-12-29 17:47:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |     def testModeStrings(self): | 
					
						
							|  |  |  |         # check invalid mode strings | 
					
						
							|  |  |  |         for mode in ("", "aU", "wU+"): | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 f = self.open(TESTFN, mode) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             except ValueError: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 f.close() | 
					
						
							|  |  |  |                 self.fail('%r is an invalid file mode' % mode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testStdin(self): | 
					
						
							|  |  |  |         # This causes the interpreter to exit on OSF1 v5.1. | 
					
						
							|  |  |  |         if sys.platform != 'osf1V5': | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             self.assertRaises((IOError, ValueError), sys.stdin.seek, -1) | 
					
						
							| 
									
										
										
										
											2006-02-12 11:53:32 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             print(( | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 '  Skipping sys.stdin.seek(-1), it may crash the interpreter.' | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 ' Test manually.'), file=sys.__stdout__) | 
					
						
							|  |  |  |         self.assertRaises((IOError, ValueError), sys.stdin.truncate) | 
					
						
							| 
									
										
										
										
											2006-02-12 11:53:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |     def testBadModeArgument(self): | 
					
						
							|  |  |  |         # verify that we get a sensible error message for bad mode argument | 
					
						
							|  |  |  |         bad_mode = "qwerty" | 
					
						
							| 
									
										
										
										
											2006-02-14 17:41:18 +00:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             f = self.open(TESTFN, bad_mode) | 
					
						
							|  |  |  |         except ValueError as msg: | 
					
						
							|  |  |  |             if msg.args[0] != 0: | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 s = str(msg) | 
					
						
							|  |  |  |                 if s.find(TESTFN) != -1 or s.find(bad_mode) == -1: | 
					
						
							|  |  |  |                     self.fail("bad error message for invalid mode: %s" % s) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             # if msg.args[0] == 0, we're probably on Windows where there may be | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             # no obvious way to discover why open() failed. | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             self.fail("no error for invalid mode: %s" % bad_mode) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testSetBufferSize(self): | 
					
						
							|  |  |  |         # 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: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 f = self.open(TESTFN, 'wb', s) | 
					
						
							|  |  |  |                 f.write(str(s).encode("ascii")) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 f.close() | 
					
						
							|  |  |  |                 f.close() | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 f = self.open(TESTFN, 'rb', s) | 
					
						
							|  |  |  |                 d = int(f.read().decode("ascii")) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 f.close() | 
					
						
							|  |  |  |                 f.close() | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             except IOError as msg: | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 self.fail('error setting buffer size %d: %s' % (s, str(msg))) | 
					
						
							|  |  |  |             self.assertEquals(d, s) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testTruncateOnWindows(self): | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         # SF bug <http://www.python.org/sf/801631> | 
					
						
							|  |  |  |         # "file.truncate fault on windows" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         os.unlink(TESTFN) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         f = self.open(TESTFN, 'wb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         try: | 
					
						
							|  |  |  |             f.write(b'12345678901')   # 11 bytes | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             f = self.open(TESTFN,'rb+') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             data = f.read(5) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             if data != b'12345': | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 self.fail("Read on file opened for update failed %r" % data) | 
					
						
							|  |  |  |             if f.tell() != 5: | 
					
						
							|  |  |  |                 self.fail("File pos after read wrong %d" % f.tell()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             f.truncate() | 
					
						
							|  |  |  |             if f.tell() != 5: | 
					
						
							|  |  |  |                 self.fail("File pos after ftruncate wrong %d" % f.tell()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             f.close() | 
					
						
							|  |  |  |             size = os.path.getsize(TESTFN) | 
					
						
							|  |  |  |             if size != 5: | 
					
						
							|  |  |  |                 self.fail("File size after ftruncate wrong %d" % size) | 
					
						
							|  |  |  |         finally: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             f.close() | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             os.unlink(TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def testIteration(self): | 
					
						
							| 
									
										
										
										
											2006-06-09 03:51:41 +00:00
										 |  |  |         # Test the complex interaction when mixing file-iteration and the | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         # various read* methods. | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         dataoffset = 16384 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         filler = b"ham\n" | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         assert not dataoffset % len(filler), \ | 
					
						
							|  |  |  |             "dataoffset must be multiple of len(filler)" | 
					
						
							|  |  |  |         nchunks = dataoffset // len(filler) | 
					
						
							|  |  |  |         testlines = [ | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             b"spam, spam and eggs\n", | 
					
						
							|  |  |  |             b"eggs, spam, ham and spam\n", | 
					
						
							|  |  |  |             b"saussages, spam, spam and eggs\n", | 
					
						
							|  |  |  |             b"spam, ham, spam and eggs\n", | 
					
						
							|  |  |  |             b"spam, spam, spam, spam, spam, ham, spam\n", | 
					
						
							|  |  |  |             b"wonderful spaaaaaam.\n" | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |         ] | 
					
						
							|  |  |  |         methods = [("readline", ()), ("read", ()), ("readlines", ()), | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                    ("readinto", (array("b", b" "*100),))] | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             # Prepare the testfile | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             bag = self.open(TESTFN, "wb") | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             bag.write(filler * nchunks) | 
					
						
							|  |  |  |             bag.writelines(testlines) | 
					
						
							|  |  |  |             bag.close() | 
					
						
							|  |  |  |             # Test for appropriate errors mixing read* and iteration | 
					
						
							|  |  |  |             for methodname, args in methods: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 f = self.open(TESTFN, 'rb') | 
					
						
							|  |  |  |                 if next(f) != filler: | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                     self.fail, "Broken testfile" | 
					
						
							|  |  |  |                 meth = getattr(f, methodname) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 meth(*args)  # This simply shouldn't fail | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |                 f.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-09 03:51:41 +00:00
										 |  |  |             # Test to see if harmless (by accident) mixing of read* and | 
					
						
							|  |  |  |             # iteration still works. This depends on the size of the internal | 
					
						
							|  |  |  |             # iteration buffer (currently 8192,) but we can test it in a | 
					
						
							|  |  |  |             # flexible manner.  Each line in the bag o' ham is 4 bytes | 
					
						
							|  |  |  |             # ("h", "a", "m", "\n"), so 4096 lines of that should get us | 
					
						
							|  |  |  |             # exactly on the buffer boundary for any power-of-2 buffersize | 
					
						
							|  |  |  |             # between 4 and 16384 (inclusive). | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             f = self.open(TESTFN, 'rb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             for i in range(nchunks): | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |                 next(f) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             testline = testlines.pop(0) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 line = f.readline() | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 self.fail("readline() after next() with supposedly empty " | 
					
						
							|  |  |  |                           "iteration-buffer failed anyway") | 
					
						
							|  |  |  |             if line != testline: | 
					
						
							|  |  |  |                 self.fail("readline() after next() with empty buffer " | 
					
						
							|  |  |  |                           "failed. Got %r, expected %r" % (line, testline)) | 
					
						
							|  |  |  |             testline = testlines.pop(0) | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             buf = array("b", b"\x00" * len(testline)) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 f.readinto(buf) | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 self.fail("readinto() after next() with supposedly empty " | 
					
						
							|  |  |  |                           "iteration-buffer failed anyway") | 
					
						
							|  |  |  |             line = buf.tostring() | 
					
						
							|  |  |  |             if line != testline: | 
					
						
							|  |  |  |                 self.fail("readinto() after next() with empty buffer " | 
					
						
							|  |  |  |                           "failed. Got %r, expected %r" % (line, testline)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             testline = testlines.pop(0) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 line = f.read(len(testline)) | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 self.fail("read() after next() with supposedly empty " | 
					
						
							|  |  |  |                           "iteration-buffer failed anyway") | 
					
						
							|  |  |  |             if line != testline: | 
					
						
							|  |  |  |                 self.fail("read() after next() with empty buffer " | 
					
						
							|  |  |  |                           "failed. Got %r, expected %r" % (line, testline)) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 lines = f.readlines() | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							|  |  |  |                 self.fail("readlines() after next() with supposedly empty " | 
					
						
							|  |  |  |                           "iteration-buffer failed anyway") | 
					
						
							|  |  |  |             if lines != testlines: | 
					
						
							|  |  |  |                 self.fail("readlines() after next() with empty buffer " | 
					
						
							|  |  |  |                           "failed. Got %r, expected %r" % (line, testline)) | 
					
						
							|  |  |  |             # Reading after iteration hit EOF shouldn't hurt either | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |             f = self.open(TESTFN, 'rb') | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 for line in f: | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     f.readline() | 
					
						
							|  |  |  |                     f.readinto(buf) | 
					
						
							|  |  |  |                     f.read() | 
					
						
							|  |  |  |                     f.readlines() | 
					
						
							|  |  |  |                 except ValueError: | 
					
						
							|  |  |  |                     self.fail("read* failed after next() consumed file") | 
					
						
							|  |  |  |             finally: | 
					
						
							|  |  |  |                 f.close() | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             os.unlink(TESTFN) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | class COtherFileTests(OtherFileTests): | 
					
						
							|  |  |  |     open = io.open | 
					
						
							| 
									
										
										
										
											2008-02-23 15:11:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  | class PyOtherFileTests(OtherFileTests): | 
					
						
							|  |  |  |     open = staticmethod(pyio.open) | 
					
						
							| 
									
										
										
										
											2008-12-08 18:55:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-06 23:11:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | def test_main(): | 
					
						
							| 
									
										
										
										
											2006-06-09 05:54:18 +00:00
										 |  |  |     # Historically, these tests have been sloppy about removing TESTFN. | 
					
						
							|  |  |  |     # So get rid of it no matter what. | 
					
						
							| 
									
										
										
										
											2006-06-09 04:02:06 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2009-06-12 20:14:08 +00:00
										 |  |  |         run_unittest(CAutoFileTests, PyAutoFileTests, | 
					
						
							|  |  |  |                      COtherFileTests, PyOtherFileTests) | 
					
						
							| 
									
										
										
										
											2006-06-09 04:02:06 +00:00
										 |  |  |     finally: | 
					
						
							|  |  |  |         if os.path.exists(TESTFN): | 
					
						
							|  |  |  |             os.unlink(TESTFN) | 
					
						
							| 
									
										
										
										
											2006-06-08 14:50:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     test_main() |