coverage.sh 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. # Check llvm path
  28. llvm_profdata="$(find "$(rustc +"$rust_nightly" --print sysroot)" -name llvm-profdata)"
  29. if [ -z "$llvm_profdata" ]; then
  30. echo "Error: couldn't find llvm-profdata. Try installing the llvm-tools component with \`rustup component add llvm-tools-preview --toolchain=$rust_nightly\`"
  31. exit 1
  32. fi
  33. llvm_path="$(dirname "$llvm_profdata")"
  34. # get commit hash. it will be used to name output folder
  35. if [ -z "$COMMIT_HASH" ]; then
  36. COMMIT_HASH=$(git rev-parse --short=9 HEAD)
  37. fi
  38. # Clean up
  39. rm -rf "$here/../target/cov/$COMMIT_HASH"
  40. # https://doc.rust-lang.org/rustc/instrument-coverage.html
  41. export RUSTFLAGS="-C instrument-coverage $RUSTFLAGS"
  42. export RUSTFLAGS="--cfg curve25519_dalek_backend=\"serial\" $RUSTFLAGS"
  43. export LLVM_PROFILE_FILE="$here/../target/cov/${COMMIT_HASH}/profraw/default-%p-%m.profraw"
  44. if [[ -z $1 ]]; then
  45. PACKAGES=(--lib --all --exclude solana-local-cluster)
  46. else
  47. PACKAGES=("$@")
  48. fi
  49. TEST_ARGS=(
  50. --skip shred::merkle::test::test_make_shreds_from_data::
  51. --skip shred::merkle::test::test_make_shreds_from_data_rand::
  52. --skip shred::merkle::test::test_recover_merkle_shreds::
  53. )
  54. # Most verbose log level (trace) is enabled for all solana code to make log!
  55. # macro code green always. Also, forcibly discard the vast amount of log by
  56. # redirecting the stderr altogether on CI, where all tests are run unlike
  57. # developing.
  58. RUST_LOG="solana=trace,agave=trace,$RUST_LOG" INTERCEPT_OUTPUT=/dev/null "$here/../ci/intercept.sh" \
  59. cargo +"$rust_nightly" test --features frozen-abi --target-dir "$here/../target/cov" "${PACKAGES[@]}" -- "${TEST_ARGS[@]}"
  60. # Generate test reports
  61. echo "--- grcov"
  62. grcov_common_args=(
  63. "$here/../target/cov/${COMMIT_HASH}"
  64. --source-dir "$here/.."
  65. --binary-path "$here/../target/cov/debug"
  66. --llvm
  67. --llvm-path "$llvm_path"
  68. --ignore \*.cargo\*
  69. --ignore \*build.rs
  70. --ignore bench-tps\*
  71. --ignore bench-streamer\*
  72. --ignore local-cluster\*
  73. )
  74. grcov "${grcov_common_args[@]}" -t html -o "$here/../target/cov/${COMMIT_HASH}/coverage/html"
  75. echo "html: $here/../target/cov/${COMMIT_HASH}/coverage/html"
  76. grcov "${grcov_common_args[@]}" -t lcov -o "$here/../target/cov/${COMMIT_HASH}/coverage/lcov.info"
  77. echo "lcov: $here/../target/cov/${COMMIT_HASH}/coverage/lcov.info"
  78. ln -sfT "$here/../target/cov/${COMMIT_HASH}" "$here/../target/cov/LATEST"