| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Runs all tests and collects code coverage | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Warning: this process is a little slow | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  | if ! command -v grcov; then | 
					
						
							|  |  |  |   echo "Error: grcov not found.  Try |cargo install grcov|" | 
					
						
							|  |  |  |   exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-30 18:18:43 -08:00
										 |  |  | if [[ ! "$(grcov --version)" =~ 0.[678].[0124] ]]; then | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  |   echo Error: Required grcov version not installed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   echo "Installed version: $(grcov --version)" | 
					
						
							|  |  |  |   exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | set -e | 
					
						
							|  |  |  | cd "$(dirname "$0")/.." | 
					
						
							| 
									
										
										
										
											2018-12-18 14:25:10 -08:00
										 |  |  | source ci/_ | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-12 21:19:41 -06:00
										 |  |  | cargo="$(readlink -f "./cargo")" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 12:20:47 -07:00
										 |  |  | : "${CI_COMMIT:=local}" | 
					
						
							|  |  |  | reportName="lcov-${CI_COMMIT:0:9}" | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 16:23:34 -07:00
										 |  |  | if [[ -z $1 ]]; then | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  |   packages=(--lib --all --exclude solana-local-cluster) | 
					
						
							| 
									
										
										
										
											2019-05-01 23:33:28 -07:00
										 |  |  | else | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  |   packages=("$@") | 
					
						
							| 
									
										
										
										
											2019-05-01 23:33:28 -07:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  | coverageFlags=() | 
					
						
							|  |  |  | coverageFlags+=(-Zprofile)               # Enable coverage | 
					
						
							| 
									
										
										
										
											2020-10-26 13:02:58 +09:00
										 |  |  | coverageFlags+=("-Aincomplete_features") # Supress warnings due to frozen abi, which is harmless for it | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  | if [[ $(uname) != Darwin ]]; then        # macOS skipped due to https://github.com/rust-lang/rust/issues/63047 | 
					
						
							|  |  |  |   coverageFlags+=("-Clink-dead-code")    # Dead code should appear red in the report | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2019-10-17 08:53:07 +09:00
										 |  |  | coverageFlags+=("-Ccodegen-units=1")     # Disable code generation parallelism which is unsupported under -Zprofile (see [rustc issue #51705]). | 
					
						
							| 
									
										
										
										
											2018-12-18 11:42:57 -08:00
										 |  |  | coverageFlags+=("-Cinline-threshold=0")  # Disable inlining, which complicates control flow. | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  | coverageFlags+=("-Copt-level=0") | 
					
						
							| 
									
										
										
										
											2018-12-18 11:42:57 -08:00
										 |  |  | coverageFlags+=("-Coverflow-checks=off") # Disable overflow checks, which create unnecessary branches. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-23 14:53:39 +09:00
										 |  |  | export RUSTFLAGS="${coverageFlags[*]} $RUSTFLAGS" | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | export CARGO_INCREMENTAL=0 | 
					
						
							|  |  |  | export RUST_BACKTRACE=1 | 
					
						
							| 
									
										
										
										
											2019-07-10 13:08:17 -05:00
										 |  |  | export RUST_MIN_STACK=8388608 | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | echo "--- remove old coverage results" | 
					
						
							|  |  |  | if [[ -d target/cov ]]; then | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  |   find target/cov -type f -name '*.gcda' -delete | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | fi | 
					
						
							|  |  |  | rm -rf target/cov/$reportName | 
					
						
							| 
									
										
										
										
											2019-12-23 16:32:29 +09:00
										 |  |  | mkdir -p target/cov | 
					
						
							| 
									
										
										
										
											2020-02-12 01:02:40 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Mark the base time for a clean room dir | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | touch target/cov/before-test | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-12 01:02:40 +09:00
										 |  |  | # Force rebuild of possibly-cached proc macro crates and build.rs because | 
					
						
							|  |  |  | # we always want stable coverage for them | 
					
						
							|  |  |  | # Don't support odd file names in our repo ever | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | if [[ -n $CI || -z $1 ]]; then | 
					
						
							|  |  |  |   # shellcheck disable=SC2046 | 
					
						
							|  |  |  |   touch \
 | 
					
						
							|  |  |  |     $(git ls-files :**/build.rs) \
 | 
					
						
							|  |  |  |     $(git grep -l "proc-macro.*true" :**/Cargo.toml | sed 's|Cargo.toml|src/lib.rs|') | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2020-02-12 01:02:40 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-12 21:19:41 -06:00
										 |  |  | RUST_LOG=solana=trace _ "$cargo" nightly test --target-dir target/cov --no-run "${packages[@]}" | 
					
						
							|  |  |  | if RUST_LOG=solana=trace _ "$cargo" nightly test --target-dir target/cov "${packages[@]}" 2> target/cov/coverage-stderr.log; then | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  |   test_status=0 | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |   test_status=$? | 
					
						
							| 
									
										
										
										
											2020-04-13 17:28:08 -07:00
										 |  |  |   echo "Failed: $test_status" | 
					
						
							|  |  |  |   echo "^^^ +++" | 
					
						
							| 
									
										
										
										
											2020-04-13 21:09:26 -07:00
										 |  |  |   if [[ -n $CI ]]; then | 
					
						
							|  |  |  |     exit $test_status | 
					
						
							|  |  |  |   fi | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | fi | 
					
						
							|  |  |  | touch target/cov/after-test | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | echo "--- grcov" | 
					
						
							| 
									
										
										
										
											2019-05-01 23:33:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-12 01:02:40 +09:00
										 |  |  | # Create a clean room dir only with updated gcda/gcno files for this run, | 
					
						
							|  |  |  | # because our cached target dir is full of other builds' coverage files | 
					
						
							| 
									
										
										
										
											2019-12-23 16:32:29 +09:00
										 |  |  | rm -rf target/cov/tmp | 
					
						
							|  |  |  | mkdir -p target/cov/tmp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Can't use a simpler construct under the condition of SC2044 and bash 3 | 
					
						
							|  |  |  | # (macOS's default). See: https://github.com/koalaman/shellcheck/wiki/SC2044 | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | find target/cov -type f -name '*.gcda' -newer target/cov/before-test ! -newer target/cov/after-test -print0 | | 
					
						
							| 
									
										
										
										
											2019-12-23 16:32:29 +09:00
										 |  |  |   (while IFS= read -r -d '' gcda_file; do | 
					
						
							|  |  |  |     gcno_file="${gcda_file%.gcda}.gcno" | 
					
						
							| 
									
										
										
										
											2020-01-17 09:29:15 -08:00
										 |  |  |     ln -sf "../../../$gcda_file" "target/cov/tmp/$(basename "$gcda_file")" | 
					
						
							|  |  |  |     ln -sf "../../../$gcno_file" "target/cov/tmp/$(basename "$gcno_file")" | 
					
						
							| 
									
										
										
										
											2019-12-23 16:32:29 +09:00
										 |  |  |   done) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | ( | 
					
						
							| 
									
										
										
										
											2020-12-14 12:37:18 -08:00
										 |  |  |   grcov_args=( | 
					
						
							|  |  |  |     target/cov/tmp | 
					
						
							|  |  |  |     --llvm | 
					
						
							|  |  |  |     --ignore \*.cargo\* | 
					
						
							|  |  |  |     --ignore \*build.rs | 
					
						
							|  |  |  |     --ignore bench-tps\* | 
					
						
							|  |  |  |     --ignore upload-perf\* | 
					
						
							|  |  |  |     --ignore bench-streamer\* | 
					
						
							|  |  |  |     --ignore local-cluster\* | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   set -x | 
					
						
							|  |  |  |   grcov "${grcov_args[@]}" -t html -o target/cov/$reportName | 
					
						
							|  |  |  |   grcov "${grcov_args[@]}" -t lcov -o target/cov/lcov.info | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  |   cd target/cov | 
					
						
							|  |  |  |   tar zcf report.tar.gz $reportName | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ls -l target/cov/$reportName/index.html | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | ln -sfT $reportName target/cov/LATEST | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exit $test_status |