1 | #![warn (rust_2018_idioms)] |
2 | #![cfg (feature = "full" )] |
3 | |
4 | use std::io::ErrorKind; |
5 | use tokio::io::{AsyncBufReadExt, BufReader, Error}; |
6 | use tokio_test::{assert_ok, io::Builder}; |
7 | |
8 | #[tokio::test ] |
9 | async fn read_until() { |
10 | let mut buf = vec![]; |
11 | let mut rd: &[u8] = b"hello world" ; |
12 | |
13 | let n = assert_ok!(rd.read_until(b' ' , &mut buf).await); |
14 | assert_eq!(n, 6); |
15 | assert_eq!(buf, b"hello " ); |
16 | buf.clear(); |
17 | let n = assert_ok!(rd.read_until(b' ' , &mut buf).await); |
18 | assert_eq!(n, 5); |
19 | assert_eq!(buf, b"world" ); |
20 | buf.clear(); |
21 | let n = assert_ok!(rd.read_until(b' ' , &mut buf).await); |
22 | assert_eq!(n, 0); |
23 | assert_eq!(buf, []); |
24 | } |
25 | |
26 | #[tokio::test ] |
27 | async fn read_until_not_all_ready() { |
28 | let mock = Builder::new() |
29 | .read(b"Hello Wor" ) |
30 | .read(b"ld#Fizz \xffBuz" ) |
31 | .read(b"z#1#2" ) |
32 | .build(); |
33 | |
34 | let mut read = BufReader::new(mock); |
35 | |
36 | let mut chunk = b"We say " .to_vec(); |
37 | let bytes = read.read_until(b'#' , &mut chunk).await.unwrap(); |
38 | assert_eq!(bytes, b"Hello World#" .len()); |
39 | assert_eq!(chunk, b"We say Hello World#" ); |
40 | |
41 | chunk = b"I solve " .to_vec(); |
42 | let bytes = read.read_until(b'#' , &mut chunk).await.unwrap(); |
43 | assert_eq!(bytes, b"Fizz \xffBuzz \n" .len()); |
44 | assert_eq!(chunk, b"I solve Fizz \xffBuzz#" ); |
45 | |
46 | chunk.clear(); |
47 | let bytes = read.read_until(b'#' , &mut chunk).await.unwrap(); |
48 | assert_eq!(bytes, 2); |
49 | assert_eq!(chunk, b"1#" ); |
50 | |
51 | chunk.clear(); |
52 | let bytes = read.read_until(b'#' , &mut chunk).await.unwrap(); |
53 | assert_eq!(bytes, 1); |
54 | assert_eq!(chunk, b"2" ); |
55 | } |
56 | |
57 | #[tokio::test ] |
58 | async fn read_until_fail() { |
59 | let mock = Builder::new() |
60 | .read(b"Hello \xffWor" ) |
61 | .read_error(Error::new(ErrorKind::Other, "The world has no end" )) |
62 | .build(); |
63 | |
64 | let mut read = BufReader::new(mock); |
65 | |
66 | let mut chunk = b"Foo" .to_vec(); |
67 | let err = read |
68 | .read_until(b'#' , &mut chunk) |
69 | .await |
70 | .expect_err("Should fail" ); |
71 | assert_eq!(err.kind(), ErrorKind::Other); |
72 | assert_eq!(err.to_string(), "The world has no end" ); |
73 | assert_eq!(chunk, b"FooHello \xffWor" ); |
74 | } |
75 | |