///|
fn status(ok : Bool) -> String {
if ok {
"PASS"
} else {
"FAIL"
}
}
///|
fn main {
let plan = @moonsim.WorkflowPlan::new(worker_count=2)
.add("fetch", 2)
.add("parse", 3, deps=[1])
.add("index", 4, deps=[2])
.add("publish", 1, deps=[3])
let result = @moonsim.run_workflow_model(plan, seed=515UL)
let stream = result.event_stream()
let fault_policy = @moonsim.event_mutation_policy(
seed=515UL,
failure_percent=35,
reorder_same_tick=true,
)
let fault = stream.replay(fault_policy)
let evidence = @moonsim.event_failure_case(
"task_terminal_state_is_stable", stream, fault_policy,
)
let replay = evidence.replay()
let fixed = stream.replay(@moonsim.event_mutation_policy(seed=515UL))
println("workflow reliability")
println("tasks=" + result.tasks.to_string())
println("critical_path=" + result.critical_path.to_string())
println("fault_injected=" + fault.failed.to_string())
println(
"dependency_before_execution=" +
status(result.final_tick == result.critical_path),
)
println(
"terminal_state_no_rollback=" +
status(fault.failed == 0) +
" (expected finding when FAIL)",
)
println("task_completed_once=" + status(fault.duplicated == 0))
println("same_seed_replay=" + status(fault.matches_digest(replay)))
println("fixed_policy=" + status(fixed.failed == 0 && fixed.duplicated == 0))
println("digest=" + fault.digest.to_string())
}