use super::*;
#[tokio::test]
async fn delegate_permanent_error_terminates_master_without_retry() {
let leadership = Arc::new(FakeLeadershipService::new(Some(
LeadershipEvent::StartedLeading,
)));
let platform_service = Arc::new(FakePlatformService::new(leadership));
let create_endpoint_calls = Arc::new(AtomicUsize::new(0));
let create_consumer_calls = Arc::new(AtomicUsize::new(0));
let mut master = build_error_delegate_master(
platform_service,
Arc::clone(&create_endpoint_calls),
Arc::clone(&create_consumer_calls),
Some(CamelError::Config("permanent delegate error".to_string())),
0, None,
0, );
let (tx, _rx) = tokio::sync::mpsc::channel(16);
let cancel = CancellationToken::new();
let ctx = ConsumerContext::new(tx, cancel.clone(), "master-test-route".to_string());
master.start(ctx).await.unwrap();
tokio::time::timeout(Duration::from_millis(750), async {
loop {
if master
.leadership_task
.as_ref()
.is_some_and(tokio::task::JoinHandle::is_finished)
{
break;
}
sleep(Duration::from_millis(5)).await;
}
})
.await
.expect("master must terminate without retry within 750ms");
assert_eq!(
create_endpoint_calls.load(Ordering::SeqCst),
1,
"permanent error must terminate master after exactly 1 invocation"
);
let _ = master.stop().await;
cancel.cancel();
}
#[tokio::test]
async fn delegate_transient_error_retries_and_eventually_succeeds() {
let leadership = Arc::new(FakeLeadershipService::new(Some(
LeadershipEvent::StartedLeading,
)));
let platform_service = Arc::new(FakePlatformService::new(leadership));
let create_endpoint_calls = Arc::new(AtomicUsize::new(0));
let create_consumer_calls = Arc::new(AtomicUsize::new(0));
let mut master = build_error_delegate_master(
platform_service,
Arc::clone(&create_endpoint_calls),
Arc::clone(&create_consumer_calls),
None, 2, Some(CamelError::Io("connection refused".to_string())),
5, );
let (tx, mut rx) = tokio::sync::mpsc::channel(16);
let cancel = CancellationToken::new();
let ctx = ConsumerContext::new(tx, cancel.clone(), "master-test-route".to_string());
master.start(ctx).await.unwrap();
let msg = timeout(Duration::from_secs(2), rx.recv())
.await
.unwrap()
.unwrap();
assert_eq!(msg.exchange.input.body.as_text(), Some("ok"));
assert_eq!(create_endpoint_calls.load(Ordering::SeqCst), 3);
assert_eq!(create_consumer_calls.load(Ordering::SeqCst), 3);
cancel.cancel();
master.stop().await.unwrap();
}