test(format): fuzz Blosc2 decoding for peak allocation

The Blosc2 fuzz tests checked only for panics and the size of the output,
so the offsets-chunk amplification passed all 40,000 iterations.
tests/blosc2_alloc_bounds.rs now measures peak allocation (a counting
global allocator) and asserts it stays within 6x the HDF5 chunk size plus
twice the input plus 2 MiB (ruzstd's fixed state) for:

- 20,000 mutated fixture frames, decoded with their real chunk size as
  the limit, with edits aimed at the frame's and chunks' size fields;
- 20,000 mutated first chunks on their own;
- 5,000 frames built from random header sizes, offsets chunks and B2ND
  shapes (padding chunk and block shapes, chunks larger than the array,
  NaN, zero and repeated-value chunks).

Against the code before this series every test in the file fails (the
fuzz tests at frame iteration 3913, a zstd window, and random frame 289,
the offsets chunk); now the worst frame peaks at 0.48 of the bound.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
osobh
2026-09-26 11:35:08 -05:00
co-authored by Claude Opus 5.5
parent d9e4dfb6e6
commit 2ba4bc97d8
2 changed files with 246 additions and 1 deletions
+2 -1
View File
@@ -1246,7 +1246,8 @@ mod tests {
}
/// Random and mutated frames: errors are fine, panics are not, and no
/// output past the limit.
/// output past the limit. Peak allocation is fuzzed separately, with a
/// counting allocator, in `tests/blosc2_alloc_bounds.rs`.
#[test]
fn fuzzed_frames_never_panic() {
let limit = 20_000;