added llmp testcase;;
This commit is contained in:
parent
a0f186232e
commit
70b3c237e6
@ -193,6 +193,47 @@ impl LlmpMsg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An Llmp instance
|
||||||
|
pub enum LlmpConnection {
|
||||||
|
/// A broker and a thread using this tcp background thread
|
||||||
|
IsBroker {
|
||||||
|
broker: LlmpBroker,
|
||||||
|
listener_thread: thread::JoinHandle<()>,
|
||||||
|
},
|
||||||
|
/// A client, connected to the port
|
||||||
|
IsClient { client: LlmpClient },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LlmpConnection {
|
||||||
|
/// Creates either a broker, if the tcp port is not bound, or a client, connected to this port.
|
||||||
|
pub fn on_port(port: u16) -> Result<Self, AflError> {
|
||||||
|
match TcpListener::bind(format!("127.0.0.1:{}", port)) {
|
||||||
|
Ok(listener) => {
|
||||||
|
// We got the port. We are the broker! :)
|
||||||
|
dbg!("We're the broker");
|
||||||
|
let mut broker = LlmpBroker::new()?;
|
||||||
|
let listener_thread = broker.launch_tcp_listener(listener)?;
|
||||||
|
Ok(LlmpConnection::IsBroker {
|
||||||
|
broker,
|
||||||
|
listener_thread,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
match e.kind() {
|
||||||
|
std::io::ErrorKind::AddrInUse => {
|
||||||
|
// We are the client :)
|
||||||
|
dbg!("We're the client", e);
|
||||||
|
Ok(LlmpConnection::IsClient {
|
||||||
|
client: LlmpClient::create_attach_to_tcp(port)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
_ => Err(AflError::File(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Contents of the share mem pages, used by llmp internally
|
/// Contents of the share mem pages, used by llmp internally
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
#[repr(C, packed)]
|
#[repr(C, packed)]
|
||||||
@ -869,16 +910,28 @@ impl LlmpBroker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn launch_tcp_listener(&mut self, port: u16) -> Result<thread::JoinHandle<()>, AflError> {
|
/// Launches a thread using a tcp listener socket, on which new clients may connect to this broker
|
||||||
|
/// Does so on the given port.
|
||||||
|
pub fn launch_tcp_listener_on(
|
||||||
|
&mut self,
|
||||||
|
port: u16,
|
||||||
|
) -> Result<thread::JoinHandle<()>, AflError> {
|
||||||
|
let listener = TcpListener::bind(format!("127.0.0.1:{}", port))?;
|
||||||
|
// accept connections and process them, spawning a new thread for each one
|
||||||
|
println!("Server listening on port {}", port);
|
||||||
|
return self.launch_tcp_listener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Launches a thread using a tcp listener socket, on which new clients may connect to this broker
|
||||||
|
pub fn launch_tcp_listener(
|
||||||
|
&mut self,
|
||||||
|
listener: TcpListener,
|
||||||
|
) -> Result<thread::JoinHandle<()>, AflError> {
|
||||||
// Later in the execution, after the initial map filled up,
|
// Later in the execution, after the initial map filled up,
|
||||||
// the current broacast map will will point to a different map.
|
// the current broacast map will will point to a different map.
|
||||||
// However, the original map is (as of now) never freed, new clients will start
|
// However, the original map is (as of now) never freed, new clients will start
|
||||||
// to read from the initial map id.
|
// to read from the initial map id.
|
||||||
|
|
||||||
let listener = TcpListener::bind(format!("127.0.0.1:{}", port))?;
|
|
||||||
// accept connections and process them, spawning a new thread for each one
|
|
||||||
println!("Server listening on port {}", port);
|
|
||||||
|
|
||||||
let client_out_map_mem = &self.llmp_out.out_maps.first().unwrap().shmem;
|
let client_out_map_mem = &self.llmp_out.out_maps.first().unwrap().shmem;
|
||||||
let broadcast_str_initial = client_out_map_mem.shm_str.clone();
|
let broadcast_str_initial = client_out_map_mem.shm_str.clone();
|
||||||
|
|
||||||
|
@ -533,12 +533,16 @@ where
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
|
use std::{thread, time::Duration};
|
||||||
|
|
||||||
use crate::events::Event;
|
use crate::events::Event;
|
||||||
use crate::inputs::bytes::BytesInput;
|
use crate::inputs::bytes::BytesInput;
|
||||||
use crate::observers::observer_serde::NamedSerdeAnyMap;
|
use crate::observers::observer_serde::NamedSerdeAnyMap;
|
||||||
use crate::observers::{Observer, StdMapObserver};
|
use crate::observers::{Observer, StdMapObserver};
|
||||||
use crate::serde_anymap::{Ptr, PtrMut};
|
use crate::serde_anymap::{Ptr, PtrMut};
|
||||||
|
|
||||||
|
use super::llmp::{LlmpConnection, Tag};
|
||||||
|
|
||||||
static mut MAP: [u32; 4] = [0; 4];
|
static mut MAP: [u32; 4] = [0; 4];
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -572,4 +576,38 @@ mod tests {
|
|||||||
_ => panic!("mistmatch".to_string()),
|
_ => panic!("mistmatch".to_string()),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::events::tests::LlmpConnection::{IsBroker, IsClient};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn llmp_connection() {
|
||||||
|
let mut broker = match LlmpConnection::on_port(1337).unwrap() {
|
||||||
|
IsClient { client } => panic!("Could not bind to port as broker"),
|
||||||
|
IsBroker {
|
||||||
|
broker,
|
||||||
|
listener_thread,
|
||||||
|
} => broker,
|
||||||
|
};
|
||||||
|
let mut client = match LlmpConnection::on_port(1337).unwrap() {
|
||||||
|
IsBroker {
|
||||||
|
broker,
|
||||||
|
listener_thread,
|
||||||
|
} => panic!("Second connect should be a client!"),
|
||||||
|
IsClient { client } => client,
|
||||||
|
};
|
||||||
|
// Add the first client (2nd, actually, because of the tcp listener client)
|
||||||
|
broker.once().unwrap();
|
||||||
|
assert_eq!(broker.llmp_clients.len(), 2);
|
||||||
|
|
||||||
|
let tag: Tag = 0x1337;
|
||||||
|
let arr: [u8; 1] = [1u8];
|
||||||
|
// Send stuff
|
||||||
|
client.send_buf(tag, &arr).unwrap();
|
||||||
|
// Forward stuff to clients
|
||||||
|
broker.once().unwrap();
|
||||||
|
broker.once().unwrap();
|
||||||
|
let (tag2, arr2) = client.recv_buf_blocking().unwrap();
|
||||||
|
assert_eq!(tag, tag2);
|
||||||
|
assert_eq!(arr[0], arr2[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
use alloc::boxed::Box;
|
use alloc::boxed::Box;
|
||||||
use alloc::rc::Rc;
|
|
||||||
use core::cell::RefCell;
|
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::io::stderr;
|
use std::io::stderr;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user