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