1 use super::{repeat, Cursor, SeekFrom}
;
2 use crate::cmp
::{self, min}
;
3 use crate::io
::{self, IoSlice, IoSliceMut}
;
4 use crate::io
::{BufRead, BufReader, Read, Seek, Write}
;
8 #[cfg_attr(target_os = "emscripten", ignore)]
10 let mut buf
= Cursor
::new(&b
"12"[..]);
11 let mut v
= Vec
::new();
12 assert_eq
!(buf
.read_until(b'
3'
, &mut v
).unwrap(), 2);
15 let mut buf
= Cursor
::new(&b
"1233"[..]);
16 let mut v
= Vec
::new();
17 assert_eq
!(buf
.read_until(b'
3'
, &mut v
).unwrap(), 3);
18 assert_eq
!(v
, b
"123");
20 assert_eq
!(buf
.read_until(b'
3'
, &mut v
).unwrap(), 1);
23 assert_eq
!(buf
.read_until(b'
3'
, &mut v
).unwrap(), 0);
29 let buf
= Cursor
::new(&b
"12"[..]);
30 let mut s
= buf
.split(b'
3'
);
31 assert_eq
!(s
.next().unwrap().unwrap(), vec
![b'
1'
, b'
2'
]);
32 assert
!(s
.next().is_none());
34 let buf
= Cursor
::new(&b
"1233"[..]);
35 let mut s
= buf
.split(b'
3'
);
36 assert_eq
!(s
.next().unwrap().unwrap(), vec
![b'
1'
, b'
2'
]);
37 assert_eq
!(s
.next().unwrap().unwrap(), vec
![]);
38 assert
!(s
.next().is_none());
43 let mut buf
= Cursor
::new(&b
"12"[..]);
44 let mut v
= String
::new();
45 assert_eq
!(buf
.read_line(&mut v
).unwrap(), 2);
48 let mut buf
= Cursor
::new(&b
"12\n\n"[..]);
49 let mut v
= String
::new();
50 assert_eq
!(buf
.read_line(&mut v
).unwrap(), 3);
51 assert_eq
!(v
, "12\n");
53 assert_eq
!(buf
.read_line(&mut v
).unwrap(), 1);
56 assert_eq
!(buf
.read_line(&mut v
).unwrap(), 0);
62 let buf
= Cursor
::new(&b
"12\r"[..]);
63 let mut s
= buf
.lines();
64 assert_eq
!(s
.next().unwrap().unwrap(), "12\r".to_string());
65 assert
!(s
.next().is_none());
67 let buf
= Cursor
::new(&b
"12\r\n\n"[..]);
68 let mut s
= buf
.lines();
69 assert_eq
!(s
.next().unwrap().unwrap(), "12".to_string());
70 assert_eq
!(s
.next().unwrap().unwrap(), "".to_string());
71 assert
!(s
.next().is_none());
76 let mut c
= Cursor
::new(&b
""[..]);
77 let mut v
= Vec
::new();
78 assert_eq
!(c
.read_to_end(&mut v
).unwrap(), 0);
81 let mut c
= Cursor
::new(&b
"1"[..]);
82 let mut v
= Vec
::new();
83 assert_eq
!(c
.read_to_end(&mut v
).unwrap(), 1);
86 let cap
= 1024 * 1024;
87 let data
= (0..cap
).map(|i
| (i
/ 3) as u8).collect
::<Vec
<_
>>();
88 let mut v
= Vec
::new();
89 let (a
, b
) = data
.split_at(data
.len() / 2);
90 assert_eq
!(Cursor
::new(a
).read_to_end(&mut v
).unwrap(), a
.len());
91 assert_eq
!(Cursor
::new(b
).read_to_end(&mut v
).unwrap(), b
.len());
97 let mut c
= Cursor
::new(&b
""[..]);
98 let mut v
= String
::new();
99 assert_eq
!(c
.read_to_string(&mut v
).unwrap(), 0);
102 let mut c
= Cursor
::new(&b
"1"[..]);
103 let mut v
= String
::new();
104 assert_eq
!(c
.read_to_string(&mut v
).unwrap(), 1);
107 let mut c
= Cursor
::new(&b
"\xff"[..]);
108 let mut v
= String
::new();
109 assert
!(c
.read_to_string(&mut v
).is_err());
114 let mut buf
= [0; 4];
116 let mut c
= Cursor
::new(&b
""[..]);
117 assert_eq
!(c
.read_exact(&mut buf
).unwrap_err().kind(), io
::ErrorKind
::UnexpectedEof
);
119 let mut c
= Cursor
::new(&b
"123"[..]).chain(Cursor
::new(&b
"456789"[..]));
120 c
.read_exact(&mut buf
).unwrap();
121 assert_eq
!(&buf
, b
"1234");
122 c
.read_exact(&mut buf
).unwrap();
123 assert_eq
!(&buf
, b
"5678");
124 assert_eq
!(c
.read_exact(&mut buf
).unwrap_err().kind(), io
::ErrorKind
::UnexpectedEof
);
128 fn read_exact_slice() {
129 let mut buf
= [0; 4];
131 let mut c
= &b
""[..];
132 assert_eq
!(c
.read_exact(&mut buf
).unwrap_err().kind(), io
::ErrorKind
::UnexpectedEof
);
134 let mut c
= &b
"123"[..];
135 assert_eq
!(c
.read_exact(&mut buf
).unwrap_err().kind(), io
::ErrorKind
::UnexpectedEof
);
136 // make sure the optimized (early returning) method is being used
137 assert_eq
!(&buf
, &[0; 4]);
139 let mut c
= &b
"1234"[..];
140 c
.read_exact(&mut buf
).unwrap();
141 assert_eq
!(&buf
, b
"1234");
143 let mut c
= &b
"56789"[..];
144 c
.read_exact(&mut buf
).unwrap();
145 assert_eq
!(&buf
, b
"5678");
154 fn read(&mut self, _
: &mut [u8]) -> io
::Result
<usize> {
155 Err(io
::Error
::new(io
::ErrorKind
::Other
, ""))
159 fn fill_buf(&mut self) -> io
::Result
<&[u8]> {
160 Err(io
::Error
::new(io
::ErrorKind
::Other
, ""))
162 fn consume(&mut self, _amt
: usize) {}
165 let mut buf
= [0; 1];
166 assert_eq
!(0, R
.take(0).read(&mut buf
).unwrap());
167 assert_eq
!(b
"", R
.take(0).fill_buf().unwrap());
170 fn cmp_bufread
<Br1
: BufRead
, Br2
: BufRead
>(mut br1
: Br1
, mut br2
: Br2
, exp
: &[u8]) {
171 let mut cat
= Vec
::new();
174 let buf1
= br1
.fill_buf().unwrap();
175 let buf2
= br2
.fill_buf().unwrap();
176 let minlen
= if buf1
.len() < buf2
.len() { buf1.len() }
else { buf2.len() }
;
177 assert_eq
!(buf1
[..minlen
], buf2
[..minlen
]);
178 cat
.extend_from_slice(&buf1
[..minlen
]);
184 br1
.consume(consume
);
185 br2
.consume(consume
);
187 assert_eq
!(br1
.fill_buf().unwrap().len(), 0);
188 assert_eq
!(br2
.fill_buf().unwrap().len(), 0);
189 assert_eq
!(&cat
[..], &exp
[..])
194 let testdata
= b
"ABCDEFGHIJKL";
196 (&testdata
[..3]).chain(&testdata
[3..6]).chain(&testdata
[6..9]).chain(&testdata
[9..]);
197 let chain2
= (&testdata
[..4]).chain(&testdata
[4..8]).chain(&testdata
[8..]);
198 cmp_bufread(chain1
, chain2
, &testdata
[..]);
202 fn bufreader_size_hint() {
203 let testdata
= b
"ABCDEFGHIJKL";
204 let mut buf_reader
= BufReader
::new(&testdata
[..]);
205 assert_eq
!(buf_reader
.buffer().len(), 0);
207 let buffer_length
= testdata
.len();
208 buf_reader
.fill_buf().unwrap();
210 // Check that size hint matches buffer contents
211 let mut buffered_bytes
= buf_reader
.bytes();
212 let (lower_bound
, _upper_bound
) = buffered_bytes
.size_hint();
213 assert_eq
!(lower_bound
, buffer_length
);
215 // Check that size hint matches buffer contents after advancing
216 buffered_bytes
.next().unwrap().unwrap();
217 let (lower_bound
, _upper_bound
) = buffered_bytes
.size_hint();
218 assert_eq
!(lower_bound
, buffer_length
- 1);
222 fn empty_size_hint() {
223 let size_hint
= io
::empty().bytes().size_hint();
224 assert_eq
!(size_hint
, (0, Some(0)));
228 fn chain_empty_size_hint() {
229 let chain
= io
::empty().chain(io
::empty());
230 let size_hint
= chain
.bytes().size_hint();
231 assert_eq
!(size_hint
, (0, Some(0)));
235 fn chain_size_hint() {
236 let testdata
= b
"ABCDEFGHIJKL";
237 let mut buf_reader_1
= BufReader
::new(&testdata
[..6]);
238 let mut buf_reader_2
= BufReader
::new(&testdata
[6..]);
240 buf_reader_1
.fill_buf().unwrap();
241 buf_reader_2
.fill_buf().unwrap();
243 let chain
= buf_reader_1
.chain(buf_reader_2
);
244 let size_hint
= chain
.bytes().size_hint();
245 assert_eq
!(size_hint
, (testdata
.len(), None
));
249 fn chain_zero_length_read_is_not_eof() {
252 let mut s
= String
::new();
253 let mut chain
= (&a
[..]).chain(&b
[..]);
254 chain
.read(&mut []).unwrap();
255 chain
.read_to_string(&mut s
).unwrap();
260 #[cfg_attr(target_os = "emscripten", ignore)]
261 fn bench_read_to_end(b
: &mut test
::Bencher
) {
263 let mut lr
= repeat(1).take(10000000);
264 let mut vec
= Vec
::with_capacity(1024);
265 super::read_to_end(&mut lr
, &mut vec
)
270 fn seek_len() -> io
::Result
<()> {
271 let mut c
= Cursor
::new(vec
![0; 15]);
272 assert_eq
!(c
.stream_len()?
, 15);
274 c
.seek(SeekFrom
::End(0))?
;
275 let old_pos
= c
.stream_position()?
;
276 assert_eq
!(c
.stream_len()?
, 15);
277 assert_eq
!(c
.stream_position()?
, old_pos
);
279 c
.seek(SeekFrom
::Start(7))?
;
280 c
.seek(SeekFrom
::Current(2))?
;
281 let old_pos
= c
.stream_position()?
;
282 assert_eq
!(c
.stream_len()?
, 15);
283 assert_eq
!(c
.stream_position()?
, old_pos
);
289 fn seek_position() -> io
::Result
<()> {
290 // All `asserts` are duplicated here to make sure the method does not
291 // change anything about the seek state.
292 let mut c
= Cursor
::new(vec
![0; 15]);
293 assert_eq
!(c
.stream_position()?
, 0);
294 assert_eq
!(c
.stream_position()?
, 0);
296 c
.seek(SeekFrom
::End(0))?
;
297 assert_eq
!(c
.stream_position()?
, 15);
298 assert_eq
!(c
.stream_position()?
, 15);
300 c
.seek(SeekFrom
::Start(7))?
;
301 c
.seek(SeekFrom
::Current(2))?
;
302 assert_eq
!(c
.stream_position()?
, 9);
303 assert_eq
!(c
.stream_position()?
, 9);
305 c
.seek(SeekFrom
::End(-3))?
;
306 c
.seek(SeekFrom
::Current(1))?
;
307 c
.seek(SeekFrom
::Current(-5))?
;
308 assert_eq
!(c
.stream_position()?
, 8);
309 assert_eq
!(c
.stream_position()?
, 8);
314 // A simple example reader which uses the default implementation of
316 struct ExampleSliceReader
<'a
> {
320 impl<'a
> Read
for ExampleSliceReader
<'a
> {
321 fn read(&mut self, buf
: &mut [u8]) -> io
::Result
<usize> {
322 let len
= cmp
::min(self.slice
.len(), buf
.len());
323 buf
[..len
].copy_from_slice(&self.slice
[..len
]);
324 self.slice
= &self.slice
[len
..];
330 fn test_read_to_end_capacity() -> io
::Result
<()> {
331 let input
= &b
"foo"[..];
333 // read_to_end() generally needs to over-allocate, both for efficiency
334 // and so that it can distinguish EOF. Assert that this is the case
335 // with this simple ExampleSliceReader struct, which uses the default
336 // implementation of read_to_end. Even though vec1 is allocated with
337 // exactly enough capacity for the read, read_to_end will allocate more
339 let mut vec1
= Vec
::with_capacity(input
.len());
340 ExampleSliceReader { slice: input }
.read_to_end(&mut vec1
)?
;
341 assert_eq
!(vec1
.len(), input
.len());
342 assert
!(vec1
.capacity() > input
.len(), "allocated more");
344 // However, std::io::Take includes an implementation of read_to_end
345 // that will not allocate when the limit has already been reached. In
346 // this case, vec2 never grows.
347 let mut vec2
= Vec
::with_capacity(input
.len());
348 ExampleSliceReader { slice: input }
.take(input
.len() as u64).read_to_end(&mut vec2
)?
;
349 assert_eq
!(vec2
.len(), input
.len());
350 assert_eq
!(vec2
.capacity(), input
.len(), "did not allocate more");
356 fn io_slice_mut_advance() {
357 let mut buf1
= [1; 8];
358 let mut buf2
= [2; 16];
359 let mut buf3
= [3; 8];
360 let mut bufs
= &mut [
361 IoSliceMut
::new(&mut buf1
),
362 IoSliceMut
::new(&mut buf2
),
363 IoSliceMut
::new(&mut buf3
),
366 // Only in a single buffer..
367 bufs
= IoSliceMut
::advance(bufs
, 1);
368 assert_eq
!(bufs
[0].deref(), [1; 7].as_ref());
369 assert_eq
!(bufs
[1].deref(), [2; 16].as_ref());
370 assert_eq
!(bufs
[2].deref(), [3; 8].as_ref());
372 // Removing a buffer, leaving others as is.
373 bufs
= IoSliceMut
::advance(bufs
, 7);
374 assert_eq
!(bufs
[0].deref(), [2; 16].as_ref());
375 assert_eq
!(bufs
[1].deref(), [3; 8].as_ref());
377 // Removing a buffer and removing from the next buffer.
378 bufs
= IoSliceMut
::advance(bufs
, 18);
379 assert_eq
!(bufs
[0].deref(), [3; 6].as_ref());
383 fn io_slice_mut_advance_empty_slice() {
384 let empty_bufs
= &mut [][..];
386 IoSliceMut
::advance(empty_bufs
, 1);
390 fn io_slice_mut_advance_beyond_total_length() {
391 let mut buf1
= [1; 8];
392 let mut bufs
= &mut [IoSliceMut
::new(&mut buf1
)][..];
394 // Going beyond the total length should be ok.
395 bufs
= IoSliceMut
::advance(bufs
, 9);
396 assert
!(bufs
.is_empty());
400 fn io_slice_advance() {
404 let mut bufs
= &mut [IoSlice
::new(&buf1
), IoSlice
::new(&buf2
), IoSlice
::new(&buf3
)][..];
406 // Only in a single buffer..
407 bufs
= IoSlice
::advance(bufs
, 1);
408 assert_eq
!(bufs
[0].deref(), [1; 7].as_ref());
409 assert_eq
!(bufs
[1].deref(), [2; 16].as_ref());
410 assert_eq
!(bufs
[2].deref(), [3; 8].as_ref());
412 // Removing a buffer, leaving others as is.
413 bufs
= IoSlice
::advance(bufs
, 7);
414 assert_eq
!(bufs
[0].deref(), [2; 16].as_ref());
415 assert_eq
!(bufs
[1].deref(), [3; 8].as_ref());
417 // Removing a buffer and removing from the next buffer.
418 bufs
= IoSlice
::advance(bufs
, 18);
419 assert_eq
!(bufs
[0].deref(), [3; 6].as_ref());
423 fn io_slice_advance_empty_slice() {
424 let empty_bufs
= &mut [][..];
426 IoSlice
::advance(empty_bufs
, 1);
430 fn io_slice_advance_beyond_total_length() {
432 let mut bufs
= &mut [IoSlice
::new(&buf1
)][..];
434 // Going beyond the total length should be ok.
435 bufs
= IoSlice
::advance(bufs
, 9);
436 assert
!(bufs
.is_empty());
439 /// Create a new writer that reads from at most `n_bufs` and reads
440 /// `per_call` bytes (in total) per call to write.
441 fn test_writer(n_bufs
: usize, per_call
: usize) -> TestWriter
{
442 TestWriter { n_bufs, per_call, written: Vec::new() }
451 impl Write
for TestWriter
{
452 fn write(&mut self, buf
: &[u8]) -> io
::Result
<usize> {
453 self.write_vectored(&[IoSlice
::new(buf
)])
456 fn write_vectored(&mut self, bufs
: &[IoSlice
<'_
>]) -> io
::Result
<usize> {
457 let mut left
= self.per_call
;
459 for buf
in bufs
.iter().take(self.n_bufs
) {
460 let n
= min(left
, buf
.len());
461 self.written
.extend_from_slice(&buf
[0..n
]);
468 fn flush(&mut self) -> io
::Result
<()> {
474 fn test_writer_read_from_one_buf() {
475 let mut writer
= test_writer(1, 2);
477 assert_eq
!(writer
.write(&[]).unwrap(), 0);
478 assert_eq
!(writer
.write_vectored(&[]).unwrap(), 0);
480 // Read at most 2 bytes.
481 assert_eq
!(writer
.write(&[1, 1, 1]).unwrap(), 2);
482 let bufs
= &[IoSlice
::new(&[2, 2, 2])];
483 assert_eq
!(writer
.write_vectored(bufs
).unwrap(), 2);
485 // Only read from first buf.
486 let bufs
= &[IoSlice
::new(&[3]), IoSlice
::new(&[4, 4])];
487 assert_eq
!(writer
.write_vectored(bufs
).unwrap(), 1);
489 assert_eq
!(writer
.written
, &[1, 1, 2, 2, 3]);
493 fn test_writer_read_from_multiple_bufs() {
494 let mut writer
= test_writer(3, 3);
496 // Read at most 3 bytes from two buffers.
497 let bufs
= &[IoSlice
::new(&[1]), IoSlice
::new(&[2, 2, 2])];
498 assert_eq
!(writer
.write_vectored(bufs
).unwrap(), 3);
500 // Read at most 3 bytes from three buffers.
501 let bufs
= &[IoSlice
::new(&[3]), IoSlice
::new(&[4]), IoSlice
::new(&[5, 5])];
502 assert_eq
!(writer
.write_vectored(bufs
).unwrap(), 3);
504 assert_eq
!(writer
.written
, &[1, 2, 2, 3, 4, 5]);
508 fn test_write_all_vectored() {
509 #[rustfmt::skip] // Becomes unreadable otherwise.
510 let tests
: Vec
<(_
, &'
static [u8])> = vec
![
512 (vec
![IoSlice
::new(&[]), IoSlice
::new(&[])], &[]),
513 (vec
![IoSlice
::new(&[1])], &[1]),
514 (vec
![IoSlice
::new(&[1, 2])], &[1, 2]),
515 (vec
![IoSlice
::new(&[1, 2, 3])], &[1, 2, 3]),
516 (vec
![IoSlice
::new(&[1, 2, 3, 4])], &[1, 2, 3, 4]),
517 (vec
![IoSlice
::new(&[1, 2, 3, 4, 5])], &[1, 2, 3, 4, 5]),
518 (vec
![IoSlice
::new(&[1]), IoSlice
::new(&[2])], &[1, 2]),
519 (vec
![IoSlice
::new(&[1]), IoSlice
::new(&[2, 2])], &[1, 2, 2]),
520 (vec
![IoSlice
::new(&[1, 1]), IoSlice
::new(&[2, 2])], &[1, 1, 2, 2]),
521 (vec
![IoSlice
::new(&[1, 1]), IoSlice
::new(&[2, 2, 2])], &[1, 1, 2, 2, 2]),
522 (vec
![IoSlice
::new(&[1, 1]), IoSlice
::new(&[2, 2, 2])], &[1, 1, 2, 2, 2]),
523 (vec
![IoSlice
::new(&[1, 1, 1]), IoSlice
::new(&[2, 2, 2])], &[1, 1, 1, 2, 2, 2]),
524 (vec
![IoSlice
::new(&[1, 1, 1]), IoSlice
::new(&[2, 2, 2, 2])], &[1, 1, 1, 2, 2, 2, 2]),
525 (vec
![IoSlice
::new(&[1, 1, 1, 1]), IoSlice
::new(&[2, 2, 2, 2])], &[1, 1, 1, 1, 2, 2, 2, 2]),
526 (vec
![IoSlice
::new(&[1]), IoSlice
::new(&[2]), IoSlice
::new(&[3])], &[1, 2, 3]),
527 (vec
![IoSlice
::new(&[1, 1]), IoSlice
::new(&[2, 2]), IoSlice
::new(&[3, 3])], &[1, 1, 2, 2, 3, 3]),
528 (vec
![IoSlice
::new(&[1]), IoSlice
::new(&[2, 2]), IoSlice
::new(&[3, 3, 3])], &[1, 2, 2, 3, 3, 3]),
529 (vec
![IoSlice
::new(&[1, 1, 1]), IoSlice
::new(&[2, 2, 2]), IoSlice
::new(&[3, 3, 3])], &[1, 1, 1, 2, 2, 2, 3, 3, 3]),
532 let writer_configs
= &[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)];
534 for (n_bufs
, per_call
) in writer_configs
.iter().copied() {
535 for (mut input
, wanted
) in tests
.clone().into_iter() {
536 let mut writer
= test_writer(n_bufs
, per_call
);
537 assert
!(writer
.write_all_vectored(&mut *input
).is_ok());
538 assert_eq
!(&*writer
.written
, &*wanted
);