test(engine): wall-clock-bounded loop for pull_failure flake
The fixed 5-update budget in `pull_failure_sets_error_status` was the last test still subject to the AsyncComputeTaskPool starvation mode that v0.19.0's auto-save fix already cleared. Under heavy parallel cargo-test load, 5 updates wasn't always enough for the failing pull task to surface its Err and flip SyncStatusResource to Error. Pumps updates in a loop bounded by a 5-second deadline (with std::thread::yield_now between iterations to give the task pool a chance to run), exiting as soon as the status flips. Mirrors the auto-save flake fix shape — a healthy run hits the assertion in a handful of frames, while a starved run gets the budget it needs without hanging the suite. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -502,10 +502,28 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn pull_failure_sets_error_status() {
|
fn pull_failure_sets_error_status() {
|
||||||
let mut app = headless_app_with(FailingProvider);
|
let mut app = headless_app_with(FailingProvider);
|
||||||
// Pump frames until the task resolves (it's synchronous under
|
// Wall-clock-bounded loop instead of a fixed 5-update budget.
|
||||||
// AsyncComputeTaskPool in test mode, so a few updates suffice).
|
// Under heavy parallel cargo-test load the AsyncComputeTaskPool
|
||||||
for _ in 0..5 {
|
// can be starved long enough that 5 updates aren't sufficient
|
||||||
|
// for the failing pull to surface. Pumping until either the
|
||||||
|
// status flips to `Error` or a 5-second deadline elapses
|
||||||
|
// mirrors the auto-save flake fix and turns this test from
|
||||||
|
// "pass on a fast machine" into "pass on any machine that
|
||||||
|
// makes meaningful progress".
|
||||||
|
let deadline =
|
||||||
|
std::time::Instant::now() + std::time::Duration::from_secs(5);
|
||||||
|
loop {
|
||||||
app.update();
|
app.update();
|
||||||
|
if matches!(
|
||||||
|
app.world().resource::<SyncStatusResource>().0,
|
||||||
|
SyncStatus::Error(_)
|
||||||
|
) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if std::time::Instant::now() >= deadline {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::thread::yield_now();
|
||||||
}
|
}
|
||||||
let status = &app.world().resource::<SyncStatusResource>().0;
|
let status = &app.world().resource::<SyncStatusResource>().0;
|
||||||
assert!(
|
assert!(
|
||||||
|
|||||||
Reference in New Issue
Block a user