diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a889c0c01a7..892f79d0648 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -16,29 +16,43 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 with: toolchain: nightly override: true profile: minimal components: llvm-tools-preview + - name: Install rustfilt symbol demangler - run: cargo install rustfilt + run: | + cargo install rustfilt + - name: Rerun tests for coverage - run: cargo test env: - RUSTFLAGS: -Zinstrument-coverage + RUSTFLAGS: -Zinstrument-coverage -C link-dead-code -C debuginfo=2 LLVM_PROFILE_FILE: "${{ github.workspace }}/test.%p.profraw" ZEBRA_SKIP_NETWORK_TESTS: 1 + run: | + cargo test + cargo test --no-run --message-format=json | jq -r "select(.profile.test == true) | .filenames[]" | grep -v dSYM - > filenames.txt + - name: Merge coverage data - run: $(rustc --print target-libdir)/../bin/llvm-profdata merge --sparse test.*.profraw -o test.profdata + run: | + $(rustc --print target-libdir)/../bin/llvm-profdata merge test.*.profraw -o test.profdata + - name: Generate detailed html coverage report for github artifact - run: $(rustc --print target-libdir)/../bin/llvm-cov show -format=html -ignore-filename-regex=".*/.cargo/registry/.*" -ignore-filename-regex=".*/.cargo/git/.*" -ignore-filename-regex=".*/.rustup/.*" -Xdemangler=rustfilt -show-instantiations -output-dir=./coverage -instr-profile=./test.profdata $(find target/debug/deps -type f -perm -u+x ! -name '*.so') + run: | + $(rustc --print target-libdir)/../bin/llvm-cov show -format=html -ignore-filename-regex=".*/.cargo/registry/.*" -ignore-filename-regex=".*/.cargo/git/.*" -ignore-filename-regex=".*/.rustup/.*" -Xdemangler=rustfilt -show-instantiations -output-dir=./coverage -instr-profile=./test.profdata $(printf -- "-object %s " $(cat filenames.txt)) + - uses: actions/upload-artifact@v2 with: name: coverage path: ./coverage + - name: Generate lcov coverage report for codecov - run: $(rustc --print target-libdir)/../bin/llvm-cov export -format=lcov -instr-profile=test.profdata $(find target/debug/deps -type f -perm -u+x ! -name '*.so') > "lcov.info" + run: | + $(rustc --print target-libdir)/../bin/llvm-cov export -format=lcov -instr-profile=test.profdata $(printf -- "-object %s " $(cat filenames.txt)) > "lcov.info" + - name: Upload coverage report to Codecov uses: codecov/codecov-action@v1 diff --git a/.gitignore b/.gitignore index 8be07b59687..62d81cc249b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Cargo files /target/ +/coverage-target/ # Firebase caches (?) .firebase/ # Emacs detritus diff --git a/zebra-utils/coverage b/zebra-utils/coverage index 118c428a9a3..4c1b5955700 100755 --- a/zebra-utils/coverage +++ b/zebra-utils/coverage @@ -2,22 +2,28 @@ set -e set -o xtrace -rm -rf ./target/ -mkdir -p ./target/coverage -ZEBRA_SKIP_NETWORK_TESTS=1 LLVM_PROFILE_FILE="${PWD}/target/coverage/test.%p.profraw" RUSTFLAGS="-Zinstrument-coverage" cargo test -$(rustc --print target-libdir)/../bin/llvm-profdata merge --sparse ./target/coverage/test.*.profraw -o ./target/coverage/test.profdata +export CARGO_TARGET_DIR="coverage-target" -rm -rf ./target/coverage/html/ -# This one works and shows all the details I want in the CLI -$(rustc --print target-libdir)/../bin/llvm-cov show \ +rm -rf ./"$CARGO_TARGET_DIR"/coverage +mkdir -p ./$CARGO_TARGET_DIR/coverage +export ZEBRA_SKIP_NETWORK_TESTS=1 +export LLVM_PROFILE_FILE="${PWD}/$CARGO_TARGET_DIR/coverage/test.%m.profraw" +export RUSTFLAGS="-Zinstrument-coverage -C link-dead-code -C debuginfo=2" +cargo +nightly test --no-run --message-format=json | jq -r "select(.profile.test == true) | .filenames[]" | grep -v dSYM - > ./$CARGO_TARGET_DIR/files.txt +cargo +nightly test +$(rustc +nightly --print target-libdir)/../bin/llvm-profdata merge --sparse ./$CARGO_TARGET_DIR/coverage/test.*.profraw -o ./$CARGO_TARGET_DIR/coverage/test.profdata + +rm -rf ./$CARGO_TARGET_DIR/coverage/html/ + +$(rustc +nightly --print target-libdir)/../bin/llvm-cov show \ -format=html \ -Xdemangler=rustfilt \ -show-instantiations \ - -output-dir=./target/coverage/html \ + -output-dir=./$CARGO_TARGET_DIR/coverage/html \ -ignore-filename-regex=".*/.cargo/registry/.*" \ -ignore-filename-regex=".*/.cargo/git/.*" \ -ignore-filename-regex=".*/.rustup/.*" \ - -instr-profile=./target/coverage/test.profdata \ - $(find target/ -type f -perm -u+x ! -name '*.so') + -instr-profile=./$CARGO_TARGET_DIR/coverage/test.profdata \ + $(printf -- "-object %s " $(cat ./$CARGO_TARGET_DIR/files.txt)) -xdg-open ./target/coverage/html/index.html +xdg-open ./$CARGO_TARGET_DIR/coverage/html/index.html