feat: Improve multiplexer ergonomics (#111)

This commit is contained in:
Santiago Carmuega 2022-06-04 17:39:29 -03:00 committed by GitHub
parent 4ea3e134c0
commit 159d38020c
18 changed files with 242 additions and 261 deletions

View file

@ -1,36 +1,32 @@
use std::{
net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream},
net::{Ipv4Addr, SocketAddrV4, TcpListener},
thread::{self, JoinHandle},
time::Duration,
};
use log::info;
use pallas_codec::minicbor;
use pallas_multiplexer::{
agents::{Channel, ChannelBuffer},
spawn_demuxer, spawn_muxer, use_channel, StdPlexer,
bearers::Bearer,
StdPlexer,
};
use rand::{distributions::Uniform, Rng};
fn setup_passive_muxer<const P: u16>() -> JoinHandle<StdPlexer<TcpStream>> {
fn setup_passive_muxer<const P: u16>() -> JoinHandle<StdPlexer> {
thread::spawn(|| {
let server = TcpListener::bind(SocketAddrV4::new(Ipv4Addr::LOCALHOST, P)).unwrap();
info!("listening for connections on port {}", P);
let (bearer, _) = server.accept().unwrap();
bearer.set_nonblocking(true).unwrap();
bearer
.set_read_timeout(Some(Duration::from_secs(3)))
.unwrap();
let bearer = Bearer::accept_tcp(server).unwrap();
StdPlexer::new(bearer)
})
}
fn setup_active_muxer<const P: u16>() -> JoinHandle<StdPlexer<TcpStream>> {
fn setup_active_muxer<const P: u16>() -> JoinHandle<StdPlexer> {
thread::spawn(|| {
let bearer = TcpStream::connect(SocketAddrV4::new(Ipv4Addr::LOCALHOST, P)).unwrap();
let bearer = Bearer::connect_tcp(SocketAddrV4::new(Ipv4Addr::LOCALHOST, P)).unwrap();
StdPlexer::new(bearer)
})
}
@ -53,11 +49,11 @@ fn one_way_small_sequence_of_payloads() {
let mut active_plexer = active.join().unwrap();
let mut passive_plexer = passive.join().unwrap();
let mut sender_channel = use_channel(&mut active_plexer, 0x0003u16);
let mut receiver_channel = use_channel(&mut passive_plexer, 0x8003u16);
let mut sender_channel = active_plexer.use_channel(0x0003u16);
let mut receiver_channel = passive_plexer.use_channel(0x8003u16);
let loop1 = spawn_muxer(active_plexer.muxer);
let loop2 = spawn_demuxer(passive_plexer.demuxer);
active_plexer.muxer.spawn();
passive_plexer.demuxer.spawn();
for _ in [0..100] {
let payload = random_payload(50);
@ -65,47 +61,6 @@ fn one_way_small_sequence_of_payloads() {
let received_payload = receiver_channel.dequeue_chunk().unwrap();
assert_eq!(payload, received_payload);
}
loop1.cancel();
loop1.join().unwrap();
loop2.cancel();
loop2.join().unwrap();
}
#[test]
fn threads_cancel_while_still_sending() {
let passive = setup_passive_muxer::<50401>();
// HACK: a small sleep seems to be required for Github actions runner to
// formally expose the port
thread::sleep(std::time::Duration::from_secs(1));
let active = setup_active_muxer::<50401>();
let mut active_plexer = active.join().unwrap();
let mut passive_plexer = passive.join().unwrap();
let mut sender_channel = use_channel(&mut active_plexer, 0x0003u16);
let mut receiver_channel = use_channel(&mut passive_plexer, 0x8003u16);
let loop1 = spawn_muxer(active_plexer.muxer);
let loop2 = spawn_demuxer(passive_plexer.demuxer);
thread::spawn(move || loop {
let payload = random_payload(50);
sender_channel.enqueue_chunk(payload.clone()).unwrap();
let received_payload = receiver_channel.dequeue_chunk().unwrap();
assert_eq!(payload, received_payload);
});
thread::sleep(Duration::from_secs(5));
loop1.cancel();
loop1.join().unwrap();
loop2.cancel();
loop2.join().unwrap();
}
#[test]
@ -130,7 +85,7 @@ fn multiple_messages_in_same_payload() {
}
#[test]
fn fragmented_message_in_multiple_payload() {
fn fragmented_message_in_multiple_payloads() {
let mut input = Vec::new();
let msg = (11u8, 12u8, 13u8, 14u8, 15u8, 16u8, 17u8);
minicbor::encode(msg, &mut input).unwrap();