annotate Lib/test/test_io.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 1102e86b8739
children 2f314971e164
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1 """Unit tests for the io module."""
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
3 # Tests of io are scattered over the test suite:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
4 # * test_bufio - tests file buffering
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
5 # * test_memoryio - tests BytesIO and StringIO
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
6 # * test_fileio - tests FileIO
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
7 # * test_file - tests the file interface
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
8 # * test_io - tests everything else in the io module
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
9 # * test_univnewlines - tests universal newline support
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
10 # * test_largefile - tests operations on a file greater than 2**32 bytes
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
11 # (only enabled with -ulargefile)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
12
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
13 ################################################################################
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
14 # ATTENTION TEST WRITERS!!!
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
15 ################################################################################
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
16 # When writing tests for io, it's important to test both the C and Python
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
17 # implementations. This is usually done by writing a base test that refers to
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
18 # the type it is testing as a attribute. Then it provides custom subclasses to
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
19 # test both implementations. This file has lots of examples.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
20 ################################################################################
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
21
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
22 from __future__ import print_function
46124
38fe64e3b131 Use the new unicode literals for the io module
Christian Heimes <christian@cheimes.de>
parents: 46107
diff changeset
23 from __future__ import unicode_literals
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
24
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
25 import os
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
26 import sys
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
27 import time
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
28 import array
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
29 import random
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
30 import unittest
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
31 import weakref
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
32 import abc
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
33 import signal
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
34 import errno
63634
762d89faceaa Merged revisions 79539 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 63556
diff changeset
35 from itertools import cycle, count
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
36 from collections import deque
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
37 from test import test_support as support
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
38
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
39 import codecs
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
40 import io # C implementation of io
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
41 import _pyio as pyio # Python implementation of io
61046
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
42 try:
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
43 import threading
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
44 except ImportError:
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
45 threading = None
73667
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
46 try:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
47 import fcntl
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
48 except ImportError:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
49 fcntl = None
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
50
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
51 __metaclass__ = type
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
52 bytes = support.py3k_bytes
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
53
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
54 def _default_chunk_size():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
55 """Get the default TextIOWrapper chunk size"""
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
56 with io.open(__file__, "r", encoding="latin1") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
57 return f._CHUNK_SIZE
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
58
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
59
64750
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
60 class MockRawIOWithoutRead:
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
61 """A RawIO implementation without read(), so as to exercise the default
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
62 RawIO.read() which calls readinto()."""
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
63
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
64 def __init__(self, read_stack=()):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
65 self._read_stack = list(read_stack)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
66 self._write_stack = []
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
67 self._reads = 0
63921
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
68 self._extraneous_reads = 0
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
69
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
70 def write(self, b):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
71 self._write_stack.append(bytes(b))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
72 return len(b)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
73
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
74 def writable(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
75 return True
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
76
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
77 def fileno(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
78 return 42
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
79
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
80 def readable(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
81 return True
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
82
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
83 def seekable(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
84 return True
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
85
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
86 def seek(self, pos, whence):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
87 return 0 # wrong but we gotta return something
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
88
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
89 def tell(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
90 return 0 # same comment as above
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
91
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
92 def readinto(self, buf):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
93 self._reads += 1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
94 max_len = len(buf)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
95 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
96 data = self._read_stack[0]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
97 except IndexError:
63921
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
98 self._extraneous_reads += 1
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
99 return 0
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
100 if data is None:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
101 del self._read_stack[0]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
102 return None
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
103 n = len(data)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
104 if len(data) <= max_len:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
105 del self._read_stack[0]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
106 buf[:n] = data
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
107 return n
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
108 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
109 buf[:] = data[:max_len]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
110 self._read_stack[0] = data[max_len:]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
111 return max_len
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
112
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
113 def truncate(self, pos=None):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
114 return pos
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
115
64750
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
116 class CMockRawIOWithoutRead(MockRawIOWithoutRead, io.RawIOBase):
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
117 pass
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
118
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
119 class PyMockRawIOWithoutRead(MockRawIOWithoutRead, pyio.RawIOBase):
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
120 pass
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
121
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
122
64750
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
123 class MockRawIO(MockRawIOWithoutRead):
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
124
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
125 def read(self, n=None):
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
126 self._reads += 1
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
127 try:
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
128 return self._read_stack.pop(0)
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
129 except:
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
130 self._extraneous_reads += 1
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
131 return b""
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
132
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
133 class CMockRawIO(MockRawIO, io.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
134 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
135
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
136 class PyMockRawIO(MockRawIO, pyio.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
137 pass
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
138
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
139
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
140 class MisbehavedRawIO(MockRawIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
141 def write(self, b):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
142 return MockRawIO.write(self, b) * 2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
143
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
144 def read(self, n=None):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
145 return MockRawIO.read(self, n) * 2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
146
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
147 def seek(self, pos, whence):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
148 return -123
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
149
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
150 def tell(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
151 return -456
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
152
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
153 def readinto(self, buf):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
154 MockRawIO.readinto(self, buf)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
155 return len(buf) * 5
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
156
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
157 class CMisbehavedRawIO(MisbehavedRawIO, io.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
158 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
159
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
160 class PyMisbehavedRawIO(MisbehavedRawIO, pyio.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
161 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
162
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
163
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
164 class CloseFailureIO(MockRawIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
165 closed = 0
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
166
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
167 def close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
168 if not self.closed:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
169 self.closed = 1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
170 raise IOError
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
171
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
172 class CCloseFailureIO(CloseFailureIO, io.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
173 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
174
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
175 class PyCloseFailureIO(CloseFailureIO, pyio.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
176 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
177
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
178
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
179 class MockFileIO:
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
180
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
181 def __init__(self, data):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
182 self.read_history = []
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
183 super(MockFileIO, self).__init__(data)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
184
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
185 def read(self, n=None):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
186 res = super(MockFileIO, self).read(n)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
187 self.read_history.append(None if res is None else len(res))
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
188 return res
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
189
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
190 def readinto(self, b):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
191 res = super(MockFileIO, self).readinto(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
192 self.read_history.append(res)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
193 return res
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
194
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
195 class CMockFileIO(MockFileIO, io.BytesIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
196 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
197
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
198 class PyMockFileIO(MockFileIO, pyio.BytesIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
199 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
200
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
201
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
202 class MockNonBlockWriterIO:
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
203
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
204 def __init__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
205 self._write_stack = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
206 self._blocker_char = None
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
207
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
208 def pop_written(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
209 s = b"".join(self._write_stack)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
210 self._write_stack[:] = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
211 return s
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
212
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
213 def block_on(self, char):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
214 """Block when a given char is encountered."""
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
215 self._blocker_char = char
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
216
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
217 def readable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
218 return True
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
219
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
220 def seekable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
221 return True
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
222
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
223 def writable(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
224 return True
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
225
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
226 def write(self, b):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
227 b = bytes(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
228 n = -1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
229 if self._blocker_char:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
230 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
231 n = b.index(self._blocker_char)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
232 except ValueError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
233 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
234 else:
73667
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
235 if n > 0:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
236 # write data up to the first blocker
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
237 self._write_stack.append(b[:n])
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
238 return n
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
239 else:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
240 # cancel blocker and indicate would block
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
241 self._blocker_char = None
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
242 return None
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
243 self._write_stack.append(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
244 return len(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
245
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
246 class CMockNonBlockWriterIO(MockNonBlockWriterIO, io.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
247 BlockingIOError = io.BlockingIOError
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
248
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
249 class PyMockNonBlockWriterIO(MockNonBlockWriterIO, pyio.RawIOBase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
250 BlockingIOError = pyio.BlockingIOError
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
251
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
252
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
253 class IOTest(unittest.TestCase):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
254
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
255 def setUp(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
256 support.unlink(support.TESTFN)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
257
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
258 def tearDown(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
259 support.unlink(support.TESTFN)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
260
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
261 def write_ops(self, f):
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
262 self.assertEqual(f.write(b"blah."), 5)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
263 f.truncate(0)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
264 self.assertEqual(f.tell(), 5)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
265 f.seek(0)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
266
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
267 self.assertEqual(f.write(b"blah."), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
268 self.assertEqual(f.seek(0), 0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
269 self.assertEqual(f.write(b"Hello."), 6)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
270 self.assertEqual(f.tell(), 6)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
271 self.assertEqual(f.seek(-1, 1), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
272 self.assertEqual(f.tell(), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
273 self.assertEqual(f.write(bytearray(b" world\n\n\n")), 9)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
274 self.assertEqual(f.seek(0), 0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
275 self.assertEqual(f.write(b"h"), 1)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
276 self.assertEqual(f.seek(-1, 2), 13)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
277 self.assertEqual(f.tell(), 13)
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
278
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
279 self.assertEqual(f.truncate(12), 12)
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
280 self.assertEqual(f.tell(), 13)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
281 self.assertRaises(TypeError, f.seek, 0.0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
282
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
283 def read_ops(self, f, buffered=False):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
284 data = f.read(5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
285 self.assertEqual(data, b"hello")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
286 data = bytearray(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
287 self.assertEqual(f.readinto(data), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
288 self.assertEqual(data, b" worl")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
289 self.assertEqual(f.readinto(data), 2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
290 self.assertEqual(len(data), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
291 self.assertEqual(data[:2], b"d\n")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
292 self.assertEqual(f.seek(0), 0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
293 self.assertEqual(f.read(20), b"hello world\n")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
294 self.assertEqual(f.read(1), b"")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
295 self.assertEqual(f.readinto(bytearray(b"x")), 0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
296 self.assertEqual(f.seek(-6, 2), 6)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
297 self.assertEqual(f.read(5), b"world")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
298 self.assertEqual(f.read(0), b"")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
299 self.assertEqual(f.readinto(bytearray()), 0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
300 self.assertEqual(f.seek(-6, 1), 5)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
301 self.assertEqual(f.read(5), b" worl")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
302 self.assertEqual(f.tell(), 10)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
303 self.assertRaises(TypeError, f.seek, 0.0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
304 if buffered:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
305 f.seek(0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
306 self.assertEqual(f.read(), b"hello world\n")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
307 f.seek(6)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
308 self.assertEqual(f.read(), b"world\n")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
309 self.assertEqual(f.read(), b"")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
310
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
311 LARGE = 2**31
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
312
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
313 def large_file_ops(self, f):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
314 assert f.readable()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
315 assert f.writable()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
316 self.assertEqual(f.seek(self.LARGE), self.LARGE)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
317 self.assertEqual(f.tell(), self.LARGE)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
318 self.assertEqual(f.write(b"xxx"), 3)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
319 self.assertEqual(f.tell(), self.LARGE + 3)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
320 self.assertEqual(f.seek(-1, 1), self.LARGE + 2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
321 self.assertEqual(f.truncate(), self.LARGE + 2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
322 self.assertEqual(f.tell(), self.LARGE + 2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
323 self.assertEqual(f.seek(0, 2), self.LARGE + 2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
324 self.assertEqual(f.truncate(self.LARGE + 1), self.LARGE + 1)
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 50958
diff changeset
325 self.assertEqual(f.tell(), self.LARGE + 2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
326 self.assertEqual(f.seek(0, 2), self.LARGE + 1)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
327 self.assertEqual(f.seek(-1, 2), self.LARGE)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
328 self.assertEqual(f.read(2), b"x")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
329
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
330 def test_invalid_operations(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
331 # Try writing on a file opened in read mode and vice-versa.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
332 for mode in ("w", "wb"):
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
333 with self.open(support.TESTFN, mode) as fp:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
334 self.assertRaises(IOError, fp.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
335 self.assertRaises(IOError, fp.readline)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
336 with self.open(support.TESTFN, "rb") as fp:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
337 self.assertRaises(IOError, fp.write, b"blah")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
338 self.assertRaises(IOError, fp.writelines, [b"blah\n"])
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
339 with self.open(support.TESTFN, "r") as fp:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
340 self.assertRaises(IOError, fp.write, "blah")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
341 self.assertRaises(IOError, fp.writelines, ["blah\n"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
342
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
343 def test_raw_file_io(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
344 with self.open(support.TESTFN, "wb", buffering=0) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
345 self.assertEqual(f.readable(), False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
346 self.assertEqual(f.writable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
347 self.assertEqual(f.seekable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
348 self.write_ops(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
349 with self.open(support.TESTFN, "rb", buffering=0) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
350 self.assertEqual(f.readable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
351 self.assertEqual(f.writable(), False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
352 self.assertEqual(f.seekable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
353 self.read_ops(f)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
354
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
355 def test_buffered_file_io(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
356 with self.open(support.TESTFN, "wb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
357 self.assertEqual(f.readable(), False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
358 self.assertEqual(f.writable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
359 self.assertEqual(f.seekable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
360 self.write_ops(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
361 with self.open(support.TESTFN, "rb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
362 self.assertEqual(f.readable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
363 self.assertEqual(f.writable(), False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
364 self.assertEqual(f.seekable(), True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
365 self.read_ops(f, True)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
366
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
367 def test_readline(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
368 with self.open(support.TESTFN, "wb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
369 f.write(b"abc\ndef\nxyzzy\nfoo\x00bar\nanother line")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
370 with self.open(support.TESTFN, "rb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
371 self.assertEqual(f.readline(), b"abc\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
372 self.assertEqual(f.readline(10), b"def\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
373 self.assertEqual(f.readline(2), b"xy")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
374 self.assertEqual(f.readline(4), b"zzy\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
375 self.assertEqual(f.readline(), b"foo\x00bar\n")
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
376 self.assertEqual(f.readline(None), b"another line")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
377 self.assertRaises(TypeError, f.readline, 5.3)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
378 with self.open(support.TESTFN, "r") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
379 self.assertRaises(TypeError, f.readline, 5.3)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
380
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
381 def test_raw_bytes_io(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
382 f = self.BytesIO()
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
383 self.write_ops(f)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
384 data = f.getvalue()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
385 self.assertEqual(data, b"hello world\n")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
386 f = self.BytesIO(data)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
387 self.read_ops(f, True)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
388
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
389 def test_large_file_ops(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
390 # On Windows and Mac OSX this test comsumes large resources; It takes
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
391 # a long time to build the >2GB file and takes >2GB of disk space
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
392 # therefore the resource must be enabled to run this test.
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
393 if sys.platform[:3] == 'win' or sys.platform == 'darwin':
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
394 if not support.is_resource_enabled("largefile"):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
395 print("\nTesting large file ops skipped on %s." % sys.platform,
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
396 file=sys.stderr)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
397 print("It requires %d bytes and a long time." % self.LARGE,
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
398 file=sys.stderr)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
399 print("Use 'regrtest.py -u largefile test_io' to run it.",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
400 file=sys.stderr)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
401 return
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
402 with self.open(support.TESTFN, "w+b", 0) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
403 self.large_file_ops(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
404 with self.open(support.TESTFN, "w+b") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
405 self.large_file_ops(f)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
406
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
407 def test_with_open(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
408 for bufsize in (0, 1, 100):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
409 f = None
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
410 with self.open(support.TESTFN, "wb", bufsize) as f:
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
411 f.write(b"xxx")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
412 self.assertEqual(f.closed, True)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
413 f = None
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
414 try:
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
415 with self.open(support.TESTFN, "wb", bufsize) as f:
63556
dba99828d91c Merged revisions 77942,79023 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 63262
diff changeset
416 1 // 0
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
417 except ZeroDivisionError:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
418 self.assertEqual(f.closed, True)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
419 else:
63556
dba99828d91c Merged revisions 77942,79023 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 63262
diff changeset
420 self.fail("1 // 0 didn't raise an exception")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
421
50958
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
422 # issue 5008
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
423 def test_append_mode_tell(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
424 with self.open(support.TESTFN, "wb") as f:
50958
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
425 f.write(b"xxx")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
426 with self.open(support.TESTFN, "ab", buffering=0) as f:
50958
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
427 self.assertEqual(f.tell(), 3)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
428 with self.open(support.TESTFN, "ab") as f:
50958
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
429 self.assertEqual(f.tell(), 3)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
430 with self.open(support.TESTFN, "a") as f:
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
431 self.assertTrue(f.tell() > 0)
50958
762f9f189e2e Merged revisions 68835 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50305
diff changeset
432
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
433 def test_destructor(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
434 record = []
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
435 class MyFileIO(self.FileIO):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
436 def __del__(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
437 record.append(1)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
438 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
439 f = super(MyFileIO, self).__del__
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
440 except AttributeError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
441 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
442 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
443 f()
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
444 def close(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
445 record.append(2)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
446 super(MyFileIO, self).close()
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
447 def flush(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
448 record.append(3)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
449 super(MyFileIO, self).flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
450 f = MyFileIO(support.TESTFN, "wb")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
451 f.write(b"xxx")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
452 del f
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
453 support.gc_collect()
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
454 self.assertEqual(record, [1, 2, 3])
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
455 with self.open(support.TESTFN, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
456 self.assertEqual(f.read(), b"xxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
457
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
458 def _check_base_destructor(self, base):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
459 record = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
460 class MyIO(base):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
461 def __init__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
462 # This exercises the availability of attributes on object
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
463 # destruction.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
464 # (in the C version, close() is called by the tp_dealloc
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
465 # function, not by __del__)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
466 self.on_del = 1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
467 self.on_close = 2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
468 self.on_flush = 3
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
469 def __del__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
470 record.append(self.on_del)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
471 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
472 f = super(MyIO, self).__del__
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
473 except AttributeError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
474 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
475 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
476 f()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
477 def close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
478 record.append(self.on_close)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
479 super(MyIO, self).close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
480 def flush(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
481 record.append(self.on_flush)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
482 super(MyIO, self).flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
483 f = MyIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
484 del f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
485 support.gc_collect()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
486 self.assertEqual(record, [1, 2, 3])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
487
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
488 def test_IOBase_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
489 self._check_base_destructor(self.IOBase)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
490
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
491 def test_RawIOBase_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
492 self._check_base_destructor(self.RawIOBase)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
493
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
494 def test_BufferedIOBase_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
495 self._check_base_destructor(self.BufferedIOBase)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
496
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
497 def test_TextIOBase_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
498 self._check_base_destructor(self.TextIOBase)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
499
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
500 def test_close_flushes(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
501 with self.open(support.TESTFN, "wb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
502 f.write(b"xxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
503 with self.open(support.TESTFN, "rb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
504 self.assertEqual(f.read(), b"xxx")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
505
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
506 def test_array_writes(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
507 a = array.array(b'i', range(10))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
508 n = len(a.tostring())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
509 with self.open(support.TESTFN, "wb", 0) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
510 self.assertEqual(f.write(a), n)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
511 with self.open(support.TESTFN, "wb") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
512 self.assertEqual(f.write(a), n)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
513
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
514 def test_closefd(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
515 self.assertRaises(ValueError, self.open, support.TESTFN, 'w',
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
516 closefd=False)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
517
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
518 def test_read_closed(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
519 with self.open(support.TESTFN, "w") as f:
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
520 f.write("egg\n")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
521 with self.open(support.TESTFN, "r") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
522 file = self.open(f.fileno(), "r", closefd=False)
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
523 self.assertEqual(file.read(), "egg\n")
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
524 file.seek(0)
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
525 file.close()
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
526 self.assertRaises(ValueError, file.read)
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
527
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
528 def test_no_closefd_with_filename(self):
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
529 # can't use closefd in combination with a file name
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
530 self.assertRaises(ValueError, self.open, support.TESTFN, "r", closefd=False)
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
531
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
532 def test_closefd_attr(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
533 with self.open(support.TESTFN, "wb") as f:
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
534 f.write(b"egg\n")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
535 with self.open(support.TESTFN, "r") as f:
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
536 self.assertEqual(f.buffer.raw.closefd, True)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
537 file = self.open(f.fileno(), "r", closefd=False)
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
538 self.assertEqual(file.buffer.raw.closefd, False)
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
539
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
540 def test_garbage_collection(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
541 # FileIO objects are collected, and collecting them flushes
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
542 # all data to disk.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
543 f = self.FileIO(support.TESTFN, "wb")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
544 f.write(b"abcxxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
545 f.f = f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
546 wr = weakref.ref(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
547 del f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
548 support.gc_collect()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
549 self.assertTrue(wr() is None, wr)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
550 with self.open(support.TESTFN, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
551 self.assertEqual(f.read(), b"abcxxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
552
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
553 def test_unbounded_file(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
554 # Issue #1174606: reading from an unbounded stream such as /dev/zero.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
555 zero = "/dev/zero"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
556 if not os.path.exists(zero):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
557 self.skipTest("{0} does not exist".format(zero))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
558 if sys.maxsize > 0x7FFFFFFF:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
559 self.skipTest("test can only run in a 32-bit address space")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
560 if support.real_max_memuse < support._2G:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
561 self.skipTest("test requires at least 2GB of memory")
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
562 with self.open(zero, "rb", buffering=0) as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
563 self.assertRaises(OverflowError, f.read)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
564 with self.open(zero, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
565 self.assertRaises(OverflowError, f.read)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
566 with self.open(zero, "r") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
567 self.assertRaises(OverflowError, f.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
568
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
569 def test_flush_error_on_close(self):
61180
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
570 f = self.open(support.TESTFN, "wb", buffering=0)
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
571 def bad_flush():
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
572 raise IOError()
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
573 f.flush = bad_flush
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
574 self.assertRaises(IOError, f.close) # exception not swallowed
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
575
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
576 def test_multi_close(self):
61180
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
577 f = self.open(support.TESTFN, "wb", buffering=0)
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
578 f.close()
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
579 f.close()
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
580 f.close()
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
581 self.assertRaises(ValueError, f.flush)
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
582
64750
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
583 def test_RawIOBase_read(self):
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
584 # Exercise the default RawIOBase.read() implementation (which calls
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
585 # readinto() internally).
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
586 rawio = self.MockRawIOWithoutRead((b"abc", b"d", None, b"efg", None))
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
587 self.assertEqual(rawio.read(2), b"ab")
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
588 self.assertEqual(rawio.read(2), b"c")
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
589 self.assertEqual(rawio.read(2), b"d")
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
590 self.assertEqual(rawio.read(2), None)
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
591 self.assertEqual(rawio.read(2), b"ef")
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
592 self.assertEqual(rawio.read(2), b"g")
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
593 self.assertEqual(rawio.read(2), None)
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
594 self.assertEqual(rawio.read(2), b"")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
595
77134
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
596 def test_fileio_closefd(self):
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
597 # Issue #4841
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
598 with self.open(__file__, 'rb') as f1, \
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
599 self.open(__file__, 'rb') as f2:
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
600 fileio = self.FileIO(f1.fileno(), closefd=False)
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
601 # .__init__() must not close f1
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
602 fileio.__init__(f2.fileno(), closefd=False)
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
603 f1.readline()
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
604 # .close() must not close f2
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
605 fileio.close()
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
606 f2.readline()
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
607
83d500908ffc #4841: Fix FileIO constructor to honor closefd when called repeatedly
Hynek Schlawack <hs@ox.cx>
parents: 73667
diff changeset
608
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
609 class CIOTest(IOTest):
71299
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
610
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
611 def test_IOBase_finalize(self):
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
612 # Issue #12149: segmentation fault on _PyIOBase_finalize when both a
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
613 # class which inherits IOBase and an object of this class are caught
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
614 # in a reference cycle and close() is already in the method cache.
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
615 class MyIO(self.IOBase):
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
616 def close(self):
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
617 pass
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
618
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
619 # create an instance to populate the method cache
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
620 MyIO()
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
621 obj = MyIO()
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
622 obj.obj = obj
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
623 wr = weakref.ref(obj)
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
624 del MyIO
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
625 del obj
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
626 support.gc_collect()
9618303852da Issue #12149: Update the method cache after a type's dictionnary gets
Antoine Pitrou <solipsis@pitrou.net>
parents: 71227
diff changeset
627 self.assertTrue(wr() is None, wr)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
628
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
629 class PyIOTest(IOTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
630 test_array_writes = unittest.skip(
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
631 "len(array.array) returns number of elements rather than bytelength"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
632 )(IOTest.test_array_writes)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
633
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
634
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
635 class CommonBufferedTests:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
636 # Tests common to BufferedReader, BufferedWriter and BufferedRandom
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
637
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
638 def test_detach(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
639 raw = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
640 buf = self.tp(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
641 self.assertIs(buf.detach(), raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
642 self.assertRaises(ValueError, buf.detach)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
643
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
644 def test_fileno(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
645 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
646 bufio = self.tp(rawio)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
647
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
648 self.assertEqual(42, bufio.fileno())
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
649
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
650 def test_no_fileno(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
651 # XXX will we always have fileno() function? If so, kill
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
652 # this test. Else, write it.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
653 pass
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
654
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
655 def test_invalid_args(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
656 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
657 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
658 # Invalid whence
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
659 self.assertRaises(ValueError, bufio.seek, 0, -1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
660 self.assertRaises(ValueError, bufio.seek, 0, 3)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
661
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
662 def test_override_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
663 tp = self.tp
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
664 record = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
665 class MyBufferedIO(tp):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
666 def __del__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
667 record.append(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
668 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
669 f = super(MyBufferedIO, self).__del__
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
670 except AttributeError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
671 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
672 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
673 f()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
674 def close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
675 record.append(2)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
676 super(MyBufferedIO, self).close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
677 def flush(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
678 record.append(3)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
679 super(MyBufferedIO, self).flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
680 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
681 bufio = MyBufferedIO(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
682 writable = bufio.writable()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
683 del bufio
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
684 support.gc_collect()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
685 if writable:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
686 self.assertEqual(record, [1, 2, 3])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
687 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
688 self.assertEqual(record, [1, 2])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
689
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
690 def test_context_manager(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
691 # Test usability as a context manager
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
692 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
693 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
694 def _with():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
695 with bufio:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
696 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
697 _with()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
698 # bufio should now be closed, and using it a second time should raise
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
699 # a ValueError.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
700 self.assertRaises(ValueError, _with)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
701
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
702 def test_error_through_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
703 # Test that the exception state is not modified by a destructor,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
704 # even if close() fails.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
705 rawio = self.CloseFailureIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
706 def f():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
707 self.tp(rawio).xyzzy
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
708 with support.captured_output("stderr") as s:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
709 self.assertRaises(AttributeError, f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
710 s = s.getvalue().strip()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
711 if s:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
712 # The destructor *may* have printed an unraisable error, check it
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
713 self.assertEqual(len(s.splitlines()), 1)
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
714 self.assertTrue(s.startswith("Exception IOError: "), s)
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
715 self.assertTrue(s.endswith(" ignored"), s)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
716
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
717 def test_repr(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
718 raw = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
719 b = self.tp(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
720 clsname = "%s.%s" % (self.tp.__module__, self.tp.__name__)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
721 self.assertEqual(repr(b), "<%s>" % clsname)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
722 raw.name = "dummy"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
723 self.assertEqual(repr(b), "<%s name=u'dummy'>" % clsname)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
724 raw.name = b"dummy"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
725 self.assertEqual(repr(b), "<%s name='dummy'>" % clsname)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
726
61180
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
727 def test_flush_error_on_close(self):
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
728 raw = self.MockRawIO()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
729 def bad_flush():
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
730 raise IOError()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
731 raw.flush = bad_flush
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
732 b = self.tp(raw)
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
733 self.assertRaises(IOError, b.close) # exception not swallowed
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
734
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
735 def test_multi_close(self):
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
736 raw = self.MockRawIO()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
737 b = self.tp(raw)
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
738 b.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
739 b.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
740 b.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
741 self.assertRaises(ValueError, b.flush)
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
742
67075
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
743 def test_readonly_attributes(self):
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
744 raw = self.MockRawIO()
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
745 buf = self.tp(raw)
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
746 x = self.MockRawIO()
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
747 with self.assertRaises((AttributeError, TypeError)):
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
748 buf.raw = x
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
749
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
750
78320
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
751 class SizeofTest:
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
752
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
753 @support.cpython_only
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
754 def test_sizeof(self):
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
755 bufsize1 = 4096
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
756 bufsize2 = 8192
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
757 rawio = self.MockRawIO()
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
758 bufio = self.tp(rawio, buffer_size=bufsize1)
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
759 size = sys.getsizeof(bufio) - bufsize1
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
760 rawio = self.MockRawIO()
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
761 bufio = self.tp(rawio, buffer_size=bufsize2)
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
762 self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
763
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
764
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
765 class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
766 read_mode = "rb"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
767
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
768 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
769 rawio = self.MockRawIO([b"abc"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
770 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
771 bufio.__init__(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
772 bufio.__init__(rawio, buffer_size=1024)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
773 bufio.__init__(rawio, buffer_size=16)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
774 self.assertEqual(b"abc", bufio.read())
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
775 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
776 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
777 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
778 rawio = self.MockRawIO([b"abc"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
779 bufio.__init__(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
780 self.assertEqual(b"abc", bufio.read())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
781
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
782 def test_read(self):
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
783 for arg in (None, 7):
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
784 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
785 bufio = self.tp(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
786 self.assertEqual(b"abcdefg", bufio.read(arg))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
787 # Invalid args
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
788 self.assertRaises(ValueError, bufio.read, -2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
789
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
790 def test_read1(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
791 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
792 bufio = self.tp(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
793 self.assertEqual(b"a", bufio.read(1))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
794 self.assertEqual(b"b", bufio.read1(1))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
795 self.assertEqual(rawio._reads, 1)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
796 self.assertEqual(b"c", bufio.read1(100))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
797 self.assertEqual(rawio._reads, 1)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
798 self.assertEqual(b"d", bufio.read1(100))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
799 self.assertEqual(rawio._reads, 2)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
800 self.assertEqual(b"efg", bufio.read1(100))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
801 self.assertEqual(rawio._reads, 3)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
802 self.assertEqual(b"", bufio.read1(100))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
803 self.assertEqual(rawio._reads, 4)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
804 # Invalid args
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
805 self.assertRaises(ValueError, bufio.read1, -1)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
806
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
807 def test_readinto(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
808 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
809 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
810 b = bytearray(2)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
811 self.assertEqual(bufio.readinto(b), 2)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
812 self.assertEqual(b, b"ab")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
813 self.assertEqual(bufio.readinto(b), 2)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
814 self.assertEqual(b, b"cd")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
815 self.assertEqual(bufio.readinto(b), 2)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
816 self.assertEqual(b, b"ef")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
817 self.assertEqual(bufio.readinto(b), 1)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
818 self.assertEqual(b, b"gf")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
819 self.assertEqual(bufio.readinto(b), 0)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
820 self.assertEqual(b, b"gf")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
821
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
822 def test_readlines(self):
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
823 def bufio():
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
824 rawio = self.MockRawIO((b"abc\n", b"d\n", b"ef"))
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
825 return self.tp(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
826 self.assertEqual(bufio().readlines(), [b"abc\n", b"d\n", b"ef"])
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
827 self.assertEqual(bufio().readlines(5), [b"abc\n", b"d\n"])
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
828 self.assertEqual(bufio().readlines(None), [b"abc\n", b"d\n", b"ef"])
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
829
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
830 def test_buffering(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
831 data = b"abcdefghi"
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
832 dlen = len(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
833
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
834 tests = [
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
835 [ 100, [ 3, 1, 4, 8 ], [ dlen, 0 ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
836 [ 100, [ 3, 3, 3], [ dlen ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
837 [ 4, [ 1, 2, 4, 2 ], [ 4, 4, 1 ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
838 ]
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
839
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
840 for bufsize, buf_read_sizes, raw_read_sizes in tests:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
841 rawio = self.MockFileIO(data)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
842 bufio = self.tp(rawio, buffer_size=bufsize)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
843 pos = 0
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
844 for nbytes in buf_read_sizes:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
845 self.assertEqual(bufio.read(nbytes), data[pos:pos+nbytes])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
846 pos += nbytes
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
847 # this is mildly implementation-dependent
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
848 self.assertEqual(rawio.read_history, raw_read_sizes)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
849
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
850 def test_read_non_blocking(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
851 # Inject some None's in there to simulate EWOULDBLOCK
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
852 rawio = self.MockRawIO((b"abc", b"d", None, b"efg", None, None, None))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
853 bufio = self.tp(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
854 self.assertEqual(b"abcd", bufio.read(6))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
855 self.assertEqual(b"e", bufio.read(1))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
856 self.assertEqual(b"fg", bufio.read())
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
857 self.assertEqual(b"", bufio.peek(1))
70388
43a498da8680 Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
858 self.assertIsNone(bufio.read())
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
859 self.assertEqual(b"", bufio.read())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
860
70388
43a498da8680 Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
861 rawio = self.MockRawIO((b"a", None, None))
43a498da8680 Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
862 self.assertEqual(b"a", rawio.readall())
43a498da8680 Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
863 self.assertIsNone(rawio.readall())
43a498da8680 Issue #12175: RawIOBase.readall() now returns None if read() returns None.
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70384
diff changeset
864
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
865 def test_read_past_eof(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
866 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
867 bufio = self.tp(rawio)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
868
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
869 self.assertEqual(b"abcdefg", bufio.read(9000))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
870
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
871 def test_read_all(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
872 rawio = self.MockRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
873 bufio = self.tp(rawio)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
874
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
875 self.assertEqual(b"abcdefg", bufio.read())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
876
61046
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
877 @unittest.skipUnless(threading, 'Threading required for this test.')
65318
07b6bb76ee43 Merged revisions 85482 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64750
diff changeset
878 @support.requires_resource('cpu')
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
879 def test_threads(self):
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
880 try:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
881 # Write out many bytes with exactly the same number of 0's,
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
882 # 1's... 255's. This will help us check that concurrent reading
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
883 # doesn't duplicate or forget contents.
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
884 N = 1000
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
885 l = list(range(256)) * N
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
886 random.shuffle(l)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
887 s = bytes(bytearray(l))
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
888 with self.open(support.TESTFN, "wb") as f:
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
889 f.write(s)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
890 with self.open(support.TESTFN, self.read_mode, buffering=0) as raw:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
891 bufio = self.tp(raw, 8)
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
892 errors = []
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
893 results = []
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
894 def f():
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
895 try:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
896 # Intra-buffer read then buffer-flushing read
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
897 for n in cycle([1, 19]):
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
898 s = bufio.read(n)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
899 if not s:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
900 break
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
901 # list.append() is atomic
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
902 results.append(s)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
903 except Exception as e:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
904 errors.append(e)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
905 raise
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
906 threads = [threading.Thread(target=f) for x in range(20)]
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
907 for t in threads:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
908 t.start()
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
909 time.sleep(0.02) # yield
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
910 for t in threads:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
911 t.join()
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
912 self.assertFalse(errors,
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
913 "the following exceptions were caught: %r" % errors)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
914 s = b''.join(results)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
915 for i in range(256):
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
916 c = bytes(bytearray([i]))
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
917 self.assertEqual(s.count(c), N)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
918 finally:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
919 support.unlink(support.TESTFN)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
920
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
921 def test_misbehaved_io(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
922 rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
923 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
924 self.assertRaises(IOError, bufio.seek, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
925 self.assertRaises(IOError, bufio.tell)
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
926
63921
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
927 def test_no_extraneous_read(self):
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
928 # Issue #9550; when the raw IO object has satisfied the read request,
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
929 # we should not issue any additional reads, otherwise it may block
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
930 # (e.g. socket).
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
931 bufsize = 16
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
932 for n in (2, bufsize - 1, bufsize, bufsize + 1, bufsize * 2):
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
933 rawio = self.MockRawIO([b"x" * n])
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
934 bufio = self.tp(rawio, bufsize)
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
935 self.assertEqual(bufio.read(n), b"x" * n)
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
936 # Simple case: one raw read is enough to satisfy the request.
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
937 self.assertEqual(rawio._extraneous_reads, 0,
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
938 "failed for {}: {} != 0".format(n, rawio._extraneous_reads))
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
939 # A more complex case where two raw reads are needed to satisfy
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
940 # the request.
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
941 rawio = self.MockRawIO([b"x" * (n - 1), b"x"])
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
942 bufio = self.tp(rawio, bufsize)
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
943 self.assertEqual(bufio.read(n), b"x" * n)
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
944 self.assertEqual(rawio._extraneous_reads, 0,
c3ff6e910068 Merged revisions 83944 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63260
diff changeset
945 "failed for {}: {} != 0".format(n, rawio._extraneous_reads))
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
946
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
947
78320
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
948 class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
949 tp = io.BufferedReader
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
950
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
951 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
952 BufferedReaderTest.test_constructor(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
953 # The allocation can succeed on 32-bit builds, e.g. with more
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
954 # than 2GB RAM and a 64-bit kernel.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
955 if sys.maxsize > 0x7FFFFFFF:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
956 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
957 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
958 self.assertRaises((OverflowError, MemoryError, ValueError),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
959 bufio.__init__, rawio, sys.maxsize)
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
960
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
961 def test_initialization(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
962 rawio = self.MockRawIO([b"abc"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
963 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
964 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
965 self.assertRaises(ValueError, bufio.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
966 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
967 self.assertRaises(ValueError, bufio.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
968 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
969 self.assertRaises(ValueError, bufio.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
970
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
971 def test_misbehaved_io_read(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
972 rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
973 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
974 # _pyio.BufferedReader seems to implement reading different, so that
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
975 # checking this is not so easy.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
976 self.assertRaises(IOError, bufio.read, 10)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
977
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
978 def test_garbage_collection(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
979 # C BufferedReader objects are collected.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
980 # The Python version has __del__, so it ends into gc.garbage instead
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
981 rawio = self.FileIO(support.TESTFN, "w+b")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
982 f = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
983 f.f = f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
984 wr = weakref.ref(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
985 del f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
986 support.gc_collect()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
987 self.assertTrue(wr() is None, wr)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
988
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
989 class PyBufferedReaderTest(BufferedReaderTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
990 tp = pyio.BufferedReader
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
991
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
992
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
993 class BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
994 write_mode = "wb"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
995
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
996 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
997 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
998 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
999 bufio.__init__(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1000 bufio.__init__(rawio, buffer_size=1024)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1001 bufio.__init__(rawio, buffer_size=16)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1002 self.assertEqual(3, bufio.write(b"abc"))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1003 bufio.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1004 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1005 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1006 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1007 bufio.__init__(rawio)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1008 self.assertEqual(3, bufio.write(b"ghi"))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1009 bufio.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1010 self.assertEqual(b"".join(rawio._write_stack), b"abcghi")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1011
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1012 def test_detach_flush(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1013 raw = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1014 buf = self.tp(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1015 buf.write(b"howdy!")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1016 self.assertFalse(raw._write_stack)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1017 buf.detach()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1018 self.assertEqual(raw._write_stack, [b"howdy!"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1019
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1020 def test_write(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1021 # Write to the buffered IO but don't overflow the buffer.
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1022 writer = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1023 bufio = self.tp(writer, 8)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1024 bufio.write(b"abc")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1025 self.assertFalse(writer._write_stack)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1026
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1027 def test_write_overflow(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1028 writer = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1029 bufio = self.tp(writer, 8)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1030 contents = b"abcdefghijklmnop"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1031 for n in range(0, len(contents), 3):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1032 bufio.write(contents[n:n+3])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1033 flushed = b"".join(writer._write_stack)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1034 # At least (total - 8) bytes were implicitly flushed, perhaps more
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1035 # depending on the implementation.
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
1036 self.assertTrue(flushed.startswith(contents[:-8]), flushed)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1037
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1038 def check_writes(self, intermediate_func):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1039 # Lots of writes, test the flushed output is as expected.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1040 contents = bytes(range(256)) * 1000
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1041 n = 0
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1042 writer = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1043 bufio = self.tp(writer, 13)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1044 # Generator of write sizes: repeat each N 15 times then proceed to N+1
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1045 def gen_sizes():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1046 for size in count(1):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1047 for i in range(15):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1048 yield size
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1049 sizes = gen_sizes()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1050 while n < len(contents):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1051 size = min(next(sizes), len(contents) - n)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1052 self.assertEqual(bufio.write(contents[n:n+size]), size)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1053 intermediate_func(bufio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1054 n += size
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1055 bufio.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1056 self.assertEqual(contents,
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1057 b"".join(writer._write_stack))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1058
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1059 def test_writes(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1060 self.check_writes(lambda bufio: None)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1061
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1062 def test_writes_and_flushes(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1063 self.check_writes(lambda bufio: bufio.flush())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1064
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1065 def test_writes_and_seeks(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1066 def _seekabs(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1067 pos = bufio.tell()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1068 bufio.seek(pos + 1, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1069 bufio.seek(pos - 1, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1070 bufio.seek(pos, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1071 self.check_writes(_seekabs)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1072 def _seekrel(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1073 pos = bufio.seek(0, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1074 bufio.seek(+1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1075 bufio.seek(-1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1076 bufio.seek(pos, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1077 self.check_writes(_seekrel)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1078
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1079 def test_writes_and_truncates(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1080 self.check_writes(lambda bufio: bufio.truncate(bufio.tell()))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1081
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1082 def test_write_non_blocking(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1083 raw = self.MockNonBlockWriterIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1084 bufio = self.tp(raw, 8)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1085
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1086 self.assertEqual(bufio.write(b"abcd"), 4)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1087 self.assertEqual(bufio.write(b"efghi"), 5)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1088 # 1 byte will be written, the rest will be buffered
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1089 raw.block_on(b"k")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1090 self.assertEqual(bufio.write(b"jklmn"), 5)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1091
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1092 # 8 bytes will be written, 8 will be buffered and the rest will be lost
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1093 raw.block_on(b"0")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1094 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1095 bufio.write(b"opqrwxyz0123456789")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1096 except self.BlockingIOError as e:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1097 written = e.characters_written
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1098 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1099 self.fail("BlockingIOError should have been raised")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1100 self.assertEqual(written, 16)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1101 self.assertEqual(raw.pop_written(),
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1102 b"abcdefghijklmnopqrwxyz")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1103
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1104 self.assertEqual(bufio.write(b"ABCDEFGHI"), 9)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1105 s = raw.pop_written()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1106 # Previously buffered bytes were flushed
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1107 self.assertTrue(s.startswith(b"01234567A"), s)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1108
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1109 def test_write_and_rewind(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1110 raw = io.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1111 bufio = self.tp(raw, 4)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1112 self.assertEqual(bufio.write(b"abcdef"), 6)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1113 self.assertEqual(bufio.tell(), 6)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1114 bufio.seek(0, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1115 self.assertEqual(bufio.write(b"XY"), 2)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1116 bufio.seek(6, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1117 self.assertEqual(raw.getvalue(), b"XYcdef")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1118 self.assertEqual(bufio.write(b"123456"), 6)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1119 bufio.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1120 self.assertEqual(raw.getvalue(), b"XYcdef123456")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1121
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1122 def test_flush(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1123 writer = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1124 bufio = self.tp(writer, 8)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1125 bufio.write(b"abc")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1126 bufio.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1127 self.assertEqual(b"abc", writer._write_stack[0])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1128
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1129 def test_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1130 writer = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1131 bufio = self.tp(writer, 8)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1132 bufio.write(b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1133 del bufio
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1134 support.gc_collect()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1135 self.assertEqual(b"abc", writer._write_stack[0])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1136
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1137 def test_truncate(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1138 # Truncate implicitly flushes the buffer.
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
1139 with self.open(support.TESTFN, self.write_mode, buffering=0) as raw:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1140 bufio = self.tp(raw, 8)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1141 bufio.write(b"abcdef")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1142 self.assertEqual(bufio.truncate(3), 3)
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1143 self.assertEqual(bufio.tell(), 6)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
1144 with self.open(support.TESTFN, "rb", buffering=0) as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1145 self.assertEqual(f.read(), b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1146
61046
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
1147 @unittest.skipUnless(threading, 'Threading required for this test.')
65318
07b6bb76ee43 Merged revisions 85482 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64750
diff changeset
1148 @support.requires_resource('cpu')
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1149 def test_threads(self):
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1150 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1151 # Write out many bytes from many threads and test they were
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1152 # all flushed.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1153 N = 1000
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1154 contents = bytes(range(256)) * N
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1155 sizes = cycle([1, 19])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1156 n = 0
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1157 queue = deque()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1158 while n < len(contents):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1159 size = next(sizes)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1160 queue.append(contents[n:n+size])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1161 n += size
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1162 del contents
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1163 # We use a real file object because it allows us to
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1164 # exercise situations where the GIL is released before
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1165 # writing the buffer to the raw streams. This is in addition
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1166 # to concurrency issues due to switching threads in the middle
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1167 # of Python code.
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
1168 with self.open(support.TESTFN, self.write_mode, buffering=0) as raw:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1169 bufio = self.tp(raw, 8)
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1170 errors = []
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1171 def f():
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1172 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1173 while True:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1174 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1175 s = queue.popleft()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1176 except IndexError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1177 return
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1178 bufio.write(s)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1179 except Exception as e:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1180 errors.append(e)
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1181 raise
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1182 threads = [threading.Thread(target=f) for x in range(20)]
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1183 for t in threads:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1184 t.start()
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1185 time.sleep(0.02) # yield
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1186 for t in threads:
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1187 t.join()
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1188 self.assertFalse(errors,
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1189 "the following exceptions were caught: %r" % errors)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1190 bufio.close()
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
1191 with self.open(support.TESTFN, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1192 s = f.read()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1193 for i in range(256):
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1194 self.assertEqual(s.count(bytes([i])), N)
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1195 finally:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1196 support.unlink(support.TESTFN)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1197
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1198 def test_misbehaved_io(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1199 rawio = self.MisbehavedRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1200 bufio = self.tp(rawio, 5)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1201 self.assertRaises(IOError, bufio.seek, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1202 self.assertRaises(IOError, bufio.tell)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1203 self.assertRaises(IOError, bufio.write, b"abcdef")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1204
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1205 def test_max_buffer_size_deprecation(self):
59669
7df3e13d3e50 Cleanup some test cases using check_warnings and check_py3k_warnings.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58817
diff changeset
1206 with support.check_warnings(("max_buffer_size is deprecated",
7df3e13d3e50 Cleanup some test cases using check_warnings and check_py3k_warnings.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58817
diff changeset
1207 DeprecationWarning)):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1208 self.tp(self.MockRawIO(), 8, 12)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1209
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1210
78320
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
1211 class CBufferedWriterTest(BufferedWriterTest, SizeofTest):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1212 tp = io.BufferedWriter
48238
67938575afc6 Issue #3476: make BufferedReader and BufferedWriter thread-safe
Antoine Pitrou <solipsis@pitrou.net>
parents: 46805
diff changeset
1213
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1214 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1215 BufferedWriterTest.test_constructor(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1216 # The allocation can succeed on 32-bit builds, e.g. with more
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1217 # than 2GB RAM and a 64-bit kernel.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1218 if sys.maxsize > 0x7FFFFFFF:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1219 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1220 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1221 self.assertRaises((OverflowError, MemoryError, ValueError),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1222 bufio.__init__, rawio, sys.maxsize)
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
1223
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1224 def test_initialization(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1225 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1226 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1227 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1228 self.assertRaises(ValueError, bufio.write, b"def")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1229 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1230 self.assertRaises(ValueError, bufio.write, b"def")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1231 self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1232 self.assertRaises(ValueError, bufio.write, b"def")
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
1233
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1234 def test_garbage_collection(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1235 # C BufferedWriter objects are collected, and collecting them flushes
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1236 # all data to disk.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1237 # The Python version has __del__, so it ends into gc.garbage instead
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1238 rawio = self.FileIO(support.TESTFN, "w+b")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1239 f = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1240 f.write(b"123xxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1241 f.x = f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1242 wr = weakref.ref(f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1243 del f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1244 support.gc_collect()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
1245 self.assertTrue(wr() is None, wr)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
1246 with self.open(support.TESTFN, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1247 self.assertEqual(f.read(), b"123xxx")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1248
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1249
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1250 class PyBufferedWriterTest(BufferedWriterTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1251 tp = pyio.BufferedWriter
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1252
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1253 class BufferedRWPairTest(unittest.TestCase):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1254
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1255 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1256 pair = self.tp(self.MockRawIO(), self.MockRawIO())
50305
e673632e1885 Merged revisions 67898,67904-67907,67912,67918,67920-67921,67923-67924,67927,67930,67932,67943 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50171
diff changeset
1257 self.assertFalse(pair.closed)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1258
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1259 def test_detach(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1260 pair = self.tp(self.MockRawIO(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1261 self.assertRaises(self.UnsupportedOperation, pair.detach)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1262
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1263 def test_constructor_max_buffer_size_deprecation(self):
59669
7df3e13d3e50 Cleanup some test cases using check_warnings and check_py3k_warnings.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58817
diff changeset
1264 with support.check_warnings(("max_buffer_size is deprecated",
7df3e13d3e50 Cleanup some test cases using check_warnings and check_py3k_warnings.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58817
diff changeset
1265 DeprecationWarning)):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1266 self.tp(self.MockRawIO(), self.MockRawIO(), 8, 12)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1267
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1268 def test_constructor_with_not_readable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1269 class NotReadable(MockRawIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1270 def readable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1271 return False
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1272
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1273 self.assertRaises(IOError, self.tp, NotReadable(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1274
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1275 def test_constructor_with_not_writeable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1276 class NotWriteable(MockRawIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1277 def writable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1278 return False
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1279
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1280 self.assertRaises(IOError, self.tp, self.MockRawIO(), NotWriteable())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1281
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1282 def test_read(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1283 pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1284
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1285 self.assertEqual(pair.read(3), b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1286 self.assertEqual(pair.read(1), b"d")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1287 self.assertEqual(pair.read(), b"ef")
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1288 pair = self.tp(self.BytesIO(b"abc"), self.MockRawIO())
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1289 self.assertEqual(pair.read(None), b"abc")
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1290
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1291 def test_readlines(self):
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1292 pair = lambda: self.tp(self.BytesIO(b"abc\ndef\nh"), self.MockRawIO())
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1293 self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1294 self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
1295 self.assertEqual(pair().readlines(5), [b"abc\n", b"def\n"])
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1296
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1297 def test_read1(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1298 # .read1() is delegated to the underlying reader object, so this test
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1299 # can be shallow.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1300 pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1301
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1302 self.assertEqual(pair.read1(3), b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1303
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1304 def test_readinto(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1305 pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1306
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1307 data = bytearray(5)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1308 self.assertEqual(pair.readinto(data), 5)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1309 self.assertEqual(data, b"abcde")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1310
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1311 def test_write(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1312 w = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1313 pair = self.tp(self.MockRawIO(), w)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1314
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1315 pair.write(b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1316 pair.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1317 pair.write(b"def")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1318 pair.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1319 self.assertEqual(w._write_stack, [b"abc", b"def"])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1320
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1321 def test_peek(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1322 pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1323
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1324 self.assertTrue(pair.peek(3).startswith(b"abc"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1325 self.assertEqual(pair.read(3), b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1326
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1327 def test_readable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1328 pair = self.tp(self.MockRawIO(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1329 self.assertTrue(pair.readable())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1330
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1331 def test_writeable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1332 pair = self.tp(self.MockRawIO(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1333 self.assertTrue(pair.writable())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1334
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1335 def test_seekable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1336 # BufferedRWPairs are never seekable, even if their readers and writers
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1337 # are.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1338 pair = self.tp(self.MockRawIO(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1339 self.assertFalse(pair.seekable())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1340
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1341 # .flush() is delegated to the underlying writer object and has been
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1342 # tested in the test_write method.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1343
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1344 def test_close_and_closed(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1345 pair = self.tp(self.MockRawIO(), self.MockRawIO())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1346 self.assertFalse(pair.closed)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1347 pair.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1348 self.assertTrue(pair.closed)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1349
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1350 def test_isatty(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1351 class SelectableIsAtty(MockRawIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1352 def __init__(self, isatty):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1353 MockRawIO.__init__(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1354 self._isatty = isatty
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1355
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1356 def isatty(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1357 return self._isatty
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1358
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1359 pair = self.tp(SelectableIsAtty(False), SelectableIsAtty(False))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1360 self.assertFalse(pair.isatty())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1361
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1362 pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(False))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1363 self.assertTrue(pair.isatty())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1364
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1365 pair = self.tp(SelectableIsAtty(False), SelectableIsAtty(True))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1366 self.assertTrue(pair.isatty())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1367
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1368 pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(True))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1369 self.assertTrue(pair.isatty())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1370
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1371 class CBufferedRWPairTest(BufferedRWPairTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1372 tp = io.BufferedRWPair
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1373
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1374 class PyBufferedRWPairTest(BufferedRWPairTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1375 tp = pyio.BufferedRWPair
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1376
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1377
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1378 class BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1379 read_mode = "rb+"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1380 write_mode = "wb+"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1381
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1382 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1383 BufferedReaderTest.test_constructor(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1384 BufferedWriterTest.test_constructor(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1385
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1386 def test_read_and_write(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1387 raw = self.MockRawIO((b"asdf", b"ghjk"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1388 rw = self.tp(raw, 8)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1389
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1390 self.assertEqual(b"as", rw.read(2))
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1391 rw.write(b"ddd")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1392 rw.write(b"eee")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1393 self.assertFalse(raw._write_stack) # Buffer writes
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1394 self.assertEqual(b"ghjk", rw.read())
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1395 self.assertEqual(b"dddeee", raw._write_stack[0])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1396
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1397 def test_seek_and_tell(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1398 raw = self.BytesIO(b"asdfghjkl")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1399 rw = self.tp(raw)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1400
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1401 self.assertEqual(b"as", rw.read(2))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1402 self.assertEqual(2, rw.tell())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1403 rw.seek(0, 0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1404 self.assertEqual(b"asdf", rw.read(4))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1405
71984
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1406 rw.write(b"123f")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1407 rw.seek(0, 0)
71984
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1408 self.assertEqual(b"asdf123fl", rw.read())
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1409 self.assertEqual(9, rw.tell())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1410 rw.seek(-4, 2)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1411 self.assertEqual(5, rw.tell())
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1412 rw.seek(2, 1)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1413 self.assertEqual(7, rw.tell())
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1414 self.assertEqual(b"fl", rw.read(11))
71984
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1415 rw.flush()
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1416 self.assertEqual(b"asdf123fl", raw.getvalue())
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1417
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1418 self.assertRaises(TypeError, rw.seek, 0.0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1419
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1420 def check_flush_and_read(self, read_func):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1421 raw = self.BytesIO(b"abcdefghi")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1422 bufio = self.tp(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1423
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1424 self.assertEqual(b"ab", read_func(bufio, 2))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1425 bufio.write(b"12")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1426 self.assertEqual(b"ef", read_func(bufio, 2))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1427 self.assertEqual(6, bufio.tell())
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1428 bufio.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1429 self.assertEqual(6, bufio.tell())
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1430 self.assertEqual(b"ghi", read_func(bufio))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1431 raw.seek(0, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1432 raw.write(b"XYZ")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1433 # flush() resets the read buffer
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1434 bufio.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1435 bufio.seek(0, 0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1436 self.assertEqual(b"XYZ", read_func(bufio, 3))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1437
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1438 def test_flush_and_read(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1439 self.check_flush_and_read(lambda bufio, *args: bufio.read(*args))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1440
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1441 def test_flush_and_readinto(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1442 def _readinto(bufio, n=-1):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1443 b = bytearray(n if n >= 0 else 9999)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1444 n = bufio.readinto(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1445 return bytes(b[:n])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1446 self.check_flush_and_read(_readinto)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1447
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1448 def test_flush_and_peek(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1449 def _peek(bufio, n=-1):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1450 # This relies on the fact that the buffer can contain the whole
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1451 # raw stream, otherwise peek() can return less.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1452 b = bufio.peek(n)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1453 if n != -1:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1454 b = b[:n]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1455 bufio.seek(len(b), 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1456 return b
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1457 self.check_flush_and_read(_peek)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1458
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1459 def test_flush_and_write(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1460 raw = self.BytesIO(b"abcdefghi")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1461 bufio = self.tp(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1462
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1463 bufio.write(b"123")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1464 bufio.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1465 bufio.write(b"45")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1466 bufio.flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1467 bufio.seek(0, 0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1468 self.assertEqual(b"12345fghi", raw.getvalue())
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1469 self.assertEqual(b"12345fghi", bufio.read())
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1470
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1471 def test_threads(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1472 BufferedReaderTest.test_threads(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1473 BufferedWriterTest.test_threads(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1474
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1475 def test_writes_and_peek(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1476 def _peek(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1477 bufio.peek(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1478 self.check_writes(_peek)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1479 def _peek(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1480 pos = bufio.tell()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1481 bufio.seek(-1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1482 bufio.peek(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1483 bufio.seek(pos, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1484 self.check_writes(_peek)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1485
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1486 def test_writes_and_reads(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1487 def _read(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1488 bufio.seek(-1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1489 bufio.read(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1490 self.check_writes(_read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1491
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1492 def test_writes_and_read1s(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1493 def _read1(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1494 bufio.seek(-1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1495 bufio.read1(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1496 self.check_writes(_read1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1497
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1498 def test_writes_and_readintos(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1499 def _read(bufio):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1500 bufio.seek(-1, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1501 bufio.readinto(bytearray(1))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1502 self.check_writes(_read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1503
55564
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1504 def test_write_after_readahead(self):
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1505 # Issue #6629: writing after the buffer was filled by readahead should
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1506 # first rewind the raw stream.
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1507 for overwrite_size in [1, 5]:
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1508 raw = self.BytesIO(b"A" * 10)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1509 bufio = self.tp(raw, 4)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1510 # Trigger readahead
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1511 self.assertEqual(bufio.read(1), b"A")
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1512 self.assertEqual(bufio.tell(), 1)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1513 # Overwriting should rewind the raw stream if it needs so
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1514 bufio.write(b"B" * overwrite_size)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1515 self.assertEqual(bufio.tell(), overwrite_size + 1)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1516 # If the write size was smaller than the buffer size, flush() and
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1517 # check that rewind happens.
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1518 bufio.flush()
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1519 self.assertEqual(bufio.tell(), overwrite_size + 1)
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1520 s = raw.getvalue()
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1521 self.assertEqual(s,
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1522 b"A" + b"B" * overwrite_size + b"A" * (9 - overwrite_size))
2f641e337c9f Issue #6629: Fix a data corruption issue in the new `io` package, which could
Antoine Pitrou <solipsis@pitrou.net>
parents: 55002
diff changeset
1523
70060
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1524 def test_write_rewind_write(self):
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1525 # Various combinations of reading / writing / seeking backwards / writing again
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1526 def mutate(bufio, pos1, pos2):
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1527 assert pos2 >= pos1
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1528 # Fill the buffer
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1529 bufio.seek(pos1)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1530 bufio.read(pos2 - pos1)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1531 bufio.write(b'\x02')
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1532 # This writes earlier than the previous write, but still inside
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1533 # the buffer.
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1534 bufio.seek(pos1)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1535 bufio.write(b'\x01')
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1536
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1537 b = b"\x80\x81\x82\x83\x84"
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1538 for i in range(0, len(b)):
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1539 for j in range(i, len(b)):
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1540 raw = self.BytesIO(b)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1541 bufio = self.tp(raw, 100)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1542 mutate(bufio, i, j)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1543 bufio.flush()
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1544 expected = bytearray(b)
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1545 expected[j] = 2
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1546 expected[i] = 1
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1547 self.assertEqual(raw.getvalue(), expected,
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1548 "failed result for i=%d, j=%d" % (i, j))
0d24d4c537a6 Issue #12062: In the `io` module, fix a flushing bug when doing a certain
Antoine Pitrou <solipsis@pitrou.net>
parents: 68256
diff changeset
1549
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1550 def test_truncate_after_read_or_write(self):
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1551 raw = self.BytesIO(b"A" * 10)
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1552 bufio = self.tp(raw, 100)
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1553 self.assertEqual(bufio.read(2), b"AA") # the read buffer gets filled
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1554 self.assertEqual(bufio.truncate(), 2)
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1555 self.assertEqual(bufio.write(b"BB"), 2) # the write buffer increases
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1556 self.assertEqual(bufio.truncate(), 4)
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 58472
diff changeset
1557
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1558 def test_misbehaved_io(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1559 BufferedReaderTest.test_misbehaved_io(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1560 BufferedWriterTest.test_misbehaved_io(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1561
71984
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1562 def test_interleaved_read_write(self):
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1563 # Test for issue #12213
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1564 with self.BytesIO(b'abcdefgh') as raw:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1565 with self.tp(raw, 100) as f:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1566 f.write(b"1")
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1567 self.assertEqual(f.read(1), b'b')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1568 f.write(b'2')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1569 self.assertEqual(f.read1(1), b'd')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1570 f.write(b'3')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1571 buf = bytearray(1)
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1572 f.readinto(buf)
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1573 self.assertEqual(buf, b'f')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1574 f.write(b'4')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1575 self.assertEqual(f.peek(1), b'h')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1576 f.flush()
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1577 self.assertEqual(raw.getvalue(), b'1b2d3f4h')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1578
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1579 with self.BytesIO(b'abc') as raw:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1580 with self.tp(raw, 100) as f:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1581 self.assertEqual(f.read(1), b'a')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1582 f.write(b"2")
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1583 self.assertEqual(f.read(1), b'c')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1584 f.flush()
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1585 self.assertEqual(raw.getvalue(), b'a2c')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1586
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1587 def test_interleaved_readline_write(self):
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1588 with self.BytesIO(b'ab\ncdef\ng\n') as raw:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1589 with self.tp(raw) as f:
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1590 f.write(b'1')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1591 self.assertEqual(f.readline(), b'b\n')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1592 f.write(b'2')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1593 self.assertEqual(f.readline(), b'def\n')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1594 f.write(b'3')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1595 self.assertEqual(f.readline(), b'\n')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1596 f.flush()
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1597 self.assertEqual(raw.getvalue(), b'1b\n2def\n3\n')
cf2010e9f941 Issue #12213: Fix a buffering bug with interleaved reads and writes that
Antoine Pitrou <solipsis@pitrou.net>
parents: 71299
diff changeset
1598
78320
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
1599 class CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest,
1102e86b8739 Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77134
diff changeset
1600 BufferedRandomTest, SizeofTest):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1601 tp = io.BufferedRandom
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1602
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1603 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1604 BufferedRandomTest.test_constructor(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1605 # The allocation can succeed on 32-bit builds, e.g. with more
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1606 # than 2GB RAM and a 64-bit kernel.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1607 if sys.maxsize > 0x7FFFFFFF:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1608 rawio = self.MockRawIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1609 bufio = self.tp(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1610 self.assertRaises((OverflowError, MemoryError, ValueError),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1611 bufio.__init__, rawio, sys.maxsize)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1612
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1613 def test_garbage_collection(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1614 CBufferedReaderTest.test_garbage_collection(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1615 CBufferedWriterTest.test_garbage_collection(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1616
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1617 class PyBufferedRandomTest(BufferedRandomTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1618 tp = pyio.BufferedRandom
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1619
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1620
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1621 # To fully exercise seek/tell, the StatefulIncrementalDecoder has these
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1622 # properties:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1623 # - A single output character can correspond to many bytes of input.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1624 # - The number of input bytes to complete the character can be
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1625 # undetermined until the last input byte is received.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1626 # - The number of input bytes can vary depending on previous input.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1627 # - A single input byte can correspond to many characters of output.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1628 # - The number of output characters can be undetermined until the
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1629 # last input byte is received.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1630 # - The number of output characters can vary depending on previous input.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1631
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1632 class StatefulIncrementalDecoder(codecs.IncrementalDecoder):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1633 """
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1634 For testing seek/tell behavior with a stateful, buffering decoder.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1635
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1636 Input is a sequence of words. Words may be fixed-length (length set
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1637 by input) or variable-length (period-terminated). In variable-length
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1638 mode, extra periods are ignored. Possible words are:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1639 - 'i' followed by a number sets the input length, I (maximum 99).
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1640 When I is set to 0, words are space-terminated.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1641 - 'o' followed by a number sets the output length, O (maximum 99).
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1642 - Any other word is converted into a word followed by a period on
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1643 the output. The output word consists of the input word truncated
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1644 or padded out with hyphens to make its length equal to O. If O
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1645 is 0, the word is output verbatim without truncating or padding.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1646 I and O are initially set to 1. When I changes, any buffered input is
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1647 re-scanned according to the new I. EOF also terminates the last word.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1648 """
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1649
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1650 def __init__(self, errors='strict'):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1651 codecs.IncrementalDecoder.__init__(self, errors)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1652 self.reset()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1653
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1654 def __repr__(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1655 return '<SID %x>' % id(self)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1656
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1657 def reset(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1658 self.i = 1
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1659 self.o = 1
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1660 self.buffer = bytearray()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1661
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1662 def getstate(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1663 i, o = self.i ^ 1, self.o ^ 1 # so that flags = 0 after reset()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1664 return bytes(self.buffer), i*100 + o
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1665
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1666 def setstate(self, state):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1667 buffer, io = state
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1668 self.buffer = bytearray(buffer)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1669 i, o = divmod(io, 100)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1670 self.i, self.o = i ^ 1, o ^ 1
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1671
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1672 def decode(self, input, final=False):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1673 output = ''
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1674 for b in input:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1675 if self.i == 0: # variable-length, terminated with period
46244
4779e3496ae1 Fix and enable a skipped test:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46124
diff changeset
1676 if b == '.':
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1677 if self.buffer:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1678 output += self.process_word()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1679 else:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1680 self.buffer.append(b)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1681 else: # fixed-length, terminate after self.i bytes
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1682 self.buffer.append(b)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1683 if len(self.buffer) == self.i:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1684 output += self.process_word()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1685 if final and self.buffer: # EOF terminates the last word
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1686 output += self.process_word()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1687 return output
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1688
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1689 def process_word(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1690 output = ''
46641
bfa82b493335 In test_io, StatefulIncrementalDecoderTest was not part of the test suite.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46245
diff changeset
1691 if self.buffer[0] == ord('i'):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1692 self.i = min(99, int(self.buffer[1:] or 0)) # set input length
46641
bfa82b493335 In test_io, StatefulIncrementalDecoderTest was not part of the test suite.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46245
diff changeset
1693 elif self.buffer[0] == ord('o'):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1694 self.o = min(99, int(self.buffer[1:] or 0)) # set output length
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1695 else:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1696 output = self.buffer.decode('ascii')
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1697 if len(output) < self.o:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1698 output += '-'*self.o # pad out with hyphens
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1699 if self.o:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1700 output = output[:self.o] # truncate to output length
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1701 output += '.'
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1702 self.buffer = bytearray()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1703 return output
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1704
46245
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1705 codecEnabled = False
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1706
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1707 @classmethod
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1708 def lookupTestDecoder(cls, name):
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1709 if cls.codecEnabled and name == 'test_decoder':
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1710 latin1 = codecs.lookup('latin-1')
46245
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1711 return codecs.CodecInfo(
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1712 name='test_decoder', encode=latin1.encode, decode=None,
46245
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1713 incrementalencoder=None,
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1714 streamreader=None, streamwriter=None,
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1715 incrementaldecoder=cls)
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1716
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1717 # Register the previous decoder for testing.
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1718 # Disabled by default, tests will enable it.
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1719 codecs.register(StatefulIncrementalDecoder.lookupTestDecoder)
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1720
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
1721
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1722 class StatefulIncrementalDecoderTest(unittest.TestCase):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1723 """
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1724 Make sure the StatefulIncrementalDecoder actually works.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1725 """
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1726
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1727 test_cases = [
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1728 # I=1, O=1 (fixed-length input == fixed-length output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1729 (b'abcd', False, 'a.b.c.d.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1730 # I=0, O=0 (variable-length input, variable-length output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1731 (b'oiabcd', True, 'abcd.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1732 # I=0, O=0 (should ignore extra periods)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1733 (b'oi...abcd...', True, 'abcd.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1734 # I=0, O=6 (variable-length input, fixed-length output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1735 (b'i.o6.x.xyz.toolongtofit.', False, 'x-----.xyz---.toolon.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1736 # I=2, O=6 (fixed-length input < fixed-length output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1737 (b'i.i2.o6xyz', True, 'xy----.z-----.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1738 # I=6, O=3 (fixed-length input > fixed-length output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1739 (b'i.o3.i6.abcdefghijklmnop', True, 'abc.ghi.mno.'),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1740 # I=0, then 3; O=29, then 15 (with longer output)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1741 (b'i.o29.a.b.cde.o15.abcdefghijabcdefghij.i3.a.b.c.d.ei00k.l.m', True,
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1742 'a----------------------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1743 'b----------------------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1744 'cde--------------------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1745 'abcdefghijabcde.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1746 'a.b------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1747 '.c.------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1748 'd.e------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1749 'k--------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1750 'l--------------.' +
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1751 'm--------------.')
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1752 ]
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1753
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1754 def test_decoder(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1755 # Try a few one-shot test cases.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1756 for input, eof, output in self.test_cases:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1757 d = StatefulIncrementalDecoder()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1758 self.assertEqual(d.decode(input, eof), output)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1759
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1760 # Also test an unfinished decode, followed by forcing EOF.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1761 d = StatefulIncrementalDecoder()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1762 self.assertEqual(d.decode(b'oiabcd'), '')
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1763 self.assertEqual(d.decode(b'', 1), 'abcd.')
63262
315c2b524c59 Issue #5006: Better handling of unicode byte-order marks (BOM) in the io
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61606
diff changeset
1764
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1765 class TextIOWrapperTest(unittest.TestCase):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1766
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1767 def setUp(self):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1768 self.testdata = b"AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n"
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1769 self.normalized = b"AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1770 support.unlink(support.TESTFN)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1771
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1772 def tearDown(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1773 support.unlink(support.TESTFN)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1774
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1775 def test_constructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1776 r = self.BytesIO(b"\xc3\xa9\n\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1777 b = self.BufferedReader(r, 1000)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1778 t = self.TextIOWrapper(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1779 t.__init__(b, encoding="latin1", newline="\r\n")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1780 self.assertEqual(t.encoding, "latin1")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1781 self.assertEqual(t.line_buffering, False)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1782 t.__init__(b, encoding="utf8", line_buffering=True)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1783 self.assertEqual(t.encoding, "utf8")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1784 self.assertEqual(t.line_buffering, True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1785 self.assertEqual("\xe9\n", t.readline())
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1786 self.assertRaises(TypeError, t.__init__, b, newline=42)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1787 self.assertRaises(ValueError, t.__init__, b, newline='xyzzy')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1788
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1789 def test_detach(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1790 r = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1791 b = self.BufferedWriter(r)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1792 t = self.TextIOWrapper(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1793 self.assertIs(t.detach(), b)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1794
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1795 t = self.TextIOWrapper(b, encoding="ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1796 t.write("howdy")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1797 self.assertFalse(r.getvalue())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1798 t.detach()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1799 self.assertEqual(r.getvalue(), b"howdy")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1800 self.assertRaises(ValueError, t.detach)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1801
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1802 def test_repr(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1803 raw = self.BytesIO("hello".encode("utf-8"))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1804 b = self.BufferedReader(raw)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1805 t = self.TextIOWrapper(b, encoding="utf-8")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1806 modname = self.TextIOWrapper.__module__
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1807 self.assertEqual(repr(t),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1808 "<%s.TextIOWrapper encoding='utf-8'>" % modname)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1809 raw.name = "dummy"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1810 self.assertEqual(repr(t),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1811 "<%s.TextIOWrapper name=u'dummy' encoding='utf-8'>" % modname)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1812 raw.name = b"dummy"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1813 self.assertEqual(repr(t),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1814 "<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1815
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1816 def test_line_buffering(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1817 r = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1818 b = self.BufferedWriter(r, 1000)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1819 t = self.TextIOWrapper(b, newline="\n", line_buffering=True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1820 t.write("X")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1821 self.assertEqual(r.getvalue(), b"") # No flush happened
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1822 t.write("Y\nZ")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1823 self.assertEqual(r.getvalue(), b"XY\nZ") # All got flushed
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1824 t.write("A\rB")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1825 self.assertEqual(r.getvalue(), b"XY\nZA\rB")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1826
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1827 def test_encoding(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1828 # Check the encoding attribute is always set, and valid
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1829 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1830 t = self.TextIOWrapper(b, encoding="utf8")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1831 self.assertEqual(t.encoding, "utf8")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1832 t = self.TextIOWrapper(b)
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
1833 self.assertTrue(t.encoding is not None)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1834 codecs.lookup(t.encoding)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1835
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1836 def test_encoding_errors_reading(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1837 # (1) default
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1838 b = self.BytesIO(b"abc\n\xff\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1839 t = self.TextIOWrapper(b, encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1840 self.assertRaises(UnicodeError, t.read)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1841 # (2) explicit strict
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1842 b = self.BytesIO(b"abc\n\xff\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1843 t = self.TextIOWrapper(b, encoding="ascii", errors="strict")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1844 self.assertRaises(UnicodeError, t.read)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1845 # (3) ignore
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1846 b = self.BytesIO(b"abc\n\xff\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1847 t = self.TextIOWrapper(b, encoding="ascii", errors="ignore")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1848 self.assertEqual(t.read(), "abc\n\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1849 # (4) replace
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1850 b = self.BytesIO(b"abc\n\xff\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1851 t = self.TextIOWrapper(b, encoding="ascii", errors="replace")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1852 self.assertEqual(t.read(), "abc\n\ufffd\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1853
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1854 def test_encoding_errors_writing(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1855 # (1) default
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1856 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1857 t = self.TextIOWrapper(b, encoding="ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1858 self.assertRaises(UnicodeError, t.write, "\xff")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1859 # (2) explicit strict
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1860 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1861 t = self.TextIOWrapper(b, encoding="ascii", errors="strict")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1862 self.assertRaises(UnicodeError, t.write, "\xff")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1863 # (3) ignore
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1864 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1865 t = self.TextIOWrapper(b, encoding="ascii", errors="ignore",
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1866 newline="\n")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1867 t.write("abc\xffdef\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1868 t.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1869 self.assertEqual(b.getvalue(), b"abcdef\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1870 # (4) replace
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1871 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1872 t = self.TextIOWrapper(b, encoding="ascii", errors="replace",
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1873 newline="\n")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1874 t.write("abc\xffdef\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1875 t.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1876 self.assertEqual(b.getvalue(), b"abc?def\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1877
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1878 def test_newlines(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1879 input_lines = [ "unix\n", "windows\r\n", "os9\r", "last\n", "nonl" ]
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1880
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1881 tests = [
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1882 [ None, [ 'unix\n', 'windows\n', 'os9\n', 'last\n', 'nonl' ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1883 [ '', input_lines ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1884 [ '\n', [ "unix\n", "windows\r\n", "os9\rlast\n", "nonl" ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1885 [ '\r\n', [ "unix\nwindows\r\n", "os9\rlast\nnonl" ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1886 [ '\r', [ "unix\nwindows\r", "\nos9\r", "last\nnonl" ] ],
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1887 ]
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1888 encodings = (
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1889 'utf-8', 'latin-1',
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1890 'utf-16', 'utf-16-le', 'utf-16-be',
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1891 'utf-32', 'utf-32-le', 'utf-32-be',
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
1892 )
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1893
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1894 # Try a range of buffer sizes to test the case where \r is the last
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1895 # character in TextIOWrapper._pending_line.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1896 for encoding in encodings:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1897 # XXX: str.encode() should return bytes
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1898 data = bytes(''.join(input_lines).encode(encoding))
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1899 for do_reads in (False, True):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1900 for bufsize in range(1, 10):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1901 for newline, exp_lines in tests:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1902 bufio = self.BufferedReader(self.BytesIO(data), bufsize)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1903 textio = self.TextIOWrapper(bufio, newline=newline,
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1904 encoding=encoding)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1905 if do_reads:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1906 got_lines = []
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1907 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1908 c2 = textio.read(2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1909 if c2 == '':
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1910 break
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1911 self.assertEqual(len(c2), 2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1912 got_lines.append(c2 + textio.readline())
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1913 else:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1914 got_lines = list(textio)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1915
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1916 for got_line, exp_line in zip(got_lines, exp_lines):
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1917 self.assertEqual(got_line, exp_line)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1918 self.assertEqual(len(got_lines), len(exp_lines))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1919
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1920 def test_newlines_input(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1921 testdata = b"AAA\nBB\x00B\nCCC\rDDD\rEEE\r\nFFF\r\nGGG"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1922 normalized = testdata.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1923 for newline, expected in [
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1924 (None, normalized.decode("ascii").splitlines(True)),
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1925 ("", testdata.decode("ascii").splitlines(True)),
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1926 ("\n", ["AAA\n", "BB\x00B\n", "CCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1927 ("\r\n", ["AAA\nBB\x00B\nCCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1928 ("\r", ["AAA\nBB\x00B\nCCC\r", "DDD\r", "EEE\r", "\nFFF\r", "\nGGG"]),
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1929 ]:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1930 buf = self.BytesIO(testdata)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1931 txt = self.TextIOWrapper(buf, encoding="ascii", newline=newline)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1932 self.assertEqual(txt.readlines(), expected)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1933 txt.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1934 self.assertEqual(txt.read(), "".join(expected))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1935
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1936 def test_newlines_output(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1937 testdict = {
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1938 "": b"AAA\nBBB\nCCC\nX\rY\r\nZ",
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1939 "\n": b"AAA\nBBB\nCCC\nX\rY\r\nZ",
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1940 "\r": b"AAA\rBBB\rCCC\rX\rY\r\rZ",
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1941 "\r\n": b"AAA\r\nBBB\r\nCCC\r\nX\rY\r\r\nZ",
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1942 }
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1943 tests = [(None, testdict[os.linesep])] + sorted(testdict.items())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1944 for newline, expected in tests:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1945 buf = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1946 txt = self.TextIOWrapper(buf, encoding="ascii", newline=newline)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1947 txt.write("AAA\nB")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1948 txt.write("BB\nCCC\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1949 txt.write("X\rY\r\nZ")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1950 txt.flush()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1951 self.assertEqual(buf.closed, False)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1952 self.assertEqual(buf.getvalue(), expected)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
1953
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1954 def test_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1955 l = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1956 base = self.BytesIO
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1957 class MyBytesIO(base):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1958 def close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1959 l.append(self.getvalue())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1960 base.close(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1961 b = MyBytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1962 t = self.TextIOWrapper(b, encoding="ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1963 t.write("abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1964 del t
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1965 support.gc_collect()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
1966 self.assertEqual([b"abc"], l)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1967
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1968 def test_override_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1969 record = []
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1970 class MyTextIO(self.TextIOWrapper):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1971 def __del__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1972 record.append(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1973 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1974 f = super(MyTextIO, self).__del__
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1975 except AttributeError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1976 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1977 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1978 f()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1979 def close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1980 record.append(2)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1981 super(MyTextIO, self).close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1982 def flush(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1983 record.append(3)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1984 super(MyTextIO, self).flush()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1985 b = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1986 t = MyTextIO(b, encoding="ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1987 del t
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1988 support.gc_collect()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1989 self.assertEqual(record, [1, 2, 3])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1990
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1991 def test_error_through_destructor(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1992 # Test that the exception state is not modified by a destructor,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1993 # even if close() fails.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1994 rawio = self.CloseFailureIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1995 def f():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1996 self.TextIOWrapper(rawio).xyzzy
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1997 with support.captured_output("stderr") as s:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1998 self.assertRaises(AttributeError, f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
1999 s = s.getvalue().strip()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2000 if s:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2001 # The destructor *may* have printed an unraisable error, check it
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2002 self.assertEqual(len(s.splitlines()), 1)
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
2003 self.assertTrue(s.startswith("Exception IOError: "), s)
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
2004 self.assertTrue(s.endswith(" ignored"), s)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2005
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2006 # Systematic tests of the text I/O API
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2007
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2008 def test_basic_io(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2009 for chunksize in (1, 2, 3, 4, 5, 15, 16, 17, 31, 32, 33, 63, 64, 65):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2010 for enc in "ascii", "latin1", "utf8" :# , "utf-16-be", "utf-16-le":
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2011 f = self.open(support.TESTFN, "w+", encoding=enc)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2012 f._CHUNK_SIZE = chunksize
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2013 self.assertEqual(f.write("abc"), 3)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2014 f.close()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2015 f = self.open(support.TESTFN, "r+", encoding=enc)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2016 f._CHUNK_SIZE = chunksize
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2017 self.assertEqual(f.tell(), 0)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2018 self.assertEqual(f.read(), "abc")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2019 cookie = f.tell()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2020 self.assertEqual(f.seek(0), 0)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2021 self.assertEqual(f.read(None), "abc")
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2022 f.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2023 self.assertEqual(f.read(2), "ab")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2024 self.assertEqual(f.read(1), "c")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2025 self.assertEqual(f.read(1), "")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2026 self.assertEqual(f.read(), "")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2027 self.assertEqual(f.tell(), cookie)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2028 self.assertEqual(f.seek(0), 0)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2029 self.assertEqual(f.seek(0, 2), cookie)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2030 self.assertEqual(f.write("def"), 3)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2031 self.assertEqual(f.seek(cookie), cookie)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2032 self.assertEqual(f.read(), "def")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2033 if enc.startswith("utf"):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2034 self.multi_line_test(f, enc)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2035 f.close()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2036
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2037 def multi_line_test(self, f, enc):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2038 f.seek(0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2039 f.truncate()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2040 sample = "s\xff\u0fff\uffff"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2041 wlines = []
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2042 for size in (0, 1, 2, 3, 4, 5, 30, 31, 32, 33, 62, 63, 64, 65, 1000):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2043 chars = []
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2044 for i in range(size):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2045 chars.append(sample[i % len(sample)])
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2046 line = "".join(chars) + "\n"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2047 wlines.append((f.tell(), line))
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2048 f.write(line)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2049 f.seek(0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2050 rlines = []
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2051 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2052 pos = f.tell()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2053 line = f.readline()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2054 if not line:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2055 break
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2056 rlines.append((pos, line))
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2057 self.assertEqual(rlines, wlines)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2058
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2059 def test_telling(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2060 f = self.open(support.TESTFN, "w+", encoding="utf8")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2061 p0 = f.tell()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2062 f.write("\xff\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2063 p1 = f.tell()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2064 f.write("\xff\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2065 p2 = f.tell()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2066 f.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2067 self.assertEqual(f.tell(), p0)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2068 self.assertEqual(f.readline(), "\xff\n")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2069 self.assertEqual(f.tell(), p1)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2070 self.assertEqual(f.readline(), "\xff\n")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2071 self.assertEqual(f.tell(), p2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2072 f.seek(0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2073 for line in f:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2074 self.assertEqual(line, "\xff\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2075 self.assertRaises(IOError, f.tell)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2076 self.assertEqual(f.tell(), p2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2077 f.close()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2078
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2079 def test_seeking(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2080 chunk_size = _default_chunk_size()
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2081 prefix_size = chunk_size - 2
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2082 u_prefix = "a" * prefix_size
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2083 prefix = bytes(u_prefix.encode("utf-8"))
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2084 self.assertEqual(len(u_prefix), len(prefix))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2085 u_suffix = "\u8888\n"
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2086 suffix = bytes(u_suffix.encode("utf-8"))
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2087 line = prefix + suffix
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2088 f = self.open(support.TESTFN, "wb")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2089 f.write(line*2)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2090 f.close()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2091 f = self.open(support.TESTFN, "r", encoding="utf-8")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2092 s = f.read(prefix_size)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2093 self.assertEqual(s, prefix.decode("ascii"))
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2094 self.assertEqual(f.tell(), prefix_size)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2095 self.assertEqual(f.readline(), u_suffix)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2096
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2097 def test_seeking_too(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2098 # Regression test for a specific bug
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2099 data = b'\xe0\xbf\xbf\n'
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2100 f = self.open(support.TESTFN, "wb")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2101 f.write(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2102 f.close()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2103 f = self.open(support.TESTFN, "r", encoding="utf-8")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2104 f._CHUNK_SIZE # Just test that it exists
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2105 f._CHUNK_SIZE = 2
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2106 f.readline()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2107 f.tell()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2108
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2109 def test_seek_and_tell(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2110 #Test seek/tell using the StatefulIncrementalDecoder.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2111 # Make test faster by doing smaller seeks
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2112 CHUNK_SIZE = 128
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2113
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2114 def test_seek_and_tell_with_data(data, min_pos=0):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2115 """Tell/seek to various points within a data stream and ensure
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2116 that the decoded data returned by read() is consistent."""
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2117 f = self.open(support.TESTFN, 'wb')
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2118 f.write(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2119 f.close()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2120 f = self.open(support.TESTFN, encoding='test_decoder')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2121 f._CHUNK_SIZE = CHUNK_SIZE
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2122 decoded = f.read()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2123 f.close()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2124
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2125 for i in range(min_pos, len(decoded) + 1): # seek positions
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2126 for j in [1, 5, len(decoded) - i]: # read lengths
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2127 f = self.open(support.TESTFN, encoding='test_decoder')
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2128 self.assertEqual(f.read(i), decoded[:i])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2129 cookie = f.tell()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2130 self.assertEqual(f.read(j), decoded[i:i + j])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2131 f.seek(cookie)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2132 self.assertEqual(f.read(), decoded[i:])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2133 f.close()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2134
46245
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
2135 # Enable the test decoder.
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
2136 StatefulIncrementalDecoder.codecEnabled = 1
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2137
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2138 # Run the tests.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2139 try:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2140 # Try each test case.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2141 for input, _, _ in StatefulIncrementalDecoderTest.test_cases:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2142 test_seek_and_tell_with_data(input)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2143
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2144 # Position each test case so that it crosses a chunk boundary.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2145 for input, _, _ in StatefulIncrementalDecoderTest.test_cases:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2146 offset = CHUNK_SIZE - len(input)//2
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2147 prefix = b'.'*offset
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2148 # Don't bother seeking into the prefix (takes too long).
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2149 min_pos = offset*2
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2150 test_seek_and_tell_with_data(prefix + input, min_pos)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2151
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2152 # Ensure our test decoder won't interfere with subsequent tests.
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2153 finally:
46245
0730f3d50cdc Newly enabled test appears to leak:
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 46244
diff changeset
2154 StatefulIncrementalDecoder.codecEnabled = 0
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2155
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2156 def test_encoded_writes(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2157 data = "1234567890"
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2158 tests = ("utf-16",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2159 "utf-16-le",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2160 "utf-16-be",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2161 "utf-32",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2162 "utf-32-le",
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2163 "utf-32-be")
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2164 for encoding in tests:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2165 buf = self.BytesIO()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2166 f = self.TextIOWrapper(buf, encoding=encoding)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2167 # Check if the BOM is written only once (see issue1753).
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2168 f.write(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2169 f.write(data)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2170 f.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2171 self.assertEqual(f.read(), data * 2)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2172 f.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2173 self.assertEqual(f.read(), data * 2)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2174 self.assertEqual(buf.getvalue(), (data * 2).encode(encoding))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2175
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2176 def test_unreadable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2177 class UnReadable(self.BytesIO):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2178 def readable(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2179 return False
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2180 txt = self.TextIOWrapper(UnReadable())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2181 self.assertRaises(IOError, txt.read)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2182
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2183 def test_read_one_by_one(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2184 txt = self.TextIOWrapper(self.BytesIO(b"AA\r\nBB"))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2185 reads = ""
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2186 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2187 c = txt.read(1)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2188 if not c:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2189 break
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2190 reads += c
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2191 self.assertEqual(reads, "AA\nBB")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2192
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2193 def test_readlines(self):
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2194 txt = self.TextIOWrapper(self.BytesIO(b"AA\nBB\nCC"))
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2195 self.assertEqual(txt.readlines(), ["AA\n", "BB\n", "CC"])
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2196 txt.seek(0)
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2197 self.assertEqual(txt.readlines(None), ["AA\n", "BB\n", "CC"])
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2198 txt.seek(0)
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55756
diff changeset
2199 self.assertEqual(txt.readlines(5), ["AA\n", "BB\n"])
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2200
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2201 # read in amounts equal to TextIOWrapper._CHUNK_SIZE which is 128.
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2202 def test_read_by_chunk(self):
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2203 # make sure "\r\n" straddles 128 char boundary.
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2204 txt = self.TextIOWrapper(self.BytesIO(b"A" * 127 + b"\r\nB"))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2205 reads = ""
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2206 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2207 c = txt.read(128)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2208 if not c:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2209 break
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2210 reads += c
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2211 self.assertEqual(reads, "A"*127+"\nB")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2212
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2213 def test_issue1395_1(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2214 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2215
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2216 # read one char at a time
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2217 reads = ""
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2218 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2219 c = txt.read(1)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2220 if not c:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2221 break
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2222 reads += c
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2223 self.assertEqual(reads, self.normalized)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2224
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2225 def test_issue1395_2(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2226 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2227 txt._CHUNK_SIZE = 4
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2228
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2229 reads = ""
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2230 while True:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2231 c = txt.read(4)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2232 if not c:
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2233 break
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2234 reads += c
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2235 self.assertEqual(reads, self.normalized)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2236
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2237 def test_issue1395_3(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2238 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2239 txt._CHUNK_SIZE = 4
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2240
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2241 reads = txt.read(4)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2242 reads += txt.read(4)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2243 reads += txt.readline()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2244 reads += txt.readline()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2245 reads += txt.readline()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2246 self.assertEqual(reads, self.normalized)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2247
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2248 def test_issue1395_4(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2249 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2250 txt._CHUNK_SIZE = 4
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2251
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2252 reads = txt.read(4)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2253 reads += txt.read()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2254 self.assertEqual(reads, self.normalized)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2255
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2256 def test_issue1395_5(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2257 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2258 txt._CHUNK_SIZE = 4
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2259
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2260 reads = txt.read(4)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2261 pos = txt.tell()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2262 txt.seek(0)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2263 txt.seek(pos)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2264 self.assertEqual(txt.read(4), "BBB\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2265
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2266 def test_issue2282(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2267 buffer = self.BytesIO(self.testdata)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2268 txt = self.TextIOWrapper(buffer, encoding="ascii")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2269
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2270 self.assertEqual(buffer.seekable(), txt.seekable())
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2271
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2272 def test_append_bom(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2273 # The BOM is not written again when appending to a non-empty file
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2274 filename = support.TESTFN
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2275 for charset in ('utf-8-sig', 'utf-16', 'utf-32'):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2276 with self.open(filename, 'w', encoding=charset) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2277 f.write('aaa')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2278 pos = f.tell()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2279 with self.open(filename, 'rb') as f:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2280 self.assertEqual(f.read(), 'aaa'.encode(charset))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2281
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2282 with self.open(filename, 'a', encoding=charset) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2283 f.write('xxx')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2284 with self.open(filename, 'rb') as f:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2285 self.assertEqual(f.read(), 'aaaxxx'.encode(charset))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2286
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2287 def test_seek_bom(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2288 # Same test, but when seeking manually
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2289 filename = support.TESTFN
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2290 for charset in ('utf-8-sig', 'utf-16', 'utf-32'):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2291 with self.open(filename, 'w', encoding=charset) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2292 f.write('aaa')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2293 pos = f.tell()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2294 with self.open(filename, 'r+', encoding=charset) as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2295 f.seek(pos)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2296 f.write('zzz')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2297 f.seek(0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2298 f.write('bbb')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2299 with self.open(filename, 'rb') as f:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2300 self.assertEqual(f.read(), 'bbbzzz'.encode(charset))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2301
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2302 def test_errors_property(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2303 with self.open(support.TESTFN, "w") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2304 self.assertEqual(f.errors, "strict")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2305 with self.open(support.TESTFN, "w", errors="replace") as f:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2306 self.assertEqual(f.errors, "replace")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2307
61046
3a0484200034 Issue #7449, last part (11): fix many tests if thread support is disabled
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60486
diff changeset
2308 @unittest.skipUnless(threading, 'Threading required for this test.')
55756
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2309 def test_threads_write(self):
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2310 # Issue6750: concurrent writes could duplicate data
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2311 event = threading.Event()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2312 with self.open(support.TESTFN, "w", buffering=1) as f:
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2313 def run(n):
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2314 text = "Thread%03d\n" % n
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2315 event.wait()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2316 f.write(text)
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2317 threads = [threading.Thread(target=lambda n=x: run(n))
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2318 for x in range(20)]
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2319 for t in threads:
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2320 t.start()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2321 time.sleep(0.02)
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2322 event.set()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2323 for t in threads:
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2324 t.join()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2325 with self.open(support.TESTFN) as f:
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2326 content = f.read()
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2327 for n in range(20):
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2328 self.assertEqual(content.count("Thread%03d\n" % n), 1)
55756
d4037fb856d2 #6750: TextIOWrapped could duplicate output when several threads write to it.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 55564
diff changeset
2329
61180
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2330 def test_flush_error_on_close(self):
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2331 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2332 def bad_flush():
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2333 raise IOError()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2334 txt.flush = bad_flush
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2335 self.assertRaises(IOError, txt.close) # exception not swallowed
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2336
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2337 def test_multi_close(self):
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2338 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2339 txt.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2340 txt.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2341 txt.close()
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2342 self.assertRaises(ValueError, txt.flush)
9b438bb06d4d Issue #7865: The close() method of :mod:`io` objects should not swallow
Antoine Pitrou <solipsis@pitrou.net>
parents: 61046
diff changeset
2343
67075
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2344 def test_readonly_attributes(self):
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2345 txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2346 buf = self.BytesIO(self.testdata)
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2347 with self.assertRaises((AttributeError, TypeError)):
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2348 txt.buffer = buf
595f258806ef Merged revisions 87427 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66660
diff changeset
2349
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2350 class CTextIOWrapperTest(TextIOWrapperTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2351
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2352 def test_initialization(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2353 r = self.BytesIO(b"\xc3\xa9\n\n")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2354 b = self.BufferedReader(r, 1000)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2355 t = self.TextIOWrapper(b)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2356 self.assertRaises(TypeError, t.__init__, b, newline=42)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2357 self.assertRaises(ValueError, t.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2358 self.assertRaises(ValueError, t.__init__, b, newline='xyzzy')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2359 self.assertRaises(ValueError, t.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2360
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2361 def test_garbage_collection(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2362 # C TextIOWrapper objects are collected, and collecting them flushes
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2363 # all data to disk.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2364 # The Python version has __del__, so it ends in gc.garbage instead.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2365 rawio = io.FileIO(support.TESTFN, "wb")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2366 b = self.BufferedWriter(rawio)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2367 t = self.TextIOWrapper(b, encoding="ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2368 t.write("456def")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2369 t.x = t
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2370 wr = weakref.ref(t)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2371 del t
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2372 support.gc_collect()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
2373 self.assertTrue(wr() is None, wr)
54781
a5f31b30c7c3 Issue #6215: Fixed to use self.open() instead of open() or io.open().
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 54717
diff changeset
2374 with self.open(support.TESTFN, "rb") as f:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2375 self.assertEqual(f.read(), b"456def")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2376
72754
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2377 def test_rwpair_cleared_before_textio(self):
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2378 # Issue 13070: TextIOWrapper's finalization would crash when called
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2379 # after the reference to the underlying BufferedRWPair's writer got
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2380 # cleared by the GC.
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2381 for i in range(1000):
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2382 b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2383 t1 = self.TextIOWrapper(b1, encoding="ascii")
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2384 b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2385 t2 = self.TextIOWrapper(b2, encoding="ascii")
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2386 # circular references
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2387 t1.buddy = t2
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2388 t2.buddy = t1
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2389 support.gc_collect()
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2390
89b9e4bf6f1f Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle
Charles-François Natali <neologix@free.fr>
parents: 71984
diff changeset
2391
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2392 class PyTextIOWrapperTest(TextIOWrapperTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2393 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2394
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2395
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2396 class IncrementalNewlineDecoderTest(unittest.TestCase):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2397
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2398 def check_newline_decoding_utf8(self, decoder):
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2399 # UTF-8 specific tests for a newline decoder
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2400 def _check_decode(b, s, **kwargs):
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2401 # We exercise getstate() / setstate() as well as decode()
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2402 state = decoder.getstate()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2403 self.assertEqual(decoder.decode(b, **kwargs), s)
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2404 decoder.setstate(state)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2405 self.assertEqual(decoder.decode(b, **kwargs), s)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2406
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2407 _check_decode(b'\xe8\xa2\x88', "\u8888")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2408
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2409 _check_decode(b'\xe8', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2410 _check_decode(b'\xa2', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2411 _check_decode(b'\x88', "\u8888")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2412
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2413 _check_decode(b'\xe8', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2414 _check_decode(b'\xa2', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2415 _check_decode(b'\x88', "\u8888")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2416
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2417 _check_decode(b'\xe8', "")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2418 self.assertRaises(UnicodeDecodeError, decoder.decode, b'', final=True)
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2419
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2420 decoder.reset()
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2421 _check_decode(b'\n', "\n")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2422 _check_decode(b'\r', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2423 _check_decode(b'', "\n", final=True)
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2424 _check_decode(b'\r', "\n", final=True)
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2425
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2426 _check_decode(b'\r', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2427 _check_decode(b'a', "\na")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2428
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2429 _check_decode(b'\r\r\n', "\n\n")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2430 _check_decode(b'\r', "")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2431 _check_decode(b'\r', "\n")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2432 _check_decode(b'\na', "\na")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2433
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2434 _check_decode(b'\xe8\xa2\x88\r\n', "\u8888\n")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2435 _check_decode(b'\xe8\xa2\x88', "\u8888")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2436 _check_decode(b'\n', "\n")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2437 _check_decode(b'\xe8\xa2\x88\r', "\u8888")
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2438 _check_decode(b'\n', "\n")
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2439
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2440 def check_newline_decoding(self, decoder, encoding):
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2441 result = []
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2442 if encoding is not None:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2443 encoder = codecs.getincrementalencoder(encoding)()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2444 def _decode_bytewise(s):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2445 # Decode one byte at a time
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2446 for b in encoder.encode(s):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2447 result.append(decoder.decode(b))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2448 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2449 encoder = None
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2450 def _decode_bytewise(s):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2451 # Decode one char at a time
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2452 for c in s:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2453 result.append(decoder.decode(c))
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2454 self.assertEqual(decoder.newlines, None)
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2455 _decode_bytewise("abc\n\r")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2456 self.assertEqual(decoder.newlines, '\n')
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2457 _decode_bytewise("\nabc")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2458 self.assertEqual(decoder.newlines, ('\n', '\r\n'))
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2459 _decode_bytewise("abc\r")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2460 self.assertEqual(decoder.newlines, ('\n', '\r\n'))
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2461 _decode_bytewise("abc")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2462 self.assertEqual(decoder.newlines, ('\r', '\n', '\r\n'))
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2463 _decode_bytewise("abc\r")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2464 self.assertEqual("".join(result), "abc\n\nabcabc\nabcabc")
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2465 decoder.reset()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2466 input = "abc"
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2467 if encoder is not None:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2468 encoder.reset()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2469 input = encoder.encode(input)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2470 self.assertEqual(decoder.decode(input), "abc")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2471 self.assertEqual(decoder.newlines, None)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2472
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2473 def test_newline_decoder(self):
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2474 encodings = (
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2475 # None meaning the IncrementalNewlineDecoder takes unicode input
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2476 # rather than bytes input
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2477 None, 'utf-8', 'latin-1',
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2478 'utf-16', 'utf-16-le', 'utf-16-be',
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2479 'utf-32', 'utf-32-le', 'utf-32-be',
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2480 )
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2481 for enc in encodings:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2482 decoder = enc and codecs.getincrementaldecoder(enc)()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2483 decoder = self.IncrementalNewlineDecoder(decoder, translate=True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2484 self.check_newline_decoding(decoder, enc)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2485 decoder = codecs.getincrementaldecoder("utf-8")()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2486 decoder = self.IncrementalNewlineDecoder(decoder, translate=True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2487 self.check_newline_decoding_utf8(decoder)
50171
d15746abf6c7 Merged revisions 67762 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50008
diff changeset
2488
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2489 def test_newline_bytes(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2490 # Issue 5433: Excessive optimization in IncrementalNewlineDecoder
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2491 def _check(dec):
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2492 self.assertEqual(dec.newlines, None)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2493 self.assertEqual(dec.decode("\u0D00"), "\u0D00")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2494 self.assertEqual(dec.newlines, None)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2495 self.assertEqual(dec.decode("\u0A00"), "\u0A00")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2496 self.assertEqual(dec.newlines, None)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2497 dec = self.IncrementalNewlineDecoder(None, translate=False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2498 _check(dec)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2499 dec = self.IncrementalNewlineDecoder(None, translate=True)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2500 _check(dec)
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
2501
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2502 class CIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2503 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2504
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2505 class PyIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2506 pass
61181
fe3bf399a19c Merged revisions 80720 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58544
diff changeset
2507
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2508
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2509 # XXX Tests for open()
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2510
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2511 class MiscIOTest(unittest.TestCase):
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2512
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2513 def tearDown(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2514 support.unlink(support.TESTFN)
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2515
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2516 def test___all__(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2517 for name in self.io.__all__:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2518 obj = getattr(self.io, name, None)
52701
f390464639fb handle SEEK_ constants in test_io
Benjamin Peterson <benjamin@python.org>
parents: 50956
diff changeset
2519 self.assertTrue(obj is not None, name)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2520 if name == "open":
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2521 continue
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2522 elif "error" in name.lower() or name == "UnsupportedOperation":
52701
f390464639fb handle SEEK_ constants in test_io
Benjamin Peterson <benjamin@python.org>
parents: 50956
diff changeset
2523 self.assertTrue(issubclass(obj, Exception), name)
f390464639fb handle SEEK_ constants in test_io
Benjamin Peterson <benjamin@python.org>
parents: 50956
diff changeset
2524 elif not name.startswith("SEEK_"):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2525 self.assertTrue(issubclass(obj, self.IOBase))
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2526
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2527 def test_attributes(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2528 f = self.open(support.TESTFN, "wb", buffering=0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2529 self.assertEqual(f.mode, "wb")
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2530 f.close()
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2531
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2532 f = self.open(support.TESTFN, "U")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2533 self.assertEqual(f.name, support.TESTFN)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2534 self.assertEqual(f.buffer.name, support.TESTFN)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2535 self.assertEqual(f.buffer.raw.name, support.TESTFN)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2536 self.assertEqual(f.mode, "U")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2537 self.assertEqual(f.buffer.mode, "rb")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2538 self.assertEqual(f.buffer.raw.mode, "rb")
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2539 f.close()
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2540
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2541 f = self.open(support.TESTFN, "w+")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2542 self.assertEqual(f.mode, "w+")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2543 self.assertEqual(f.buffer.mode, "rb+") # Does it really matter?
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2544 self.assertEqual(f.buffer.raw.mode, "rb+")
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2545
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2546 g = self.open(f.fileno(), "wb", closefd=False)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2547 self.assertEqual(g.mode, "wb")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2548 self.assertEqual(g.raw.mode, "wb")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2549 self.assertEqual(g.name, f.fileno())
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65318
diff changeset
2550 self.assertEqual(g.raw.name, f.fileno())
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2551 f.close()
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2552 g.close()
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2553
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2554 def test_io_after_close(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2555 for kwargs in [
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2556 {"mode": "w"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2557 {"mode": "wb"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2558 {"mode": "w", "buffering": 1},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2559 {"mode": "w", "buffering": 2},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2560 {"mode": "wb", "buffering": 0},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2561 {"mode": "r"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2562 {"mode": "rb"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2563 {"mode": "r", "buffering": 1},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2564 {"mode": "r", "buffering": 2},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2565 {"mode": "rb", "buffering": 0},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2566 {"mode": "w+"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2567 {"mode": "w+b"},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2568 {"mode": "w+", "buffering": 1},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2569 {"mode": "w+", "buffering": 2},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2570 {"mode": "w+b", "buffering": 0},
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2571 ]:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2572 f = self.open(support.TESTFN, **kwargs)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2573 f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2574 self.assertRaises(ValueError, f.flush)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2575 self.assertRaises(ValueError, f.fileno)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2576 self.assertRaises(ValueError, f.isatty)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2577 self.assertRaises(ValueError, f.__iter__)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2578 if hasattr(f, "peek"):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2579 self.assertRaises(ValueError, f.peek, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2580 self.assertRaises(ValueError, f.read)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2581 if hasattr(f, "read1"):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2582 self.assertRaises(ValueError, f.read1, 1024)
70384
f2414bb35c96 Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError if
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70060
diff changeset
2583 if hasattr(f, "readall"):
f2414bb35c96 Issue #12175: FileIO.readall() now raises a ValueError instead of an IOError if
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70060
diff changeset
2584 self.assertRaises(ValueError, f.readall)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2585 if hasattr(f, "readinto"):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2586 self.assertRaises(ValueError, f.readinto, bytearray(1024))
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2587 self.assertRaises(ValueError, f.readline)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2588 self.assertRaises(ValueError, f.readlines)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2589 self.assertRaises(ValueError, f.seek, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2590 self.assertRaises(ValueError, f.tell)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2591 self.assertRaises(ValueError, f.truncate)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2592 self.assertRaises(ValueError, f.write,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2593 b"" if "b" in kwargs['mode'] else "")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2594 self.assertRaises(ValueError, f.writelines, [])
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2595 self.assertRaises(ValueError, next, f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2596
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2597 def test_blockingioerror(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2598 # Various BlockingIOError issues
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2599 self.assertRaises(TypeError, self.BlockingIOError)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2600 self.assertRaises(TypeError, self.BlockingIOError, 1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2601 self.assertRaises(TypeError, self.BlockingIOError, 1, 2, 3, 4)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2602 self.assertRaises(TypeError, self.BlockingIOError, 1, "", None)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2603 b = self.BlockingIOError(1, "")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2604 self.assertEqual(b.characters_written, 0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2605 class C(unicode):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2606 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2607 c = C("")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2608 b = self.BlockingIOError(1, c)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2609 c.b = b
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2610 b.c = c
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2611 wr = weakref.ref(c)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2612 del c, b
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2613 support.gc_collect()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54781
diff changeset
2614 self.assertTrue(wr() is None, wr)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2615
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2616 def test_abcs(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2617 # Test the visible base classes are ABCs.
58472
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2618 self.assertIsInstance(self.IOBase, abc.ABCMeta)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2619 self.assertIsInstance(self.RawIOBase, abc.ABCMeta)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2620 self.assertIsInstance(self.BufferedIOBase, abc.ABCMeta)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2621 self.assertIsInstance(self.TextIOBase, abc.ABCMeta)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2622
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2623 def _check_abc_inheritance(self, abcmodule):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2624 with self.open(support.TESTFN, "wb", buffering=0) as f:
58472
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2625 self.assertIsInstance(f, abcmodule.IOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2626 self.assertIsInstance(f, abcmodule.RawIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2627 self.assertNotIsInstance(f, abcmodule.BufferedIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2628 self.assertNotIsInstance(f, abcmodule.TextIOBase)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2629 with self.open(support.TESTFN, "wb") as f:
58472
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2630 self.assertIsInstance(f, abcmodule.IOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2631 self.assertNotIsInstance(f, abcmodule.RawIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2632 self.assertIsInstance(f, abcmodule.BufferedIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2633 self.assertNotIsInstance(f, abcmodule.TextIOBase)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2634 with self.open(support.TESTFN, "w") as f:
58472
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2635 self.assertIsInstance(f, abcmodule.IOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2636 self.assertNotIsInstance(f, abcmodule.RawIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2637 self.assertNotIsInstance(f, abcmodule.BufferedIOBase)
6ffcdafa0118 use assert[Not]IsInstance where appropriate
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58198
diff changeset
2638 self.assertIsInstance(f, abcmodule.TextIOBase)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2639
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2640 def test_abc_inheritance(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2641 # Test implementations inherit from their respective ABCs
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2642 self._check_abc_inheritance(self)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2643
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2644 def test_abc_inheritance_official(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2645 # Test implementations inherit from the official ABCs of the
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2646 # baseline "io" module.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2647 self._check_abc_inheritance(io)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2648
73667
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2649 @unittest.skipUnless(fcntl, 'fcntl required for this test')
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2650 def test_nonblock_pipe_write_bigbuf(self):
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2651 self._test_nonblock_pipe_write(16*1024)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2652
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2653 @unittest.skipUnless(fcntl, 'fcntl required for this test')
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2654 def test_nonblock_pipe_write_smallbuf(self):
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2655 self._test_nonblock_pipe_write(1024)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2656
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2657 def _set_non_blocking(self, fd):
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2658 flags = fcntl.fcntl(fd, fcntl.F_GETFL)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2659 self.assertNotEqual(flags, -1)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2660 res = fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2661 self.assertEqual(res, 0)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2662
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2663 def _test_nonblock_pipe_write(self, bufsize):
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2664 sent = []
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2665 received = []
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2666 r, w = os.pipe()
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2667 self._set_non_blocking(r)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2668 self._set_non_blocking(w)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2669
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2670 # To exercise all code paths in the C implementation we need
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2671 # to play with buffer sizes. For instance, if we choose a
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2672 # buffer size less than or equal to _PIPE_BUF (4096 on Linux)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2673 # then we will never get a partial write of the buffer.
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2674 rf = self.open(r, mode='rb', closefd=True, buffering=bufsize)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2675 wf = self.open(w, mode='wb', closefd=True, buffering=bufsize)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2676
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2677 with rf, wf:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2678 for N in 9999, 73, 7574:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2679 try:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2680 i = 0
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2681 while True:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2682 msg = bytes([i % 26 + 97]) * N
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2683 sent.append(msg)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2684 wf.write(msg)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2685 i += 1
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2686
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2687 except self.BlockingIOError as e:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2688 self.assertEqual(e.args[0], errno.EAGAIN)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2689 sent[-1] = sent[-1][:e.characters_written]
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2690 received.append(rf.read())
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2691 msg = b'BLOCKED'
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2692 wf.write(msg)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2693 sent.append(msg)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2694
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2695 while True:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2696 try:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2697 wf.flush()
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2698 break
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2699 except self.BlockingIOError as e:
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2700 self.assertEqual(e.args[0], errno.EAGAIN)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2701 self.assertEqual(e.characters_written, 0)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2702 received.append(rf.read())
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2703
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2704 received += iter(rf.read, None)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2705
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2706 sent, received = b''.join(sent), b''.join(received)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2707 self.assertTrue(sent == received)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2708 self.assertTrue(wf.closed)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2709 self.assertTrue(rf.closed)
e84e17643eeb Issue #13322: Fix BufferedWriter.write() to ensure that BlockingIOError is
Antoine Pitrou <solipsis@pitrou.net>
parents: 72754
diff changeset
2710
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2711 class CMiscIOTest(MiscIOTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2712 io = io
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2713
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2714 class PyMiscIOTest(MiscIOTest):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2715 io = pyio
49779
f41cb206d061 backport r67300
Benjamin Peterson <benjamin@python.org>
parents: 49677
diff changeset
2716
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2717
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2718 @unittest.skipIf(os.name == 'nt', 'POSIX signals required for this test.')
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2719 class SignalsTest(unittest.TestCase):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2720
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2721 def setUp(self):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2722 self.oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2723
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2724 def tearDown(self):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2725 signal.signal(signal.SIGALRM, self.oldalrm)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2726
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2727 def alarm_interrupt(self, sig, frame):
64706
a59ae9389131 Silence warning about 1/0
Florent Xicluna <florent.xicluna@gmail.com>
parents: 64209
diff changeset
2728 1 // 0
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2729
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2730 @unittest.skipUnless(threading, 'Threading required for this test.')
71188
a624b86264a4 Issue #12429: Skip interrupted write tests on FreeBSD <= 7
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70388
diff changeset
2731 @unittest.skipIf(sys.platform in ('freebsd5', 'freebsd6', 'freebsd7'),
a624b86264a4 Issue #12429: Skip interrupted write tests on FreeBSD <= 7
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70388
diff changeset
2732 'issue #12429: skip test on FreeBSD <= 7')
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2733 def check_interrupted_write(self, item, bytes, **fdopen_kwargs):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2734 """Check that a partial write, when it gets interrupted, properly
68028
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2735 invokes the signal handler, and bubbles up the exception raised
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2736 in the latter."""
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2737 read_results = []
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2738 def _read():
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2739 s = os.read(r, 1)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2740 read_results.append(s)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2741 t = threading.Thread(target=_read)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2742 t.daemon = True
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2743 r, w = os.pipe()
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2744 try:
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2745 wio = self.io.open(w, **fdopen_kwargs)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2746 t.start()
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2747 signal.alarm(1)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2748 # Fill the pipe enough that the write will be blocking.
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2749 # It will be interrupted by the timer armed above. Since the
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2750 # other thread has read one byte, the low-level write will
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2751 # return with a successful (partial) result rather than an EINTR.
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2752 # The buffered IO layer must check for pending signal
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2753 # handlers, which in this case will invoke alarm_interrupt().
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2754 self.assertRaises(ZeroDivisionError,
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2755 wio.write, item * (1024 * 1024))
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2756 t.join()
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2757 # We got one byte, get another one and check that it isn't a
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2758 # repeat of the first one.
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2759 read_results.append(os.read(r, 1))
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2760 self.assertEqual(read_results, [bytes[0:1], bytes[1:2]])
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2761 finally:
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2762 os.close(w)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2763 os.close(r)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2764 # This is deliberate. If we didn't close the file descriptor
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2765 # before closing wio, wio would try to flush its internal
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2766 # buffer, and block again.
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2767 try:
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2768 wio.close()
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2769 except IOError as e:
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2770 if e.errno != errno.EBADF:
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2771 raise
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2772
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2773 def test_interrupted_write_unbuffered(self):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2774 self.check_interrupted_write(b"xy", b"xy", mode="wb", buffering=0)
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2775
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2776 def test_interrupted_write_buffered(self):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2777 self.check_interrupted_write(b"xy", b"xy", mode="wb")
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2778
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2779 def test_interrupted_write_text(self):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2780 self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii")
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2781
66660
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2782 def check_reentrant_write(self, data, **fdopen_kwargs):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2783 def on_alarm(*args):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2784 # Will be called reentrantly from the same thread
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2785 wio.write(data)
71227
9864e5d16407 test_io: make quiet the DeprecationWarning('classic int division')
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71188
diff changeset
2786 1//0
66660
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2787 signal.signal(signal.SIGALRM, on_alarm)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2788 r, w = os.pipe()
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2789 wio = self.io.open(w, **fdopen_kwargs)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2790 try:
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2791 signal.alarm(1)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2792 # Either the reentrant call to wio.write() fails with RuntimeError,
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2793 # or the signal handler raises ZeroDivisionError.
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2794 with self.assertRaises((ZeroDivisionError, RuntimeError)) as cm:
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2795 while 1:
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2796 for i in range(100):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2797 wio.write(data)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2798 wio.flush()
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2799 # Make sure the buffer doesn't fill up and block further writes
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2800 os.read(r, len(data) * 100)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2801 exc = cm.exception
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2802 if isinstance(exc, RuntimeError):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2803 self.assertTrue(str(exc).startswith("reentrant call"), str(exc))
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2804 finally:
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2805 wio.close()
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2806 os.close(r)
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2807
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2808 def test_reentrant_write_buffered(self):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2809 self.check_reentrant_write(b"xy", mode="wb")
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2810
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2811 def test_reentrant_write_text(self):
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2812 self.check_reentrant_write("xy", mode="w", encoding="ascii")
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2813
68028
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2814 def check_interrupted_read_retry(self, decode, **fdopen_kwargs):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2815 """Check that a buffered read, when it gets interrupted (either
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2816 returning a partial result or EINTR), properly invokes the signal
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2817 handler and retries if the latter returned successfully."""
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2818 r, w = os.pipe()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2819 fdopen_kwargs["closefd"] = False
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2820 def alarm_handler(sig, frame):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2821 os.write(w, b"bar")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2822 signal.signal(signal.SIGALRM, alarm_handler)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2823 try:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2824 rio = self.io.open(r, **fdopen_kwargs)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2825 os.write(w, b"foo")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2826 signal.alarm(1)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2827 # Expected behaviour:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2828 # - first raw read() returns partial b"foo"
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2829 # - second raw read() returns EINTR
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2830 # - third raw read() returns b"bar"
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2831 self.assertEqual(decode(rio.read(6)), "foobar")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2832 finally:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2833 rio.close()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2834 os.close(w)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2835 os.close(r)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2836
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2837 def test_interrupterd_read_retry_buffered(self):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2838 self.check_interrupted_read_retry(lambda x: x.decode('latin1'),
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2839 mode="rb")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2840
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2841 def test_interrupterd_read_retry_text(self):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2842 self.check_interrupted_read_retry(lambda x: x,
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2843 mode="r")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2844
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2845 @unittest.skipUnless(threading, 'Threading required for this test.')
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2846 def check_interrupted_write_retry(self, item, **fdopen_kwargs):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2847 """Check that a buffered write, when it gets interrupted (either
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2848 returning a partial result or EINTR), properly invokes the signal
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2849 handler and retries if the latter returned successfully."""
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2850 select = support.import_module("select")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2851 # A quantity that exceeds the buffer size of an anonymous pipe's
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2852 # write end.
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2853 N = 1024 * 1024
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2854 r, w = os.pipe()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2855 fdopen_kwargs["closefd"] = False
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2856 # We need a separate thread to read from the pipe and allow the
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2857 # write() to finish. This thread is started after the SIGALRM is
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2858 # received (forcing a first EINTR in write()).
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2859 read_results = []
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2860 write_finished = False
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2861 def _read():
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2862 while not write_finished:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2863 while r in select.select([r], [], [], 1.0)[0]:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2864 s = os.read(r, 1024)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2865 read_results.append(s)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2866 t = threading.Thread(target=_read)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2867 t.daemon = True
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2868 def alarm1(sig, frame):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2869 signal.signal(signal.SIGALRM, alarm2)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2870 signal.alarm(1)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2871 def alarm2(sig, frame):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2872 t.start()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2873 signal.signal(signal.SIGALRM, alarm1)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2874 try:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2875 wio = self.io.open(w, **fdopen_kwargs)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2876 signal.alarm(1)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2877 # Expected behaviour:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2878 # - first raw write() is partial (because of the limited pipe buffer
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2879 # and the first alarm)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2880 # - second raw write() returns EINTR (because of the second alarm)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2881 # - subsequent write()s are successful (either partial or complete)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2882 self.assertEqual(N, wio.write(item * N))
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2883 wio.flush()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2884 write_finished = True
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2885 t.join()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2886 self.assertEqual(N, sum(len(x) for x in read_results))
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2887 finally:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2888 write_finished = True
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2889 os.close(w)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2890 os.close(r)
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2891 # This is deliberate. If we didn't close the file descriptor
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2892 # before closing wio, wio would try to flush its internal
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2893 # buffer, and could block (in case of failure).
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2894 try:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2895 wio.close()
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2896 except IOError as e:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2897 if e.errno != errno.EBADF:
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2898 raise
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2899
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2900 def test_interrupterd_write_retry_buffered(self):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2901 self.check_interrupted_write_retry(b"x", mode="wb")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2902
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2903 def test_interrupterd_write_retry_text(self):
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2904 self.check_interrupted_write_retry("x", mode="w", encoding="latin1")
675b48c4c88a Merged revisions 88610 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67075
diff changeset
2905
66660
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2906
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2907 class CSignalsTest(SignalsTest):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2908 io = io
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2909
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2910 class PySignalsTest(SignalsTest):
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2911 io = pyio
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2912
66660
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2913 # Handling reentrancy issues would slow down _pyio even more, so the
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2914 # tests are disabled.
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2915 test_reentrant_write_buffered = None
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2916 test_reentrant_write_text = None
5a723b7aefb7 Merged revisions 86981,86984 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66348
diff changeset
2917
50002
5ef8b5a74efa Merged revisions 67245,67277,67289,67295,67301-67303,67307,67330,67332,67336,67355,67359,67362,67364,67367-67368,67370 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
2918
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2919 def test_main():
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2920 tests = (CIOTest, PyIOTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2921 CBufferedReaderTest, PyBufferedReaderTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2922 CBufferedWriterTest, PyBufferedWriterTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2923 CBufferedRWPairTest, PyBufferedRWPairTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2924 CBufferedRandomTest, PyBufferedRandomTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2925 StatefulIncrementalDecoderTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2926 CIncrementalNewlineDecoderTest, PyIncrementalNewlineDecoderTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2927 CTextIOWrapperTest, PyTextIOWrapperTest,
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2928 CMiscIOTest, PyMiscIOTest,
64209
dfd0229748ef Merged revisions 84239 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63921
diff changeset
2929 CSignalsTest, PySignalsTest,
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2930 )
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2931
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2932 # Put the namespaces of the IO module we are testing and some useful mock
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2933 # classes in the __dict__ of each test.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2934 mocks = (MockRawIO, MisbehavedRawIO, MockFileIO, CloseFailureIO,
64750
2b9dea2a2fff Merged revisions 84814 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64706
diff changeset
2935 MockNonBlockWriterIO, MockRawIOWithoutRead)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2936 all_members = io.__all__ + ["IncrementalNewlineDecoder"]
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2937 c_io_ns = dict((name, getattr(io, name)) for name in all_members)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2938 py_io_ns = dict((name, getattr(pyio, name)) for name in all_members)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2939 globs = globals()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2940 c_io_ns.update((x.__name__, globs["C" + x.__name__]) for x in mocks)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2941 py_io_ns.update((x.__name__, globs["Py" + x.__name__]) for x in mocks)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2942 # Avoid turning open into a bound method.
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2943 py_io_ns["open"] = pyio.OpenWrapper
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2944 for test in tests:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2945 if test.__name__.startswith("C"):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2946 for name, obj in c_io_ns.items():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2947 setattr(test, name, obj)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2948 elif test.__name__.startswith("Py"):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2949 for name, obj in py_io_ns.items():
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2950 setattr(test, name, obj)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2951
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2952 support.run_unittest(*tests)
46107
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2953
5341b30b1812 Merged revisions 61750,61752,61754,61756,61760,61763,61768,61772,61775,61805,61809,61812,61819,61917,61920,61930,61933-61934 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff changeset
2954 if __name__ == "__main__":
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 52701
diff changeset
2955 test_main()