summaryrefslogtreecommitdiffstats
path: root/tokio/tests/uds_datagram.rs
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2019-10-25 12:50:15 -0700
committerGitHub <noreply@github.com>2019-10-25 12:50:15 -0700
commit227533d456fe32e48ffcd3796f1e6c8f9318b230 (patch)
tree498029aaf42dd64eeb8ef0e7d7f29802b45d4e95 /tokio/tests/uds_datagram.rs
parent03a9378297c73c2e56a6d6b55db22b92427b850a (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.rs69
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(())
+}