#![cfg(feature = "runtime")]
use nwep::{Address, Bootstrap, Client, Identity, Method, Server, Status};
use std::time::Duration;
fn lo(octet: u8, port: u16) -> Address {
Address::ipv4_mapped(127, 0, 0, octet, port)
}
#[tokio::test]
async fn managed_resolve_by_node_id() {
let (r_port, a_port, g_port) = (19401u16, 19402, 19403);
let r_id = Identity::generate().unwrap();
let r_node = *r_id.node_id();
let r = Server::builder()
.identity(r_id)
.bind(lo(1, r_port))
.dht([Bootstrap::new(&r_node, &lo(1, r_port))])
.serve()
.await
.expect("rendezvous serves");
let r_contact = Bootstrap::new(&r_node, &lo(1, r_port));
let a_id = Identity::generate().unwrap();
let a_node = *a_id.node_id();
let a = Server::builder()
.identity(a_id)
.bind(lo(2, a_port))
.on_request(|req, res| match req.path() {
Some("/ping") => res.ok(b"pong"),
_ => res.not_found(),
})
.dht([r_contact])
.announce_as(lo(2, a_port))
.serve()
.await
.expect("peer serves");
tokio::time::sleep(Duration::from_millis(800)).await;
let resolver = Server::builder()
.identity(Identity::generate().unwrap())
.bind(lo(3, g_port))
.dht([r_contact])
.serve()
.await
.expect("resolver serves");
let addr = resolver
.resolve(&a_node, Duration::from_secs(8))
.await
.expect("resolved A by node_id through the managed dht");
let client = Client::builder()
.identity(Identity::generate().unwrap())
.connect(&a_node, &addr)
.expect("connect to resolved address");
let resp = client.send(Method::Read, "/ping", &[]).unwrap();
assert_eq!(resp.status(), Some(Status::Ok));
assert_eq!(resp.into_body(), b"pong");
let m = resolver.dht_metrics().await.unwrap();
assert!(
m.datagrams_received > 0,
"the managed dht exchanged datagrams"
);
a.shutdown();
resolver.shutdown();
r.shutdown();
}