Files
dagx/justfile
swaits 5839b35979 test: add comprehensive testing infrastructure (fuzzing, proptest, mutation)
Implements dagx-11: Add comprehensive testing infrastructure including
fuzzing, property-based testing, and mutation testing configuration.

**Fuzzing Infrastructure:**
- Created fuzz/ directory with cargo-fuzz setup
- 4 fuzz targets covering different scenarios:
  - fuzz_dag_execution: Basic DAG execution with various patterns
  - fuzz_dependencies: Dependency management (linear, diamond, complex)
  - fuzz_type_safety: Type-safe output retrieval
  - fuzz_concurrent: Concurrent execution and thread safety
- Comprehensive README with usage instructions
- Integrated with justfile (fuzz, fuzz-all, fuzz-extended, fuzz-build)

**Property-Based Testing:**
- Added proptest dependency to Cargo.toml
- Created tests/property_tests.rs with 14 property tests:
  - Value preservation through DAG
  - Linear chain correctness
  - Fan-out pattern verification
  - Diamond pattern correctness
  - String, Vec, Option, Result handling
  - HashMap and custom struct preservation
  - DAG isolation
  - Concurrent execution scaling
- Integrated with justfile (proptest recipe)

**Mutation Testing:**
- Created .cargo-mutants.toml configuration
- Focused on critical functions:
  - DagRunner::run and ::get
  - TaskBuilder::depends_on
  - ExecutableNode::execute_with_listeners
  - ExtractFromListeners::extract
  - DepsTuple::to_node_ids
- Excluded low-value mutations (fmt, clone, default)
- Configured for nextest and parallel execution
- Already integrated via existing justfile mutants recipe

**Justfile Updates:**
- Added fuzzing section with 5 new recipes
- Added proptest recipe for property-based tests
- All recipes follow existing patterns and naming conventions

Similar setup to ../announcement project but tailored for DAG-specific testing.
2025-10-14 10:44:30 -06:00

258 lines
7.9 KiB
Makefile

