use bacnet_transport::mstp::SerialPort;
use bacnet_types::error::Error;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::sync::Mutex;
use tokio_serial::{SerialPort as _, SerialStream};
use super::mstp_monitor::{join_and_discover, peer_server, propose, Run};
use super::*;
use crate::tui::monitor::Lines;
struct Line(Mutex<SerialStream>);
impl SerialPort for Line {
async fn write(&self, data: &[u8]) -> Result<(), Error> {
let mut line = self.0.lock().await;
line.write_all(data).await.map_err(Error::Transport)
}
async fn read(&self, buf: &mut [u8]) -> Result<usize, Error> {
self.0
.lock()
.await
.read(buf)
.await
.map_err(Error::Transport)
}
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn the_monitor_hands_a_pseudo_terminal_to_the_participant() {
let (peer_end, tui_end) = SerialStream::pair().unwrap();
let path = tui_end.name().expect("the pseudo-terminal's path");
let mut server = peer_server(Line(Mutex::new(peer_end))).await;
let mut run = Run::on(Lines::System, &path, false);
run.listen_for(Duration::ZERO).await;
run.press(KeyCode::Char(':')).await;
type_text(&mut run.app, "mstp listen 2");
run.press(KeyCode::Enter).await;
let settings = propose(&mut run).await;
assert_eq!((settings.mac, settings.max_master), (3, 10));
assert_eq!(settings.port, path);
join_and_discover(&mut run, &settings, false).await;
assert_eq!(run.quit().await, b"");
server.stop().await.unwrap();
drop(tui_end);
}