#!/usr/bin/env bash set -e cd "$(dirname "$0")/.." cargo="$(readlink -f "./cargo")" source ci/_ annotate() { ${BUILDKITE:-false} && { buildkite-agent annotate "$@" } } # Run the appropriate test based on entrypoint testName=$(basename "$0" .sh) source ci/rust-version.sh stable export RUST_BACKTRACE=1 export RUSTFLAGS="-D warnings" source scripts/ulimit-n.sh #shellcheck source=ci/common/limit-threads.sh source ci/common/limit-threads.sh # get channel info eval "$(ci/channel-info.sh)" #shellcheck source=ci/common/shared-functions.sh source ci/common/shared-functions.sh echo "Executing $testName" case $testName in test-stable) if need_to_upload_test_result; then _ cargo test --jobs "$JOBS" --all --tests --exclude solana-local-cluster ${V:+--verbose} -- -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ ci/intercept.sh cargo test --jobs "$JOBS" --all --tests --exclude solana-local-cluster ${V:+--verbose} -- --nocapture fi ;; test-stable-sbf) # Clear the C dependency files, if dependency moves these files are not regenerated test -d target/debug/sbf && find target/debug/sbf -name '*.d' -delete test -d target/release/sbf && find target/release/sbf -name '*.d' -delete # rustfilt required for dumping SBF assembly listings "$cargo" install rustfilt # solana-keygen required when building C programs _ "$cargo" build --manifest-path=keygen/Cargo.toml export PATH="$PWD/target/debug":$PATH cargo_build_sbf="$(realpath ./cargo-build-sbf)" cargo_test_sbf="$(realpath ./cargo-test-sbf)" # SBF solana-sdk legacy compile test "$cargo_build_sbf" --manifest-path sdk/Cargo.toml # Ensure the minimum supported "rust-version" matches platform tools to fail # quickly if users try to build with an older platform tools install cargo_toml=sdk/program/Cargo.toml source "scripts/read-cargo-variable.sh" crate_rust_version=$(readCargoVariable rust-version $cargo_toml) platform_tools_rust_version=$("$cargo_build_sbf" --version | grep rustc) platform_tools_rust_version=$(echo "$platform_tools_rust_version" | cut -d\ -f2) # Remove "rustc " prefix from a string like "rustc 1.68.0-dev" platform_tools_rust_version=$(echo "$platform_tools_rust_version" | cut -d- -f1) # Remove "-dev" suffix from a string like "1.68.0-dev" if [[ $crate_rust_version != "$platform_tools_rust_version" ]]; then echo "Error: Update 'rust-version' field in '$cargo_toml' from $crate_rust_version to $platform_tools_rust_version" exit 1 fi # SBF C program system tests _ make -C programs/sbf/c tests if need_to_upload_test_result; then _ cargo test \ --manifest-path programs/sbf/Cargo.toml \ --no-default-features --features=sbf_c,sbf_rust -- -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ cargo test \ --manifest-path programs/sbf/Cargo.toml \ --no-default-features --features=sbf_c,sbf_rust -- --nocapture fi # SBF Rust program unit tests for sbf_test in programs/sbf/rust/*; do if pushd "$sbf_test"; then "$cargo" test "$cargo_build_sbf" --sbf-sdk ../../../../sdk/sbf --dump "$cargo_test_sbf" --sbf-sdk ../../../../sdk/sbf popd fi done |& tee cargo.log # Save the output of cargo building the sbf tests so we can analyze # the number of redundant rebuilds of dependency crates. The # expected number of solana-program crate compilations is 4. There # should be 3 builds of solana-program while 128bit crate is # built. These compilations are not redundant because the crate is # built for different target each time. An additional compilation of # solana-program is performed when simulation crate is built. This # last compiled solana-program is of different version, normally the # latest mainbeta release version. solana_program_count=$(grep -c 'solana-program v' cargo.log) rm -f cargo.log if ((solana_program_count > 14)); then echo "Regression of build redundancy ${solana_program_count}." echo "Review dependency features that trigger redundant rebuilds of solana-program." exit 1 fi # platform-tools version "$cargo_build_sbf" -V # SBF program instruction count assertion sbf_target_path=programs/sbf/target if need_to_upload_test_result; then _ cargo test \ --manifest-path programs/sbf/Cargo.toml \ --no-default-features --features=sbf_c,sbf_rust assert_instruction_count \ -- -Z unstable-options --format json --report-time |& tee results.json awk '!/{ "type": .* }/' results.json >"${sbf_target_path}"/deploy/instuction_counts.txt else _ cargo test \ --manifest-path programs/sbf/Cargo.toml \ --no-default-features --features=sbf_c,sbf_rust assert_instruction_count \ -- --nocapture &> "${sbf_target_path}"/deploy/instuction_counts.txt fi sbf_dump_archive="sbf-dumps.tar.bz2" rm -f "$sbf_dump_archive" tar cjvf "$sbf_dump_archive" "${sbf_target_path}"/{deploy/*.txt,sbf-solana-solana/release/*.so} exit 0 ;; test-stable-perf) if [[ $(uname) = Linux ]]; then # Enable persistence mode to keep the CUDA kernel driver loaded, avoiding a # lengthy and unexpected delay the first time CUDA is involved when the driver # is not yet loaded. sudo --non-interactive ./net/scripts/enable-nvidia-persistence-mode.sh || true rm -rf target/perf-libs ./fetch-perf-libs.sh # Force CUDA for solana-core unit tests export TEST_PERF_LIBS_CUDA=1 # Force CUDA in ci/localnet-sanity.sh export SOLANA_CUDA=1 fi _ cargo build --bins ${V:+--verbose} if need_to_upload_test_result; then _ cargo test --package solana-perf --package solana-ledger --package solana-core --lib ${V:+--verbose} -- -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ cargo test --package solana-perf --package solana-ledger --package solana-core --lib ${V:+--verbose} -- --nocapture fi _ cargo run --manifest-path poh-bench/Cargo.toml ${V:+--verbose} -- --hashes-per-tick 10 ;; test-local-cluster) _ cargo build --release --bins ${V:+--verbose} if need_to_upload_test_result; then _ cargo test --release --package solana-local-cluster --test local_cluster ${V:+--verbose} -- --test-threads=1 -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ ci/intercept.sh cargo test --release --package solana-local-cluster --test local_cluster ${V:+--verbose} -- --nocapture --test-threads=1 fi exit 0 ;; test-local-cluster-flakey) _ cargo build --release --bins ${V:+--verbose} if need_to_upload_test_result; then _ cargo test --release --package solana-local-cluster --test local_cluster_flakey ${V:+--verbose} -- --test-threads=1 -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ ci/intercept.sh cargo test --release --package solana-local-cluster --test local_cluster_flakey ${V:+--verbose} -- --nocapture --test-threads=1 fi exit 0 ;; test-local-cluster-slow-1) _ cargo build --release --bins ${V:+--verbose} if need_to_upload_test_result; then _ cargo test --release --package solana-local-cluster --test local_cluster_slow_1 ${V:+--verbose} -- --test-threads=1 -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ ci/intercept.sh cargo test --release --package solana-local-cluster --test local_cluster_slow_1 ${V:+--verbose} -- --nocapture --test-threads=1 fi exit 0 ;; test-local-cluster-slow-2) _ cargo build --release --bins ${V:+--verbose} if need_to_upload_test_result; then _ cargo test --release --package solana-local-cluster --test local_cluster_slow_2 ${V:+--verbose} -- --test-threads=1 -Z unstable-options --format json --report-time | tee results.json exit_if_error "${PIPESTATUS[0]}" else _ ci/intercept.sh cargo test --release --package solana-local-cluster --test local_cluster_slow_2 ${V:+--verbose} -- --nocapture --test-threads=1 fi exit 0 ;; test-wasm) _ node --version _ npm --version for dir in sdk/{program,}; do if [[ -r "$dir"/package.json ]]; then pushd "$dir" _ npm install _ npm test popd fi done exit 0 ;; test-docs) if need_to_upload_test_result; then _ cargo test --jobs "$JOBS" --all --doc --exclude solana-local-cluster ${V:+--verbose} -- -Z unstable-options --format json --report-time | tee results.json exit "${PIPESTATUS[0]}" else _ cargo test --jobs "$JOBS" --all --doc --exclude solana-local-cluster ${V:+--verbose} -- --nocapture exit 0 fi ;; *) echo "Error: Unknown test: $testName" ;; esac ( export CARGO_TOOLCHAIN=+"$rust_stable" export RUST_LOG="solana_metrics=warn,info,$RUST_LOG" echo --- ci/localnet-sanity.sh ci/localnet-sanity.sh -x echo --- ci/run-sanity.sh ci/run-sanity.sh -x )