1 #![warn(rust_2018_idioms)]
2 #![cfg(feature = "full")]
3
4 use tokio::io::{join, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, Join, ReadBuf};
5
6 use std::io;
7 use std::pin::Pin;
8 use std::task::{Context, Poll};
9
10 struct R;
11
12 impl AsyncRead for R {
poll_read( self: Pin<&mut Self>, _cx: &mut Context<'_>, buf: &mut ReadBuf<'_>, ) -> Poll<io::Result<()>>13 fn poll_read(
14 self: Pin<&mut Self>,
15 _cx: &mut Context<'_>,
16 buf: &mut ReadBuf<'_>,
17 ) -> Poll<io::Result<()>> {
18 buf.put_slice(&[b'z']);
19 Poll::Ready(Ok(()))
20 }
21 }
22
23 struct W;
24
25 impl AsyncWrite for W {
poll_write( self: Pin<&mut Self>, _cx: &mut Context<'_>, _buf: &[u8], ) -> Poll<Result<usize, io::Error>>26 fn poll_write(
27 self: Pin<&mut Self>,
28 _cx: &mut Context<'_>,
29 _buf: &[u8],
30 ) -> Poll<Result<usize, io::Error>> {
31 Poll::Ready(Ok(1))
32 }
33
poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), io::Error>>34 fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
35 Poll::Ready(Ok(()))
36 }
37
poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), io::Error>>38 fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {
39 Poll::Ready(Ok(()))
40 }
41
poll_write_vectored( self: Pin<&mut Self>, _cx: &mut Context<'_>, _bufs: &[io::IoSlice<'_>], ) -> Poll<Result<usize, io::Error>>42 fn poll_write_vectored(
43 self: Pin<&mut Self>,
44 _cx: &mut Context<'_>,
45 _bufs: &[io::IoSlice<'_>],
46 ) -> Poll<Result<usize, io::Error>> {
47 Poll::Ready(Ok(2))
48 }
49
is_write_vectored(&self) -> bool50 fn is_write_vectored(&self) -> bool {
51 true
52 }
53 }
54
55 #[test]
is_send_and_sync()56 fn is_send_and_sync() {
57 fn assert_bound<T: Send + Sync>() {}
58
59 assert_bound::<Join<W, R>>();
60 }
61
62 #[test]
method_delegation()63 fn method_delegation() {
64 let mut rw = join(R, W);
65 let mut buf = [0; 1];
66
67 tokio_test::block_on(async move {
68 assert_eq!(1, rw.read(&mut buf).await.unwrap());
69 assert_eq!(b'z', buf[0]);
70
71 assert_eq!(1, rw.write(&[b'x']).await.unwrap());
72 assert_eq!(
73 2,
74 rw.write_vectored(&[io::IoSlice::new(&[b'x'])])
75 .await
76 .unwrap()
77 );
78 assert!(rw.is_write_vectored());
79
80 assert!(rw.flush().await.is_ok());
81 assert!(rw.shutdown().await.is_ok());
82 });
83 }
84