1 extern crate futures; 2 extern crate tokio_io; 3 extern crate tokio_tcp; 4 5 use std::io::{Read, Write}; 6 use std::net::TcpStream; 7 use std::thread; 8 9 use futures::stream::Stream; 10 use futures::Future; 11 use tokio_io::io::read_to_end; 12 use tokio_tcp::TcpListener; 13 14 macro_rules! t { 15 ($e:expr) => { 16 match $e { 17 Ok(e) => e, 18 Err(e) => panic!("{} failed with {:?}", stringify!($e), e), 19 } 20 }; 21 } 22 23 #[test] limit()24fn limit() { 25 let srv = t!(TcpListener::bind(&t!("127.0.0.1:0".parse()))); 26 let addr = t!(srv.local_addr()); 27 28 let t = thread::spawn(move || { 29 let mut s1 = TcpStream::connect(&addr).unwrap(); 30 s1.write_all(b"foo bar baz").unwrap(); 31 }); 32 33 let clients = srv.incoming().take(1); 34 let copied = clients.collect().and_then(|clients| { 35 let mut clients = clients.into_iter(); 36 let a = clients.next().unwrap(); 37 38 read_to_end(a.take(4), Vec::new()) 39 }); 40 41 let (_, data) = t!(copied.wait()); 42 t.join().unwrap(); 43 44 assert_eq!(data, b"foo "); 45 } 46