Skip to content

Commit

Permalink
feat(elfo-test): added methods for extracting messages and requests f…
Browse files Browse the repository at this point in the history
…rom envelop
  • Loading branch information
RicoGit committed Feb 26, 2024
1 parent 7f8d746 commit c8139ea
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 2 deletions.
3 changes: 1 addition & 2 deletions elfo-core/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ 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::{MemoryTracker, MemoryCheckResult}, time::Interval};

use crate::{
actor::{Actor, ActorMeta, ActorStartInfo, ActorStatus},
Expand All @@ -19,7 +19,6 @@ use crate::{
context::Context,
demux::Demux,
errors::{RequestError, StartError, StartGroupError},
memory_tracker::MemoryCheckResult,
message,
messages::{StartEntrypoint, Terminate, UpdateConfig},
object::Object,
Expand Down
2 changes: 2 additions & 0 deletions elfo-test/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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;
74 changes: 74 additions & 0 deletions elfo-test/src/utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
use elfo_core::{msg, Envelope, Message, Request, ResponseToken};

/// Extracts message with type [`M`] from [`Envelope`], panics otherwise.
#[track_caller]
pub fn extract_message<M: Message>(msg: Envelope) -> M {
msg!(match msg {
msg @ M => msg,
msg => panic!(
r#"unexpected message: expected {}, got: {}"#,
elfo_core::dumping::extract_name_by_type::<M>(),
msg.message().name()
),
})
}

/// Extracts request message with type [`R`] from [`Envelope`], panics
/// otherwise.
#[track_caller]
pub fn extract_request<R: Request>(msg: Envelope) -> (R, ResponseToken<R>) {
msg!(match msg {
(req @ R, token) => (req, token),
msg => panic!(
r#"unexpected request: expected {}, got: {}"#,
elfo_core::dumping::extract_name_by_type::<R>(),
msg.message().name()
),
})
}

#[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::<TestMessage>(envelop);
assert_eq!(resp, TestMessage);
});
}

#[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::<TestRequest>(envelop);
assert_eq!(resp, TestRequest);
});
}

fn create_scope() -> Scope {
Scope::test(
Addr::NULL,
ActorMeta {
group: "group".into(),
key: "key".into(),
}
.into(),
)
}
}

0 comments on commit c8139ea

Please sign in to comment.