diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d8cfe44dfe4..c7eba7768cb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -110,6 +110,7 @@ jobs: run: CI_ENV=1 CI_MINIMIZE_DISK_USAGE=1 ./ci/ci-tx-sync-tests.sh coverage: + needs: fuzz strategy: fail-fast: false runs-on: self-hosted @@ -133,6 +134,11 @@ jobs: # Maybe if codecov wasn't broken we wouldn't need to do this... ./codecov --verbose upload-process --disable-search --fail-on-error -f target/codecov.json -t "f421b687-4dc2-4387-ac3d-dc3b2528af57" -F 'tests' cargo clean + - name: Download honggfuzz corpus + uses: actions/download-artifact@v4 + with: + name: hfuzz-corpus + path: fuzz/hfuzz_workspace - name: Run fuzz coverage generation run: | ./contrib/generate_fuzz_coverage.sh --output-dir `pwd` --output-codecov-json @@ -254,6 +260,11 @@ jobs: cargo clean - name: Run fuzzers run: cd fuzz && ./ci-fuzz.sh && cd .. + - name: Upload honggfuzz corpus + uses: actions/upload-artifact@v4 + with: + name: hfuzz-corpus + path: fuzz/hfuzz_workspace linting: runs-on: ubuntu-latest diff --git a/contrib/generate_fuzz_coverage.sh b/contrib/generate_fuzz_coverage.sh index 694ff65aa2f..34f163205ea 100755 --- a/contrib/generate_fuzz_coverage.sh +++ b/contrib/generate_fuzz_coverage.sh @@ -62,9 +62,40 @@ if [ "$OUTPUT_CODECOV_JSON" = "0" ]; then cargo llvm-cov --html --ignore-filename-regex "fuzz/" --output-dir "$OUTPUT_DIR" echo "Coverage report generated in $OUTPUT_DIR/html/index.html" else - cargo llvm-cov -j8 --codecov --ignore-filename-regex "fuzz/" --output-path "$OUTPUT_DIR/fuzz-codecov.json" - echo "Fuzz codecov report available at $OUTPUT_DIR/fuzz-codecov.json" -fi + # Clean previous coverage artifacts to ensure a fresh run. + cargo llvm-cov clean --workspace + # Import honggfuzz corpus if the artifact was downloaded. + imported=0 + if [ -d "hfuzz_workspace" ]; then + echo "Importing corpus from hfuzz_workspace..." + for target_dir in hfuzz_workspace/*; do + [ -d "$target_dir" ] || continue + src_name="$(basename "$target_dir")" + for dest in "$src_name" "${src_name%_target}"; do + mkdir -p "test_cases/$dest" + # Copy corpus files into the test_cases directory + find "$target_dir" -maxdepth 2 -type f \ + \( -path "$target_dir/CORPUS/*" -o -path "$target_dir/INPUT/*" -o -path "$target_dir/NEW/*" -o -path "$target_dir/input/*" \) \ + -print0 | xargs -0 -I{} cp -n {} "test_cases/$dest/" 2>/dev/null || true + done + done + # Check if any files were actually imported + if [ -n "$(find test_cases -type f -print -quit 2>/dev/null)" ]; then + imported=1 + fi + fi + # Generate coverage based on whether a corpus was imported. + if [ "$imported" = "1" ]; then + echo "Replaying imported corpus via tests to generate coverage..." + cargo llvm-cov -j8 --codecov --ignore-filename-regex "fuzz/" \ + --output-path "$OUTPUT_DIR/fuzz-codecov.json" --tests + else + echo "No corpus found; generating no-corpus coverage JSON..." + cargo llvm-cov -j8 --codecov --ignore-filename-regex "fuzz/" \ + --output-path "$OUTPUT_DIR/fuzz-codecov.json" --no-run + fi + echo "Fuzz codecov report available at $OUTPUT_DIR/fuzz-codecov.json" +fi