# justfile for dagx crate
# High-level development and CI workflows
# =============================================================================
# Configuration
# =============================================================================
# Treat all warnings as errors
rustflags := "-D warnings"
# Code coverage target percentage (fail if below this threshold)
coverage_target := "80"
# Timeout for coverage analysis in seconds
coverage_timeout := "600"
# Benchmark timeout in seconds
bench_timeout := "300"
# =============================================================================
# Default recipe - show available recipes
default:
@just --list
# =============================================================================
# Primary Development Workflows
# =============================================================================
# Quick development loop: format + lint + fast tests
dev:
#!/usr/bin/env bash
set -e
echo "🔄 Running development checks..."
cargo fmt
RUSTFLAGS="{{rustflags}}" cargo clippy --all-targets --all-features &
RUSTFLAGS="{{rustflags}}" cargo nextest run --lib --all-features &
wait
echo "✅ Development checks passed"
# Pre-commit checks: format-check + lint + typecheck
check:
@echo "Running format check..."
cargo fmt -- --check
@echo ""
@echo "Running clippy..."
RUSTFLAGS="{{rustflags}}" cargo clippy --all-targets --all-features
RUSTFLAGS="{{rustflags}}" cargo clippy --all-targets --no-default-features
@echo ""
@echo "Verifying compilation..."
RUSTFLAGS="{{rustflags}}" cargo test --lib --all-features --no-run
RUSTFLAGS="{{rustflags}}" cargo test --lib --no-default-features --no-run
@echo ""
@echo "✅ All checks passed"
# Run all tests
test:
@echo "Running all tests..."
RUSTFLAGS="{{rustflags}}" cargo nextest run --lib --all-features
@echo "✅ All tests passed"
# Before pushing: check + test + coverage
pre-push: check test coverage
@echo ""
@echo "✅ Pre-push checks passed - safe to push!"
# Comprehensive pre-release validation
pre-release: check test coverage audit examples bench-check
#!/usr/bin/env bash
set -e
# Verify documentation version matches crate version
echo ""
echo "📋 Verifying documentation version..."
VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
MAJOR_MINOR=$(echo $VERSION | cut -d. -f1-2)
if ! grep -q "dagx = \"$MAJOR_MINOR\"" README.md; then
echo "❌ ERROR: README.md should reference version $MAJOR_MINOR (crate is $VERSION)"
echo " Update installation examples in README.md"
exit 1
fi
echo "✅ Documentation version correct: $MAJOR_MINOR"
# Package verification
echo ""
echo "📦 Verifying package..."
cargo publish --dry-run
cargo package --list > /tmp/dagx-files.txt
echo "✅ Package verified"
echo ""
echo "✅ All pre-release checks passed!"
echo " - Code formatted and linted"
echo " - All tests passing"
echo " - Code coverage ≥ {{coverage_target}}%"
echo " - No security vulnerabilities"
echo " - Dependencies verified"
echo " - All examples run successfully"
echo " - All benchmarks compile"
echo " - Documentation version verified"
echo " - Package ready for publication"
echo ""
echo "📦 Ready to publish! Run: cargo publish"
# =============================================================================
# Quality & Security
# =============================================================================
# Run code coverage analysis
coverage:
@echo "Running code coverage analysis (target: {{coverage_target}}%)..."
cargo llvm-cov nextest --lib --html --output-dir coverage --fail-under-lines {{coverage_target}}
@echo "Coverage report: coverage/html/index.html"
# Mutation testing with cargo-mutants
mutants:
@echo "Running mutation testing..."
@echo "⚠️ This will use significant CPU and memory resources!"
cargo mutants \
--no-shuffle \
--test-tool nextest \
--jobs 3 \
--all-features \
-vV
# Security audit + dependency checks
audit:
@echo "🔒 Running security checks..."
cargo audit
@echo "✅ Security checks passed"
# Run Miri for undefined behavior detection
miri:
@echo "Running Miri tests for UB detection..."
cargo +nightly miri test --lib
# =============================================================================
# Benchmarks
# =============================================================================
# Verify benchmarks compile
bench-check:
@echo "Verifying benchmarks compile..."
cargo bench --no-run
@echo "✅ All benchmarks compile"
# Run all benchmarks
bench:
cargo bench
# Run benchmarks and save as baseline
bench-baseline:
cargo bench -- --save-baseline baseline
# Compare benchmarks against baseline
bench-compare:
cargo bench -- --baseline baseline
# Run specific benchmark suite
bench-suite suite:
cargo bench --bench {{suite}}
# =============================================================================
# Fuzzing
# =============================================================================
# Run a single fuzz target for 60 seconds
fuzz target:
@echo "Fuzzing {{target}} for 60 seconds..."
cargo +nightly fuzz run {{target}} -- -max_total_time=60
# Run all fuzz targets sequentially for quick smoke test
fuzz-all:
#!/usr/bin/env bash
set -e
echo "🔬 Running all fuzz targets..."
for target in fuzz_dag_execution fuzz_dependencies fuzz_type_safety fuzz_concurrent; do
echo ""
echo "Running $target..."
cargo +nightly fuzz run $target -- -max_total_time=30 -runs=10000
done
echo ""
echo "✅ All fuzz targets completed"
# Run extended fuzzing session (for deeper testing)
fuzz-extended target:
@echo "Running extended fuzzing session for {{target}}..."
@echo "⚠️ This will run for 1 hour. Press Ctrl+C to stop early."
cargo +nightly fuzz run {{target}} -- -max_total_time=3600
# Build all fuzz targets
fuzz-build:
@echo "Building fuzz targets..."
cargo +nightly fuzz build
@echo "✅ All fuzz targets built"
# Minimize corpus for a fuzz target
fuzz-cmin target:
@echo "Minimizing corpus for {{target}}..."
cargo +nightly fuzz cmin {{target}}
# Run property-based tests
proptest:
@echo "Running property-based tests..."
cargo nextest run property_tests --all-features
@echo "✅ Property tests passed"
# =============================================================================
# Documentation & Utilities
# =============================================================================
# Build documentation and open in browser
doc:
cargo doc --no-deps --all-features --open
# Format code
fmt:
cargo fmt
# Show project information
info:
@echo "dagx crate - Type-safe DAG execution framework for async Rust"
@echo ""
@echo "Rust: $(rustc --version)"
@echo "Cargo: $(cargo --version)"
@echo ""
@echo "Dependencies:"
@cargo tree --depth 1
# Run all examples
examples:
@echo "Running all examples..."
cargo run --example 01_basic
cargo run --example 02_fan_out
cargo run --example 03_fan_in
cargo run --example 04_parallel_computation
cargo run --example circuit_breaker
cargo run --example complex_dag
cargo run --example conditional_workflow
cargo run --example custom_types
cargo run --example data_pipeline
cargo run --example debug_tracing
cargo run --example error_handling
cargo run --example large_dag
cargo run --example parallelism_proof
cargo run --example retry_strategies
cargo run --example timeout
cargo run --example tracing_example
@echo "✅ All examples completed successfully"
# Clean build artifacts
clean:
cargo clean
rm -rf mutants.out/ mutants.out.old/ mutation_history.json
rm -rf target/criterion
rm -rf coverage/