blob: 956a5027e54b1e06123e429d38c5d935a19e694c [file] [log] [blame]
Guido van Rossum68bbcd22007-02-27 17:19:33 +00001"""Unit tests for io.py."""
2
Guido van Rossum28524c72007-02-27 05:47:44 +00003import unittest
4from test import test_support
5
6import io
7
Guido van Rossuma9e20242007-03-08 00:43:48 +00008
Guido van Rossum01a27522007-03-07 01:00:12 +00009class MockIO(io.RawIOBase):
Guido van Rossuma9e20242007-03-08 00:43:48 +000010
Guido van Rossum01a27522007-03-07 01:00:12 +000011 def __init__(self, readStack=()):
Guido van Rossum68bbcd22007-02-27 17:19:33 +000012 self._readStack = list(readStack)
Guido van Rossum01a27522007-03-07 01:00:12 +000013 self._writeStack = []
Guido van Rossum68bbcd22007-02-27 17:19:33 +000014
15 def read(self, n=None):
16 try:
17 return self._readStack.pop(0)
18 except:
19 return io.EOF
20
Guido van Rossum01a27522007-03-07 01:00:12 +000021 def write(self, b):
22 self._writeStack.append(b)
23 return len(b)
24
25 def writable(self):
26 return True
27
Guido van Rossum68bbcd22007-02-27 17:19:33 +000028 def fileno(self):
29 return 42
30
31 def readable(self):
32 return True
33
Guido van Rossum01a27522007-03-07 01:00:12 +000034 def seekable(self):
Guido van Rossum68bbcd22007-02-27 17:19:33 +000035 return True
36
Guido van Rossum01a27522007-03-07 01:00:12 +000037 def seek(self, pos, whence):
38 pass
39
40 def tell(self):
Guido van Rossum68bbcd22007-02-27 17:19:33 +000041 return 42
42
Guido van Rossuma9e20242007-03-08 00:43:48 +000043
Guido van Rossum01a27522007-03-07 01:00:12 +000044class MockNonBlockWriterIO(io.RawIOBase):
Guido van Rossuma9e20242007-03-08 00:43:48 +000045
Guido van Rossum01a27522007-03-07 01:00:12 +000046 def __init__(self, blockingScript):
47 self.bs = list(blockingScript)
48 self._write_stack = []
Guido van Rossuma9e20242007-03-08 00:43:48 +000049
Guido van Rossum01a27522007-03-07 01:00:12 +000050 def write(self, b):
51 self._write_stack.append(b)
52 n = self.bs.pop(0)
53 if (n < 0):
54 raise io.BlockingIO(0, "test blocking", -n)
55 else:
56 return n
Guido van Rossuma9e20242007-03-08 00:43:48 +000057
Guido van Rossum01a27522007-03-07 01:00:12 +000058 def writable(self):
59 return True
Guido van Rossum68bbcd22007-02-27 17:19:33 +000060
Guido van Rossuma9e20242007-03-08 00:43:48 +000061
Guido van Rossum28524c72007-02-27 05:47:44 +000062class IOTest(unittest.TestCase):
63
Guido van Rossum4d0f5a42007-03-07 22:59:39 +000064 def tearDown(self):
65 test_support.unlink(test_support.TESTFN)
66
Guido van Rossum28524c72007-02-27 05:47:44 +000067 def write_ops(self, f):
68 f.write(b"blah.")
69 f.seek(0)
70 f.write(b"Hello.")
71 self.assertEqual(f.tell(), 6)
72 f.seek(-1, 1)
73 self.assertEqual(f.tell(), 5)
74 f.write(" world\n\n\n")
75 f.seek(0)
76 f.write("h")
77 f.seek(-2, 2)
78 f.truncate()
79
80 def read_ops(self, f):
81 data = f.read(5)
82 self.assertEqual(data, b"hello")
Guido van Rossum00efead2007-03-07 05:23:25 +000083 n = f.readinto(data)
84 self.assertEqual(n, 5)
Guido van Rossum28524c72007-02-27 05:47:44 +000085 self.assertEqual(data, b" worl")
Guido van Rossum00efead2007-03-07 05:23:25 +000086 n = f.readinto(data)
87 self.assertEqual(n, 2)
88 self.assertEqual(len(data), 5)
89 self.assertEqual(data[:2], b"d\n")
Guido van Rossum28524c72007-02-27 05:47:44 +000090 f.seek(0)
91 self.assertEqual(f.read(20), b"hello world\n")
92 f.seek(-6, 2)
93 self.assertEqual(f.read(5), b"world")
94 f.seek(-6, 1)
95 self.assertEqual(f.read(5), b" worl")
96 self.assertEqual(f.tell(), 10)
97
98 def test_raw_file_io(self):
99 f = io.open(test_support.TESTFN, "wb", buffering=0)
100 self.assertEqual(f.readable(), False)
101 self.assertEqual(f.writable(), True)
102 self.assertEqual(f.seekable(), True)
103 self.write_ops(f)
104 f.close()
105 f = io.open(test_support.TESTFN, "rb", buffering=0)
106 self.assertEqual(f.readable(), True)
107 self.assertEqual(f.writable(), False)
108 self.assertEqual(f.seekable(), True)
109 self.read_ops(f)
110 f.close()
111
112 def test_raw_bytes_io(self):
113 f = io.BytesIO()
114 self.write_ops(f)
115 data = f.getvalue()
116 self.assertEqual(data, b"hello world\n")
117 f = io.BytesIO(data)
118 self.read_ops(f)
119
Guido van Rossuma9e20242007-03-08 00:43:48 +0000120 def test_fileio_FileIO(self):
121 import _fileio
122 f = _fileio._FileIO(test_support.TESTFN, "w")
123 self.assertEqual(f.readable(), False)
124 self.assertEqual(f.writable(), True)
125 self.assertEqual(f.seekable(), True)
126 self.write_ops(f)
127 f.close()
128 f = _fileio._FileIO(test_support.TESTFN, "r")
129 self.assertEqual(f.readable(), True)
130 self.assertEqual(f.writable(), False)
131 self.assertEqual(f.seekable(), True)
132 self.read_ops(f)
133 f.close()
134
135 def test_PyFileIO(self):
136 f = io._PyFileIO(test_support.TESTFN, "w")
137 self.assertEqual(f.readable(), False)
138 self.assertEqual(f.writable(), True)
139 self.assertEqual(f.seekable(), True)
140 self.write_ops(f)
141 f.close()
142 f = io._PyFileIO(test_support.TESTFN, "r")
143 self.assertEqual(f.readable(), True)
144 self.assertEqual(f.writable(), False)
145 self.assertEqual(f.seekable(), True)
146 self.read_ops(f)
147 f.close()
148
149
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000150class BytesIOTest(unittest.TestCase):
Guido van Rossuma9e20242007-03-08 00:43:48 +0000151
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000152 def testInit(self):
153 buf = b"1234567890"
154 bytesIo = io.BytesIO(buf)
155
156 def testRead(self):
157 buf = b"1234567890"
158 bytesIo = io.BytesIO(buf)
159
160 self.assertEquals(buf[:1], bytesIo.read(1))
161 self.assertEquals(buf[1:5], bytesIo.read(4))
162 self.assertEquals(buf[5:], bytesIo.read(900))
163 self.assertEquals(io.EOF, bytesIo.read())
164
165 def testReadNoArgs(self):
166 buf = b"1234567890"
167 bytesIo = io.BytesIO(buf)
168
169 self.assertEquals(buf, bytesIo.read())
170 self.assertEquals(io.EOF, bytesIo.read())
171
172 def testSeek(self):
173 buf = b"1234567890"
174 bytesIo = io.BytesIO(buf)
175
176 bytesIo.read(5)
177 bytesIo.seek(0)
178 self.assertEquals(buf, bytesIo.read())
179
180 bytesIo.seek(3)
181 self.assertEquals(buf[3:], bytesIo.read())
182
183 def testTell(self):
184 buf = b"1234567890"
185 bytesIo = io.BytesIO(buf)
186
187 self.assertEquals(0, bytesIo.tell())
188 bytesIo.seek(5)
189 self.assertEquals(5, bytesIo.tell())
190 bytesIo.seek(10000)
191 self.assertEquals(10000, bytesIo.tell())
192
Guido van Rossuma9e20242007-03-08 00:43:48 +0000193
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000194class BufferedReaderTest(unittest.TestCase):
Guido van Rossuma9e20242007-03-08 00:43:48 +0000195
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000196 def testRead(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000197 rawIo = MockIO((b"abc", b"d", b"efg"))
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000198 bufIo = io.BufferedReader(rawIo)
199
200 self.assertEquals(b"abcdef", bufIo.read(6))
201
Guido van Rossum01a27522007-03-07 01:00:12 +0000202 def testReadNonBlocking(self):
203 # Inject some None's in there to simulate EWOULDBLOCK
204 rawIo = MockIO((b"abc", b"d", None, b"efg", None, None))
205 bufIo = io.BufferedReader(rawIo)
206
207 self.assertEquals(b"abcd", bufIo.read(6))
208 self.assertEquals(b"e", bufIo.read(1))
209 self.assertEquals(b"fg", bufIo.read())
210 self.assert_(None is bufIo.read())
211 self.assertEquals(io.EOF, bufIo.read())
212
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000213 def testReadToEof(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000214 rawIo = MockIO((b"abc", b"d", b"efg"))
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000215 bufIo = io.BufferedReader(rawIo)
216
217 self.assertEquals(b"abcdefg", bufIo.read(9000))
218
219 def testReadNoArgs(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000220 rawIo = MockIO((b"abc", b"d", b"efg"))
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000221 bufIo = io.BufferedReader(rawIo)
222
223 self.assertEquals(b"abcdefg", bufIo.read())
224
225 def testFileno(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000226 rawIo = MockIO((b"abc", b"d", b"efg"))
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000227 bufIo = io.BufferedReader(rawIo)
228
229 self.assertEquals(42, bufIo.fileno())
230
231 def testFilenoNoFileno(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000232 # XXX will we always have fileno() function? If so, kill
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000233 # this test. Else, write it.
234 pass
235
Guido van Rossuma9e20242007-03-08 00:43:48 +0000236
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000237class BufferedWriterTest(unittest.TestCase):
Guido van Rossuma9e20242007-03-08 00:43:48 +0000238
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000239 def testWrite(self):
240 # Write to the buffered IO but don't overflow the buffer.
Guido van Rossum01a27522007-03-07 01:00:12 +0000241 writer = MockIO()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000242 bufIo = io.BufferedWriter(writer, 8)
243
244 bufIo.write(b"abc")
245
246 self.assertFalse(writer._writeStack)
247
248 def testWriteOverflow(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000249 writer = MockIO()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000250 bufIo = io.BufferedWriter(writer, 8)
251
252 bufIo.write(b"abc")
253 bufIo.write(b"defghijkl")
254
255 self.assertEquals(b"abcdefghijkl", writer._writeStack[0])
256
Guido van Rossum01a27522007-03-07 01:00:12 +0000257 def testWriteNonBlocking(self):
258 raw = MockNonBlockWriterIO((9, 2, 22, -6, 10, 12, 12))
259 bufIo = io.BufferedWriter(raw, 8, 16)
260
261 bufIo.write(b"asdf")
262 bufIo.write(b"asdfa")
263 self.assertEquals(b"asdfasdfa", raw._write_stack[0])
264
265 bufIo.write(b"asdfasdfasdf")
266 self.assertEquals(b"asdfasdfasdf", raw._write_stack[1])
267 bufIo.write(b"asdfasdfasdf")
268 self.assertEquals(b"dfasdfasdf", raw._write_stack[2])
269 self.assertEquals(b"asdfasdfasdf", raw._write_stack[3])
270
271 bufIo.write(b"asdfasdfasdf")
272
273 # XXX I don't like this test. It relies too heavily on how the algorithm
274 # actually works, which we might change. Refactor later.
275
276 def testFileno(self):
277 rawIo = MockIO((b"abc", b"d", b"efg"))
278 bufIo = io.BufferedWriter(rawIo)
279
280 self.assertEquals(42, bufIo.fileno())
281
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000282 def testFlush(self):
Guido van Rossum01a27522007-03-07 01:00:12 +0000283 writer = MockIO()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000284 bufIo = io.BufferedWriter(writer, 8)
285
286 bufIo.write(b"abc")
287 bufIo.flush()
288
289 self.assertEquals(b"abc", writer._writeStack[0])
290
Guido van Rossuma9e20242007-03-08 00:43:48 +0000291
Guido van Rossum01a27522007-03-07 01:00:12 +0000292class BufferedRWPairTest(unittest.TestCase):
Guido van Rossuma9e20242007-03-08 00:43:48 +0000293
Guido van Rossum01a27522007-03-07 01:00:12 +0000294 def testRWPair(self):
295 r = MockIO(())
296 w = MockIO()
297 pair = io.BufferedRWPair(r, w)
298
299 # XXX need implementation
300
Guido van Rossuma9e20242007-03-08 00:43:48 +0000301
Guido van Rossum01a27522007-03-07 01:00:12 +0000302class BufferedRandom(unittest.TestCase):
Guido van Rossuma9e20242007-03-08 00:43:48 +0000303
Guido van Rossum01a27522007-03-07 01:00:12 +0000304 def testReadAndWrite(self):
305 raw = MockIO((b"asdf", b"ghjk"))
306 rw = io.BufferedRandom(raw, 8, 12)
307
308 self.assertEqual(b"as", rw.read(2))
309 rw.write(b"ddd")
310 rw.write(b"eee")
311 self.assertFalse(raw._writeStack) # Buffer writes
312 self.assertEqual(b"ghjk", rw.read()) # This read forces write flush
313 self.assertEquals(b"dddeee", raw._writeStack[0])
314
315 def testSeekAndTell(self):
316 raw = io.BytesIO(b"asdfghjkl")
317 rw = io.BufferedRandom(raw)
318
319 self.assertEquals(b"as", rw.read(2))
320 self.assertEquals(2, rw.tell())
321 rw.seek(0, 0)
322 self.assertEquals(b"asdf", rw.read(4))
323
324 rw.write(b"asdf")
325 rw.seek(0, 0)
326 self.assertEquals(b"asdfasdfl", rw.read())
327 self.assertEquals(9, rw.tell())
328 rw.seek(-4, 2)
329 self.assertEquals(5, rw.tell())
330 rw.seek(2, 1)
331 self.assertEquals(7, rw.tell())
332 self.assertEquals(b"fl", rw.read(11))
333
334# XXX Tests for open()
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000335
Guido van Rossum28524c72007-02-27 05:47:44 +0000336def test_main():
Guido van Rossum68bbcd22007-02-27 17:19:33 +0000337 test_support.run_unittest(IOTest, BytesIOTest, BufferedReaderTest,
Guido van Rossum01a27522007-03-07 01:00:12 +0000338 BufferedWriterTest, BufferedRWPairTest,
339 BufferedRandom)
Guido van Rossum28524c72007-02-27 05:47:44 +0000340
341if __name__ == "__main__":
342 test_main()