blob: 0b6645c028d90421cbe611dfc874d177863acaae [file] [log] [blame]
#!/bin/bash
# Runs Bazel build commands over rustfmt rules, where some are expected
# to fail.
#
# Can be run from anywhere within the rules_rust workspace.
set -euo pipefail
if [[ -z "${BUILD_WORKSPACE_DIRECTORY:-}" ]]; then
echo "This script should be run under Bazel"
exit 1
fi
cd "${BUILD_WORKSPACE_DIRECTORY}"
# Executes a bazel build command and handles the return value, exiting
# upon seeing an error.
#
# Takes two arguments:
# ${1}: The expected return code.
# ${2}: The target within "//test/rustfmt" to be tested.
function check_build_result() {
local ret=0
echo -n "Testing ${2}... "
(bazel test //test/rustfmt:"${2}") || ret="$?" && true
if [[ "${ret}" -ne "${1}" ]]; then
>&2 echo "FAIL: Unexpected return code [saw: ${ret}, want: ${1}] building target //test/rustfmt:${2}"
>&2 echo " Run \"bazel test //test/rustfmt:${2}\" to see the output"
exit 1
else
echo "OK"
fi
}
function test_all_and_apply() {
local -r TEST_OK=0
local -r TEST_FAILED=3
local -r VARIANTS=(rust_binary rust_library rust_shared_library rust_static_library)
temp_dir="$(mktemp -d -t ci-XXXXXXXXXX)"
new_workspace="${temp_dir}/rules_rust_test_rustfmt"
mkdir -p "${new_workspace}/test/rustfmt" && \
cp -r test/rustfmt/* "${new_workspace}/test/rustfmt/" && \
cat << EOF > "${new_workspace}/WORKSPACE.bazel"
workspace(name = "rules_rust_test_rustfmt")
local_repository(
name = "rules_rust",
path = "${BUILD_WORKSPACE_DIRECTORY}",
)
load("@rules_rust//rust:repositories.bzl", "rust_repositories")
rust_repositories()
EOF
# See github.com/bazelbuild/rules_rust/issues/2317.
echo "build --noincompatible_sandbox_hermetic_tmp" > "${new_workspace}/.bazelrc"
# Drop the 'norustfmt' tags
if [ "$(uname)" == "Darwin" ]; then
SEDOPTS=(-i '' -e)
else
SEDOPTS=(-i)
fi
sed ${SEDOPTS[@]} 's/"norustfmt"//' "${new_workspace}/test/rustfmt/rustfmt_integration_test_suite.bzl"
sed ${SEDOPTS[@]} 's/"manual"//' "${new_workspace}/test/rustfmt/rustfmt_integration_test_suite.bzl"
pushd "${new_workspace}"
for variant in ${VARIANTS[@]}; do
check_build_result $TEST_FAILED ${variant}_unformatted_2015_test
check_build_result $TEST_FAILED ${variant}_unformatted_2018_test
check_build_result $TEST_OK ${variant}_formatted_2015_test
check_build_result $TEST_OK ${variant}_formatted_2018_test
check_build_result $TEST_OK ${variant}_generated_test
done
# Format a specific target
for variant in ${VARIANTS[@]}; do
bazel run @rules_rust//tools/rustfmt -- //test/rustfmt:${variant}_unformatted_2018
done
for variant in ${VARIANTS[@]}; do
check_build_result $TEST_FAILED ${variant}_unformatted_2015_test
check_build_result $TEST_OK ${variant}_unformatted_2018_test
check_build_result $TEST_OK ${variant}_formatted_2015_test
check_build_result $TEST_OK ${variant}_formatted_2018_test
check_build_result $TEST_OK ${variant}_generated_test
done
# Format all targets
bazel run @rules_rust//tools/rustfmt --@rules_rust//:rustfmt.toml=//test/rustfmt:test_rustfmt.toml
# Ensure all tests pass
check_build_result $TEST_OK "*"
popd
rm -rf "${temp_dir}"
}
test_all_and_apply