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]
read_until()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]
read_until_not_all_ready()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]
read_until_fail()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