use iroh::protocol::ProtocolHandler;
use p2panda_core::test_utils::setup_logging;
use crate::address_book::AddressBook;
use crate::iroh_endpoint::Endpoint;
use crate::test_utils::test_args;
const ECHO_PROTOCOL_ID: &[u8] = b"test/echo/v1";
#[derive(Debug)]
struct EchoProtocol;
impl ProtocolHandler for EchoProtocol {
async fn accept(
&self,
connection: iroh::endpoint::Connection,
) -> Result<(), iroh::protocol::AcceptError> {
let (mut tx, mut rx) = connection.accept_bi().await?;
let _bytes_sent = tokio::io::copy(&mut rx, &mut tx).await?;
tx.finish()?;
connection.closed().await;
Ok(())
}
}
#[tokio::test]
async fn establish_connection() {
setup_logging();
let mut alice_args = test_args();
let bob_args = test_args();
let alice_address_book = AddressBook::builder().spawn().await.unwrap();
let bob_address_book = AddressBook::builder().spawn().await.unwrap();
let alice_endpoint = Endpoint::builder(alice_address_book)
.config(alice_args.iroh_config.clone())
.signing_key(alice_args.signing_key.clone())
.spawn()
.await
.unwrap();
let bob_endpoint = Endpoint::builder(bob_address_book.clone())
.config(bob_args.iroh_config.clone())
.signing_key(bob_args.signing_key.clone())
.spawn()
.await
.unwrap();
alice_endpoint
.accept(ECHO_PROTOCOL_ID, EchoProtocol)
.await
.unwrap();
bob_address_book
.insert_node_info(alice_args.node_info())
.await
.unwrap();
let connection = bob_endpoint
.connect(alice_args.verifying_key, ECHO_PROTOCOL_ID)
.await
.expect("connection establishment should not fail");
let (mut tx, mut rx) = connection.open_bi().await.expect("establish bi-di stream");
tx.write_all(b"i feel so").await.unwrap();
tx.finish().unwrap();
let response = rx.read_to_end(1000).await.unwrap();
assert_eq!(&response, b"i feel so");
connection.close(0u32.into(), b"bye!");
}