coverage.sh 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env bash
  2. #
  3. # Run tests and collect code coverage
  4. #
  5. # == Usage:
  6. #
  7. # Run all:
  8. # $ ./script/coverage.sh
  9. #
  10. # Run for specific packages
  11. # $ ./script/coverage.sh -p solana-account-decoder
  12. # $ ./script/coverage.sh -p solana-account-decoder -p solana-accounts-db [-p ...]
  13. #
  14. # Custom folder name. (default: $(git rev-parse --short=9 HEAD))
  15. # $ COMMIT_HASH=xxx ./script/coverage.sh -p solana-account-decoder
  16. #
  17. set -e
  18. here=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
  19. # Check for grcov commands
  20. if ! command -v grcov >/dev/null 2>&1; then
  21. echo "Error: grcov not found. Try |cargo install grcov|"
  22. exit 1
  23. fi
  24. # Use nightly as we have some nightly-only tests (frozen-abi)
  25. # shellcheck source=ci/rust-version.sh
  26. source "$here/../ci/rust-version.sh" nightly
  27. # get commit hash. it will be used to name output folder
  28. if [ -z "$COMMIT_HASH" ]; then
  29. COMMIT_HASH=$(git rev-parse --short=9 HEAD)
  30. fi
  31. # Clean up
  32. rm -rf "$here/../target/cov/$COMMIT_HASH"
  33. # https://doc.rust-lang.org/rustc/instrument-coverage.html
  34. export RUSTFLAGS="-C instrument-coverage $RUSTFLAGS"
  35. export LLVM_PROFILE_FILE="$here/../target/cov/${COMMIT_HASH}/profraw/default-%p-%m.profraw"
  36. if [[ -z $1 ]]; then
  37. PACKAGES=(--lib --all --exclude solana-local-cluster)
  38. else
  39. PACKAGES=("$@")
  40. fi
  41. TEST_ARGS=(
  42. --skip shred::merkle::test::test_make_shreds_from_data::
  43. --skip shred::merkle::test::test_make_shreds_from_data_rand::
  44. --skip shred::merkle::test::test_recover_merkle_shreds::
  45. )
  46. # Most verbose log level (trace) is enabled for all solana code to make log!
  47. # macro code green always. Also, forcibly discard the vast amount of log by
  48. # redirecting the stderr altogether on CI, where all tests are run unlike
  49. # developing.
  50. RUST_LOG="solana=trace,agave=trace,$RUST_LOG" INTERCEPT_OUTPUT=/dev/null "$here/../ci/intercept.sh" \
  51. cargo +"$rust_nightly" test --features frozen-abi --target-dir "$here/../target/cov" "${PACKAGES[@]}" -- "${TEST_ARGS[@]}"
  52. # Generate test reports
  53. echo "--- grcov"
  54. grcov_common_args=(
  55. "$here/../target/cov/${COMMIT_HASH}"
  56. --source-dir "$here/.."
  57. --binary-path "$here/../target/cov/debug"
  58. --llvm
  59. --ignore \*.cargo\*
  60. --ignore \*build.rs
  61. --ignore bench-tps\*
  62. --ignore upload-perf\*
  63. --ignore bench-streamer\*
  64. --ignore local-cluster\*
  65. )
  66. grcov "${grcov_common_args[@]}" -t html -o "$here/../target/cov/${COMMIT_HASH}/coverage/html"
  67. echo "html: $here/../target/cov/${COMMIT_HASH}/coverage/html"
  68. grcov "${grcov_common_args[@]}" -t lcov -o "$here/../target/cov/${COMMIT_HASH}/coverage/lcov.info"
  69. echo "lcov: $here/../target/cov/${COMMIT_HASH}/coverage/lcov.info"
  70. ln -sfT "$here/../target/cov/${COMMIT_HASH}" "$here/../target/cov/LATEST"