82 lines
2.9 KiB
Rust
82 lines
2.9 KiB
Rust
// file: crates/ksp-job-api/unit_tests/notification.rs
|
|
// version: 1
|
|
|
|
fn sequence(value: u64) -> crate::JobNotificationSequence {
|
|
let mut sequence = crate::JobNotificationSequence::initial();
|
|
for _ in 0..value {
|
|
sequence = match sequence.next() {
|
|
std::result::Result::Ok(next) => next,
|
|
std::result::Result::Err(_) => return sequence,
|
|
};
|
|
}
|
|
return sequence;
|
|
}
|
|
|
|
#[test]
|
|
fn pre_003_notification_sequence_advances_strictly_and_orders_positions() {
|
|
let mut first = crate::JobNotificationSequence::initial();
|
|
for _ in 0..41 {
|
|
let next = first.next();
|
|
assert!(next.is_ok());
|
|
first = match next {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
}
|
|
let second = first.next();
|
|
assert!(second.is_ok());
|
|
let second = match second {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
assert_eq!(first.value(), 41);
|
|
assert_eq!(second.value(), 42);
|
|
assert!(second.is_after(first));
|
|
assert!(!first.is_after(second));
|
|
assert!(second > first);
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn pre_003_notification_sequence_exhaustion_is_explicit_and_non_wrapping() {
|
|
let exhausted = super::exhausted_notification_sequence().next();
|
|
assert!(exhausted.is_err());
|
|
let error = match exhausted {
|
|
std::result::Result::Err(value) => value,
|
|
std::result::Result::Ok(_) => return,
|
|
};
|
|
assert_eq!(error.code(), crate::ERROR_CODE_JOB_NOTIFICATION_SEQUENCE_EXHAUSTED);
|
|
assert_eq!(error.context().len(), 1);
|
|
assert_eq!(error.context()[0].key(), "sequence");
|
|
assert_eq!(error.context()[0].value(), u64::MAX.to_string());
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn pre_003_notification_preserves_complete_value_and_redacts_snapshot_debug() {
|
|
let id = crate::JobId::new("job-notify-001");
|
|
let kind = crate::JobKindCode::new("backfill_raw");
|
|
assert!(id.is_ok());
|
|
assert!(kind.is_ok());
|
|
let id = match id {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
let kind = match kind {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
let notification =
|
|
crate::JobNotification::new(id.clone(), kind.clone(), sequence(7), crate::JobState::Running, "RAW-PAYLOAD-MUST-NOT-APPEAR-IN-DEBUG".to_string());
|
|
assert_eq!(notification.id(), &id);
|
|
assert_eq!(notification.kind(), &kind);
|
|
assert_eq!(notification.sequence().value(), 7);
|
|
assert_eq!(notification.state(), crate::JobState::Running);
|
|
assert_eq!(notification.snapshot(), "RAW-PAYLOAD-MUST-NOT-APPEAR-IN-DEBUG");
|
|
let debug = std::format!("{notification:?}");
|
|
assert!(debug.contains("JobNotification"));
|
|
assert!(debug.contains("<redacted>"));
|
|
assert!(!debug.contains("RAW-PAYLOAD-MUST-NOT-APPEAR-IN-DEBUG"));
|
|
return;
|
|
}
|