use std::{net::SocketAddr, time::Instant};
use crossbeam_channel::{Receiver, Sender};
use crate::net::{ConnectionManager, LinkConditioner, VirtualConnection};
use crate::test_utils::*;
use crate::{error::Result, Config, Packet, SocketEvent};
pub struct FakeSocket {
handler: ConnectionManager<EmulatedSocket, VirtualConnection>,
}
impl FakeSocket {
pub fn bind(network: &NetworkEmulator, addr: SocketAddr, config: Config) -> Result<Self> {
Ok(Self {
handler: ConnectionManager::new(network.new_socket(addr)?, config),
})
}
pub fn get_packet_sender(&self) -> Sender<Packet> {
self.handler.event_sender().clone()
}
pub fn get_event_receiver(&self) -> Receiver<SocketEvent> {
self.handler.event_receiver().clone()
}
pub fn send(&mut self, packet: Packet) -> Result<()> {
self.handler.event_sender().send(packet).unwrap();
Ok(())
}
pub fn recv(&mut self) -> Option<SocketEvent> {
if let Ok(event) = self.handler.event_receiver().try_recv() {
Some(event)
} else {
None
}
}
pub fn manual_poll(&mut self, time: Instant) {
self.handler.manual_poll(time);
}
pub fn connection_count(&self) -> usize {
self.handler.connections_count()
}
pub fn set_link_conditioner(&mut self, conditioner: Option<LinkConditioner>) {
self.handler.socket_mut().set_link_conditioner(conditioner);
}
}