1ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot"""Unit tests for the io module."""
2ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Tests of io are scattered over the test suite:
4ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_bufio - tests file buffering
5ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_memoryio - tests BytesIO and StringIO
6ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_fileio - tests FileIO
7ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_file - tests the file interface
8ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_io - tests everything else in the io module
9ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_univnewlines - tests universal newline support
10ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# * test_largefile - tests operations on a file greater than 2**32 bytes
11ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#     (only enabled with -ulargefile)
12ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
13ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot################################################################################
14ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# ATTENTION TEST WRITERS!!!
15ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot################################################################################
16ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# When writing tests for io, it's important to test both the C and Python
17ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# implementations. This is usually done by writing a base test that refers to
18ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# the type it is testing as a attribute. Then it provides custom subclasses to
19ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# test both implementations. This file has lots of examples.
20ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot################################################################################
21ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
22ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom __future__ import print_function
23ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom __future__ import unicode_literals
24ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
25ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport os
26ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport sys
27ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport time
28ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport array
29ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport random
30ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport unittest
31ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport weakref
32ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport abc
33ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport signal
34ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport errno
35ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom itertools import cycle, count
36ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom collections import deque
37ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom UserList import UserList
38ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotfrom test import test_support as support
39ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport contextlib
40ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
41ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport codecs
42ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport io  # C implementation of io
43ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotimport _pyio as pyio # Python implementation of io
44ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robottry:
45ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    import threading
46ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotexcept ImportError:
47ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    threading = None
48ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robottry:
49ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    import fcntl
50ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotexcept ImportError:
51ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    fcntl = None
52ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
53ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot__metaclass__ = type
54ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotbytes = support.py3k_bytes
55ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
56ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef _default_chunk_size():
57ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """Get the default TextIOWrapper chunk size"""
58ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    with io.open(__file__, "r", encoding="latin1") as f:
59ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return f._CHUNK_SIZE
60ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
61ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
62ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MockRawIOWithoutRead:
63ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """A RawIO implementation without read(), so as to exercise the default
64ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    RawIO.read() which calls readinto()."""
65ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
66ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, read_stack=()):
67ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._read_stack = list(read_stack)
68ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._write_stack = []
69ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._reads = 0
70ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._extraneous_reads = 0
71ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
72ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def write(self, b):
73ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._write_stack.append(bytes(b))
74ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return len(b)
75ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
76ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def writable(self):
77ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
78ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
79ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def fileno(self):
80ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 42
81ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
82ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def readable(self):
83ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
84ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
85ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def seekable(self):
86ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
87ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
88ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def seek(self, pos, whence):
89ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 0   # wrong but we gotta return something
90ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
91ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tell(self):
92ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return 0   # same comment as above
93ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
94ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def readinto(self, buf):
95ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._reads += 1
96ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        max_len = len(buf)
97ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
98ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            data = self._read_stack[0]
99ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        except IndexError:
100ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self._extraneous_reads += 1
101ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return 0
102ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if data is None:
103ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            del self._read_stack[0]
104ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return None
105ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        n = len(data)
106ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if len(data) <= max_len:
107ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            del self._read_stack[0]
108ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf[:n] = data
109ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return n
110ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
111ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf[:] = data[:max_len]
112ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self._read_stack[0] = data[max_len:]
113ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return max_len
114ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
115ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def truncate(self, pos=None):
116ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return pos
117ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
118ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMockRawIOWithoutRead(MockRawIOWithoutRead, io.RawIOBase):
119ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
120ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
121ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMockRawIOWithoutRead(MockRawIOWithoutRead, pyio.RawIOBase):
122ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
123ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
124ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
125ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MockRawIO(MockRawIOWithoutRead):
126ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
127ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def read(self, n=None):
128ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._reads += 1
129ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
130ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self._read_stack.pop(0)
131ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        except:
132ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self._extraneous_reads += 1
133ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return b""
134ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
135ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMockRawIO(MockRawIO, io.RawIOBase):
136ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
137ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
138ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMockRawIO(MockRawIO, pyio.RawIOBase):
139ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
140ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
141ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
142ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MisbehavedRawIO(MockRawIO):
143ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def write(self, b):
144ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return MockRawIO.write(self, b) * 2
145ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
146ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def read(self, n=None):
147ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return MockRawIO.read(self, n) * 2
148ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
149ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def seek(self, pos, whence):
150ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return -123
151ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
152ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tell(self):
153ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return -456
154ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
155ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def readinto(self, buf):
156ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        MockRawIO.readinto(self, buf)
157ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return len(buf) * 5
158ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
159ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMisbehavedRawIO(MisbehavedRawIO, io.RawIOBase):
160ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
161ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
162ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMisbehavedRawIO(MisbehavedRawIO, pyio.RawIOBase):
163ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
164ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
165ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
166ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CloseFailureIO(MockRawIO):
167ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    closed = 0
168ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
169ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def close(self):
170ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not self.closed:
171ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.closed = 1
172ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError
173ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
174ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CCloseFailureIO(CloseFailureIO, io.RawIOBase):
175ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
176ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
177ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyCloseFailureIO(CloseFailureIO, pyio.RawIOBase):
178ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
179ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
180ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
181ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MockFileIO:
182ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
183ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, data):
184ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.read_history = []
185ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        super(MockFileIO, self).__init__(data)
186ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
187ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def read(self, n=None):
188ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        res = super(MockFileIO, self).read(n)
189ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.read_history.append(None if res is None else len(res))
190ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return res
191ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
192ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def readinto(self, b):
193ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        res = super(MockFileIO, self).readinto(b)
194ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.read_history.append(res)
195ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return res
196ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
197ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMockFileIO(MockFileIO, io.BytesIO):
198ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
199ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
200ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMockFileIO(MockFileIO, pyio.BytesIO):
201ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
202ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
203ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
204ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MockNonBlockWriterIO:
205ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
206ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self):
207ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._write_stack = []
208ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._blocker_char = None
209ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
210ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def pop_written(self):
211ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        s = b"".join(self._write_stack)
212ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._write_stack[:] = []
213ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return s
214ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
215ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def block_on(self, char):
216ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        """Block when a given char is encountered."""
217ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._blocker_char = char
218ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
219ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def readable(self):
220ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
221ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
222ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def seekable(self):
223ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
224ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
225ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def writable(self):
226ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return True
227ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
228ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def write(self, b):
229ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = bytes(b)
230ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        n = -1
231ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self._blocker_char:
232ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
233ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                n = b.index(self._blocker_char)
234ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except ValueError:
235ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pass
236ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
237ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if n > 0:
238ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    # write data up to the first blocker
239ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self._write_stack.append(b[:n])
240ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    return n
241ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
242ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    # cancel blocker and indicate would block
243ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self._blocker_char = None
244ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    return None
245ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._write_stack.append(b)
246ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return len(b)
247ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
248ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMockNonBlockWriterIO(MockNonBlockWriterIO, io.RawIOBase):
249ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    BlockingIOError = io.BlockingIOError
250ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
251ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMockNonBlockWriterIO(MockNonBlockWriterIO, pyio.RawIOBase):
252ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    BlockingIOError = pyio.BlockingIOError
253ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
254ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
255ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass IOTest(unittest.TestCase):
256ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
257ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def setUp(self):
258ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.unlink(support.TESTFN)
259ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
260ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tearDown(self):
261ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.unlink(support.TESTFN)
262ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
263ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def write_ops(self, f):
264ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(b"blah."), 5)
265ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.truncate(0)
266ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 5)
267ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.seek(0)
268ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
269ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(b"blah."), 5)
270ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(0), 0)
271ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(b"Hello."), 6)
272ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 6)
273ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-1, 1), 5)
274ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 5)
275ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(bytearray(b" world\n\n\n")), 9)
276ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(0), 0)
277ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(b"h"), 1)
278ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-1, 2), 13)
279ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 13)
280ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
281ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.truncate(12), 12)
282ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 13)
283ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, f.seek, 0.0)
284ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
285ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def read_ops(self, f, buffered=False):
286ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = f.read(5)
287ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(data, b"hello")
288ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = bytearray(data)
289ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readinto(data), 5)
290ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(data, b" worl")
291ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readinto(data), 2)
292ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(len(data), 5)
293ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(data[:2], b"d\n")
294ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(0), 0)
295ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(20), b"hello world\n")
296ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(1), b"")
297ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readinto(bytearray(b"x")), 0)
298ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-6, 2), 6)
299ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(5), b"world")
300ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(0), b"")
301ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readinto(bytearray()), 0)
302ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-6, 1), 5)
303ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(5), b" worl")
304ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), 10)
305ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, f.seek, 0.0)
306ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if buffered:
307ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.seek(0)
308ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"hello world\n")
309ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.seek(6)
310ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"world\n")
311ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"")
312ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
313ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    LARGE = 2**31
314ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
315ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def large_file_ops(self, f):
316ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        assert f.readable()
317ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        assert f.writable()
318ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(self.LARGE), self.LARGE)
319ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), self.LARGE)
320ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.write(b"xxx"), 3)
321ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), self.LARGE + 3)
322ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-1, 1), self.LARGE + 2)
323ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.truncate(), self.LARGE + 2)
324ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), self.LARGE + 2)
325ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(0, 2), self.LARGE + 2)
326ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.truncate(self.LARGE + 1), self.LARGE + 1)
327ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), self.LARGE + 2)
328ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(0, 2), self.LARGE + 1)
329ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.seek(-1, 2), self.LARGE)
330ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.read(2), b"x")
331ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
332ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_invalid_operations(self):
333ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Try writing on a file opened in read mode and vice-versa.
334ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for mode in ("w", "wb"):
335ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, mode) as fp:
336ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(IOError, fp.read)
337ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(IOError, fp.readline)
338ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as fp:
339ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(IOError, fp.write, b"blah")
340ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(IOError, fp.writelines, [b"blah\n"])
341ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "r") as fp:
342ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(IOError, fp.write, "blah")
343ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(IOError, fp.writelines, ["blah\n"])
344ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
345ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_raw_file_io(self):
346ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb", buffering=0) as f:
347ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readable(), False)
348ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.writable(), True)
349ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.seekable(), True)
350ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.write_ops(f)
351ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb", buffering=0) as f:
352ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readable(), True)
353ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.writable(), False)
354ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.seekable(), True)
355ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.read_ops(f)
356ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
357ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_buffered_file_io(self):
358ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
359ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readable(), False)
360ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.writable(), True)
361ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.seekable(), True)
362ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.write_ops(f)
363ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
364ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readable(), True)
365ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.writable(), False)
366ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.seekable(), True)
367ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.read_ops(f, True)
368ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
369ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readline(self):
370ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
371ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(b"abc\ndef\nxyzzy\nfoo\x00bar\nanother line")
372ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
373ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(), b"abc\n")
374ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(10), b"def\n")
375ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(2), b"xy")
376ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(4), b"zzy\n")
377ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(), b"foo\x00bar\n")
378ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.readline(None), b"another line")
379ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(TypeError, f.readline, 5.3)
380ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "r") as f:
381ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(TypeError, f.readline, 5.3)
382ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
383ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_raw_bytes_io(self):
384ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.BytesIO()
385ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.write_ops(f)
386ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = f.getvalue()
387ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(data, b"hello world\n")
388ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.BytesIO(data)
389ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.read_ops(f, True)
390ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
391ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_large_file_ops(self):
392ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # On Windows and Mac OSX this test comsumes large resources; It takes
393ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # a long time to build the >2GB file and takes >2GB of disk space
394ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # therefore the resource must be enabled to run this test.
395ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.platform[:3] == 'win' or sys.platform == 'darwin':
396ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not support.is_resource_enabled("largefile"):
397ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                print("\nTesting large file ops skipped on %s." % sys.platform,
398ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                      file=sys.stderr)
399ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                print("It requires %d bytes and a long time." % self.LARGE,
400ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                      file=sys.stderr)
401ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                print("Use 'regrtest.py -u largefile test_io' to run it.",
402ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                      file=sys.stderr)
403ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return
404ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w+b", 0) as f:
405ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.large_file_ops(f)
406ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w+b") as f:
407ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.large_file_ops(f)
408ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
409ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_with_open(self):
410ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for bufsize in (0, 1, 100):
411ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = None
412ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, "wb", bufsize) as f:
413ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b"xxx")
414ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.closed, True)
415ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = None
416ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
417ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                with self.open(support.TESTFN, "wb", bufsize) as f:
418ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    1 // 0
419ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except ZeroDivisionError:
420ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.closed, True)
421ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else:
422ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.fail("1 // 0 didn't raise an exception")
423ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
424ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # issue 5008
425ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_append_mode_tell(self):
426ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
427ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(b"xxx")
428ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "ab", buffering=0) as f:
429ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.tell(), 3)
430ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "ab") as f:
431ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.tell(), 3)
432ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "a") as f:
433ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(f.tell() > 0)
434ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
435ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_destructor(self):
436ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        record = []
437ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyFileIO(self.FileIO):
438ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __del__(self):
439ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(1)
440ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
441ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f = super(MyFileIO, self).__del__
442ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except AttributeError:
443ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    pass
444ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
445ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f()
446ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
447ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(2)
448ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyFileIO, self).close()
449ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def flush(self):
450ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(3)
451ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyFileIO, self).flush()
452ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = MyFileIO(support.TESTFN, "wb")
453ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write(b"xxx")
454ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del f
455ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
456ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(record, [1, 2, 3])
457ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
458ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"xxx")
459ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
460ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def _check_base_destructor(self, base):
461ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        record = []
462ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyIO(base):
463ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __init__(self):
464ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # This exercises the availability of attributes on object
465ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # destruction.
466ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # (in the C version, close() is called by the tp_dealloc
467ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # function, not by __del__)
468ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.on_del = 1
469ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.on_close = 2
470ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.on_flush = 3
471ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __del__(self):
472ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(self.on_del)
473ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
474ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f = super(MyIO, self).__del__
475ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except AttributeError:
476ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    pass
477ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
478ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f()
479ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
480ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(self.on_close)
481ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyIO, self).close()
482ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def flush(self):
483ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(self.on_flush)
484ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyIO, self).flush()
485ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = MyIO()
486ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del f
487ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
488ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(record, [1, 2, 3])
489ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
490ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_IOBase_destructor(self):
491ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_base_destructor(self.IOBase)
492ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
493ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_RawIOBase_destructor(self):
494ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_base_destructor(self.RawIOBase)
495ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
496ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_BufferedIOBase_destructor(self):
497ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_base_destructor(self.BufferedIOBase)
498ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
499ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_TextIOBase_destructor(self):
500ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_base_destructor(self.TextIOBase)
501ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
502ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_close_flushes(self):
503ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
504ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(b"xxx")
505ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
506ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"xxx")
507ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
508ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_array_writes(self):
509ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        a = array.array(b'i', range(10))
510ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        n = len(a.tostring())
511ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb", 0) as f:
512ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.write(a), n)
513ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
514ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.write(a), n)
515ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
516ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_closefd(self):
517ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, self.open, support.TESTFN, 'w',
518ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                          closefd=False)
519ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
520ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_closed(self):
521ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w") as f:
522ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write("egg\n")
523ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "r") as f:
524ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            file = self.open(f.fileno(), "r", closefd=False)
525ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(file.read(), "egg\n")
526ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            file.seek(0)
527ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            file.close()
528ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, file.read)
529ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
530ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_no_closefd_with_filename(self):
531ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # can't use closefd in combination with a file name
532ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, self.open, support.TESTFN, "r", closefd=False)
533ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
534ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_closefd_attr(self):
535ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
536ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(b"egg\n")
537ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "r") as f:
538ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.buffer.raw.closefd, True)
539ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            file = self.open(f.fileno(), "r", closefd=False)
540ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(file.buffer.raw.closefd, False)
541ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
542ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_garbage_collection(self):
543ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # FileIO objects are collected, and collecting them flushes
544ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # all data to disk.
545ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.FileIO(support.TESTFN, "wb")
546ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write(b"abcxxx")
547ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.f = f
548ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(f)
549ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del f
550ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
551ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
552ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
553ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"abcxxx")
554ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
555ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_unbounded_file(self):
556ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #1174606: reading from an unbounded stream such as /dev/zero.
557ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        zero = "/dev/zero"
558ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if not os.path.exists(zero):
559ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.skipTest("{0} does not exist".format(zero))
560ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.maxsize > 0x7FFFFFFF:
561ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.skipTest("test can only run in a 32-bit address space")
562ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if support.real_max_memuse < support._2G:
563ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.skipTest("test requires at least 2GB of memory")
564ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(zero, "rb", buffering=0) as f:
565ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(OverflowError, f.read)
566ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(zero, "rb") as f:
567ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(OverflowError, f.read)
568ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(zero, "r") as f:
569ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(OverflowError, f.read)
570ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
571ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_error_on_close(self):
572ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "wb", buffering=0)
573ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_flush():
574ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError()
575ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.flush = bad_flush
576ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, f.close) # exception not swallowed
577ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(f.closed)
578ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
579ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_multi_close(self):
580ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "wb", buffering=0)
581ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
582ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
583ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
584ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, f.flush)
585ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
586ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_RawIOBase_read(self):
587ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Exercise the default RawIOBase.read() implementation (which calls
588ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # readinto() internally).
589ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIOWithoutRead((b"abc", b"d", None, b"efg", None))
590ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"ab")
591ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"c")
592ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"d")
593ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), None)
594ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"ef")
595ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"g")
596ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), None)
597ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio.read(2), b"")
598ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
599ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_fileio_closefd(self):
600ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #4841
601ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(__file__, 'rb') as f1, \
602ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             self.open(__file__, 'rb') as f2:
603ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            fileio = self.FileIO(f1.fileno(), closefd=False)
604ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # .__init__() must not close f1
605ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            fileio.__init__(f2.fileno(), closefd=False)
606ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f1.readline()
607ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # .close() must not close f2
608ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            fileio.close()
609ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f2.readline()
610ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
611ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
612ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CIOTest(IOTest):
613ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
614ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_IOBase_finalize(self):
615ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #12149: segmentation fault on _PyIOBase_finalize when both a
616ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # class which inherits IOBase and an object of this class are caught
617ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # in a reference cycle and close() is already in the method cache.
618ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyIO(self.IOBase):
619ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
620ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pass
621ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
622ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # create an instance to populate the method cache
623ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        MyIO()
624ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        obj = MyIO()
625ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        obj.obj = obj
626ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(obj)
627ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del MyIO
628ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del obj
629ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
630ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
631ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
632ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyIOTest(IOTest):
633ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    test_array_writes = unittest.skip(
634ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        "len(array.array) returns number of elements rather than bytelength"
635ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    )(IOTest.test_array_writes)
636ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
637ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
638ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CommonBufferedTests:
639ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Tests common to BufferedReader, BufferedWriter and BufferedRandom
640ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
641ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_detach(self):
642ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
643ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.tp(raw)
644ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIs(buf.detach(), raw)
645ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, buf.detach)
646ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
647ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_fileno(self):
648ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
649ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
650ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
651ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(42, bufio.fileno())
652ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
653ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_no_fileno(self):
654ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # XXX will we always have fileno() function? If so, kill
655ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # this test. Else, write it.
656ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pass
657ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
658ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_invalid_args(self):
659ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
660ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
661ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Invalid whence
662ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.seek, 0, -1)
663ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.seek, 0, 3)
664ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
665ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_override_destructor(self):
666ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        tp = self.tp
667ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        record = []
668ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyBufferedIO(tp):
669ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __del__(self):
670ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(1)
671ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
672ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f = super(MyBufferedIO, self).__del__
673ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except AttributeError:
674ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    pass
675ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
676ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f()
677ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
678ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(2)
679ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyBufferedIO, self).close()
680ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def flush(self):
681ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(3)
682ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyBufferedIO, self).flush()
683ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
684ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = MyBufferedIO(rawio)
685ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writable = bufio.writable()
686ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del bufio
687ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
688ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if writable:
689ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(record, [1, 2, 3])
690ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
691ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(record, [1, 2])
692ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
693ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_context_manager(self):
694ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test usability as a context manager
695ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
696ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
697ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _with():
698ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with bufio:
699ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pass
700ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _with()
701ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # bufio should now be closed, and using it a second time should raise
702ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # a ValueError.
703ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, _with)
704ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
705ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_error_through_destructor(self):
706ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test that the exception state is not modified by a destructor,
707ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # even if close() fails.
708ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.CloseFailureIO()
709ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def f():
710ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(rawio).xyzzy
711ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with support.captured_output("stderr") as s:
712ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(AttributeError, f)
713ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        s = s.getvalue().strip()
714ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if s:
715ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # The destructor *may* have printed an unraisable error, check it
716ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(len(s.splitlines()), 1)
717ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(s.startswith("Exception IOError: "), s)
718ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(s.endswith(" ignored"), s)
719ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
720ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_repr(self):
721ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
722ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.tp(raw)
723ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        clsname = "%s.%s" % (self.tp.__module__, self.tp.__name__)
724ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(b), "<%s>" % clsname)
725ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.name = "dummy"
726ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(b), "<%s name=u'dummy'>" % clsname)
727ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.name = b"dummy"
728ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(b), "<%s name='dummy'>" % clsname)
729ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
730ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_error_on_close(self):
731ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
732ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_flush():
733ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError()
734ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.flush = bad_flush
735ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.tp(raw)
736ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, b.close) # exception not swallowed
737ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(b.closed)
738ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
739ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_close_error_on_close(self):
740ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
741ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_flush():
742ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError('flush')
743ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_close():
744ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError('close')
745ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.close = bad_close
746ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.tp(raw)
747ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.flush = bad_flush
748ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaises(IOError) as err: # exception not swallowed
749ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b.close()
750ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(err.exception.args, ('close',))
751ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(b.closed)
752ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
753ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_multi_close(self):
754ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
755ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.tp(raw)
756ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.close()
757ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.close()
758ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.close()
759ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, b.flush)
760ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
761ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readonly_attributes(self):
762ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
763ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.tp(raw)
764ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        x = self.MockRawIO()
765ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaises((AttributeError, TypeError)):
766ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf.raw = x
767ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
768ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
769ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass SizeofTest:
770ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
771ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @support.cpython_only
772ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_sizeof(self):
773ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufsize1 = 4096
774ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufsize2 = 8192
775ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
776ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio, buffer_size=bufsize1)
777ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        size = sys.getsizeof(bufio) - bufsize1
778ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
779ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio, buffer_size=bufsize2)
780ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
781ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
782ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
783ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
784ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    read_mode = "rb"
785ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
786ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
787ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO([b"abc"])
788ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
789ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio)
790ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio, buffer_size=1024)
791ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio, buffer_size=16)
792ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abc", bufio.read())
793ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
794ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
795ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
796ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO([b"abc"])
797ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio)
798ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abc", bufio.read())
799ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
800ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read(self):
801ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for arg in (None, 7):
802ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO((b"abc", b"d", b"efg"))
803ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio)
804ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(b"abcdefg", bufio.read(arg))
805ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Invalid args
806ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.read, -2)
807ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
808ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read1(self):
809ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"abc", b"d", b"efg"))
810ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
811ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"a", bufio.read(1))
812ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"b", bufio.read1(1))
813ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio._reads, 1)
814ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"c", bufio.read1(100))
815ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio._reads, 1)
816ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"d", bufio.read1(100))
817ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio._reads, 2)
818ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"efg", bufio.read1(100))
819ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio._reads, 3)
820ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"", bufio.read1(100))
821ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rawio._reads, 4)
822ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Invalid args
823ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.read1, -1)
824ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
825ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readinto(self):
826ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"abc", b"d", b"efg"))
827ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
828ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = bytearray(2)
829ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.readinto(b), 2)
830ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b, b"ab")
831ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.readinto(b), 2)
832ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b, b"cd")
833ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.readinto(b), 2)
834ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b, b"ef")
835ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.readinto(b), 1)
836ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b, b"gf")
837ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.readinto(b), 0)
838ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b, b"gf")
839ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
840ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readlines(self):
841ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bufio():
842ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO((b"abc\n", b"d\n", b"ef"))
843ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return self.tp(rawio)
844ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio().readlines(), [b"abc\n", b"d\n", b"ef"])
845ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio().readlines(5), [b"abc\n", b"d\n"])
846ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio().readlines(None), [b"abc\n", b"d\n", b"ef"])
847ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
848ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_buffering(self):
849ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = b"abcdefghi"
850ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        dlen = len(data)
851ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
852ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        tests = [
853ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ 100, [ 3, 1, 4, 8 ], [ dlen, 0 ] ],
854ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ 100, [ 3, 3, 3],     [ dlen ]    ],
855ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [   4, [ 1, 2, 4, 2 ], [ 4, 4, 1 ] ],
856ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        ]
857ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
858ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for bufsize, buf_read_sizes, raw_read_sizes in tests:
859ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockFileIO(data)
860ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio, buffer_size=bufsize)
861ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pos = 0
862ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for nbytes in buf_read_sizes:
863ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(bufio.read(nbytes), data[pos:pos+nbytes])
864ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pos += nbytes
865ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # this is mildly implementation-dependent
866ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(rawio.read_history, raw_read_sizes)
867ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
868ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_non_blocking(self):
869ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Inject some None's in there to simulate EWOULDBLOCK
870ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"abc", b"d", None, b"efg", None, None, None))
871ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
872ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abcd", bufio.read(6))
873ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"e", bufio.read(1))
874ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"fg", bufio.read())
875ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"", bufio.peek(1))
876ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsNone(bufio.read())
877ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"", bufio.read())
878ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
879ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"a", None, None))
880ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"a", rawio.readall())
881ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsNone(rawio.readall())
882ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
883ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_past_eof(self):
884ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"abc", b"d", b"efg"))
885ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
886ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
887ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abcdefg", bufio.read(9000))
888ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
889ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_all(self):
890ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO((b"abc", b"d", b"efg"))
891ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
892ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
893ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abcdefg", bufio.read())
894ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
895ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(threading, 'Threading required for this test.')
896ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @support.requires_resource('cpu')
897ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_threads(self):
898ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
899ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Write out many bytes with exactly the same number of 0's,
900ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # 1's... 255's. This will help us check that concurrent reading
901ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # doesn't duplicate or forget contents.
902ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            N = 1000
903ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            l = list(range(256)) * N
904ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            random.shuffle(l)
905ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            s = bytes(bytearray(l))
906ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, "wb") as f:
907ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(s)
908ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, self.read_mode, buffering=0) as raw:
909ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio = self.tp(raw, 8)
910ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                errors = []
911ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                results = []
912ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                def f():
913ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    try:
914ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        # Intra-buffer read then buffer-flushing read
915ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        for n in cycle([1, 19]):
916ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            s = bufio.read(n)
917ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            if not s:
918ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                break
919ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            # list.append() is atomic
920ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            results.append(s)
921ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    except Exception as e:
922ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        errors.append(e)
923ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        raise
924ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                threads = [threading.Thread(target=f) for x in range(20)]
925ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for t in threads:
926ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    t.start()
927ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                time.sleep(0.02) # yield
928ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for t in threads:
929ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    t.join()
930ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertFalse(errors,
931ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    "the following exceptions were caught: %r" % errors)
932ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                s = b''.join(results)
933ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for i in range(256):
934ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    c = bytes(bytearray([i]))
935ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(s.count(c), N)
936ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
937ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            support.unlink(support.TESTFN)
938ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
939ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_misbehaved_io(self):
940ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
941ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
942ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.seek, 0)
943ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.tell)
944ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
945ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_no_extraneous_read(self):
946ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #9550; when the raw IO object has satisfied the read request,
947ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # we should not issue any additional reads, otherwise it may block
948ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (e.g. socket).
949ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufsize = 16
950ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for n in (2, bufsize - 1, bufsize, bufsize + 1, bufsize * 2):
951ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO([b"x" * n])
952ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio, bufsize)
953ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.read(n), b"x" * n)
954ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Simple case: one raw read is enough to satisfy the request.
955ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(rawio._extraneous_reads, 0,
956ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                             "failed for {}: {} != 0".format(n, rawio._extraneous_reads))
957ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # A more complex case where two raw reads are needed to satisfy
958ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # the request.
959ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO([b"x" * (n - 1), b"x"])
960ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio, bufsize)
961ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.read(n), b"x" * n)
962ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(rawio._extraneous_reads, 0,
963ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                             "failed for {}: {} != 0".format(n, rawio._extraneous_reads))
964ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
965ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
966ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CBufferedReaderTest(BufferedReaderTest, SizeofTest):
967ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = io.BufferedReader
968ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
969ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
970ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedReaderTest.test_constructor(self)
971ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The allocation can succeed on 32-bit builds, e.g. with more
972ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # than 2GB RAM and a 64-bit kernel.
973ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.maxsize > 0x7FFFFFFF:
974ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO()
975ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio)
976ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises((OverflowError, MemoryError, ValueError),
977ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio.__init__, rawio, sys.maxsize)
978ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
979ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_initialization(self):
980ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO([b"abc"])
981ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
982ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
983ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.read)
984ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
985ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.read)
986ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
987ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.read)
988ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
989ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_misbehaved_io_read(self):
990ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg"))
991ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
992ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # _pyio.BufferedReader seems to implement reading different, so that
993ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # checking this is not so easy.
994ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.read, 10)
995ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
996ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_garbage_collection(self):
997ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # C BufferedReader objects are collected.
998ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The Python version has __del__, so it ends into gc.garbage instead
999ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.FileIO(support.TESTFN, "w+b")
1000ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.tp(rawio)
1001ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.f = f
1002ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(f)
1003ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del f
1004ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
1005ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
1006ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1007ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_args_error(self):
1008ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #17275
1009ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaisesRegexp(TypeError, "BufferedReader"):
1010ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(io.BytesIO(), 1024, 1024, 1024)
1011ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1012ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1013ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyBufferedReaderTest(BufferedReaderTest):
1014ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = pyio.BufferedReader
1015ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1016ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1017ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass BufferedWriterTest(unittest.TestCase, CommonBufferedTests):
1018ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    write_mode = "wb"
1019ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1020ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1021ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
1022ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
1023ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio)
1024ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio, buffer_size=1024)
1025ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio, buffer_size=16)
1026ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(3, bufio.write(b"abc"))
1027ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1028ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
1029ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
1030ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
1031ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.__init__(rawio)
1032ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(3, bufio.write(b"ghi"))
1033ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1034ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"".join(rawio._write_stack), b"abcghi")
1035ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1036ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_detach_flush(self):
1037ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
1038ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.tp(raw)
1039ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf.write(b"howdy!")
1040ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(raw._write_stack)
1041ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf.detach()
1042ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(raw._write_stack, [b"howdy!"])
1043ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1044ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write(self):
1045ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Write to the buffered IO but don't overflow the buffer.
1046ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1047ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1048ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"abc")
1049ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(writer._write_stack)
1050ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1051ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_overflow(self):
1052ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1053ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1054ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        contents = b"abcdefghijklmnop"
1055ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for n in range(0, len(contents), 3):
1056ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(contents[n:n+3])
1057ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        flushed = b"".join(writer._write_stack)
1058ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # At least (total - 8) bytes were implicitly flushed, perhaps more
1059ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # depending on the implementation.
1060ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(flushed.startswith(contents[:-8]), flushed)
1061ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1062ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_writes(self, intermediate_func):
1063ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Lots of writes, test the flushed output is as expected.
1064ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        contents = bytes(range(256)) * 1000
1065ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        n = 0
1066ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1067ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 13)
1068ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Generator of write sizes: repeat each N 15 times then proceed to N+1
1069ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def gen_sizes():
1070ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for size in count(1):
1071ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for i in range(15):
1072ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    yield size
1073ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sizes = gen_sizes()
1074ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while n < len(contents):
1075ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            size = min(next(sizes), len(contents) - n)
1076ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.write(contents[n:n+size]), size)
1077ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            intermediate_func(bufio)
1078ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            n += size
1079ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1080ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(contents,
1081ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b"".join(writer._write_stack))
1082ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1083ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes(self):
1084ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(lambda bufio: None)
1085ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1086ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_flushes(self):
1087ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(lambda bufio: bufio.flush())
1088ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1089ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_seeks(self):
1090ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _seekabs(bufio):
1091ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pos = bufio.tell()
1092ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos + 1, 0)
1093ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos - 1, 0)
1094ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos, 0)
1095ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_seekabs)
1096ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _seekrel(bufio):
1097ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pos = bufio.seek(0, 1)
1098ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(+1, 1)
1099ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(-1, 1)
1100ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos, 0)
1101ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_seekrel)
1102ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1103ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_truncates(self):
1104ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(lambda bufio: bufio.truncate(bufio.tell()))
1105ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1106ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_non_blocking(self):
1107ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockNonBlockWriterIO()
1108ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(raw, 8)
1109ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1110ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"abcd"), 4)
1111ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"efghi"), 5)
1112ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # 1 byte will be written, the rest will be buffered
1113ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.block_on(b"k")
1114ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"jklmn"), 5)
1115ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1116ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # 8 bytes will be written, 8 will be buffered and the rest will be lost
1117ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.block_on(b"0")
1118ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
1119ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(b"opqrwxyz0123456789")
1120ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        except self.BlockingIOError as e:
1121ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            written = e.characters_written
1122ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
1123ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.fail("BlockingIOError should have been raised")
1124ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(written, 16)
1125ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(raw.pop_written(),
1126ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b"abcdefghijklmnopqrwxyz")
1127ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1128ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"ABCDEFGHI"), 9)
1129ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        s = raw.pop_written()
1130ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Previously buffered bytes were flushed
1131ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(s.startswith(b"01234567A"), s)
1132ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1133ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_and_rewind(self):
1134ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = io.BytesIO()
1135ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(raw, 4)
1136ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"abcdef"), 6)
1137ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.tell(), 6)
1138ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.seek(0, 0)
1139ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"XY"), 2)
1140ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.seek(6, 0)
1141ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(raw.getvalue(), b"XYcdef")
1142ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"123456"), 6)
1143ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1144ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(raw.getvalue(), b"XYcdef123456")
1145ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1146ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush(self):
1147ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1148ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1149ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"abc")
1150ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1151ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abc", writer._write_stack[0])
1152ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1153ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines(self):
1154ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        l = [b'ab', b'cd', b'ef']
1155ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1156ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1157ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.writelines(l)
1158ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1159ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b''.join(writer._write_stack), b'abcdef')
1160ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1161ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines_userlist(self):
1162ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        l = UserList([b'ab', b'cd', b'ef'])
1163ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1164ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1165ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.writelines(l)
1166ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1167ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b''.join(writer._write_stack), b'abcdef')
1168ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1169ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines_error(self):
1170ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1171ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1172ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, bufio.writelines, [1, 2, 3])
1173ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, bufio.writelines, None)
1174ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1175ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_destructor(self):
1176ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        writer = self.MockRawIO()
1177ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(writer, 8)
1178ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"abc")
1179ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del bufio
1180ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
1181ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"abc", writer._write_stack[0])
1182ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1183ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_truncate(self):
1184ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Truncate implicitly flushes the buffer.
1185ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, self.write_mode, buffering=0) as raw:
1186ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(raw, 8)
1187ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(b"abcdef")
1188ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.truncate(3), 3)
1189ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.tell(), 6)
1190ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb", buffering=0) as f:
1191ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"abc")
1192ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1193ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(threading, 'Threading required for this test.')
1194ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @support.requires_resource('cpu')
1195ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_threads(self):
1196ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
1197ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Write out many bytes from many threads and test they were
1198ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # all flushed.
1199ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            N = 1000
1200ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            contents = bytes(range(256)) * N
1201ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            sizes = cycle([1, 19])
1202ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            n = 0
1203ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            queue = deque()
1204ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            while n < len(contents):
1205ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                size = next(sizes)
1206ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                queue.append(contents[n:n+size])
1207ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                n += size
1208ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            del contents
1209ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # We use a real file object because it allows us to
1210ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # exercise situations where the GIL is released before
1211ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # writing the buffer to the raw streams. This is in addition
1212ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # to concurrency issues due to switching threads in the middle
1213ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # of Python code.
1214ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, self.write_mode, buffering=0) as raw:
1215ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio = self.tp(raw, 8)
1216ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                errors = []
1217ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                def f():
1218ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    try:
1219ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        while True:
1220ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            try:
1221ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                s = queue.popleft()
1222ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            except IndexError:
1223ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                return
1224ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            bufio.write(s)
1225ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    except Exception as e:
1226ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        errors.append(e)
1227ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        raise
1228ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                threads = [threading.Thread(target=f) for x in range(20)]
1229ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for t in threads:
1230ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    t.start()
1231ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                time.sleep(0.02) # yield
1232ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for t in threads:
1233ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    t.join()
1234ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertFalse(errors,
1235ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    "the following exceptions were caught: %r" % errors)
1236ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio.close()
1237ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(support.TESTFN, "rb") as f:
1238ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                s = f.read()
1239ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for i in range(256):
1240ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(s.count(bytes([i])), N)
1241ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
1242ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            support.unlink(support.TESTFN)
1243ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1244ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_misbehaved_io(self):
1245ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MisbehavedRawIO()
1246ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio, 5)
1247ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.seek, 0)
1248ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.tell)
1249ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, bufio.write, b"abcdef")
1250ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1251ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_max_buffer_size_deprecation(self):
1252ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with support.check_warnings(("max_buffer_size is deprecated",
1253ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                     DeprecationWarning)):
1254ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(self.MockRawIO(), 8, 12)
1255ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1256ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_error_on_close(self):
1257ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO()
1258ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_write(b):
1259ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError()
1260ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.write = bad_write
1261ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.tp(raw)
1262ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.write(b'spam')
1263ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, b.close) # exception not swallowed
1264ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(b.closed)
1265ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1266ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1267ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CBufferedWriterTest(BufferedWriterTest, SizeofTest):
1268ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = io.BufferedWriter
1269ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1270ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1271ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedWriterTest.test_constructor(self)
1272ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The allocation can succeed on 32-bit builds, e.g. with more
1273ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # than 2GB RAM and a 64-bit kernel.
1274ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.maxsize > 0x7FFFFFFF:
1275ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO()
1276ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio)
1277ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises((OverflowError, MemoryError, ValueError),
1278ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio.__init__, rawio, sys.maxsize)
1279ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1280ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_initialization(self):
1281ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.MockRawIO()
1282ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(rawio)
1283ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=0)
1284ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.write, b"def")
1285ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-16)
1286ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.write, b"def")
1287ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.__init__, rawio, buffer_size=-1)
1288ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, bufio.write, b"def")
1289ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1290ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_garbage_collection(self):
1291ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # C BufferedWriter objects are collected, and collecting them flushes
1292ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # all data to disk.
1293ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The Python version has __del__, so it ends into gc.garbage instead
1294ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.FileIO(support.TESTFN, "w+b")
1295ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.tp(rawio)
1296ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write(b"123xxx")
1297ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.x = f
1298ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(f)
1299ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del f
1300ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
1301ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
1302ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
1303ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"123xxx")
1304ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1305ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_args_error(self):
1306ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #17275
1307ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaisesRegexp(TypeError, "BufferedWriter"):
1308ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(io.BytesIO(), 1024, 1024, 1024)
1309ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1310ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1311ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyBufferedWriterTest(BufferedWriterTest):
1312ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = pyio.BufferedWriter
1313ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1314ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass BufferedRWPairTest(unittest.TestCase):
1315ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1316ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1317ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1318ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(pair.closed)
1319ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1320ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_detach(self):
1321ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1322ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(self.UnsupportedOperation, pair.detach)
1323ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1324ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor_max_buffer_size_deprecation(self):
1325ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with support.check_warnings(("max_buffer_size is deprecated",
1326ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                     DeprecationWarning)):
1327ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(self.MockRawIO(), self.MockRawIO(), 8, 12)
1328ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1329ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor_with_not_readable(self):
1330ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class NotReadable(MockRawIO):
1331ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def readable(self):
1332ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return False
1333ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1334ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, self.tp, NotReadable(), self.MockRawIO())
1335ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1336ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor_with_not_writeable(self):
1337ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class NotWriteable(MockRawIO):
1338ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def writable(self):
1339ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return False
1340ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1341ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, self.tp, self.MockRawIO(), NotWriteable())
1342ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1343ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read(self):
1344ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
1345ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1346ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read(3), b"abc")
1347ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read(1), b"d")
1348ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read(), b"ef")
1349ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.BytesIO(b"abc"), self.MockRawIO())
1350ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read(None), b"abc")
1351ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1352ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readlines(self):
1353ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = lambda: self.tp(self.BytesIO(b"abc\ndef\nh"), self.MockRawIO())
1354ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
1355ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
1356ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair().readlines(5), [b"abc\n", b"def\n"])
1357ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1358ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read1(self):
1359ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # .read1() is delegated to the underlying reader object, so this test
1360ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # can be shallow.
1361ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
1362ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1363ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read1(3), b"abc")
1364ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1365ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readinto(self):
1366ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
1367ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1368ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = bytearray(5)
1369ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.readinto(data), 5)
1370ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(data, b"abcde")
1371ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1372ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write(self):
1373ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        w = self.MockRawIO()
1374ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), w)
1375ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1376ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair.write(b"abc")
1377ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair.flush()
1378ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair.write(b"def")
1379ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair.flush()
1380ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(w._write_stack, [b"abc", b"def"])
1381ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1382ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_peek(self):
1383ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.BytesIO(b"abcdef"), self.MockRawIO())
1384ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1385ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.peek(3).startswith(b"abc"))
1386ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(pair.read(3), b"abc")
1387ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1388ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readable(self):
1389ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1390ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.readable())
1391ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1392ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writeable(self):
1393ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1394ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.writable())
1395ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1396ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seekable(self):
1397ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # BufferedRWPairs are never seekable, even if their readers and writers
1398ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # are.
1399ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1400ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(pair.seekable())
1401ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1402ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # .flush() is delegated to the underlying writer object and has been
1403ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # tested in the test_write method.
1404ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1405ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_close_and_closed(self):
1406ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(self.MockRawIO(), self.MockRawIO())
1407ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(pair.closed)
1408ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair.close()
1409ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.closed)
1410ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1411ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_isatty(self):
1412ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class SelectableIsAtty(MockRawIO):
1413ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __init__(self, isatty):
1414ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                MockRawIO.__init__(self)
1415ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self._isatty = isatty
1416ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1417ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def isatty(self):
1418ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return self._isatty
1419ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1420ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(SelectableIsAtty(False), SelectableIsAtty(False))
1421ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(pair.isatty())
1422ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1423ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(False))
1424ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.isatty())
1425ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1426ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(SelectableIsAtty(False), SelectableIsAtty(True))
1427ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.isatty())
1428ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1429ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pair = self.tp(SelectableIsAtty(True), SelectableIsAtty(True))
1430ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(pair.isatty())
1431ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1432ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CBufferedRWPairTest(BufferedRWPairTest):
1433ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = io.BufferedRWPair
1434ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1435ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyBufferedRWPairTest(BufferedRWPairTest):
1436ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = pyio.BufferedRWPair
1437ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1438ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1439ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass BufferedRandomTest(BufferedReaderTest, BufferedWriterTest):
1440ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    read_mode = "rb+"
1441ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    write_mode = "wb+"
1442ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1443ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1444ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedReaderTest.test_constructor(self)
1445ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedWriterTest.test_constructor(self)
1446ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1447ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_and_write(self):
1448ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.MockRawIO((b"asdf", b"ghjk"))
1449ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw = self.tp(raw, 8)
1450ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1451ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"as", rw.read(2))
1452ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.write(b"ddd")
1453ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.write(b"eee")
1454ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(raw._write_stack) # Buffer writes
1455ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"ghjk", rw.read())
1456ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"dddeee", raw._write_stack[0])
1457ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1458ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seek_and_tell(self):
1459ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.BytesIO(b"asdfghjkl")
1460ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw = self.tp(raw)
1461ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1462ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"as", rw.read(2))
1463ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(2, rw.tell())
1464ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.seek(0, 0)
1465ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"asdf", rw.read(4))
1466ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1467ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.write(b"123f")
1468ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.seek(0, 0)
1469ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"asdf123fl", rw.read())
1470ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(9, rw.tell())
1471ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.seek(-4, 2)
1472ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(5, rw.tell())
1473ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.seek(2, 1)
1474ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(7, rw.tell())
1475ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"fl", rw.read(11))
1476ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rw.flush()
1477ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"asdf123fl", raw.getvalue())
1478ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1479ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, rw.seek, 0.0)
1480ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1481ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_flush_and_read(self, read_func):
1482ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.BytesIO(b"abcdefghi")
1483ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(raw)
1484ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1485ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"ab", read_func(bufio, 2))
1486ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"12")
1487ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"ef", read_func(bufio, 2))
1488ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(6, bufio.tell())
1489ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1490ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(6, bufio.tell())
1491ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"ghi", read_func(bufio))
1492ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.seek(0, 0)
1493ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.write(b"XYZ")
1494ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # flush() resets the read buffer
1495ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1496ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.seek(0, 0)
1497ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"XYZ", read_func(bufio, 3))
1498ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1499ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_and_read(self):
1500ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_flush_and_read(lambda bufio, *args: bufio.read(*args))
1501ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1502ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_and_readinto(self):
1503ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _readinto(bufio, n=-1):
1504ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b = bytearray(n if n >= 0 else 9999)
1505ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            n = bufio.readinto(b)
1506ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return bytes(b[:n])
1507ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_flush_and_read(_readinto)
1508ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1509ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_and_peek(self):
1510ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _peek(bufio, n=-1):
1511ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # This relies on the fact that the buffer can contain the whole
1512ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # raw stream, otherwise peek() can return less.
1513ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b = bufio.peek(n)
1514ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if n != -1:
1515ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                b = b[:n]
1516ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(len(b), 1)
1517ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return b
1518ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_flush_and_read(_peek)
1519ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1520ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_and_write(self):
1521ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.BytesIO(b"abcdefghi")
1522ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(raw)
1523ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1524ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"123")
1525ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1526ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.write(b"45")
1527ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.flush()
1528ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio.seek(0, 0)
1529ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"12345fghi", raw.getvalue())
1530ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b"12345fghi", bufio.read())
1531ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1532ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_threads(self):
1533ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedReaderTest.test_threads(self)
1534ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedWriterTest.test_threads(self)
1535ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1536ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_peek(self):
1537ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _peek(bufio):
1538ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.peek(1)
1539ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_peek)
1540ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _peek(bufio):
1541ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pos = bufio.tell()
1542ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(-1, 1)
1543ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.peek(1)
1544ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos, 0)
1545ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_peek)
1546ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1547ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_reads(self):
1548ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _read(bufio):
1549ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(-1, 1)
1550ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.read(1)
1551ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_read)
1552ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1553ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_read1s(self):
1554ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _read1(bufio):
1555ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(-1, 1)
1556ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.read1(1)
1557ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_read1)
1558ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1559ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writes_and_readintos(self):
1560ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _read(bufio):
1561ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(-1, 1)
1562ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.readinto(bytearray(1))
1563ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_writes(_read)
1564ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1565ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_after_readahead(self):
1566ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #6629: writing after the buffer was filled by readahead should
1567ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # first rewind the raw stream.
1568ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for overwrite_size in [1, 5]:
1569ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raw = self.BytesIO(b"A" * 10)
1570ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(raw, 4)
1571ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Trigger readahead
1572ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.read(1), b"A")
1573ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.tell(), 1)
1574ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Overwriting should rewind the raw stream if it needs so
1575ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(b"B" * overwrite_size)
1576ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.tell(), overwrite_size + 1)
1577ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # If the write size was smaller than the buffer size, flush() and
1578ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # check that rewind happens.
1579ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.flush()
1580ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(bufio.tell(), overwrite_size + 1)
1581ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            s = raw.getvalue()
1582ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(s,
1583ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                b"A" + b"B" * overwrite_size + b"A" * (9 - overwrite_size))
1584ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1585ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_write_rewind_write(self):
1586ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Various combinations of reading / writing / seeking backwards / writing again
1587ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def mutate(bufio, pos1, pos2):
1588ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            assert pos2 >= pos1
1589ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Fill the buffer
1590ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos1)
1591ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.read(pos2 - pos1)
1592ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(b'\x02')
1593ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # This writes earlier than the previous write, but still inside
1594ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # the buffer.
1595ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.seek(pos1)
1596ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio.write(b'\x01')
1597ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1598ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = b"\x80\x81\x82\x83\x84"
1599ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for i in range(0, len(b)):
1600ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for j in range(i, len(b)):
1601ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                raw = self.BytesIO(b)
1602ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio = self.tp(raw, 100)
1603ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                mutate(bufio, i, j)
1604ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio.flush()
1605ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                expected = bytearray(b)
1606ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                expected[j] = 2
1607ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                expected[i] = 1
1608ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(raw.getvalue(), expected,
1609ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                 "failed result for i=%d, j=%d" % (i, j))
1610ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1611ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_truncate_after_read_or_write(self):
1612ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.BytesIO(b"A" * 10)
1613ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        bufio = self.tp(raw, 100)
1614ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.read(2), b"AA") # the read buffer gets filled
1615ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.truncate(), 2)
1616ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.write(b"BB"), 2) # the write buffer increases
1617ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(bufio.truncate(), 4)
1618ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1619ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_misbehaved_io(self):
1620ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedReaderTest.test_misbehaved_io(self)
1621ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedWriterTest.test_misbehaved_io(self)
1622ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1623ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interleaved_read_write(self):
1624ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test for issue #12213
1625ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.BytesIO(b'abcdefgh') as raw:
1626ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.tp(raw, 100) as f:
1627ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b"1")
1628ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(1), b'b')
1629ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'2')
1630ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read1(1), b'd')
1631ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'3')
1632ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                buf = bytearray(1)
1633ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.readinto(buf)
1634ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(buf, b'f')
1635ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'4')
1636ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.peek(1), b'h')
1637ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.flush()
1638ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(raw.getvalue(), b'1b2d3f4h')
1639ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1640ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.BytesIO(b'abc') as raw:
1641ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.tp(raw, 100) as f:
1642ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(1), b'a')
1643ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b"2")
1644ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(1), b'c')
1645ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.flush()
1646ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(raw.getvalue(), b'a2c')
1647ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1648ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interleaved_readline_write(self):
1649ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.BytesIO(b'ab\ncdef\ng\n') as raw:
1650ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.tp(raw) as f:
1651ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'1')
1652ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.readline(), b'b\n')
1653ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'2')
1654ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.readline(), b'def\n')
1655ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(b'3')
1656ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.readline(), b'\n')
1657ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.flush()
1658ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(raw.getvalue(), b'1b\n2def\n3\n')
1659ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1660ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1661ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CBufferedRandomTest(CBufferedReaderTest, CBufferedWriterTest,
1662ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                          BufferedRandomTest, SizeofTest):
1663ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = io.BufferedRandom
1664ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1665ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1666ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        BufferedRandomTest.test_constructor(self)
1667ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The allocation can succeed on 32-bit builds, e.g. with more
1668ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # than 2GB RAM and a 64-bit kernel.
1669ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if sys.maxsize > 0x7FFFFFFF:
1670ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rawio = self.MockRawIO()
1671ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            bufio = self.tp(rawio)
1672ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises((OverflowError, MemoryError, ValueError),
1673ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                bufio.__init__, rawio, sys.maxsize)
1674ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1675ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_garbage_collection(self):
1676ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        CBufferedReaderTest.test_garbage_collection(self)
1677ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        CBufferedWriterTest.test_garbage_collection(self)
1678ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1679ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_args_error(self):
1680ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #17275
1681ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaisesRegexp(TypeError, "BufferedRandom"):
1682ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.tp(io.BytesIO(), 1024, 1024, 1024)
1683ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1684ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1685ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyBufferedRandomTest(BufferedRandomTest):
1686ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tp = pyio.BufferedRandom
1687ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1688ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1689ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# To fully exercise seek/tell, the StatefulIncrementalDecoder has these
1690ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# properties:
1691ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - A single output character can correspond to many bytes of input.
1692ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - The number of input bytes to complete the character can be
1693ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#     undetermined until the last input byte is received.
1694ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - The number of input bytes can vary depending on previous input.
1695ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - A single input byte can correspond to many characters of output.
1696ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - The number of output characters can be undetermined until the
1697ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#     last input byte is received.
1698ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot#   - The number of output characters can vary depending on previous input.
1699ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1700ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StatefulIncrementalDecoder(codecs.IncrementalDecoder):
1701ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
1702ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    For testing seek/tell behavior with a stateful, buffering decoder.
1703ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1704ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Input is a sequence of words.  Words may be fixed-length (length set
1705ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    by input) or variable-length (period-terminated).  In variable-length
1706ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    mode, extra periods are ignored.  Possible words are:
1707ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      - 'i' followed by a number sets the input length, I (maximum 99).
1708ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        When I is set to 0, words are space-terminated.
1709ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      - 'o' followed by a number sets the output length, O (maximum 99).
1710ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot      - Any other word is converted into a word followed by a period on
1711ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        the output.  The output word consists of the input word truncated
1712ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        or padded out with hyphens to make its length equal to O.  If O
1713ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        is 0, the word is output verbatim without truncating or padding.
1714ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    I and O are initially set to 1.  When I changes, any buffered input is
1715ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    re-scanned according to the new I.  EOF also terminates the last word.
1716ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
1717ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1718ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __init__(self, errors='strict'):
1719ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        codecs.IncrementalDecoder.__init__(self, errors)
1720ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.reset()
1721ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1722ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def __repr__(self):
1723ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return '<SID %x>' % id(self)
1724ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1725ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def reset(self):
1726ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.i = 1
1727ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.o = 1
1728ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.buffer = bytearray()
1729ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1730ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def getstate(self):
1731ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        i, o = self.i ^ 1, self.o ^ 1 # so that flags = 0 after reset()
1732ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return bytes(self.buffer), i*100 + o
1733ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1734ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def setstate(self, state):
1735ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buffer, io = state
1736ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.buffer = bytearray(buffer)
1737ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        i, o = divmod(io, 100)
1738ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.i, self.o = i ^ 1, o ^ 1
1739ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1740ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def decode(self, input, final=False):
1741ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        output = ''
1742ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for b in input:
1743ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.i == 0: # variable-length, terminated with period
1744ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if b == '.':
1745ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    if self.buffer:
1746ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        output += self.process_word()
1747ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
1748ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.buffer.append(b)
1749ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            else: # fixed-length, terminate after self.i bytes
1750ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.buffer.append(b)
1751ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if len(self.buffer) == self.i:
1752ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    output += self.process_word()
1753ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if final and self.buffer: # EOF terminates the last word
1754ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            output += self.process_word()
1755ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return output
1756ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1757ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def process_word(self):
1758ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        output = ''
1759ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if self.buffer[0] == ord('i'):
1760ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.i = min(99, int(self.buffer[1:] or 0)) # set input length
1761ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif self.buffer[0] == ord('o'):
1762ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.o = min(99, int(self.buffer[1:] or 0)) # set output length
1763ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
1764ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            output = self.buffer.decode('ascii')
1765ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if len(output) < self.o:
1766ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                output += '-'*self.o # pad out with hyphens
1767ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if self.o:
1768ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                output = output[:self.o] # truncate to output length
1769ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            output += '.'
1770ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.buffer = bytearray()
1771ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        return output
1772ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1773ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    codecEnabled = False
1774ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1775ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @classmethod
1776ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def lookupTestDecoder(cls, name):
1777ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if cls.codecEnabled and name == 'test_decoder':
1778ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            latin1 = codecs.lookup('latin-1')
1779ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            return codecs.CodecInfo(
1780ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                name='test_decoder', encode=latin1.encode, decode=None,
1781ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                incrementalencoder=None,
1782ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                streamreader=None, streamwriter=None,
1783ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                incrementaldecoder=cls)
1784ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1785ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Register the previous decoder for testing.
1786ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# Disabled by default, tests will enable it.
1787ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotcodecs.register(StatefulIncrementalDecoder.lookupTestDecoder)
1788ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1789ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1790ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass StatefulIncrementalDecoderTest(unittest.TestCase):
1791ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
1792ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    Make sure the StatefulIncrementalDecoder actually works.
1793ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    """
1794ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1795ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    test_cases = [
1796ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=1, O=1 (fixed-length input == fixed-length output)
1797ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'abcd', False, 'a.b.c.d.'),
1798ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=0, O=0 (variable-length input, variable-length output)
1799ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'oiabcd', True, 'abcd.'),
1800ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=0, O=0 (should ignore extra periods)
1801ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'oi...abcd...', True, 'abcd.'),
1802ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=0, O=6 (variable-length input, fixed-length output)
1803ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'i.o6.x.xyz.toolongtofit.', False, 'x-----.xyz---.toolon.'),
1804ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=2, O=6 (fixed-length input < fixed-length output)
1805ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'i.i2.o6xyz', True, 'xy----.z-----.'),
1806ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=6, O=3 (fixed-length input > fixed-length output)
1807ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'i.o3.i6.abcdefghijklmnop', True, 'abc.ghi.mno.'),
1808ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # I=0, then 3; O=29, then 15 (with longer output)
1809ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        (b'i.o29.a.b.cde.o15.abcdefghijabcdefghij.i3.a.b.c.d.ei00k.l.m', True,
1810ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'a----------------------------.' +
1811ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'b----------------------------.' +
1812ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'cde--------------------------.' +
1813ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'abcdefghijabcde.' +
1814ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'a.b------------.' +
1815ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         '.c.------------.' +
1816ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'd.e------------.' +
1817ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'k--------------.' +
1818ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'l--------------.' +
1819ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot         'm--------------.')
1820ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    ]
1821ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1822ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_decoder(self):
1823ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Try a few one-shot test cases.
1824ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for input, eof, output in self.test_cases:
1825ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            d = StatefulIncrementalDecoder()
1826ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(d.decode(input, eof), output)
1827ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1828ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Also test an unfinished decode, followed by forcing EOF.
1829ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        d = StatefulIncrementalDecoder()
1830ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(d.decode(b'oiabcd'), '')
1831ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(d.decode(b'', 1), 'abcd.')
1832ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1833ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass TextIOWrapperTest(unittest.TestCase):
1834ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1835ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def setUp(self):
1836ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.testdata = b"AAA\r\nBBB\rCCC\r\nDDD\nEEE\r\n"
1837ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.normalized = b"AAA\nBBB\nCCC\nDDD\nEEE\n".decode("ascii")
1838ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.unlink(support.TESTFN)
1839ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1840ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tearDown(self):
1841ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.unlink(support.TESTFN)
1842ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1843ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_constructor(self):
1844ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r = self.BytesIO(b"\xc3\xa9\n\n")
1845ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedReader(r, 1000)
1846ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b)
1847ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.__init__(b, encoding="latin1", newline="\r\n")
1848ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.encoding, "latin1")
1849ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.line_buffering, False)
1850ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.__init__(b, encoding="utf8", line_buffering=True)
1851ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.encoding, "utf8")
1852ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.line_buffering, True)
1853ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual("\xe9\n", t.readline())
1854ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, t.__init__, b, newline=42)
1855ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, t.__init__, b, newline='xyzzy')
1856ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1857ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_detach(self):
1858ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r = self.BytesIO()
1859ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedWriter(r)
1860ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b)
1861ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIs(t.detach(), b)
1862ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1863ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii")
1864ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("howdy")
1865ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertFalse(r.getvalue())
1866ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.detach()
1867ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(r.getvalue(), b"howdy")
1868ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, t.detach)
1869ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1870ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_repr(self):
1871ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw = self.BytesIO("hello".encode("utf-8"))
1872ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedReader(raw)
1873ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="utf-8")
1874ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        modname = self.TextIOWrapper.__module__
1875ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(t),
1876ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                         "<%s.TextIOWrapper encoding='utf-8'>" % modname)
1877ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.name = "dummy"
1878ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(t),
1879ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                         "<%s.TextIOWrapper name=u'dummy' encoding='utf-8'>" % modname)
1880ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        raw.name = b"dummy"
1881ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(repr(t),
1882ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                         "<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
1883ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1884ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_line_buffering(self):
1885ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r = self.BytesIO()
1886ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedWriter(r, 1000)
1887ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, newline="\n", line_buffering=True)
1888ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("X")
1889ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(r.getvalue(), b"")  # No flush happened
1890ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("Y\nZ")
1891ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(r.getvalue(), b"XY\nZ")  # All got flushed
1892ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("A\rB")
1893ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(r.getvalue(), b"XY\nZA\rB")
1894ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1895ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_encoding(self):
1896ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Check the encoding attribute is always set, and valid
1897ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
1898ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="utf8")
1899ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.encoding, "utf8")
1900ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b)
1901ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(t.encoding is not None)
1902ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        codecs.lookup(t.encoding)
1903ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1904ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_encoding_errors_reading(self):
1905ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (1) default
1906ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO(b"abc\n\xff\n")
1907ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii")
1908ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(UnicodeError, t.read)
1909ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (2) explicit strict
1910ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO(b"abc\n\xff\n")
1911ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="strict")
1912ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(UnicodeError, t.read)
1913ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (3) ignore
1914ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO(b"abc\n\xff\n")
1915ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="ignore")
1916ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.read(), "abc\n\n")
1917ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (4) replace
1918ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO(b"abc\n\xff\n")
1919ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="replace")
1920ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.read(), "abc\n\ufffd\n")
1921ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1922ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_encoding_errors_writing(self):
1923ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (1) default
1924ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
1925ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii")
1926ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(UnicodeError, t.write, "\xff")
1927ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (2) explicit strict
1928ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
1929ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="strict")
1930ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(UnicodeError, t.write, "\xff")
1931ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (3) ignore
1932ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
1933ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="ignore",
1934ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                             newline="\n")
1935ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("abc\xffdef\n")
1936ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.flush()
1937ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b.getvalue(), b"abcdef\n")
1938ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # (4) replace
1939ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
1940ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii", errors="replace",
1941ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                             newline="\n")
1942ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("abc\xffdef\n")
1943ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.flush()
1944ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b.getvalue(), b"abc?def\n")
1945ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1946ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_newlines(self):
1947ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        input_lines = [ "unix\n", "windows\r\n", "os9\r", "last\n", "nonl" ]
1948ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1949ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        tests = [
1950ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ None, [ 'unix\n', 'windows\n', 'os9\n', 'last\n', 'nonl' ] ],
1951ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ '', input_lines ],
1952ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ '\n', [ "unix\n", "windows\r\n", "os9\rlast\n", "nonl" ] ],
1953ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ '\r\n', [ "unix\nwindows\r\n", "os9\rlast\nnonl" ] ],
1954ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            [ '\r', [ "unix\nwindows\r", "\nos9\r", "last\nnonl" ] ],
1955ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        ]
1956ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        encodings = (
1957ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            'utf-8', 'latin-1',
1958ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            'utf-16', 'utf-16-le', 'utf-16-be',
1959ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            'utf-32', 'utf-32-le', 'utf-32-be',
1960ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        )
1961ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1962ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Try a range of buffer sizes to test the case where \r is the last
1963ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # character in TextIOWrapper._pending_line.
1964ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for encoding in encodings:
1965ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # XXX: str.encode() should return bytes
1966ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            data = bytes(''.join(input_lines).encode(encoding))
1967ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for do_reads in (False, True):
1968ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for bufsize in range(1, 10):
1969ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    for newline, exp_lines in tests:
1970ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        bufio = self.BufferedReader(self.BytesIO(data), bufsize)
1971ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        textio = self.TextIOWrapper(bufio, newline=newline,
1972ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                                  encoding=encoding)
1973ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        if do_reads:
1974ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            got_lines = []
1975ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            while True:
1976ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                c2 = textio.read(2)
1977ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                if c2 == '':
1978ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                    break
1979ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                self.assertEqual(len(c2), 2)
1980ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                got_lines.append(c2 + textio.readline())
1981ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        else:
1982ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            got_lines = list(textio)
1983ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1984ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        for got_line, exp_line in zip(got_lines, exp_lines):
1985ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                            self.assertEqual(got_line, exp_line)
1986ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        self.assertEqual(len(got_lines), len(exp_lines))
1987ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
1988ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_newlines_input(self):
1989ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        testdata = b"AAA\nBB\x00B\nCCC\rDDD\rEEE\r\nFFF\r\nGGG"
1990ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        normalized = testdata.replace(b"\r\n", b"\n").replace(b"\r", b"\n")
1991ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for newline, expected in [
1992ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            (None, normalized.decode("ascii").splitlines(True)),
1993ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ("", testdata.decode("ascii").splitlines(True)),
1994ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ("\n", ["AAA\n", "BB\x00B\n", "CCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
1995ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ("\r\n", ["AAA\nBB\x00B\nCCC\rDDD\rEEE\r\n", "FFF\r\n", "GGG"]),
1996ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ("\r",  ["AAA\nBB\x00B\nCCC\r", "DDD\r", "EEE\r", "\nFFF\r", "\nGGG"]),
1997ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ]:
1998ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf = self.BytesIO(testdata)
1999ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt = self.TextIOWrapper(buf, encoding="ascii", newline=newline)
2000ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(txt.readlines(), expected)
2001ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.seek(0)
2002ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(txt.read(), "".join(expected))
2003ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2004ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_newlines_output(self):
2005ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        testdict = {
2006ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "": b"AAA\nBBB\nCCC\nX\rY\r\nZ",
2007ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "\n": b"AAA\nBBB\nCCC\nX\rY\r\nZ",
2008ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "\r": b"AAA\rBBB\rCCC\rX\rY\r\rZ",
2009ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            "\r\n": b"AAA\r\nBBB\r\nCCC\r\nX\rY\r\r\nZ",
2010ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            }
2011ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        tests = [(None, testdict[os.linesep])] + sorted(testdict.items())
2012ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for newline, expected in tests:
2013ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf = self.BytesIO()
2014ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt = self.TextIOWrapper(buf, encoding="ascii", newline=newline)
2015ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.write("AAA\nB")
2016ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.write("BB\nCCC\n")
2017ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.write("X\rY\r\nZ")
2018ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.flush()
2019ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(buf.closed, False)
2020ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(buf.getvalue(), expected)
2021ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2022ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_destructor(self):
2023ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        l = []
2024ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        base = self.BytesIO
2025ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyBytesIO(base):
2026ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
2027ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                l.append(self.getvalue())
2028ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                base.close(self)
2029ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = MyBytesIO()
2030ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii")
2031ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("abc")
2032ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del t
2033ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
2034ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual([b"abc"], l)
2035ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2036ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_override_destructor(self):
2037ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        record = []
2038ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class MyTextIO(self.TextIOWrapper):
2039ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def __del__(self):
2040ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(1)
2041ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
2042ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f = super(MyTextIO, self).__del__
2043ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except AttributeError:
2044ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    pass
2045ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                else:
2046ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f()
2047ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def close(self):
2048ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(2)
2049ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyTextIO, self).close()
2050ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def flush(self):
2051ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                record.append(3)
2052ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                super(MyTextIO, self).flush()
2053ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BytesIO()
2054ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = MyTextIO(b, encoding="ascii")
2055ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del t
2056ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
2057ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(record, [1, 2, 3])
2058ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2059ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_error_through_destructor(self):
2060ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test that the exception state is not modified by a destructor,
2061ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # even if close() fails.
2062ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = self.CloseFailureIO()
2063ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def f():
2064ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.TextIOWrapper(rawio).xyzzy
2065ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with support.captured_output("stderr") as s:
2066ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(AttributeError, f)
2067ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        s = s.getvalue().strip()
2068ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if s:
2069ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # The destructor *may* have printed an unraisable error, check it
2070ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(len(s.splitlines()), 1)
2071ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(s.startswith("Exception IOError: "), s)
2072ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(s.endswith(" ignored"), s)
2073ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2074ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Systematic tests of the text I/O API
2075ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2076ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_basic_io(self):
2077ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for chunksize in (1, 2, 3, 4, 5, 15, 16, 17, 31, 32, 33, 63, 64, 65):
2078ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for enc in "ascii", "latin1", "utf8" :# , "utf-16-be", "utf-16-le":
2079ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f = self.open(support.TESTFN, "w+", encoding=enc)
2080ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f._CHUNK_SIZE = chunksize
2081ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.write("abc"), 3)
2082ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.close()
2083ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f = self.open(support.TESTFN, "r+", encoding=enc)
2084ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f._CHUNK_SIZE = chunksize
2085ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.tell(), 0)
2086ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), "abc")
2087ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                cookie = f.tell()
2088ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.seek(0), 0)
2089ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(None), "abc")
2090ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.seek(0)
2091ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(2), "ab")
2092ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(1), "c")
2093ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(1), "")
2094ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), "")
2095ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.tell(), cookie)
2096ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.seek(0), 0)
2097ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.seek(0, 2), cookie)
2098ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.write("def"), 3)
2099ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.seek(cookie), cookie)
2100ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), "def")
2101ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if enc.startswith("utf"):
2102ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.multi_line_test(f, enc)
2103ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.close()
2104ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2105ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def multi_line_test(self, f, enc):
2106ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.seek(0)
2107ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.truncate()
2108ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sample = "s\xff\u0fff\uffff"
2109ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wlines = []
2110ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for size in (0, 1, 2, 3, 4, 5, 30, 31, 32, 33, 62, 63, 64, 65, 1000):
2111ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            chars = []
2112ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for i in range(size):
2113ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                chars.append(sample[i % len(sample)])
2114ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            line = "".join(chars) + "\n"
2115ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wlines.append((f.tell(), line))
2116ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(line)
2117ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.seek(0)
2118ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rlines = []
2119ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while True:
2120ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pos = f.tell()
2121ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            line = f.readline()
2122ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not line:
2123ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
2124ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rlines.append((pos, line))
2125ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(rlines, wlines)
2126ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2127ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_telling(self):
2128ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "w+", encoding="utf8")
2129ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        p0 = f.tell()
2130ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write("\xff\n")
2131ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        p1 = f.tell()
2132ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write("\xff\n")
2133ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        p2 = f.tell()
2134ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.seek(0)
2135ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), p0)
2136ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readline(), "\xff\n")
2137ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), p1)
2138ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readline(), "\xff\n")
2139ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), p2)
2140ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.seek(0)
2141ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for line in f:
2142ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(line, "\xff\n")
2143ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(IOError, f.tell)
2144ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), p2)
2145ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2146ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2147ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seeking(self):
2148ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        chunk_size = _default_chunk_size()
2149ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        prefix_size = chunk_size - 2
2150ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        u_prefix = "a" * prefix_size
2151ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        prefix = bytes(u_prefix.encode("utf-8"))
2152ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(len(u_prefix), len(prefix))
2153ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        u_suffix = "\u8888\n"
2154ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        suffix = bytes(u_suffix.encode("utf-8"))
2155ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        line = prefix + suffix
2156ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "wb")
2157ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write(line*2)
2158ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2159ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "r", encoding="utf-8")
2160ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        s = f.read(prefix_size)
2161ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(s, prefix.decode("ascii"))
2162ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.tell(), prefix_size)
2163ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.readline(), u_suffix)
2164ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2165ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seeking_too(self):
2166ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Regression test for a specific bug
2167ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = b'\xe0\xbf\xbf\n'
2168ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "wb")
2169ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.write(data)
2170ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2171ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "r", encoding="utf-8")
2172ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f._CHUNK_SIZE  # Just test that it exists
2173ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f._CHUNK_SIZE = 2
2174ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.readline()
2175ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.tell()
2176ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2177ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seek_and_tell(self):
2178ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        #Test seek/tell using the StatefulIncrementalDecoder.
2179ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Make test faster by doing smaller seeks
2180ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        CHUNK_SIZE = 128
2181ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2182ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def test_seek_and_tell_with_data(data, min_pos=0):
2183ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            """Tell/seek to various points within a data stream and ensure
2184ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            that the decoded data returned by read() is consistent."""
2185ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = self.open(support.TESTFN, 'wb')
2186ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(data)
2187ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.close()
2188ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = self.open(support.TESTFN, encoding='test_decoder')
2189ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f._CHUNK_SIZE = CHUNK_SIZE
2190ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            decoded = f.read()
2191ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.close()
2192ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2193ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for i in range(min_pos, len(decoded) + 1): # seek positions
2194ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for j in [1, 5, len(decoded) - i]: # read lengths
2195ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f = self.open(support.TESTFN, encoding='test_decoder')
2196ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(f.read(i), decoded[:i])
2197ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    cookie = f.tell()
2198ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(f.read(j), decoded[i:i + j])
2199ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f.seek(cookie)
2200ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(f.read(), decoded[i:])
2201ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    f.close()
2202ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2203ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Enable the test decoder.
2204ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        StatefulIncrementalDecoder.codecEnabled = 1
2205ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2206ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Run the tests.
2207ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
2208ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Try each test case.
2209ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for input, _, _ in StatefulIncrementalDecoderTest.test_cases:
2210ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                test_seek_and_tell_with_data(input)
2211ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2212ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Position each test case so that it crosses a chunk boundary.
2213ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for input, _, _ in StatefulIncrementalDecoderTest.test_cases:
2214ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                offset = CHUNK_SIZE - len(input)//2
2215ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                prefix = b'.'*offset
2216ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # Don't bother seeking into the prefix (takes too long).
2217ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                min_pos = offset*2
2218ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                test_seek_and_tell_with_data(prefix + input, min_pos)
2219ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2220ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Ensure our test decoder won't interfere with subsequent tests.
2221ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
2222ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            StatefulIncrementalDecoder.codecEnabled = 0
2223ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2224ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_encoded_writes(self):
2225ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        data = "1234567890"
2226ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        tests = ("utf-16",
2227ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                 "utf-16-le",
2228ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                 "utf-16-be",
2229ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                 "utf-32",
2230ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                 "utf-32-le",
2231ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                 "utf-32-be")
2232ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for encoding in tests:
2233ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            buf = self.BytesIO()
2234ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = self.TextIOWrapper(buf, encoding=encoding)
2235ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Check if the BOM is written only once (see issue1753).
2236ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(data)
2237ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.write(data)
2238ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.seek(0)
2239ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), data * 2)
2240ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.seek(0)
2241ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), data * 2)
2242ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(buf.getvalue(), (data * 2).encode(encoding))
2243ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2244ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_unreadable(self):
2245ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class UnReadable(self.BytesIO):
2246ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def readable(self):
2247ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                return False
2248ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(UnReadable())
2249ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, txt.read)
2250ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2251ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_one_by_one(self):
2252ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(b"AA\r\nBB"))
2253ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = ""
2254ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while True:
2255ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            c = txt.read(1)
2256ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not c:
2257ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
2258ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            reads += c
2259ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, "AA\nBB")
2260ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2261ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readlines(self):
2262ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(b"AA\nBB\nCC"))
2263ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(txt.readlines(), ["AA\n", "BB\n", "CC"])
2264ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.seek(0)
2265ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(txt.readlines(None), ["AA\n", "BB\n", "CC"])
2266ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.seek(0)
2267ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(txt.readlines(5), ["AA\n", "BB\n"])
2268ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2269ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # read in amounts equal to TextIOWrapper._CHUNK_SIZE which is 128.
2270ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_by_chunk(self):
2271ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # make sure "\r\n" straddles 128 char boundary.
2272ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(b"A" * 127 + b"\r\nB"))
2273ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = ""
2274ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while True:
2275ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            c = txt.read(128)
2276ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not c:
2277ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
2278ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            reads += c
2279ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, "A"*127+"\nB")
2280ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2281ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines(self):
2282ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        l = ['ab', 'cd', 'ef']
2283ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.BytesIO()
2284ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(buf)
2285ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.writelines(l)
2286ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.flush()
2287ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(buf.getvalue(), b'abcdef')
2288ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2289ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines_userlist(self):
2290ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        l = UserList(['ab', 'cd', 'ef'])
2291ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.BytesIO()
2292ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(buf)
2293ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.writelines(l)
2294ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.flush()
2295ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(buf.getvalue(), b'abcdef')
2296ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2297ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_writelines_error(self):
2298ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO())
2299ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, txt.writelines, [1, 2, 3])
2300ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, txt.writelines, None)
2301ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, txt.writelines, b'abc')
2302ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2303ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue1395_1(self):
2304ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2305ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2306ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # read one char at a time
2307ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = ""
2308ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while True:
2309ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            c = txt.read(1)
2310ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not c:
2311ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
2312ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            reads += c
2313ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, self.normalized)
2314ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2315ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue1395_2(self):
2316ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2317ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt._CHUNK_SIZE = 4
2318ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2319ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = ""
2320ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        while True:
2321ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            c = txt.read(4)
2322ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if not c:
2323ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                break
2324ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            reads += c
2325ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, self.normalized)
2326ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2327ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue1395_3(self):
2328ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2329ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt._CHUNK_SIZE = 4
2330ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2331ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = txt.read(4)
2332ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads += txt.read(4)
2333ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads += txt.readline()
2334ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads += txt.readline()
2335ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads += txt.readline()
2336ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, self.normalized)
2337ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2338ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue1395_4(self):
2339ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2340ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt._CHUNK_SIZE = 4
2341ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2342ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = txt.read(4)
2343ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads += txt.read()
2344ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(reads, self.normalized)
2345ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2346ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue1395_5(self):
2347ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2348ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt._CHUNK_SIZE = 4
2349ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2350ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        reads = txt.read(4)
2351ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        pos = txt.tell()
2352ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.seek(0)
2353ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.seek(pos)
2354ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(txt.read(4), "BBB\n")
2355ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2356ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_issue2282(self):
2357ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buffer = self.BytesIO(self.testdata)
2358ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(buffer, encoding="ascii")
2359ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2360ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(buffer.seekable(), txt.seekable())
2361ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2362ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_append_bom(self):
2363ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The BOM is not written again when appending to a non-empty file
2364ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        filename = support.TESTFN
2365ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for charset in ('utf-8-sig', 'utf-16', 'utf-32'):
2366ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'w', encoding=charset) as f:
2367ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write('aaa')
2368ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pos = f.tell()
2369ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'rb') as f:
2370ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), 'aaa'.encode(charset))
2371ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2372ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'a', encoding=charset) as f:
2373ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write('xxx')
2374ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'rb') as f:
2375ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), 'aaaxxx'.encode(charset))
2376ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2377ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_seek_bom(self):
2378ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Same test, but when seeking manually
2379ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        filename = support.TESTFN
2380ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for charset in ('utf-8-sig', 'utf-16', 'utf-32'):
2381ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'w', encoding=charset) as f:
2382ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write('aaa')
2383ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                pos = f.tell()
2384ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'r+', encoding=charset) as f:
2385ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.seek(pos)
2386ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write('zzz')
2387ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.seek(0)
2388ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write('bbb')
2389ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.open(filename, 'rb') as f:
2390ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(f.read(), 'bbbzzz'.encode(charset))
2391ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2392ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_errors_property(self):
2393ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w") as f:
2394ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.errors, "strict")
2395ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w", errors="replace") as f:
2396ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.errors, "replace")
2397ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2398ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(threading, 'Threading required for this test.')
2399ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_threads_write(self):
2400ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue6750: concurrent writes could duplicate data
2401ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        event = threading.Event()
2402ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w", buffering=1) as f:
2403ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def run(n):
2404ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                text = "Thread%03d\n" % n
2405ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                event.wait()
2406ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                f.write(text)
2407ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            threads = [threading.Thread(target=lambda n=x: run(n))
2408ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                       for x in range(20)]
2409ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for t in threads:
2410ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                t.start()
2411ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            time.sleep(0.02)
2412ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            event.set()
2413ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for t in threads:
2414ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                t.join()
2415ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN) as f:
2416ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            content = f.read()
2417ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for n in range(20):
2418ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertEqual(content.count("Thread%03d\n" % n), 1)
2419ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2420ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_flush_error_on_close(self):
2421ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2422ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def bad_flush():
2423ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            raise IOError()
2424ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.flush = bad_flush
2425ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(IOError, txt.close) # exception not swallowed
2426ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(txt.closed)
2427ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2428ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_multi_close(self):
2429ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2430ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.close()
2431ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.close()
2432ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt.close()
2433ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, txt.flush)
2434ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2435ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_readonly_attributes(self):
2436ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2437ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        buf = self.BytesIO(self.testdata)
2438ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.assertRaises((AttributeError, TypeError)):
2439ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            txt.buffer = buf
2440ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2441ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_read_nonbytes(self):
2442ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #17106
2443ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Crash when underlying read() returns non-bytes
2444ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class NonbytesStream(self.StringIO):
2445ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            read1 = self.StringIO.read
2446ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class NonbytesStream(self.StringIO):
2447ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            read1 = self.StringIO.read
2448ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(NonbytesStream('a'))
2449ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.maybeRaises(TypeError):
2450ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.read(1)
2451ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(NonbytesStream('a'))
2452ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.maybeRaises(TypeError):
2453ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.readline()
2454ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(NonbytesStream('a'))
2455ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(t.read(), u'a')
2456ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2457ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_illegal_decoder(self):
2458ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue #17106
2459ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Crash when decoder returns non-string
2460ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(self.BytesIO(b'aaaaaa'), newline='\n',
2461ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                               encoding='quopri_codec')
2462ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.maybeRaises(TypeError):
2463ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.read(1)
2464ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(self.BytesIO(b'aaaaaa'), newline='\n',
2465ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                               encoding='quopri_codec')
2466ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.maybeRaises(TypeError):
2467ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.readline()
2468ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(self.BytesIO(b'aaaaaa'), newline='\n',
2469ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                               encoding='quopri_codec')
2470ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.maybeRaises(TypeError):
2471ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.read()
2472ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2473ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2474ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CTextIOWrapperTest(TextIOWrapperTest):
2475ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2476ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_initialization(self):
2477ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r = self.BytesIO(b"\xc3\xa9\n\n")
2478ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedReader(r, 1000)
2479ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b)
2480ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, t.__init__, b, newline=42)
2481ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, t.read)
2482ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, t.__init__, b, newline='xyzzy')
2483ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(ValueError, t.read)
2484ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2485ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_garbage_collection(self):
2486ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # C TextIOWrapper objects are collected, and collecting them flushes
2487ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # all data to disk.
2488ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # The Python version has __del__, so it ends in gc.garbage instead.
2489ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rawio = io.FileIO(support.TESTFN, "wb")
2490ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BufferedWriter(rawio)
2491ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = self.TextIOWrapper(b, encoding="ascii")
2492ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.write("456def")
2493ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.x = t
2494ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(t)
2495ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del t
2496ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
2497ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
2498ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "rb") as f:
2499ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(f.read(), b"456def")
2500ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2501ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_rwpair_cleared_before_textio(self):
2502ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue 13070: TextIOWrapper's finalization would crash when called
2503ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # after the reference to the underlying BufferedRWPair's writer got
2504ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # cleared by the GC.
2505ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for i in range(1000):
2506ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
2507ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t1 = self.TextIOWrapper(b1, encoding="ascii")
2508ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO())
2509ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t2 = self.TextIOWrapper(b2, encoding="ascii")
2510ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # circular references
2511ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t1.buddy = t2
2512ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t2.buddy = t1
2513ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
2514ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2515ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    maybeRaises = unittest.TestCase.assertRaises
2516ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2517ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2518ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyTextIOWrapperTest(TextIOWrapperTest):
2519ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @contextlib.contextmanager
2520ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def maybeRaises(self, *args, **kwds):
2521ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        yield
2522ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2523ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2524ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass IncrementalNewlineDecoderTest(unittest.TestCase):
2525ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2526ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_newline_decoding_utf8(self, decoder):
2527ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # UTF-8 specific tests for a newline decoder
2528ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _check_decode(b, s, **kwargs):
2529ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # We exercise getstate() / setstate() as well as decode()
2530ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            state = decoder.getstate()
2531ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(decoder.decode(b, **kwargs), s)
2532ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            decoder.setstate(state)
2533ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(decoder.decode(b, **kwargs), s)
2534ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2535ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8\xa2\x88', "\u8888")
2536ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2537ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8', "")
2538ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xa2', "")
2539ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\x88', "\u8888")
2540ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2541ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8', "")
2542ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xa2', "")
2543ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\x88', "\u8888")
2544ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2545ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8', "")
2546ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(UnicodeDecodeError, decoder.decode, b'', final=True)
2547ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2548ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        decoder.reset()
2549ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\n', "\n")
2550ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r', "")
2551ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'', "\n", final=True)
2552ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r', "\n", final=True)
2553ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2554ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r', "")
2555ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'a', "\na")
2556ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2557ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r\r\n', "\n\n")
2558ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r', "")
2559ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\r', "\n")
2560ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\na', "\na")
2561ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2562ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8\xa2\x88\r\n', "\u8888\n")
2563ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8\xa2\x88', "\u8888")
2564ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\n', "\n")
2565ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\xe8\xa2\x88\r', "\u8888")
2566ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check_decode(b'\n', "\n")
2567ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2568ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_newline_decoding(self, decoder, encoding):
2569ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        result = []
2570ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if encoding is not None:
2571ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            encoder = codecs.getincrementalencoder(encoding)()
2572ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def _decode_bytewise(s):
2573ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # Decode one byte at a time
2574ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for b in encoder.encode(s):
2575ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    result.append(decoder.decode(b))
2576ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        else:
2577ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            encoder = None
2578ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            def _decode_bytewise(s):
2579ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                # Decode one char at a time
2580ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                for c in s:
2581ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    result.append(decoder.decode(c))
2582ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, None)
2583ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _decode_bytewise("abc\n\r")
2584ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, '\n')
2585ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _decode_bytewise("\nabc")
2586ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, ('\n', '\r\n'))
2587ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _decode_bytewise("abc\r")
2588ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, ('\n', '\r\n'))
2589ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _decode_bytewise("abc")
2590ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, ('\r', '\n', '\r\n'))
2591ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _decode_bytewise("abc\r")
2592ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual("".join(result), "abc\n\nabcabc\nabcabc")
2593ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        decoder.reset()
2594ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        input = "abc"
2595ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if encoder is not None:
2596ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            encoder.reset()
2597ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            input = encoder.encode(input)
2598ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.decode(input), "abc")
2599ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(decoder.newlines, None)
2600ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2601ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_newline_decoder(self):
2602ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        encodings = (
2603ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # None meaning the IncrementalNewlineDecoder takes unicode input
2604ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # rather than bytes input
2605ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            None, 'utf-8', 'latin-1',
2606ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            'utf-16', 'utf-16-le', 'utf-16-be',
2607ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            'utf-32', 'utf-32-le', 'utf-32-be',
2608ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        )
2609ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for enc in encodings:
2610ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            decoder = enc and codecs.getincrementaldecoder(enc)()
2611ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            decoder = self.IncrementalNewlineDecoder(decoder, translate=True)
2612ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.check_newline_decoding(decoder, enc)
2613ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        decoder = codecs.getincrementaldecoder("utf-8")()
2614ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        decoder = self.IncrementalNewlineDecoder(decoder, translate=True)
2615ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_newline_decoding_utf8(decoder)
2616ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2617ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_newline_bytes(self):
2618ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Issue 5433: Excessive optimization in IncrementalNewlineDecoder
2619ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _check(dec):
2620ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(dec.newlines, None)
2621ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(dec.decode("\u0D00"), "\u0D00")
2622ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(dec.newlines, None)
2623ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(dec.decode("\u0A00"), "\u0A00")
2624ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(dec.newlines, None)
2625ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        dec = self.IncrementalNewlineDecoder(None, translate=False)
2626ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check(dec)
2627ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        dec = self.IncrementalNewlineDecoder(None, translate=True)
2628ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        _check(dec)
2629ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2630ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
2631ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
2632ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2633ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyIncrementalNewlineDecoderTest(IncrementalNewlineDecoderTest):
2634ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    pass
2635ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2636ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2637ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot# XXX Tests for open()
2638ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2639ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass MiscIOTest(unittest.TestCase):
2640ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2641ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tearDown(self):
2642ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.unlink(support.TESTFN)
2643ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2644ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test___all__(self):
2645ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for name in self.io.__all__:
2646ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            obj = getattr(self.io, name, None)
2647ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertTrue(obj is not None, name)
2648ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if name == "open":
2649ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                continue
2650ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            elif "error" in name.lower() or name == "UnsupportedOperation":
2651ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertTrue(issubclass(obj, Exception), name)
2652ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            elif not name.startswith("SEEK_"):
2653ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertTrue(issubclass(obj, self.IOBase))
2654ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2655ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_attributes(self):
2656ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "wb", buffering=0)
2657ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.mode, "wb")
2658ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2659ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2660ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "U")
2661ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.name,            support.TESTFN)
2662ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.name,     support.TESTFN)
2663ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.raw.name, support.TESTFN)
2664ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.mode,            "U")
2665ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.mode,     "rb")
2666ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.raw.mode, "rb")
2667ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2668ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2669ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f = self.open(support.TESTFN, "w+")
2670ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.mode,            "w+")
2671ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.mode,     "rb+") # Does it really matter?
2672ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(f.buffer.raw.mode, "rb+")
2673ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2674ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        g = self.open(f.fileno(), "wb", closefd=False)
2675ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(g.mode,     "wb")
2676ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(g.raw.mode, "wb")
2677ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(g.name,     f.fileno())
2678ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(g.raw.name, f.fileno())
2679ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        f.close()
2680ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        g.close()
2681ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2682ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_io_after_close(self):
2683ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        for kwargs in [
2684ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w"},
2685ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "wb"},
2686ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w", "buffering": 1},
2687ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w", "buffering": 2},
2688ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "wb", "buffering": 0},
2689ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "r"},
2690ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "rb"},
2691ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "r", "buffering": 1},
2692ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "r", "buffering": 2},
2693ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "rb", "buffering": 0},
2694ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w+"},
2695ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w+b"},
2696ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w+", "buffering": 1},
2697ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w+", "buffering": 2},
2698ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                {"mode": "w+b", "buffering": 0},
2699ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            ]:
2700ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f = self.open(support.TESTFN, **kwargs)
2701ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            f.close()
2702ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.flush)
2703ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.fileno)
2704ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.isatty)
2705ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.__iter__)
2706ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if hasattr(f, "peek"):
2707ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(ValueError, f.peek, 1)
2708ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.read)
2709ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if hasattr(f, "read1"):
2710ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(ValueError, f.read1, 1024)
2711ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if hasattr(f, "readall"):
2712ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(ValueError, f.readall)
2713ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if hasattr(f, "readinto"):
2714ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertRaises(ValueError, f.readinto, bytearray(1024))
2715ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.readline)
2716ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.readlines)
2717ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.seek, 0)
2718ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.tell)
2719ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.truncate)
2720ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.write,
2721ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                              b"" if "b" in kwargs['mode'] else "")
2722ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, f.writelines, [])
2723ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ValueError, next, f)
2724ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2725ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_blockingioerror(self):
2726ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Various BlockingIOError issues
2727ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, self.BlockingIOError)
2728ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, self.BlockingIOError, 1)
2729ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, self.BlockingIOError, 1, 2, 3, 4)
2730ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertRaises(TypeError, self.BlockingIOError, 1, "", None)
2731ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BlockingIOError(1, "")
2732ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(b.characters_written, 0)
2733ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        class C(unicode):
2734ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            pass
2735ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        c = C("")
2736ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b = self.BlockingIOError(1, c)
2737ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        c.b = b
2738ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        b.c = c
2739ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wr = weakref.ref(c)
2740ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        del c, b
2741ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        support.gc_collect()
2742ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wr() is None, wr)
2743ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2744ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_abcs(self):
2745ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test the visible base classes are ABCs.
2746ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsInstance(self.IOBase, abc.ABCMeta)
2747ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsInstance(self.RawIOBase, abc.ABCMeta)
2748ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsInstance(self.BufferedIOBase, abc.ABCMeta)
2749ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertIsInstance(self.TextIOBase, abc.ABCMeta)
2750ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2751ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def _check_abc_inheritance(self, abcmodule):
2752ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb", buffering=0) as f:
2753ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.IOBase)
2754ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.RawIOBase)
2755ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.BufferedIOBase)
2756ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.TextIOBase)
2757ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "wb") as f:
2758ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.IOBase)
2759ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.RawIOBase)
2760ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.BufferedIOBase)
2761ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.TextIOBase)
2762ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with self.open(support.TESTFN, "w") as f:
2763ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.IOBase)
2764ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.RawIOBase)
2765ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertNotIsInstance(f, abcmodule.BufferedIOBase)
2766ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertIsInstance(f, abcmodule.TextIOBase)
2767ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2768ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_abc_inheritance(self):
2769ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test implementations inherit from their respective ABCs
2770ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_abc_inheritance(self)
2771ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2772ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_abc_inheritance_official(self):
2773ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # Test implementations inherit from the official ABCs of the
2774ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # baseline "io" module.
2775ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._check_abc_inheritance(io)
2776ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2777ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(fcntl, 'fcntl required for this test')
2778ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_nonblock_pipe_write_bigbuf(self):
2779ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._test_nonblock_pipe_write(16*1024)
2780ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2781ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(fcntl, 'fcntl required for this test')
2782ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_nonblock_pipe_write_smallbuf(self):
2783ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._test_nonblock_pipe_write(1024)
2784ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2785ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def _set_non_blocking(self, fd):
2786ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        flags = fcntl.fcntl(fd, fcntl.F_GETFL)
2787ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertNotEqual(flags, -1)
2788ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        res = fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK)
2789ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertEqual(res, 0)
2790ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2791ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def _test_nonblock_pipe_write(self, bufsize):
2792ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sent = []
2793ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        received = []
2794ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r, w = os.pipe()
2795ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._set_non_blocking(r)
2796ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self._set_non_blocking(w)
2797ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2798ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # To exercise all code paths in the C implementation we need
2799ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # to play with buffer sizes.  For instance, if we choose a
2800ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # buffer size less than or equal to _PIPE_BUF (4096 on Linux)
2801ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # then we will never get a partial write of the buffer.
2802ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        rf = self.open(r, mode='rb', closefd=True, buffering=bufsize)
2803ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wf = self.open(w, mode='wb', closefd=True, buffering=bufsize)
2804ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2805ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        with rf, wf:
2806ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for N in 9999, 73, 7574:
2807ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
2808ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    i = 0
2809ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    while True:
2810ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        msg = bytes([i % 26 + 97]) * N
2811ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        sent.append(msg)
2812ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        wf.write(msg)
2813ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        i += 1
2814ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2815ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except self.BlockingIOError as e:
2816ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(e.args[0], errno.EAGAIN)
2817ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    sent[-1] = sent[-1][:e.characters_written]
2818ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    received.append(rf.read())
2819ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    msg = b'BLOCKED'
2820ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    wf.write(msg)
2821ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    sent.append(msg)
2822ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2823ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            while True:
2824ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                try:
2825ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    wf.flush()
2826ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    break
2827ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                except self.BlockingIOError as e:
2828ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(e.args[0], errno.EAGAIN)
2829ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    self.assertEqual(e.characters_written, 0)
2830ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    received.append(rf.read())
2831ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2832ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            received += iter(rf.read, None)
2833ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2834ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        sent, received = b''.join(sent), b''.join(received)
2835ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(sent == received)
2836ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(wf.closed)
2837ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.assertTrue(rf.closed)
2838ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2839ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CMiscIOTest(MiscIOTest):
2840ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    io = io
2841ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2842ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PyMiscIOTest(MiscIOTest):
2843ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    io = pyio
2844ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2845ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2846ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot@unittest.skipIf(os.name == 'nt', 'POSIX signals required for this test.')
2847ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass SignalsTest(unittest.TestCase):
2848ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2849ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def setUp(self):
2850ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.oldalrm = signal.signal(signal.SIGALRM, self.alarm_interrupt)
2851ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2852ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def tearDown(self):
2853ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        signal.signal(signal.SIGALRM, self.oldalrm)
2854ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2855ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def alarm_interrupt(self, sig, frame):
2856ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        1 // 0
2857ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2858ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(threading, 'Threading required for this test.')
2859ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipIf(sys.platform in ('freebsd5', 'freebsd6', 'freebsd7'),
2860ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                     'issue #12429: skip test on FreeBSD <= 7')
2861ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_interrupted_write(self, item, bytes, **fdopen_kwargs):
2862ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        """Check that a partial write, when it gets interrupted, properly
2863ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        invokes the signal handler, and bubbles up the exception raised
2864ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        in the latter."""
2865ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        read_results = []
2866ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _read():
2867ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            s = os.read(r, 1)
2868ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            read_results.append(s)
2869ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = threading.Thread(target=_read)
2870ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.daemon = True
2871ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r, w = os.pipe()
2872ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
2873ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wio = self.io.open(w, **fdopen_kwargs)
2874ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.start()
2875ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.alarm(1)
2876ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Fill the pipe enough that the write will be blocking.
2877ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # It will be interrupted by the timer armed above.  Since the
2878ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # other thread has read one byte, the low-level write will
2879ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # return with a successful (partial) result rather than an EINTR.
2880ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # The buffered IO layer must check for pending signal
2881ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # handlers, which in this case will invoke alarm_interrupt().
2882ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertRaises(ZeroDivisionError,
2883ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        wio.write, item * (support.PIPE_MAX_SIZE // len(item) + 1))
2884ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.join()
2885ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # We got one byte, get another one and check that it isn't a
2886ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # repeat of the first one.
2887ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            read_results.append(os.read(r, 1))
2888ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(read_results, [bytes[0:1], bytes[1:2]])
2889ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
2890ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(w)
2891ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(r)
2892ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # This is deliberate. If we didn't close the file descriptor
2893ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # before closing wio, wio would try to flush its internal
2894ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # buffer, and block again.
2895ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
2896ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                wio.close()
2897ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except IOError as e:
2898ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if e.errno != errno.EBADF:
2899ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    raise
2900ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2901ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupted_write_unbuffered(self):
2902ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_write(b"xy", b"xy", mode="wb", buffering=0)
2903ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2904ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupted_write_buffered(self):
2905ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_write(b"xy", b"xy", mode="wb")
2906ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2907ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupted_write_text(self):
2908ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_write("xy", b"xy", mode="w", encoding="ascii")
2909ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2910ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_reentrant_write(self, data, **fdopen_kwargs):
2911ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def on_alarm(*args):
2912ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Will be called reentrantly from the same thread
2913ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wio.write(data)
2914ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            1//0
2915ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        signal.signal(signal.SIGALRM, on_alarm)
2916ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r, w = os.pipe()
2917ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        wio = self.io.open(w, **fdopen_kwargs)
2918ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
2919ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.alarm(1)
2920ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Either the reentrant call to wio.write() fails with RuntimeError,
2921ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # or the signal handler raises ZeroDivisionError.
2922ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            with self.assertRaises((ZeroDivisionError, RuntimeError)) as cm:
2923ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                while 1:
2924ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    for i in range(100):
2925ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        wio.write(data)
2926ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                        wio.flush()
2927ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    # Make sure the buffer doesn't fill up and block further writes
2928ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    os.read(r, len(data) * 100)
2929ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            exc = cm.exception
2930ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            if isinstance(exc, RuntimeError):
2931ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                self.assertTrue(str(exc).startswith("reentrant call"), str(exc))
2932ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
2933ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wio.close()
2934ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(r)
2935ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2936ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_reentrant_write_buffered(self):
2937ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_reentrant_write(b"xy", mode="wb")
2938ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2939ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_reentrant_write_text(self):
2940ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_reentrant_write("xy", mode="w", encoding="ascii")
2941ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2942ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_interrupted_read_retry(self, decode, **fdopen_kwargs):
2943ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        """Check that a buffered read, when it gets interrupted (either
2944ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        returning a partial result or EINTR), properly invokes the signal
2945ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        handler and retries if the latter returned successfully."""
2946ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r, w = os.pipe()
2947ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        fdopen_kwargs["closefd"] = False
2948ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def alarm_handler(sig, frame):
2949ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.write(w, b"bar")
2950ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        signal.signal(signal.SIGALRM, alarm_handler)
2951ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
2952ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rio = self.io.open(r, **fdopen_kwargs)
2953ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.write(w, b"foo")
2954ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.alarm(1)
2955ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Expected behaviour:
2956ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - first raw read() returns partial b"foo"
2957ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - second raw read() returns EINTR
2958ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - third raw read() returns b"bar"
2959ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(decode(rio.read(6)), "foobar")
2960ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
2961ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            rio.close()
2962ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(w)
2963ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(r)
2964ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2965ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupterd_read_retry_buffered(self):
2966ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_read_retry(lambda x: x.decode('latin1'),
2967ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                          mode="rb")
2968ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2969ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupterd_read_retry_text(self):
2970ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_read_retry(lambda x: x,
2971ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                                          mode="r")
2972ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
2973ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    @unittest.skipUnless(threading, 'Threading required for this test.')
2974ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def check_interrupted_write_retry(self, item, **fdopen_kwargs):
2975ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        """Check that a buffered write, when it gets interrupted (either
2976ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        returning a partial result or EINTR), properly invokes the signal
2977ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        handler and retries if the latter returned successfully."""
2978ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        select = support.import_module("select")
2979ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # A quantity that exceeds the buffer size of an anonymous pipe's
2980ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # write end.
2981ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        N = support.PIPE_MAX_SIZE
2982ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        r, w = os.pipe()
2983ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        fdopen_kwargs["closefd"] = False
2984ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # We need a separate thread to read from the pipe and allow the
2985ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # write() to finish.  This thread is started after the SIGALRM is
2986ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        # received (forcing a first EINTR in write()).
2987ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        read_results = []
2988ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        write_finished = False
2989ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def _read():
2990ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            while not write_finished:
2991ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                while r in select.select([r], [], [], 1.0)[0]:
2992ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    s = os.read(r, 1024)
2993ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    read_results.append(s)
2994ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t = threading.Thread(target=_read)
2995ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        t.daemon = True
2996ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def alarm1(sig, frame):
2997ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.signal(signal.SIGALRM, alarm2)
2998ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.alarm(1)
2999ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        def alarm2(sig, frame):
3000ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.start()
3001ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        signal.signal(signal.SIGALRM, alarm1)
3002ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        try:
3003ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wio = self.io.open(w, **fdopen_kwargs)
3004ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            signal.alarm(1)
3005ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # Expected behaviour:
3006ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - first raw write() is partial (because of the limited pipe buffer
3007ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            #   and the first alarm)
3008ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - second raw write() returns EINTR (because of the second alarm)
3009ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # - subsequent write()s are successful (either partial or complete)
3010ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(N, wio.write(item * N))
3011ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            wio.flush()
3012ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            write_finished = True
3013ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            t.join()
3014ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            self.assertEqual(N, sum(len(x) for x in read_results))
3015ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        finally:
3016ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            write_finished = True
3017ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(w)
3018ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            os.close(r)
3019ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # This is deliberate. If we didn't close the file descriptor
3020ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # before closing wio, wio would try to flush its internal
3021ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            # buffer, and could block (in case of failure).
3022ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            try:
3023ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                wio.close()
3024ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            except IOError as e:
3025ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                if e.errno != errno.EBADF:
3026ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                    raise
3027ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3028ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupterd_write_retry_buffered(self):
3029ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_write_retry(b"x", mode="wb")
3030ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3031ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    def test_interrupterd_write_retry_text(self):
3032ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        self.check_interrupted_write_retry("x", mode="w", encoding="latin1")
3033ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3034ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3035ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass CSignalsTest(SignalsTest):
3036ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    io = io
3037ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3038ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotclass PySignalsTest(SignalsTest):
3039ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    io = pyio
3040ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3041ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Handling reentrancy issues would slow down _pyio even more, so the
3042ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # tests are disabled.
3043ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    test_reentrant_write_buffered = None
3044ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    test_reentrant_write_text = None
3045ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3046ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3047ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotdef test_main():
3048ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    tests = (CIOTest, PyIOTest,
3049ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CBufferedReaderTest, PyBufferedReaderTest,
3050ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CBufferedWriterTest, PyBufferedWriterTest,
3051ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CBufferedRWPairTest, PyBufferedRWPairTest,
3052ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CBufferedRandomTest, PyBufferedRandomTest,
3053ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             StatefulIncrementalDecoderTest,
3054ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CIncrementalNewlineDecoderTest, PyIncrementalNewlineDecoderTest,
3055ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CTextIOWrapperTest, PyTextIOWrapperTest,
3056ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CMiscIOTest, PyMiscIOTest,
3057ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             CSignalsTest, PySignalsTest,
3058ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             )
3059ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3060ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Put the namespaces of the IO module we are testing and some useful mock
3061ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # classes in the __dict__ of each test.
3062ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    mocks = (MockRawIO, MisbehavedRawIO, MockFileIO, CloseFailureIO,
3063ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot             MockNonBlockWriterIO, MockRawIOWithoutRead)
3064ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    all_members = io.__all__ + ["IncrementalNewlineDecoder"]
3065ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    c_io_ns = dict((name, getattr(io, name)) for name in all_members)
3066ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    py_io_ns = dict((name, getattr(pyio, name)) for name in all_members)
3067ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    globs = globals()
3068ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    c_io_ns.update((x.__name__, globs["C" + x.__name__]) for x in mocks)
3069ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    py_io_ns.update((x.__name__, globs["Py" + x.__name__]) for x in mocks)
3070ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    # Avoid turning open into a bound method.
3071ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    py_io_ns["open"] = pyio.OpenWrapper
3072ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    for test in tests:
3073ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        if test.__name__.startswith("C"):
3074ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for name, obj in c_io_ns.items():
3075ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                setattr(test, name, obj)
3076ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot        elif test.__name__.startswith("Py"):
3077ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot            for name, obj in py_io_ns.items():
3078ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot                setattr(test, name, obj)
3079ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3080ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    support.run_unittest(*tests)
3081ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot
3082ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robotif __name__ == "__main__":
3083ec1a0b3abe08fb9a3952e8f48231cda1f6d9b1fandroid-build-team Robot    test_main()
3084