use bytes::Bytes;
use deadline::deadline;
use tokio::time::sleep;
use tracing::*;
mod common;
use std::time::Duration;
use pea2pea::{
Pea2Pea,
protocols::{Reading, Writing},
};
impl common::TestNode {
fn send_periodic_broadcasts(&self) {
let self_clone = self.clone();
tokio::spawn(async move {
let message = "hello there ( ͡° ͜ʖ ͡°)";
let bytes = Bytes::from(message.as_bytes());
loop {
if self_clone.node().num_connected() != 0 {
info!(parent: self_clone.node().span(), "sending \"{message}\" to all my frens");
self_clone.broadcast(bytes.clone()).unwrap();
} else {
info!(parent: self_clone.node().span(), "meh, I have no frens to chat with",);
}
sleep(Duration::from_millis(50)).await;
}
});
}
}
#[tokio::test]
async fn broadcast_example() {
let random_nodes = common::start_test_nodes(4).await;
for rando in &random_nodes {
rando.enable_reading().await;
}
let broadcaster = crate::test_node!("chatty");
broadcaster.enable_writing().await;
broadcaster.send_periodic_broadcasts();
for rando in &random_nodes {
broadcaster
.0
.connect(rando.node().listening_addr().await.unwrap())
.await
.unwrap();
}
deadline!(Duration::from_secs(1), move || random_nodes
.iter()
.all(|rando| rando.node().stats().received().0 >= 2));
}