diff --git a/elfo-test/Cargo.toml b/elfo-test/Cargo.toml index b30a4641..a8e5d700 100644 --- a/elfo-test/Cargo.toml +++ b/elfo-test/Cargo.toml @@ -21,3 +21,4 @@ futures-intrusive = "0.5" futures = "0.3.12" tracing-subscriber = { version = "0.3", features = ["env-filter"] } once_cell = { version = "1.8.0" } +stability = "0.1.1" diff --git a/elfo-test/src/expect.rs b/elfo-test/src/expect.rs new file mode 100644 index 00000000..277b1c7a --- /dev/null +++ b/elfo-test/src/expect.rs @@ -0,0 +1,25 @@ +use elfo_core::{dumping::extract_name_by_type, msg, Envelope, Message, Request, ResponseToken}; + +#[track_caller] +pub fn expect_message(msg: Envelope) -> T { + msg!(match msg { + msg @ T => msg, + msg => panic!( + r#"unexpected message: expected "{}", got "{}""#, + extract_name_by_type::(), + msg.message().name() + ), + }) +} + +#[track_caller] +pub fn expect_request(msg: Envelope) -> (T, ResponseToken) { + msg!(match msg { + (msg @ T, token) => (msg, token), + msg => panic!( + r#"unexpected request: expected "{}", got "{}""#, + extract_name_by_type::(), + msg.message().name() + ), + }) +} diff --git a/elfo-test/src/lib.rs b/elfo-test/src/lib.rs index 19d7cded..03959656 100644 --- a/elfo-test/src/lib.rs +++ b/elfo-test/src/lib.rs @@ -1,5 +1,10 @@ #![warn(rust_2018_idioms, unreachable_pub)] +pub use expect::{expect_message, expect_request}; pub use proxy::{proxy, Proxy}; +#[cfg(feature = "unstable")] +pub use proxy::proxy_with_route; + +mod expect; mod proxy; diff --git a/elfo-test/src/proxy.rs b/elfo-test/src/proxy.rs index 594a433f..af1c42e9 100644 --- a/elfo-test/src/proxy.rs +++ b/elfo-test/src/proxy.rs @@ -224,7 +224,16 @@ fn testers(tx: shared::OneshotSender) -> Blueprint { }) } -pub async fn proxy(blueprint: Blueprint, config: impl for<'de> Deserializer<'de>) -> Proxy { +#[doc(hidden)] +#[stability::unstable] +pub async fn proxy_with_route( + blueprint: Blueprint, + route_filter: F, + config: impl for<'de> Deserializer<'de>, +) -> Proxy +where + F: Fn(&Envelope) -> bool + Send + Sync + 'static, +{ let _ = tracing_subscriber::fmt() .with_target(false) .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) @@ -244,7 +253,7 @@ pub async fn proxy(blueprint: Blueprint, config: impl for<'de> Deserializer<'de> let subject_addr = subject.addr(); testers.route_all_to(&subject); - subject.route_all_to(&testers); + subject.route_to(&testers, route_filter); // TODO: capture log messages. // TODO: capture metrics. @@ -271,6 +280,10 @@ pub async fn proxy(blueprint: Blueprint, config: impl for<'de> Deserializer<'de> } } +pub async fn proxy(blueprint: Blueprint, config: impl for<'de> Deserializer<'de>) -> Proxy { + proxy_with_route(blueprint, |_| true, config).await +} + #[cfg(test)] mod tests { use super::*;