use super::*;
#[test]
fn stop_pending_before_the_backoff_ends_the_retry_loop() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("steps/c/001/response.json");
let sleeper = RecSleeper::default();
let stop = AtomicBool::new(true);
let (result, stdins) = run_injected(
&path,
StubAdapter::new(vec![Ok(error_stream(ErrorKind::Transport))]),
retry(3),
false,
&sleeper,
&stop,
);
assert!(matches!(result, Err(Error::AdapterError { .. })));
assert_eq!(stdins.len(), 1, "no further `bz` after a stop");
assert_eq!(sleeper.0.borrow().len(), 0, "no backoff slept under a stop");
}
#[test]
fn stop_landing_during_the_backoff_ends_the_retry_loop() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("steps/c/001/response.json");
let stop = AtomicBool::new(false);
let sleeper = StoppingSleeper {
flag: &stop,
slept: RefCell::new(Vec::new()),
};
let (result, stdins) = run_injected(
&path,
StubAdapter::new(vec![Ok(error_stream(ErrorKind::Transport))]),
retry(3),
false,
&sleeper,
&stop,
);
assert!(matches!(result, Err(Error::AdapterError { .. })));
assert_eq!(sleeper.slept.borrow().len(), 1, "the backoff was entered");
assert_eq!(
stdins.len(),
1,
"the far-side re-read caught the stop before another attempt"
);
}
#[test]
fn no_stop_leaves_the_retry_loop_untouched() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("steps/c/001/response.json");
let sleeper = RecSleeper::default();
let stop = AtomicBool::new(false);
let (result, stdins) = run_injected(
&path,
StubAdapter::new(vec![
Ok(error_stream(ErrorKind::Transport)),
Ok(text_stream("recovered", FinishReason::Stop)),
]),
retry(3),
false,
&sleeper,
&stop,
);
result.unwrap();
assert_eq!(stdins.len(), 2, "the retry ran");
assert_eq!(sleeper.0.borrow().len(), 1);
}