Changeset 391 for python/trunk/Lib/test/test_fileio.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_fileio.py
r2 r391 1 1 # Adapted from test_file.py by Daniel Stutzbach 2 #from __future__ import unicode_literals 2 3 from __future__ import unicode_literals 3 4 4 5 import sys 5 6 import os 7 import errno 6 8 import unittest 7 9 from array import array 8 10 from weakref import proxy 9 10 from test.test_support import (TESTFN, findfile, check_warnings, run_unittest, 11 make_bad_fd) 11 from functools import wraps 12 12 from UserList import UserList 13 14 import _fileio 13 import _testcapi 14 15 from test.test_support import TESTFN, check_warnings, run_unittest, make_bad_fd 16 from test.test_support import py3k_bytes as bytes 17 from test.script_helper import run_python 18 19 from _io import FileIO as _FileIO 15 20 16 21 class AutoFileTests(unittest.TestCase): … … 18 23 19 24 def setUp(self): 20 self.f = _ fileio._FileIO(TESTFN, 'w')25 self.f = _FileIO(TESTFN, 'w') 21 26 22 27 def tearDown(self): … … 29 34 p = proxy(self.f) 30 35 p.write(bytes(range(10))) 31 self.assertEqual s(self.f.tell(), p.tell())36 self.assertEqual(self.f.tell(), p.tell()) 32 37 self.f.close() 33 38 self.f = None … … 35 40 36 41 def testSeekTell(self): 37 self.f.write(bytes( bytearray(range(20))))38 self.assertEqual s(self.f.tell(), 20)42 self.f.write(bytes(range(20))) 43 self.assertEqual(self.f.tell(), 20) 39 44 self.f.seek(0) 40 self.assertEqual s(self.f.tell(), 0)45 self.assertEqual(self.f.tell(), 0) 41 46 self.f.seek(10) 42 self.assertEqual s(self.f.tell(), 10)47 self.assertEqual(self.f.tell(), 10) 43 48 self.f.seek(5, 1) 44 self.assertEqual s(self.f.tell(), 15)49 self.assertEqual(self.f.tell(), 15) 45 50 self.f.seek(-5, 1) 46 self.assertEqual s(self.f.tell(), 10)51 self.assertEqual(self.f.tell(), 10) 47 52 self.f.seek(-5, 2) 48 self.assertEqual s(self.f.tell(), 15)53 self.assertEqual(self.f.tell(), 15) 49 54 50 55 def testAttributes(self): … … 52 57 f = self.f 53 58 54 self.assertEqual s(f.mode, "wb")55 self.assertEqual s(f.closed, False)59 self.assertEqual(f.mode, "wb") 60 self.assertEqual(f.closed, False) 56 61 57 62 # verify the attributes are readonly … … 62 67 def testReadinto(self): 63 68 # verify readinto 64 self.f.write(b ytes(bytearray([1, 2])))65 self.f.close() 66 a = array( 'b', b'x'*10)67 self.f = _ fileio._FileIO(TESTFN, 'r')69 self.f.write(b"\x01\x02") 70 self.f.close() 71 a = array(b'b', b'x'*10) 72 self.f = _FileIO(TESTFN, 'r') 68 73 n = self.f.readinto(a) 69 self.assertEquals(array('b', [1, 2]), a[:n]) 74 self.assertEqual(array(b'b', [1, 2]), a[:n]) 75 76 def testWritelinesList(self): 77 l = [b'123', b'456'] 78 self.f.writelines(l) 79 self.f.close() 80 self.f = _FileIO(TESTFN, 'rb') 81 buf = self.f.read() 82 self.assertEqual(buf, b'123456') 83 84 def testWritelinesUserList(self): 85 l = UserList([b'123', b'456']) 86 self.f.writelines(l) 87 self.f.close() 88 self.f = _FileIO(TESTFN, 'rb') 89 buf = self.f.read() 90 self.assertEqual(buf, b'123456') 91 92 def testWritelinesError(self): 93 self.assertRaises(TypeError, self.f.writelines, [1, 2, 3]) 94 self.assertRaises(TypeError, self.f.writelines, None) 95 96 def test_none_args(self): 97 self.f.write(b"hi\nbye\nabc") 98 self.f.close() 99 self.f = _FileIO(TESTFN, 'r') 100 self.assertEqual(self.f.read(None), b"hi\nbye\nabc") 101 self.f.seek(0) 102 self.assertEqual(self.f.readline(None), b"hi\n") 103 self.assertEqual(self.f.readlines(None), [b"bye\n", b"abc"]) 70 104 71 105 def testRepr(self): 72 self.assertEquals(repr(self.f), 73 "_fileio._FileIO(%d, %s)" % (self.f.fileno(), 74 repr(self.f.mode))) 106 self.assertEqual(repr(self.f), "<_io.FileIO name=%r mode='%s'>" 107 % (self.f.name, self.f.mode)) 108 del self.f.name 109 self.assertEqual(repr(self.f), "<_io.FileIO fd=%r mode='%s'>" 110 % (self.f.fileno(), self.f.mode)) 111 self.f.close() 112 self.assertEqual(repr(self.f), "<_io.FileIO [closed]>") 75 113 76 114 def testErrors(self): 77 115 f = self.f 78 self.assert _(not f.isatty())79 self.assert _(not f.closed)80 #self.assertEqual s(f.name, TESTFN)116 self.assertTrue(not f.isatty()) 117 self.assertTrue(not f.closed) 118 #self.assertEqual(f.name, TESTFN) 81 119 self.assertRaises(ValueError, f.read, 10) # Open for reading 82 120 f.close() 83 self.assert _(f.closed)84 f = _ fileio._FileIO(TESTFN, 'r')121 self.assertTrue(f.closed) 122 f = _FileIO(TESTFN, 'r') 85 123 self.assertRaises(TypeError, f.readinto, "") 86 self.assert _(not f.closed)124 self.assertTrue(not f.closed) 87 125 f.close() 88 self.assert _(f.closed)126 self.assertTrue(f.closed) 89 127 90 128 def testMethods(self): … … 96 134 97 135 self.f.close() 98 self.assert _(self.f.closed)136 self.assertTrue(self.f.closed) 99 137 100 138 for methodname in methods: … … 108 146 # Unix calls dircheck() and returns "[Errno 21]: Is a directory" 109 147 try: 110 _ fileio._FileIO('.', 'r')148 _FileIO('.', 'r') 111 149 except IOError as e: 112 150 self.assertNotEqual(e.errno, 0) … … 115 153 self.fail("Should have raised IOError") 116 154 155 @unittest.skipIf(os.name == 'nt', "test only works on a POSIX-like system") 156 def testOpenDirFD(self): 157 fd = os.open('.', os.O_RDONLY) 158 with self.assertRaises(IOError) as cm: 159 _FileIO(fd, 'r') 160 os.close(fd) 161 self.assertEqual(cm.exception.errno, errno.EISDIR) 162 163 #A set of functions testing that we get expected behaviour if someone has 164 #manually closed the internal file descriptor. First, a decorator: 165 def ClosedFD(func): 166 @wraps(func) 167 def wrapper(self): 168 #forcibly close the fd before invoking the problem function 169 f = self.f 170 os.close(f.fileno()) 171 try: 172 func(self, f) 173 finally: 174 try: 175 self.f.close() 176 except IOError: 177 pass 178 return wrapper 179 180 def ClosedFDRaises(func): 181 @wraps(func) 182 def wrapper(self): 183 #forcibly close the fd before invoking the problem function 184 f = self.f 185 os.close(f.fileno()) 186 try: 187 func(self, f) 188 except IOError as e: 189 self.assertEqual(e.errno, errno.EBADF) 190 else: 191 self.fail("Should have raised IOError") 192 finally: 193 try: 194 self.f.close() 195 except IOError: 196 pass 197 return wrapper 198 199 @ClosedFDRaises 200 def testErrnoOnClose(self, f): 201 f.close() 202 203 @ClosedFDRaises 204 def testErrnoOnClosedWrite(self, f): 205 f.write('a') 206 207 @ClosedFDRaises 208 def testErrnoOnClosedSeek(self, f): 209 f.seek(0) 210 211 @ClosedFDRaises 212 def testErrnoOnClosedTell(self, f): 213 f.tell() 214 215 @ClosedFDRaises 216 def testErrnoOnClosedTruncate(self, f): 217 f.truncate(0) 218 219 @ClosedFD 220 def testErrnoOnClosedSeekable(self, f): 221 f.seekable() 222 223 @ClosedFD 224 def testErrnoOnClosedReadable(self, f): 225 f.readable() 226 227 @ClosedFD 228 def testErrnoOnClosedWritable(self, f): 229 f.writable() 230 231 @ClosedFD 232 def testErrnoOnClosedFileno(self, f): 233 f.fileno() 234 235 @ClosedFD 236 def testErrnoOnClosedIsatty(self, f): 237 self.assertEqual(f.isatty(), False) 238 239 def ReopenForRead(self): 240 try: 241 self.f.close() 242 except IOError: 243 pass 244 self.f = _FileIO(TESTFN, 'r') 245 os.close(self.f.fileno()) 246 return self.f 247 248 @ClosedFDRaises 249 def testErrnoOnClosedRead(self, f): 250 f = self.ReopenForRead() 251 f.read(1) 252 253 @ClosedFDRaises 254 def testErrnoOnClosedReadall(self, f): 255 f = self.ReopenForRead() 256 f.readall() 257 258 @ClosedFDRaises 259 def testErrnoOnClosedReadinto(self, f): 260 f = self.ReopenForRead() 261 a = array(b'b', b'x'*10) 262 f.readinto(a) 117 263 118 264 class OtherFileTests(unittest.TestCase): … … 120 266 def testAbles(self): 121 267 try: 122 f = _ fileio._FileIO(TESTFN, "w")123 self.assertEqual s(f.readable(), False)124 self.assertEqual s(f.writable(), True)125 self.assertEqual s(f.seekable(), True)126 f.close() 127 128 f = _ fileio._FileIO(TESTFN, "r")129 self.assertEqual s(f.readable(), True)130 self.assertEqual s(f.writable(), False)131 self.assertEqual s(f.seekable(), True)132 f.close() 133 134 f = _ fileio._FileIO(TESTFN, "a+")135 self.assertEqual s(f.readable(), True)136 self.assertEqual s(f.writable(), True)137 self.assertEqual s(f.seekable(), True)138 self.assertEqual s(f.isatty(), False)268 f = _FileIO(TESTFN, "w") 269 self.assertEqual(f.readable(), False) 270 self.assertEqual(f.writable(), True) 271 self.assertEqual(f.seekable(), True) 272 f.close() 273 274 f = _FileIO(TESTFN, "r") 275 self.assertEqual(f.readable(), True) 276 self.assertEqual(f.writable(), False) 277 self.assertEqual(f.seekable(), True) 278 f.close() 279 280 f = _FileIO(TESTFN, "a+") 281 self.assertEqual(f.readable(), True) 282 self.assertEqual(f.writable(), True) 283 self.assertEqual(f.seekable(), True) 284 self.assertEqual(f.isatty(), False) 139 285 f.close() 140 286 141 287 if sys.platform != "win32": 142 288 try: 143 f = _ fileio._FileIO("/dev/tty", "a")289 f = _FileIO("/dev/tty", "a") 144 290 except EnvironmentError: 145 291 # When run in a cron job there just aren't any … … 148 294 pass 149 295 else: 150 f = _fileio._FileIO("/dev/tty", "a") 151 self.assertEquals(f.readable(), False) 152 self.assertEquals(f.writable(), True) 296 self.assertEqual(f.readable(), False) 297 self.assertEqual(f.writable(), True) 153 298 if sys.platform != "darwin" and \ 154 299 'bsd' not in sys.platform and \ 155 300 not sys.platform.startswith('sunos'): 156 301 # Somehow /dev/tty appears seekable on some BSDs 157 self.assertEqual s(f.seekable(), False)158 self.assertEqual s(f.isatty(), True)302 self.assertEqual(f.seekable(), False) 303 self.assertEqual(f.isatty(), True) 159 304 f.close() 160 305 finally: 161 306 os.unlink(TESTFN) 162 307 163 def test ModeStrings(self):308 def testInvalidModeStrings(self): 164 309 # check invalid mode strings 165 310 for mode in ("", "aU", "wU+", "rw", "rt"): 166 311 try: 167 f = _ fileio._FileIO(TESTFN, mode)312 f = _FileIO(TESTFN, mode) 168 313 except ValueError: 169 314 pass … … 172 317 self.fail('%r is an invalid file mode' % mode) 173 318 319 def testModeStrings(self): 320 # test that the mode attribute is correct for various mode strings 321 # given as init args 322 try: 323 for modes in [('w', 'wb'), ('wb', 'wb'), ('wb+', 'rb+'), 324 ('w+b', 'rb+'), ('a', 'ab'), ('ab', 'ab'), 325 ('ab+', 'ab+'), ('a+b', 'ab+'), ('r', 'rb'), 326 ('rb', 'rb'), ('rb+', 'rb+'), ('r+b', 'rb+')]: 327 # read modes are last so that TESTFN will exist first 328 with _FileIO(TESTFN, modes[0]) as f: 329 self.assertEqual(f.mode, modes[1]) 330 finally: 331 if os.path.exists(TESTFN): 332 os.unlink(TESTFN) 333 174 334 def testUnicodeOpen(self): 175 335 # verify repr works for unicode too 176 f = _ fileio._FileIO(str(TESTFN), "w")336 f = _FileIO(str(TESTFN), "w") 177 337 f.close() 178 338 os.unlink(TESTFN) 179 339 340 def testBytesOpen(self): 341 # Opening a bytes filename 342 try: 343 fn = TESTFN.encode("ascii") 344 except UnicodeEncodeError: 345 # Skip test 346 return 347 f = _FileIO(fn, "w") 348 try: 349 f.write(b"abc") 350 f.close() 351 with open(TESTFN, "rb") as f: 352 self.assertEqual(f.read(), b"abc") 353 finally: 354 os.unlink(TESTFN) 355 180 356 def testInvalidFd(self): 181 self.assertRaises(ValueError, _fileio._FileIO, -10) 182 self.assertRaises(OSError, _fileio._FileIO, make_bad_fd()) 357 self.assertRaises(ValueError, _FileIO, -10) 358 self.assertRaises(OSError, _FileIO, make_bad_fd()) 359 if sys.platform == 'win32': 360 import msvcrt 361 self.assertRaises(IOError, msvcrt.get_osfhandle, make_bad_fd()) 362 # Issue 15989 363 self.assertRaises(TypeError, _FileIO, _testcapi.INT_MAX + 1) 364 self.assertRaises(TypeError, _FileIO, _testcapi.INT_MIN - 1) 183 365 184 366 def testBadModeArgument(self): … … 186 368 bad_mode = "qwerty" 187 369 try: 188 f = _ fileio._FileIO(TESTFN, bad_mode)370 f = _FileIO(TESTFN, bad_mode) 189 371 except ValueError as msg: 190 372 if msg.args[0] != 0: 191 373 s = str(msg) 192 if s.find(TESTFN) != -1 or s.find(bad_mode) == -1:374 if TESTFN in s or bad_mode not in s: 193 375 self.fail("bad error message for invalid mode: %s" % s) 194 376 # if msg.args[0] == 0, we're probably on Windows where there may be … … 199 381 200 382 def testTruncate(self): 201 f = _ fileio._FileIO(TESTFN, 'w')383 f = _FileIO(TESTFN, 'w') 202 384 f.write(bytes(bytearray(range(10)))) 203 385 self.assertEqual(f.tell(), 10) … … 208 390 self.assertEqual(f.tell(), 5) 209 391 self.assertEqual(f.seek(0, os.SEEK_END), 15) 392 f.close() 210 393 211 394 def testTruncateOnWindows(self): … … 213 396 # SF bug <http://www.python.org/sf/801631> 214 397 # "file.truncate fault on windows" 215 f = _ fileio._FileIO(TESTFN, 'w')216 f.write(bytes( bytearray(range(11))))217 f.close() 218 219 f = _ fileio._FileIO(TESTFN,'r+')398 f = _FileIO(TESTFN, 'w') 399 f.write(bytes(range(11))) 400 f.close() 401 402 f = _FileIO(TESTFN,'r+') 220 403 data = f.read(5) 221 if data != bytes( bytearray(range(5))):404 if data != bytes(range(5)): 222 405 self.fail("Read on file opened for update failed %r" % data) 223 406 if f.tell() != 5: … … 257 440 258 441 def testInvalidInit(self): 259 self.assertRaises(TypeError, _ fileio._FileIO, "1", 0, 0)442 self.assertRaises(TypeError, _FileIO, "1", 0, 0) 260 443 261 444 def testWarnings(self): 262 with check_warnings( ) as w:445 with check_warnings(quiet=True) as w: 263 446 self.assertEqual(w.warnings, []) 264 self.assertRaises(TypeError, _ fileio._FileIO, [])447 self.assertRaises(TypeError, _FileIO, []) 265 448 self.assertEqual(w.warnings, []) 266 self.assertRaises(ValueError, _ fileio._FileIO, "/some/invalid/name", "rt")449 self.assertRaises(ValueError, _FileIO, "/some/invalid/name", "rt") 267 450 self.assertEqual(w.warnings, []) 268 451 452 def test_surrogates(self): 453 # Issue #8438: try to open a filename containing surrogates. 454 # It should either fail because the file doesn't exist or the filename 455 # can't be represented using the filesystem encoding, but not because 456 # of a LookupError for the error handler "surrogateescape". 457 filename = u'\udc80.txt' 458 try: 459 with _FileIO(filename): 460 pass 461 except (UnicodeEncodeError, IOError): 462 pass 463 # Spawn a separate Python process with a different "file system 464 # default encoding", to exercise this further. 465 env = dict(os.environ) 466 env[b'LC_CTYPE'] = b'C' 467 _, out = run_python('-c', 'import _io; _io.FileIO(%r)' % filename, env=env) 468 if ('UnicodeEncodeError' not in out and not 469 ( ('IOError: [Errno 2] No such file or directory' in out) or 470 ('IOError: [Errno 22] Invalid argument' in out) ) ): 471 self.fail('Bad output: %r' % out) 472 473 def testUnclosedFDOnException(self): 474 class MyException(Exception): pass 475 class MyFileIO(_FileIO): 476 def __setattr__(self, name, value): 477 if name == "name": 478 raise MyException("blocked setting name") 479 return super(MyFileIO, self).__setattr__(name, value) 480 fd = os.open(__file__, os.O_RDONLY) 481 self.assertRaises(MyException, MyFileIO, fd) 482 os.close(fd) # should not raise OSError(EBADF) 269 483 270 484 def test_main():
Note:
See TracChangeset
for help on using the changeset viewer.