# 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 # 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). # # Runs under both feature configurations so that feature-gated paths # (currently only the defmt::Format derives) are covered in both shapes. # 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: test-mutants-default test-mutants-no-default test-mutants-default: 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' test-mutants-no-default: cargo mutants --no-shuffle --test-tool=nextest --no-default-features \ -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