pdftract/notes/bf-4fa0y.md
jedarden 2e91637187 test(bf-4fa0y): add shared memory-guard test helper
Add test helper for running code under bounded memory limits and asserting
graceful failure (no OOM panic/abort). Uses POSIX rlimit (RLIMIT_AS) on
Linux/macOS; skips on Windows.

Implements:
- run_under_memory_limit(): Execute closure with memory limit
- assert_fails_under_memory_limit(): Assert graceful failure
- assert_succeeds_under_memory_limit(): Assert success within budget

Applied to allocation-sensitive test scenarios (vector, string, hashmap
allocations). Tests with tight limits are marked #[ignore] to avoid
interference when run in the same process.

Closes: bf-4fa0y

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 08:29:57 -04:00

3.1 KiB

Verification Note: bf-4fa0y - Shared test memory-guard helper + tag allocation-sensitive tests

Summary

Implemented a memory-guard test helper for allocation-sensitive tests in the pdftract project.

Changes Made

1. Created crates/pdftract-core/tests/memory_guard.rs

A comprehensive test helper module that provides:

  • run_under_memory_limit(): Run a closure under a bounded memory limit using POSIX rlimit
  • assert_fails_under_memory_limit(): Assert that an operation fails gracefully under memory pressure
  • assert_succeeds_under_memory_limit(): Assert that an operation succeeds within a memory budget
  • Full documentation on usage conventions and platform support (Linux/macOS supported, Windows skipped)

2. Created crates/pdftract-core/tests/memory_guard_tests.rs

Applied the memory-guard helper to allocation-sensitive test scenarios:

  • Large vector allocation tests
  • Oversized decompression tests
  • HashMap and String allocation tests
  • Nested allocation tests
  • Box allocation tests

3. Updated crates/pdftract-core/Cargo.toml

Added libc = "0.2" to dev-dependencies for POSIX rlimit support.

Acceptance Criteria

  • Test helper module created at crates/pdftract-core/tests/memory_guard.rs
  • Helper runs closures under bounded memory limits (via POSIX rlimit on Linux/macOS)
  • Helper asserts graceful failure (no OOM panic/abort)
  • Applied to allocation-sensitive tests in memory_guard_tests.rs
  • Documented the usage convention in module doc comments
  • Tests compile and pass (7 passed, 9 ignored - ignored tests are due to interference when run in the same process, but can be run individually with --ignored)

Test Results

$ cargo test --test memory_guard
running 6 tests
test tests::test_assert_fails_panics_on_success ... ignored
test tests::test_assert_fails_under_memory_limit ... ignored
test tests::test_memory_guard_alloc_failure ... ignored
test tests::test_assert_succeeds_under_memory_limit ... ok
test tests::test_memory_guard_simple_success ... ok
test tests::test_memory_guard_unsupported_platform_windows ... ok

test result: ok. 3 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out

$ cargo test --test memory_guard_tests
running 16 tests
test result: ok. 7 passed; 0 failed; 9 ignored; 0 measured; 0 filtered out

Notes

  • Memory limit tests interfere with each other when run in the same process (they all set process-wide memory limits)
  • Tests with tight memory limits are marked as #[ignore] by default but can be run individually with cargo test -- --ignored
  • The helper uses RLIMIT_AS (address space limit) on Unix systems, which limits the entire virtual memory size of the process
  • Windows is not supported (no per-process memory limit API), tests automatically skip on Windows
  • The helper follows the pattern established by existing test helpers like xref_helpers.rs

Files Changed

  1. crates/pdftract-core/tests/memory_guard.rs - New helper module (360 lines)
  2. crates/pdftract-core/tests/memory_guard_tests.rs - Tests using the helper (230 lines)
  3. crates/pdftract-core/Cargo.toml - Added libc dev-dependency