Coverage for tests/io/test_fuzz_parsers.py: 94%
31 statements
« prev ^ index » next coverage.py v7.15.1, created at 2026-07-18 05:24 +0000
« prev ^ index » next coverage.py v7.15.1, created at 2026-07-18 05:24 +0000
1import os
2import random
3from pathlib import Path
4import pytest
5from evutils.io import EventReader, EventWriter
6from evutils.types import Event_dtype
7import numpy as np
9FORMATS = [("evt3", "raw"), ("evt4", "raw"), ("evt2", "raw"), ("evt21", "raw"), ("dat", "dat"), ("csv", "csv")]
11def _write_valid_file(path, fmt):
12 ev = np.zeros(10, dtype=Event_dtype)
13 ev["t"] = np.arange(10) * 1000
14 if fmt in ("evt3", "evt4", "evt2", "evt21"):
15 with EventWriter(path, format=fmt) as w:
16 w.write(ev)
17 else:
18 with EventWriter(path, width=1280, height=720) as w:
19 w.write(ev)
21@pytest.mark.parametrize("fmt,ext", FORMATS)
22@pytest.mark.filterwarnings("ignore:Malformed packets ignored near word:UserWarning")
23def test_fuzz_parser_garbage(tmp_path, fmt, ext):
24 """Feed random bytes after a valid header to ensure parsers don't segfault."""
25 p = tmp_path / f"fuzz_{fmt}.{ext}"
26 _write_valid_file(p, fmt)
28 content = bytearray(p.read_bytes())
30 # Append 1MB of random bytes
31 random.seed(42)
32 garbage = bytearray(random.getrandbits(8) for _ in range(100_000))
33 content.extend(garbage)
35 p.write_bytes(content)
37 # Read it back. We expect it to either return garbage events, raise an error, or stop.
38 # It must NOT segfault or hang indefinitely.
39 with EventReader(p, mode="all") as r:
40 try:
41 r.read()
42 except Exception:
43 pass # Parsing errors are acceptable, segfaults are not