From c841d0287fff503920371629bcbf6f8afca605fe Mon Sep 17 00:00:00 2001 From: "K.Solovev" Date: Mon, 26 Feb 2024 14:05:08 +0400 Subject: [PATCH] feat(elfo-test): added methods for extracting messages and requests from envelop --- elfo-core/src/init.rs | 6 ++- elfo-test/src/lib.rs | 2 + elfo-test/src/utils.rs | 84 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 elfo-test/src/utils.rs diff --git a/elfo-core/src/init.rs b/elfo-core/src/init.rs index b7957cd8..c7a02d00 100644 --- a/elfo-core/src/init.rs +++ b/elfo-core/src/init.rs @@ -10,7 +10,10 @@ use tracing::{error, info, level_filters::LevelFilter, warn}; use elfo_utils::time::Instant; #[cfg(target_os = "linux")] -use crate::{memory_tracker::MemoryTracker, time::Interval}; +use crate::{ + memory_tracker::{MemoryCheckResult, MemoryTracker}, + time::Interval, +}; use crate::{ actor::{Actor, ActorMeta, ActorStartInfo, ActorStatus}, @@ -19,7 +22,6 @@ use crate::{ context::Context, demux::Demux, errors::{RequestError, StartError, StartGroupError}, - memory_tracker::MemoryCheckResult, message, messages::{StartEntrypoint, Terminate, UpdateConfig}, object::Object, diff --git a/elfo-test/src/lib.rs b/elfo-test/src/lib.rs index 19d7cded..79e965f3 100644 --- a/elfo-test/src/lib.rs +++ b/elfo-test/src/lib.rs @@ -1,5 +1,7 @@ #![warn(rust_2018_idioms, unreachable_pub)] pub use proxy::{proxy, Proxy}; +pub use utils::{extract_message, extract_request}; mod proxy; +mod utils; diff --git a/elfo-test/src/utils.rs b/elfo-test/src/utils.rs new file mode 100644 index 00000000..257fc2e3 --- /dev/null +++ b/elfo-test/src/utils.rs @@ -0,0 +1,84 @@ +use elfo_core::{msg, Envelope, Message, Request, ResponseToken}; + +/// Extracts message with type [`M`] from [`Envelope`], panics otherwise. +#[track_caller] +pub fn extract_message(envelope: Envelope) -> M { + msg!(match envelope { + msg @ M => msg, + msg => panic!( + r#"expected {}, got {:#?}"#, + elfo_core::dumping::extract_name_by_type::(), + msg.message() + ), + }) +} + +/// Extracts request message with type [`R`] from [`Envelope`], panics +/// otherwise. +#[track_caller] +pub fn extract_request(envelope: Envelope) -> (R, ResponseToken) { + msg!(match envelope { + (req @ R, token) => (req, token), + msg => panic!( + r#"expected {}, got {:#?}"#, + elfo_core::dumping::extract_name_by_type::(), + msg.message() + ), + }) +} + +#[cfg(test)] +mod tests { + use elfo_core::{_priv::MessageKind, message, scope::Scope, ActorMeta, Addr}; + + use super::*; + + #[message] + #[derive(PartialEq)] + struct TestMessage; + + #[message(ret = ())] + #[derive(PartialEq)] + struct TestRequest; + + #[test] + fn extract_message_test() { + create_scope().sync_within(|| { + let envelop = + Envelope::new(TestMessage, MessageKind::Regular { sender: Addr::NULL }).upcast(); + let resp = extract_message::(envelop); + assert_eq!(resp, TestMessage); + }); + } + + #[test] + #[should_panic(expected = "expected TestMessage, got TestRequest")] + fn extract_message_panic_test() { + create_scope().sync_within(|| { + let envelop = + Envelope::new(TestRequest, MessageKind::Regular { sender: Addr::NULL }).upcast(); + extract_message::(envelop); + }); + } + + #[test] + fn extract_request_test() { + create_scope().sync_within(|| { + let envelop = + Envelope::new(TestRequest, MessageKind::Regular { sender: Addr::NULL }).upcast(); + let (resp, _token) = extract_request::(envelop); + assert_eq!(resp, TestRequest); + }); + } + + fn create_scope() -> Scope { + Scope::test( + Addr::NULL, + ActorMeta { + group: "group".into(), + key: "key".into(), + } + .into(), + ) + } +}