use std::collections::VecDeque;
use std::net::SocketAddr;
use std::os::fd::RawFd;
use std::sync::Mutex;
use std::time::Duration;
use super::RpcError;
pub trait RpcTransport: Send + Sync {
fn send(&self, buf: &[u8], to: SocketAddr) -> Result<(), RpcError>;
fn recv(&self, timeout: Option<Duration>) -> Result<Option<(Vec<u8>, SocketAddr)>, RpcError>;
fn raw_fd(&self) -> Option<RawFd> {
None
}
}
#[derive(Default)]
pub struct MockRpcTransport {
tx: Mutex<Vec<(Vec<u8>, SocketAddr)>>,
rx: Mutex<VecDeque<(Vec<u8>, SocketAddr)>>,
}
impl MockRpcTransport {
pub fn new() -> Self {
Self::default()
}
pub fn push_rx(&self, bytes: Vec<u8>, from: SocketAddr) {
self.rx.lock().unwrap().push_back((bytes, from));
}
pub fn sent(&self) -> Vec<(Vec<u8>, SocketAddr)> {
self.tx.lock().unwrap().clone()
}
}
impl RpcTransport for MockRpcTransport {
fn send(&self, buf: &[u8], to: SocketAddr) -> Result<(), RpcError> {
self.tx.lock().unwrap().push((buf.to_vec(), to));
Ok(())
}
fn recv(&self, _timeout: Option<Duration>) -> Result<Option<(Vec<u8>, SocketAddr)>, RpcError> {
Ok(self.rx.lock().unwrap().pop_front())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mock_records_sent_and_replays_rx() {
let t = MockRpcTransport::new();
let a: SocketAddr = "172.16.2.100:54766".parse().unwrap();
t.send(&[1, 2], a).unwrap();
assert_eq!(t.sent(), vec![(vec![1, 2], a)]);
t.push_rx(vec![9], a);
assert_eq!(t.recv(None).unwrap(), Some((vec![9], a)));
assert_eq!(t.recv(None).unwrap(), None);
assert_eq!(t.raw_fd(), None);
}
}