Improve error message of gcs_file & add test (#254) * Improve error message of gcs_file & add test Make sure we clearly print the name of the GCS file the file was downloaded from, the expected and actual digests. Also adds a simple test that ensures the downloaded file actually exists. * Run buildifier
diff --git a/WORKSPACE b/WORKSPACE index 9837304..39360b9 100644 --- a/WORKSPACE +++ b/WORKSPACE
@@ -76,3 +76,14 @@ "https://github.com/bazelbuild/bazel-toolchains/archive/44200e0c026d86c53470d107b3697a3e46469c43.tar.gz", ], ) + +# Download test file to test gcs_file rule +load("@bazel_toolchains//rules:gcs.bzl", "gcs_file") + +gcs_file( + name = "download_test_gcs_file", + bucket = "gs://bazel-toolchains-test", + downloaded_file_path = "test.txt", + file = "test.txt", + sha256 = "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9", +)
diff --git a/rules/gcs.bzl b/rules/gcs.bzl index 2d82a7e..2d97ea2 100644 --- a/rules/gcs.bzl +++ b/rules/gcs.bzl
@@ -56,7 +56,12 @@ gsutil_cp_and_validate_result = ctx.execute(["bash", "gsutil_cp_and_validate.sh"]) if gsutil_cp_and_validate_result.return_code == 255: - fail("SHA256 of downloaded file does not match given SHA256: %s" % gsutil_cp_and_validate_result.stderr) + fail("SHA256 of file {} from bucket {} does not match given SHA256: {} {}".format( + ctx.attr.file, + ctx.attr.bucket, + gsutil_cp_and_validate_result.stdout, + gsutil_cp_and_validate_result.stderr, + )) elif gsutil_cp_and_validate_result.return_code != 0: fail("gsutil cp command failed: %s" % (gsutil_cp_and_validate_result.stderr))
diff --git a/rules/gsutil_cp_and_validate.sh.tpl b/rules/gsutil_cp_and_validate.sh.tpl index 16d27c8..df022e6 100644 --- a/rules/gsutil_cp_and_validate.sh.tpl +++ b/rules/gsutil_cp_and_validate.sh.tpl
@@ -14,11 +14,13 @@ #!/bin/bash # Template script to download GCS file and validate its digest -set -ex +set -e +echo "Downloading %{BUCKET}/%{FILE} to %{DOWNLOAD_PATH}" gsutil cp %{BUCKET}/%{FILE} %{DOWNLOAD_PATH} - -if [ $(sha256sum %{DOWNLOAD_PATH} | head -c 64) != %{SHA256} ]; then +digest=$(sha256sum %{DOWNLOAD_PATH} | head -c 64) +if [ $digest != %{SHA256} ]; then + echo "actual digest: $digest, expected: %{SHA256}" exit -1 else exit 0
diff --git a/tests/rules/BUILD b/tests/rules/BUILD new file mode 100644 index 0000000..b6d0df1 --- /dev/null +++ b/tests/rules/BUILD
@@ -0,0 +1,8 @@ +# Simply ensures the file supposed to be downloaded by the gce_file +# test rule was actually downloaded +sh_test( + name = "gcs_file_test", + srcs = [":file_existence_test.sh"], + args = ["$(location @download_test_gcs_file//file:test.txt)"], + data = ["@download_test_gcs_file//file:test.txt"], +)
diff --git a/tests/rules/file_existence_test.sh b/tests/rules/file_existence_test.sh new file mode 100755 index 0000000..5b113a7 --- /dev/null +++ b/tests/rules/file_existence_test.sh
@@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright 2017 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Script to run the executable generated from a docker_toolchain_autoconfig rule +# and then check the toolchain configs for the c++ auto generated config exist. +# +# This script should be passed in 'srcs' of a sh_test test rule. The sh_test +# rule is expected to have the name {docker_toolchain_autoconfig_name}_test, +# where {docker_toolchain_autoconfig_name} is the docker_toolchain_autoconfig +# rule you would like to build and run. + +set -e + +if [ -e $1 ]; then + echo "Verified $1 exists" +else + echo "$1 did not exist" && false +fi