mock_io/mock_listener/
sync.rs1use std::sync::mpsc::{channel, Receiver, Sender};
2
3use crate::{error::Error, sync::MockStream};
4
5#[derive(Debug)]
6pub struct MockListener {
8 receiver: Receiver<MockStream>,
9}
10
11impl MockListener {
12 pub fn new() -> (Self, Handle) {
14 let (sender, receiver) = channel();
15
16 (Self { receiver }, Handle { sender })
17 }
18
19 pub fn accept(&self) -> Result<MockStream, Error> {
21 self.receiver.recv().map_err(Into::into)
22 }
23}
24
25pub struct Handle {
27 sender: Sender<MockStream>,
28}
29
30impl Handle {
31 pub(crate) fn send(&self, mock_stream: MockStream) -> Result<(), Error> {
32 self.sender.send(mock_stream).map_err(Into::into)
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 use std::{
41 io::{Read, Write},
42 thread,
43 };
44
45 #[test]
46 fn check_listener_flow() {
47 let (listener, handle) = MockListener::new();
48
49 thread::spawn(move || {
50 let mut stream = MockStream::connect(&handle).unwrap();
51 stream.write(&1u64.to_be_bytes()).unwrap();
52 stream.write(&2u64.to_be_bytes()).unwrap();
53 });
54
55 while let Ok(mut stream) = listener.accept() {
56 let mut buf = [0; 8];
57
58 stream.read(&mut buf).unwrap();
59 assert_eq!(1u64.to_be_bytes(), buf);
60
61 stream.read(&mut buf).unwrap();
62 assert_eq!(2u64.to_be_bytes(), buf);
63 }
64 }
65}