Files
tokio/tests/udp.rs
T

262 lines
6.6 KiB
Rust
Raw Normal View History

#![allow(deprecated)]
2016-08-02 23:56:01 -07:00
extern crate futures;
2017-10-24 16:30:16 -07:00
extern crate tokio;
2017-10-24 16:41:39 -07:00
#[macro_use]
extern crate tokio_io;
2018-02-07 01:41:31 +04:00
extern crate bytes;
extern crate env_logger;
2016-08-02 23:56:01 -07:00
2016-08-17 09:29:05 -07:00
use std::io;
use std::net::SocketAddr;
2017-09-11 15:56:41 +02:00
use futures::{Future, Poll, Stream, Sink};
2018-02-07 01:41:31 +04:00
2018-02-07 10:42:27 -08:00
use tokio::net::{UdpSocket, UdpFramed};
2018-02-07 01:41:31 +04:00
use tokio_io::codec::{Encoder, Decoder};
use bytes::{BytesMut, BufMut};
2016-08-02 23:56:01 -07:00
macro_rules! t {
($e:expr) => (match $e {
Ok(e) => e,
Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
})
}
fn send_messages<S: SendFn + Clone, R: RecvFn + Clone>(send: S, recv: R) {
let mut a = t!(UdpSocket::bind(&([127, 0, 0, 1], 0).into()));
let mut b = t!(UdpSocket::bind(&([127, 0, 0, 1], 0).into()));
2016-08-02 23:56:01 -07:00
let a_addr = t!(a.local_addr());
let b_addr = t!(b.local_addr());
2017-09-11 15:56:41 +02:00
{
let send = SendMessage::new(a, send.clone(), b_addr, b"1234");
let recv = RecvMessage::new(b, recv.clone(), a_addr, b"1234");
let (sendt, received) = t!(send.join(recv).wait());
2017-09-11 15:56:41 +02:00
a = sendt;
b = received;
}
{
let send = SendMessage::new(a, send, b_addr, b"");
let recv = RecvMessage::new(b, recv, a_addr, b"");
t!(send.join(recv).wait());
2017-09-11 15:56:41 +02:00
}
2016-08-17 09:29:05 -07:00
}
#[test]
fn send_to_and_recv_from() {
2017-10-05 19:57:36 -07:00
send_messages(SendTo {}, RecvFrom {});
}
#[test]
fn send_and_recv() {
2017-10-05 19:57:36 -07:00
send_messages(Send {}, Recv {});
}
trait SendFn {
2018-01-31 20:09:15 -08:00
fn send(&self, &mut UdpSocket, &[u8], &SocketAddr) -> Result<usize, io::Error>;
}
#[derive(Debug, Clone)]
struct SendTo {}
impl SendFn for SendTo {
2018-01-31 20:09:15 -08:00
fn send(&self, socket: &mut UdpSocket, buf: &[u8], addr: &SocketAddr) -> Result<usize, io::Error> {
socket.send_to(buf, addr)
}
}
#[derive(Debug, Clone)]
struct Send {}
impl SendFn for Send {
2018-01-31 20:09:15 -08:00
fn send(&self, socket: &mut UdpSocket, buf: &[u8], addr: &SocketAddr) -> Result<usize, io::Error> {
2017-10-05 19:57:36 -07:00
socket.connect(addr).expect("could not connect");
socket.send(buf)
}
}
struct SendMessage<S> {
2017-09-11 15:56:41 +02:00
socket: Option<UdpSocket>,
send: S,
2016-08-17 09:29:05 -07:00
addr: SocketAddr,
2017-09-11 15:56:41 +02:00
data: &'static [u8],
}
impl<S: SendFn> SendMessage<S> {
fn new(socket: UdpSocket, send: S, addr: SocketAddr, data: &'static [u8]) -> SendMessage<S> {
2017-09-11 15:56:41 +02:00
SendMessage {
socket: Some(socket),
send: send,
2017-10-05 19:57:36 -07:00
addr: addr,
2017-09-11 15:56:41 +02:00
data: data,
}
}
2016-08-17 09:29:05 -07:00
}
2016-08-02 23:56:01 -07:00
impl<S: SendFn> Future for SendMessage<S> {
2017-09-11 15:56:41 +02:00
type Item = UdpSocket;
2016-08-17 09:29:05 -07:00
type Error = io::Error;
2016-08-02 23:56:01 -07:00
2017-09-11 15:56:41 +02:00
fn poll(&mut self) -> Poll<UdpSocket, io::Error> {
2018-01-31 20:09:15 -08:00
let n = try_nb!(self.send.send(self.socket.as_mut().unwrap(), &self.data[..], &self.addr));
2017-09-11 15:56:41 +02:00
assert_eq!(n, self.data.len());
Ok(self.socket.take().unwrap().into())
2016-08-17 09:29:05 -07:00
}
}
trait RecvFn {
2018-01-31 20:09:15 -08:00
fn recv(&self, &mut UdpSocket, &mut [u8], &SocketAddr) -> Result<usize, io::Error>;
}
#[derive(Debug, Clone)]
struct RecvFrom {}
impl RecvFn for RecvFrom {
2018-01-31 20:09:15 -08:00
fn recv(&self, socket: &mut UdpSocket, buf: &mut [u8],
expected_addr: &SocketAddr) -> Result<usize, io::Error> {
socket.recv_from(buf).map(|(s, addr)| {
assert_eq!(addr, *expected_addr);
s
})
}
}
#[derive(Debug, Clone)]
struct Recv {}
impl RecvFn for Recv {
2018-01-31 20:09:15 -08:00
fn recv(&self, socket: &mut UdpSocket, buf: &mut [u8], _: &SocketAddr) -> Result<usize, io::Error> {
socket.recv(buf)
}
}
struct RecvMessage<R> {
2017-09-11 15:56:41 +02:00
socket: Option<UdpSocket>,
recv: R,
expected_addr: SocketAddr,
expected_data: &'static [u8],
2017-09-11 15:56:41 +02:00
}
impl<R: RecvFn> RecvMessage<R> {
fn new(socket: UdpSocket, recv: R, expected_addr: SocketAddr,
expected_data: &'static [u8]) -> RecvMessage<R> {
2017-09-11 15:56:41 +02:00
RecvMessage {
socket: Some(socket),
recv: recv,
expected_addr: expected_addr,
expected_data: expected_data,
2017-09-11 15:56:41 +02:00
}
}
2016-08-17 09:29:05 -07:00
}
2016-08-02 23:56:01 -07:00
impl<R: RecvFn> Future for RecvMessage<R> {
2017-09-11 15:56:41 +02:00
type Item = UdpSocket;
2016-08-17 09:29:05 -07:00
type Error = io::Error;
2016-08-02 23:56:01 -07:00
2017-09-11 15:56:41 +02:00
fn poll(&mut self) -> Poll<UdpSocket, io::Error> {
let mut buf = vec![0u8; 10 + self.expected_data.len() * 10];
2018-01-31 20:09:15 -08:00
let n = try_nb!(self.recv.recv(&mut self.socket.as_mut().unwrap(), &mut buf[..],
&self.expected_addr));
2017-09-11 15:56:41 +02:00
assert_eq!(n, self.expected_data.len());
assert_eq!(&buf[..self.expected_data.len()], &self.expected_data[..]);
2017-09-11 15:56:41 +02:00
Ok(self.socket.take().unwrap().into())
}
}
#[test]
fn send_dgrams() {
let mut a = t!(UdpSocket::bind(&t!("127.0.0.1:0".parse())));
let mut b = t!(UdpSocket::bind(&t!("127.0.0.1:0".parse())));
2017-09-11 15:56:41 +02:00
let mut buf = [0u8; 50];
let b_addr = t!(b.local_addr());
{
2018-01-30 12:49:55 -08:00
let send = a.send_dgram(&b"4321"[..], &b_addr);
2017-09-11 15:56:41 +02:00
let recv = b.recv_dgram(&mut buf[..]);
let (sendt, received) = t!(send.join(recv).wait());
2017-09-11 15:56:41 +02:00
assert_eq!(received.2, 4);
assert_eq!(&received.1[..4], b"4321");
a = sendt.0;
b = received.0;
}
{
2018-01-30 12:49:55 -08:00
let send = a.send_dgram(&b""[..], &b_addr);
2017-09-11 15:56:41 +02:00
let recv = b.recv_dgram(&mut buf[..]);
let received = t!(send.join(recv).wait()).1;
2017-09-11 15:56:41 +02:00
assert_eq!(received.2, 0);
}
}
2018-02-07 01:41:31 +04:00
pub struct ByteCodec;
2017-09-11 15:56:41 +02:00
2018-02-07 01:41:31 +04:00
impl Decoder for ByteCodec {
type Item = Vec<u8>;
2018-01-16 19:49:59 +03:00
type Error = io::Error;
2017-09-11 15:56:41 +02:00
2018-02-07 01:41:31 +04:00
fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Vec<u8>>, io::Error> {
let len = buf.len();
Ok(Some(buf.split_to(len).to_vec()))
2017-09-11 15:56:41 +02:00
}
2018-02-07 01:41:31 +04:00
}
impl Encoder for ByteCodec {
type Item = Vec<u8>;
type Error = io::Error;
2017-09-11 15:56:41 +02:00
2018-02-07 01:41:31 +04:00
fn encode(&mut self, data: Vec<u8>, buf: &mut BytesMut) -> Result<(), io::Error> {
buf.reserve(data.len());
buf.put(data);
Ok(())
2017-09-11 15:56:41 +02:00
}
}
#[test]
fn send_framed() {
2018-02-07 01:41:31 +04:00
drop(env_logger::init());
let mut a_soc = t!(UdpSocket::bind(&t!("127.0.0.1:0".parse())));
let mut b_soc = t!(UdpSocket::bind(&t!("127.0.0.1:0".parse())));
2017-09-11 15:56:41 +02:00
let a_addr = t!(a_soc.local_addr());
let b_addr = t!(b_soc.local_addr());
{
2018-02-07 10:42:27 -08:00
let a = UdpFramed::new(a_soc, ByteCodec);
let b = UdpFramed::new(b_soc, ByteCodec);
2018-02-07 01:41:31 +04:00
let msg = b"4567".to_vec();
2017-09-11 15:56:41 +02:00
2018-02-07 01:41:31 +04:00
let send = a.send((msg.clone(), b_addr));
2017-09-11 15:56:41 +02:00
let recv = b.into_future().map_err(|e| e.0);
let (sendt, received) = t!(send.join(recv).wait());
2018-02-07 01:41:31 +04:00
let (data, addr) = received.0.unwrap();
assert_eq!(msg, data);
assert_eq!(a_addr, addr);
2017-09-11 15:56:41 +02:00
a_soc = sendt.into_inner();
b_soc = received.1.into_inner();
}
{
2018-02-07 10:42:27 -08:00
let a = UdpFramed::new(a_soc, ByteCodec);
let b = UdpFramed::new(b_soc, ByteCodec);
2018-02-07 01:41:31 +04:00
let msg = b"".to_vec();
2017-09-11 15:56:41 +02:00
2018-02-07 01:41:31 +04:00
let send = a.send((msg.clone(), b_addr));
2017-09-11 15:56:41 +02:00
let recv = b.into_future().map_err(|e| e.0);
let received = t!(send.join(recv).wait()).1;
2018-02-07 01:41:31 +04:00
let (data, addr) = received.0.unwrap();
assert_eq!(msg, data);
assert_eq!(a_addr, addr);
2016-08-17 09:29:05 -07:00
}
2016-08-02 23:56:01 -07:00
}