diff options
author | Carl Lerche <me@carllerche.com> | 2019-10-25 12:50:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-25 12:50:15 -0700 |
commit | 227533d456fe32e48ffcd3796f1e6c8f9318b230 (patch) | |
tree | 498029aaf42dd64eeb8ef0e7d7f29802b45d4e95 /tokio/tests/uds_datagram.rs | |
parent | 03a9378297c73c2e56a6d6b55db22b92427b850a (diff) |
net: move into tokio crate (#1683)
A step towards collapsing Tokio sub crates into a single `tokio`
crate (#1318).
The `net` implementation is now provided by the main `tokio` crate.
Functionality can be opted out of by using the various net related
feature flags.
Diffstat (limited to 'tokio/tests/uds_datagram.rs')
-rw-r--r-- | tokio/tests/uds_datagram.rs | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/tokio/tests/uds_datagram.rs b/tokio/tests/uds_datagram.rs new file mode 100644 index 00000000..51697b1a --- /dev/null +++ b/tokio/tests/uds_datagram.rs @@ -0,0 +1,69 @@ +#![cfg(unix)] +#![warn(rust_2018_idioms)] + +use tokio::net::unix::*; + +use std::io; + +// struct StringDatagramCodec; + +// /// A codec to decode datagrams from a unix domain socket as utf-8 text messages. +// impl Encoder for StringDatagramCodec { +// type Item = String; +// type Error = io::Error; + +// fn encode(&mut self, item: Self::Item, dst: &mut BytesMut) -> Result<(), Self::Error> { +// dst.extend_from_slice(&item.into_bytes()); +// Ok(()) +// } +// } + +// /// A codec to decode datagrams from a unix domain socket as utf-8 text messages. +// impl Decoder for StringDatagramCodec { +// type Item = String; +// type Error = io::Error; + +// fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> { +// let decoded = str::from_utf8(buf) +// .map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e))? +// .to_string(); + +// Ok(Some(decoded)) +// } +// } + +async fn echo_server(mut socket: UnixDatagram) -> io::Result<()> { + let mut recv_buf = vec![0u8; 1024]; + loop { + let (len, peer_addr) = socket.recv_from(&mut recv_buf[..]).await?; + if let Some(path) = peer_addr.as_pathname() { + socket.send_to(&recv_buf[..len], path).await?; + } + } +} + +#[tokio::test] +async fn echo() -> io::Result<()> { + let dir = tempfile::tempdir().unwrap(); + let server_path = dir.path().join("server.sock"); + let client_path = dir.path().join("client.sock"); + + let server_socket = UnixDatagram::bind(server_path.clone())?; + + tokio::spawn(async move { + if let Err(e) = echo_server(server_socket).await { + eprintln!("Error in echo server: {}", e); + } + }); + + { + let mut socket = UnixDatagram::bind(&client_path).unwrap(); + socket.connect(server_path)?; + socket.send(b"ECHO").await?; + let mut recv_buf = [0u8; 16]; + let len = socket.recv(&mut recv_buf[..]).await?; + assert_eq!(&recv_buf[..len], b"ECHO"); + } + + Ok(()) +} |