#!/usr/bin/env bash
# the bitmap fuzzer over many seeds, one process per job.
#   scripts/bitmap-fuzz.sh <first seed> <seeds per job> <jobs> [log dir]
# each job runs its own run of seeds; a failing seed's line starts
# "FUZZ FAIL" and names the seed, which reruns alone with
#   FUZZ_SEED=<seed> FUZZ_KEEP=1 cargo test --lib bitmap_fuzz::fuzz_bitmap -- --ignored --nocapture
# with the same FUZZ_SIZE and FUZZ_FORMAT, which pass through
set -euo pipefail
first=${1:?first seed}
per=${2:?seeds per job}
jobs=${3:?jobs}
logs=${4:-bitmap-fuzz-logs}
mkdir -p "$logs"

binary=$(ALBEDO_NO_MBX=1 cargo test --lib --no-run --message-format=json 2>/dev/null \
  | sed -n 's/.*"executable":"\([^"]*knot_static-[^"]*\)".*/\1/p' | tail -n 1)
[ -x "$binary" ] || { echo "no fuzzer binary" >&2; exit 1; }

started=$(date +%s)
for job in $(seq 0 $((jobs - 1))); do
  seed=$((first + job * per))
  FUZZ_SEED=$seed FUZZ_SEEDS=$per "$binary" --ignored --nocapture --exact bitmap_fuzz::fuzz_bitmap \
    >"$logs/job-$job.log" 2>&1 &
done
wait || true
took=$(( $(date +%s) - started ))
ok=$(cat "$logs"/job-*.log | grep -c '^FUZZ ok' || true)
failed=$(cat "$logs"/job-*.log | grep '^FUZZ FAIL' || true)
echo "seeds $first..$((first + jobs * per - 1)): $ok ok in ${took}s"
[ -z "$failed" ] || { echo "$failed"; exit 1; }
