| 
									
										
										
										
											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 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | set -e | 
					
						
							|  |  |  | cd "$(dirname "$0")/.." | 
					
						
							| 
									
										
										
										
											2018-12-18 14:25:10 -08:00
										 |  |  | source ci/_ | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2019-11-23 14:53:39 +09:00
										 |  |  |   packages=( --lib --all --exclude solana-local-cluster ) | 
					
						
							| 
									
										
										
										
											2019-05-01 23:33:28 -07:00
										 |  |  | else | 
					
						
							| 
									
										
										
										
											2019-10-18 16:23:34 -07:00
										 |  |  |   packages=( "$@" ) | 
					
						
							| 
									
										
										
										
											2019-05-01 23:33:28 -07:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 11:42:57 -08:00
										 |  |  | coverageFlags=(-Zprofile)                # Enable coverage | 
					
						
							|  |  |  | coverageFlags+=("-Clink-dead-code")      # Dead code should appear red in the report | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  | 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-14 19:41:05 -07:00
										 |  |  | source ci/rust-version.sh nightly | 
					
						
							| 
									
										
										
										
											2019-10-18 16:23:34 -07: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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 16:23:34 -07:00
										 |  |  | RUST_LOG=solana=trace _ cargo +$rust_nightly test --target-dir target/cov --no-run "${packages[@]}" | 
					
						
							| 
									
										
										
										
											2020-03-25 05:47:16 +09:00
										 |  |  | if RUST_LOG=solana=trace _ cargo +$rust_nightly test --target-dir target/cov "${packages[@]}" 2> target/cov/coverage-stderr.log; then | 
					
						
							|  |  |  |   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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _ grcov target/cov/tmp > target/cov/lcov-full.info | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-05 15:04:16 -08:00
										 |  |  | echo "--- filter-files-from-lcov" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # List of directories to remove from the coverage report | 
					
						
							| 
									
										
										
										
											2019-10-17 14:31:12 -07:00
										 |  |  | ignored_directories="^(bench-tps|upload-perf|bench-streamer|bench-exchange)" | 
					
						
							| 
									
										
										
										
											2019-03-05 15:04:16 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | filter-files-from-lcov() { | 
					
						
							| 
									
										
										
										
											2020-02-12 01:02:40 +09:00
										 |  |  |   # this function is too noisy for casual bash -x | 
					
						
							|  |  |  |   set +x | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  |   declare skip=false | 
					
						
							|  |  |  |   while read -r line; do | 
					
						
							|  |  |  |     if [[ $line =~ ^SF:/ ]]; then | 
					
						
							|  |  |  |       skip=true # Skip all absolute paths as these are references into ~/.cargo | 
					
						
							|  |  |  |     elif [[ $line =~ ^SF:(.*) ]]; then | 
					
						
							|  |  |  |       declare file="${BASH_REMATCH[1]}" | 
					
						
							| 
									
										
										
										
											2019-03-05 15:04:16 -08:00
										 |  |  |       if [[ $file =~ $ignored_directories ]]; then | 
					
						
							|  |  |  |         skip=true # Skip paths into ignored locations | 
					
						
							|  |  |  |       elif [[ -r $file ]]; then | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  |         skip=false | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2019-03-05 15:04:16 -08:00
										 |  |  |         skip=true # Skip relative paths that don't exist | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  |       fi | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     [[ $skip = true ]] || echo "$line" | 
					
						
							|  |  |  |   done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-05 15:04:16 -08:00
										 |  |  | filter-files-from-lcov < target/cov/lcov-full.info > target/cov/lcov.info | 
					
						
							| 
									
										
										
										
											2018-12-17 10:11:02 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | echo "--- html report" | 
					
						
							|  |  |  | # ProTip: genhtml comes from |brew install lcov| or |apt-get install lcov| | 
					
						
							|  |  |  | genhtml --output-directory target/cov/$reportName \
 | 
					
						
							|  |  |  |   --show-details \
 | 
					
						
							|  |  |  |   --highlight \
 | 
					
						
							|  |  |  |   --ignore-errors source \
 | 
					
						
							|  |  |  |   --prefix "$PWD" \
 | 
					
						
							|  |  |  |   --legend \
 | 
					
						
							|  |  |  |   target/cov/lcov.info | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ( | 
					
						
							|  |  |  |   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 |