Files
tokio/tests/global.rs
T
Alex Crichton 32f2750c2d Start adding a global event loop
This commit starts to add support for a global event loop by adding a
`Handle::default` method and implementing it. Currently the support is quite
rudimentary and doesn't support features such as shutdown, overriding the return
value of `Handle::default`, etc. Those will come as future commits.
2017-12-11 17:26:39 -06:00

38 lines
1.0 KiB
Rust

extern crate futures;
extern crate tokio;
use std::thread;
use futures::prelude::*;
use tokio::net::{TcpStream, TcpListener};
use tokio::reactor::Handle;
macro_rules! t {
($e:expr) => (match $e {
Ok(e) => e,
Err(e) => panic!("{} failed with {:?}", stringify!($e), e),
})
}
#[test]
fn hammer() {
let threads = (0..10).map(|_| {
thread::spawn(|| {
let handle = Handle::default();
let srv = t!(TcpListener::bind(&"127.0.0.1:0".parse().unwrap(), &handle));
let addr = t!(srv.local_addr());
let mine = TcpStream::connect(&addr, &handle);
let theirs = srv.incoming().into_future()
.map(|(s, _)| s.unwrap().0)
.map_err(|(s, _)| s);
let (mine, theirs) = t!(mine.join(theirs).wait());
assert_eq!(t!(mine.local_addr()), t!(theirs.peer_addr()));
assert_eq!(t!(theirs.local_addr()), t!(mine.peer_addr()));
})
}).collect::<Vec<_>>();
for thread in threads {
thread.join().unwrap();
}
}