use async_std::task;
use std::io::prelude::*;
use std::io::Write;
use std::net::TcpListener;
use std::net::{Shutdown, TcpStream};
use std::thread;
use std::time::Duration;
fn echo_server(addr: &str) -> String {
let server = TcpListener::bind(addr).unwrap();
let mut stream = server.incoming().next().unwrap().unwrap();
let mut res = String::new();
stream.read_to_string(&mut res).unwrap();
stream.write_all(res.as_bytes()).unwrap();
res
}
fn echo_client(addr: &str, expected: &str) -> String {
thread::sleep(Duration::from_secs(1));
let mut client = TcpStream::connect(addr).unwrap();
client.write_all(expected.as_bytes()).unwrap();
client.shutdown(Shutdown::Write).unwrap();
let mut res = String::new();
client.read_to_string(&mut res).unwrap();
res
}
fn run_tcp_clone(
listen_addr: &'static str,
target_addr: &'static str,
client_tx_observer_addrs: Vec<&'static str>,
client_rx_observer_addrs: Vec<&'static str>,
) {
thread::spawn(move || {
task::block_on(async move {
let _ = tcp_clone::run(
listen_addr.parse().unwrap(),
target_addr.parse().unwrap(),
client_tx_observer_addrs
.iter()
.map(|addr| addr.parse().unwrap())
.collect(),
client_rx_observer_addrs
.iter()
.map(|addr| addr.parse().unwrap())
.collect(),
)
.await;
})
});
}
#[test]
fn echo_server_client() {
thread::spawn(|| assert_eq!("hello", echo_server("127.0.0.1:2000")));
assert_eq!("hello", echo_client("127.0.0.1:2000", "hello"));
}
#[test]
fn echo_server_proxy() {
run_tcp_clone("127.0.0.1:1111", "127.0.0.1:2001", vec![], vec![]);
thread::spawn(|| assert_eq!("hello", echo_server("127.0.0.1:2001")));
assert_eq!("hello", echo_client("127.0.0.1:1111", "hello"));
}
#[test]
fn echo_server_proxy_with_observers() {
run_tcp_clone(
"127.0.0.1:2222",
"127.0.0.1:2002",
vec!["127.0.0.1:3002", "127.0.0.1:4002"],
vec![],
);
thread::spawn(|| assert_eq!("hello", echo_server("127.0.0.1:2002")));
thread::spawn(|| assert_eq!("hello", echo_server("127.0.0.1:3002")));
thread::spawn(|| assert_eq!("hello", echo_server("127.0.0.1:4002")));
assert_eq!("hello", echo_client("127.0.0.1:2222", "hello"));
}