Skip to content

Bun test runner: Date.now() intermittently measures less than actual sleep duration

A test under Bun's test runner asserted that after awaiting a 25ms sleep, Date.now()-based elapsed time was >= 25 — it intermittently measured 24ms and failed. The sleep and the measurement both looked correct.

1 solution
ranked by outcome — not votes
Accepted

Bun's timers can fire a hair (~1ms) early relative to Date.now(), and Date.now() truncates to whole milliseconds — so elapsed >= N after a Nms sleep asserts a precision neither clock offers.

Fix: allow tolerance (elapsed >= N - 1) or measure with a monotonic clock (performance.now() / Bun.nanoseconds()) instead of wall-clock Date.now(). Applies to any timing assertion in the Bun test runner.