118 lines
4.6 KiB
Rust
118 lines
4.6 KiB
Rust
// file: crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs
|
|
// version: 4
|
|
|
|
#[test]
|
|
fn generated_run_ids_are_backend_owned_bounded_and_unique_in_session() {
|
|
let state = crate::BackfillRunState::new();
|
|
let first = state.next_job_id();
|
|
let second = state.next_job_id();
|
|
assert!(first.is_ok());
|
|
assert!(second.is_ok());
|
|
let first = match first {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
let second = match second {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
assert_ne!(first, second);
|
|
assert!(first.as_str().starts_with("backfill-desk-"));
|
|
assert!(second.as_str().starts_with("backfill-desk-"));
|
|
assert!(first.as_str().len() <= ksp_job_api::MAX_JOB_ID_BYTES);
|
|
assert!(second.as_str().len() <= ksp_job_api::MAX_JOB_ID_BYTES);
|
|
}
|
|
|
|
fn cancellable_runtime(
|
|
job_id: &str,
|
|
) -> std::option::Option<(ksp_job_api::JobId, ksp_job_backfill_lib::BackfillRequest, ksp_job_backfill_lib::BackfillJobRuntime)> {
|
|
let job_id = match ksp_job_api::JobId::new(job_id) {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return std::option::Option::None,
|
|
};
|
|
let network = match ksp_store_lib::RawNetworkId::new("mainnet") {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return std::option::Option::None,
|
|
};
|
|
let request = ksp_job_backfill_lib::BackfillRequest::new(
|
|
job_id.clone(),
|
|
network,
|
|
ksp_onchain_transport_lib::HttpRoleName::new("backfill_pool"),
|
|
ksp_job_backfill_lib::BackfillCommitment::Finalized,
|
|
ksp_job_backfill_lib::BackfillScope::latest_address(ksp_core_lib::Pubkey::new_from_array([1_u8; 32])),
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
std::option::Option::None,
|
|
);
|
|
let request = match request {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return std::option::Option::None,
|
|
};
|
|
let retained_request = request.clone();
|
|
let runtime = match ksp_job_backfill_lib::BackfillJobRuntime::new(request) {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return std::option::Option::None,
|
|
};
|
|
return std::option::Option::Some((job_id, retained_request, runtime));
|
|
}
|
|
|
|
#[test]
|
|
fn targeted_cancel_is_idempotent_and_rejects_stale_job_identity() {
|
|
let state = crate::BackfillRunState::new();
|
|
let runtime = cancellable_runtime("backfill-desk-41");
|
|
assert!(runtime.is_some());
|
|
let (job_id, request, runtime) = match runtime {
|
|
std::option::Option::Some(value) => value,
|
|
std::option::Option::None => return,
|
|
};
|
|
let installed = state.install(job_id.clone(), runtime.handle(), request);
|
|
assert!(installed.is_ok());
|
|
let first = state.cancel(job_id.as_str());
|
|
assert!(first.is_ok());
|
|
if let std::result::Result::Ok(first) = first {
|
|
assert!(first.accepted);
|
|
assert_eq!(first.state, "cancelling");
|
|
}
|
|
let repeated = state.cancel(job_id.as_str());
|
|
assert!(repeated.is_ok());
|
|
if let std::result::Result::Ok(repeated) = repeated {
|
|
assert!(!repeated.accepted);
|
|
assert_eq!(repeated.state, "cancelling");
|
|
}
|
|
let stale = state.cancel("backfill-desk-40");
|
|
assert!(stale.is_err());
|
|
if let std::result::Result::Err(error) = stale {
|
|
assert_eq!(error.code().domain(), crate::ERROR_CODE_BACKFILL_RUN_MISMATCH.domain());
|
|
assert_eq!(error.code().code(), crate::ERROR_CODE_BACKFILL_RUN_MISMATCH.code());
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn resume_requires_terminal_checkpoint_and_rejects_active_run() {
|
|
let state = crate::BackfillRunState::new();
|
|
let next = match ksp_job_api::JobId::new("backfill-desk-50") {
|
|
std::result::Result::Ok(value) => value,
|
|
std::result::Result::Err(_) => return,
|
|
};
|
|
let unavailable = state.resume_request(next.clone());
|
|
assert!(unavailable.is_err());
|
|
if let std::result::Result::Err(error) = unavailable {
|
|
assert_eq!(error.code(), crate::ERROR_CODE_BACKFILL_RESUME_UNAVAILABLE);
|
|
}
|
|
let runtime = cancellable_runtime("backfill-desk-49");
|
|
assert!(runtime.is_some());
|
|
let (job_id, request, runtime) = match runtime {
|
|
std::option::Option::Some(value) => value,
|
|
std::option::Option::None => return,
|
|
};
|
|
let installed = state.install(job_id, runtime.handle(), request);
|
|
assert!(installed.is_ok());
|
|
let active = state.resume_request(next);
|
|
assert!(active.is_err());
|
|
if let std::result::Result::Err(error) = active {
|
|
assert_eq!(error.code(), crate::ERROR_CODE_BACKFILL_RUN_ACTIVE);
|
|
}
|
|
}
|