Files
protocol-rs/justfile
T
swaits ef576ba1ec test: three more cargo-fuzz targets + test-fuzz-long recipe
- command_roundtrip: structure-aware (via arbitrary crate) Command
  encode → parse → equal. Symmetric to cobs_roundtrip.
- cobs_decoder_multi_frame: chunked feeding with arbitrary split sizes;
  asserts bounded payload and that command count never exceeds sentinel
  count.
- cobs_chunk_invariant: same stream through two decoders (chunked vs
  all-at-once) must produce the same command sequence.

Adds test-fuzz-long recipe (600s per target, ~1h 10m total) for CI
cron / pre-release. All seven targets smoke-tested at 100k runs each
with zero findings.
2026-04-13 12:12:12 -06:00

91 lines
3.3 KiB
Makefile

# donglora-protocol development tasks
# default: list all recipes
default:
@just --list
# run ALL quality gates (tests, clippy, fmt, doc, deny, fuzz, miri, mutants)
test: test-unit test-clippy test-fmt test-doc test-deny test-fuzz test-miri test-mutants
# quick compile check (all feature permutations)
check:
cargo check
cargo check --no-default-features
cargo check --all-features
# unit + proptest + doc tests
test-unit:
cargo nextest run
cargo nextest run --no-default-features
cargo nextest run --all-features
cargo test --doc
# clippy with warnings as errors across feature permutations
test-clippy:
cargo clippy --all-targets -- -D warnings
cargo clippy --all-targets --no-default-features -- -D warnings
cargo clippy --all-targets --all-features -- -D warnings
# check formatting
test-fmt:
cargo fmt -- --check
# doc build (catches broken doc links)
test-doc:
cargo doc --no-deps --all-features
# license and advisory audit
test-deny:
cargo deny check
# fuzz every target for 60s (requires nightly + cargo-fuzz)
test-fuzz:
cd fuzz && cargo +nightly fuzz run parse_command -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run parse_radio_config -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run cobs_decoder_feed -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run cobs_roundtrip -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run command_roundtrip -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run cobs_decoder_multi_frame -- -max_total_time=60
cd fuzz && cargo +nightly fuzz run cobs_chunk_invariant -- -max_total_time=60
# long fuzz run: 10 minutes per target. Use for CI cron / pre-release.
test-fuzz-long:
cd fuzz && cargo +nightly fuzz run parse_command -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run parse_radio_config -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run cobs_decoder_feed -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run cobs_roundtrip -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run command_roundtrip -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run cobs_decoder_multi_frame -- -max_total_time=600
cd fuzz && cargo +nightly fuzz run cobs_chunk_invariant -- -max_total_time=600
# run tests under miri (catches UB, requires nightly + miri component)
# The proptest suite is skipped — its file-persistence layer calls getcwd
# which miri does not support. Vectors and unit tests run clean.
test-miri:
cargo +nightly miri nextest run --lib --test vectors
cargo +nightly miri nextest run --lib --test vectors --no-default-features
# mutation testing (requires cargo-mutants).
#
# Three mutants are excluded as provably equivalent — swapping the
# operator does not change behaviour because a downstream check catches
# the resulting case. See the regex strings for the specific sites.
test-mutants:
cargo mutants --no-shuffle --test-tool=nextest \
-E 'replace > with >= in Command::from_bytes' \
-E 'replace > with >= in CobsDecoder::feed' \
-E 'replace < with <= in cobs_encode_response'
# format code
fmt:
cargo fmt
# build in release mode
build:
cargo build --release
# clean all build artifacts
clean:
cargo clean
rm -rf fuzz/target fuzz/corpus fuzz/artifacts