#![deny(missing_docs)]
use later::core::JobParameter;
use later::retry::{JobRetryPolicy, RetryBackoff, RetryPolicy};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
struct DecodeJob {
value: String,
}
later::background_job! {
struct DecodeServer {
decode_job: DecodeJob,
}
}
struct AppContext {
extra_retries: usize,
}
#[later::async_trait::async_trait]
impl JobRetryPolicy for DecodeJob {
type Context = AppContext;
async fn retry_policy(&self, context: &AppContext) -> anyhow::Result<RetryPolicy> {
Ok(RetryPolicy::fixed(
self.value.len() + context.extra_retries,
std::time::Duration::from_secs(3),
))
}
}
#[test]
fn generated_payload_decode_returns_an_error() {
let result = DecodeJob::try_from_bytes(b"not-message-pack");
assert!(result.is_err());
}
#[test]
fn generated_payload_uses_an_async_context_retry_policy() {
async_std::task::block_on(async {
use later::retry::ResolveRetryPolicy as _;
let message = DecodeJob {
value: "ok".to_string(),
};
let context = AppContext { extra_retries: 3 };
let resolver = later::retry::RetryPolicyResolver::new(&message, &context);
let policy = (&resolver)
.resolve_retry_policy()
.await
.expect("retry policy lookup succeeds")
.expect("DecodeJob defines a retry policy");
assert_eq!(policy.max_retries(), 5);
assert_eq!(
policy.backoff(),
&RetryBackoff::Fixed {
delay: std::time::Duration::from_secs(3),
}
);
});
}