#![cfg(feature = "macro")]
use aerro::tower::{ClientLayer, ServerLayer};
use tower::{Service, ServiceBuilder};
#[global_allocator]
static ALLOC: dhat::Alloc = dhat::Alloc;
#[test]
fn ok_path_is_pass_through_with_no_per_call_aerro_alloc() {
let _profiler = dhat::Profiler::builder().testing().build();
let inner = tower::service_fn(|n: u32| async move { Ok::<u32, ()>(n) });
let mut svc = ServiceBuilder::new()
.layer(ServerLayer::new().service_name("svc").rpc_name("rpc"))
.layer(ClientLayer::new().caller_service("client"))
.service(inner);
let rt = tokio::runtime::Runtime::new().unwrap();
for _ in 0..16 {
let _ = rt.block_on(svc.call(1)).unwrap();
}
let before = dhat::HeapStats::get();
for _ in 0..1000 {
let _ = rt.block_on(svc.call(1)).unwrap();
}
let after = dhat::HeapStats::get();
let bytes_per_iter = (after.total_bytes - before.total_bytes) / 1000;
eprintln!("per-call total bytes allocated (tower + aerro): {bytes_per_iter}");
assert!(
bytes_per_iter < 4096,
"per-iteration alloc {bytes_per_iter} exceeded 4 KB budget"
);
}