# Host-side tests for obu-firmware. See README.md: needs gcc and make on PATH (MSYS2 UCRT64), and
# asn1tools under `py -3.11` for the replay check.
#
#   make                      build and run everything: chain, replay, fuzz
#   make chain | replay | fuzz   one of them
#   make fuzz FUZZ_ITER=50000000 FUZZ_SEED=7   a longer or different fuzz run
#   make clean                remove build/
#
# The firmware sources are compiled straight from ../../main, never copied.

CC          = gcc
PYTHON      = python
PYTHON_ASN1 = py -3.11
FW          = ../../main
BUILD       = build
EXE         = $(if $(filter Windows_NT,$(OS)),.exe,)
# Captures live in capture/recordings/ since 2026-09-14; older ones are still in the
# receiver checkout beside this repo.
RECORDINGS  = $(wildcard ../../../capture/recordings/*.pcap ../../../its-g5-receiver-firmware/recordings/*.pcap)
FUZZ_ITER   = 2000000
FUZZ_SEED   = 1

# -Werror: these sources must stay warning-free on the host compiler too.
# UBSan in trap mode needs no runtime library, so it works on MinGW; a trap shows up as a crash.
CFLAGS = -std=c11 -O2 -g -Wall -Wextra -Wpedantic -Werror -I$(FW) \
         -fsanitize=undefined -fsanitize-undefined-trap-on-error

FW_SRCS = $(FW)/geonet.c $(FW)/dot11p.c $(FW)/gn_unwrap.c
DEPS    = test_util.c test_util.h $(FW_SRCS) $(wildcard $(FW)/*.h)

.PHONY: all check chain replay fuzz clean

all: check

check: chain replay fuzz

$(BUILD):
	mkdir -p $@

$(BUILD)/%$(EXE): %.c $(DEPS) | $(BUILD)
	$(CC) $(CFLAGS) -o $@ $< test_util.c $(FW_SRCS)

# The pcap goes through pcap_gn_tally.py as a second, independent parser of the same frames.
chain: $(BUILD)/test_chain$(EXE)
	$(BUILD)/test_chain$(EXE) $(BUILD)/test_chain.pcap
	$(PYTHON) ../pcap_gn_tally.py $(BUILD)/test_chain.pcap

replay: $(BUILD)/test_replay$(EXE)
ifeq ($(RECORDINGS),)
	@echo "replay: no recordings in ../../../its-g5-receiver-firmware/recordings, skipped"
else
	$(BUILD)/test_replay$(EXE) $(BUILD)/replay.tsv $(RECORDINGS)
	$(PYTHON_ASN1) check_replay.py $(BUILD)/replay.tsv $(RECORDINGS)
endif

fuzz: $(BUILD)/fuzz_gn_unwrap$(EXE)
	$(BUILD)/fuzz_gn_unwrap$(EXE) $(FUZZ_ITER) $(FUZZ_SEED) $(RECORDINGS)

clean:
	rm -rf $(BUILD)
