1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
extern crate env_logger;
extern crate socket_relay;
extern crate tokio_core;
use std::net::{SocketAddr, UdpSocket};
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
use socket_relay::udp::Relay;
use tokio_core::reactor::Core;
#[test]
fn test() {
env_logger::init().unwrap();
let socket = UdpSocket::bind("127.0.0.1:0").unwrap();
socket
.set_read_timeout(Some(Duration::from_secs(1)))
.unwrap();
let mut buffer = [0; 100];
let relay_listen_addr = spawn_relay(socket.local_addr().unwrap());
let test_data = [9, 88, 5, 2];
socket.send_to(&test_data, relay_listen_addr).unwrap();
let (len1, relay_src1) = socket.recv_from(&mut buffer).unwrap();
assert_eq!(&buffer[..len1], &test_data);
let reply_test_data = [1, 2, 6, 100];
socket.send_to(&reply_test_data, relay_src1).unwrap();
let (len2, relay_src2) = socket.recv_from(&mut buffer).unwrap();
assert_eq!(relay_src2, relay_listen_addr);
assert_eq!(&buffer[..len2], &reply_test_data);
}
fn spawn_relay(destination_addr: SocketAddr) -> SocketAddr {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let mut core = Core::new().unwrap();
let handle = core.handle();
let relay = Relay::new(
"127.0.0.1:0".parse().unwrap(),
"127.0.0.1".parse().unwrap(),
destination_addr,
handle,
).unwrap();
println!("Relay listening on {}", relay.listen_addr());
tx.send(relay.listen_addr()).unwrap();
let _ = core.run(relay);
println!("Relay exiting")
});
rx.recv().unwrap()
}
|