#!/usr/bin/env bash
#   scripts/paths-fuzz.sh <first seed> <seeds per job> <jobs> [log dir]
# a failing seed prints a "FUZZ FAIL" line with its seed, rerun it alone with
#   FUZZ_SEED=<seed> FUZZ_KEEP=1 cargo test --lib nginx::tests::paths_fuzz::fuzz_paths -- --ignored --nocapture
set -euo pipefail
first=${1:?first seed}
per=${2:?seeds per job}
jobs=${3:?jobs}
logs=${4:-paths-fuzz-logs}
: "${NGINX_BINARY:?NGINX_BINARY must name the real nginx binary}"
mkdir -p "$logs"

binary=$(ALBEDO_NO_MBX=1 cargo test --lib --no-run --message-format=json 2>/dev/null \
  | grep '"kind":\["lib"\]' | grep '"test":true' \
  | 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 nginx::tests::paths_fuzz::fuzz_paths \
    >"$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 -A8 '^FUZZ FAIL' || true)
echo "seeds $first..$((first + jobs * per - 1)): $ok ok in ${took}s"
[ -z "$failed" ] || { echo "$failed"; exit 1; }
