aboutsummaryrefslogtreecommitdiff
path: root/go/private/tools/files_equal_test.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'go/private/tools/files_equal_test.bzl')
-rw-r--r--go/private/tools/files_equal_test.bzl122
1 files changed, 122 insertions, 0 deletions
diff --git a/go/private/tools/files_equal_test.bzl b/go/private/tools/files_equal_test.bzl
new file mode 100644
index 00000000..90377bf3
--- /dev/null
+++ b/go/private/tools/files_equal_test.bzl
@@ -0,0 +1,122 @@
+# Copyright 2016 The Bazel Go Rules Authors. All rights reserved.
+# Copyright 2016 The Closure Rules 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.
+
+"""Tests that two files contain the same data."""
+
+def files_equal_test(name, golden, actual, error_message = None, **kwargs):
+ # This genrule creates a Bash script: the source of the actual test.
+ # The script:
+ # 1. Initializes the Bash runfiles library (see
+ # @bazel_tools//tools/bash/runfiles/runfiles.bash).
+ # 2. Stores command line arguments into variables.
+ # 3. Computes runfile paths for the GOLDEN and ACTUAL files.
+ # 4. Calls "rlocation" from runfiles.bash to locates the runfiles.
+ # 5. Computes and compares checksums.
+ native.genrule(
+ name = name + "_src",
+ outs = [name + "-src.sh"],
+ executable = True,
+ visibility = ["//visibility:private"],
+ cmd = r"""cat >$@ <<'eof'
+#!/usr/bin/env bash
+# sh_test() source, generated by @io_bazel_rules_go//go/private/tools/files_equal_test.bzl
+
+### 1. initialize the Bash runfiles library
+
+# --- begin runfiles.bash initialization ---
+# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
+set -euo pipefail
+if [[ ! -d "$${RUNFILES_DIR:-/dev/null}" && ! -f "$${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
+ if [[ -f "$$0.runfiles_manifest" ]]; then
+ export RUNFILES_MANIFEST_FILE="$$0.runfiles_manifest"
+ elif [[ -f "$$0.runfiles/MANIFEST" ]]; then
+ export RUNFILES_MANIFEST_FILE="$$0.runfiles/MANIFEST"
+ elif [[ -f "$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+ export RUNFILES_DIR="$$0.runfiles"
+ fi
+fi
+if [[ -f "$${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
+ source "$${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
+elif [[ -f "$${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
+ source "$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
+ "$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
+else
+ echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
+ exit 1
+fi
+# --- end runfiles.bash initialization ---
+
+### 2. Store command line arguments into variables.
+
+declare -r GOLDEN="$${1}"
+declare -r ACTUAL="$${2}"
+declare -r ERROR_MSG="$${3:-FILES DO NOT HAVE EQUAL CONTENTS}"
+
+### 3. Compute runfile paths.
+
+# Strip "external/" prefix OR prepend workspace name and strip "./" prefix.
+[[ "$$GOLDEN" =~ external/* ]] && F1="$${GOLDEN#external/}" || F1="$$TEST_WORKSPACE/$${GOLDEN#./}"
+[[ "$$ACTUAL" =~ external/* ]] && F2="$${ACTUAL#external/}" || F2="$$TEST_WORKSPACE/$${ACTUAL#./}"
+
+### 4. Locate the runfiles.
+
+F1="$$(rlocation "$$F1")"
+F2="$$(rlocation "$$F2")"
+
+if [[ "$$F1" == "$$F2" ]]; then
+ echo >&2 "GOLDEN and ACTUAL should be different files"
+ exit 1
+fi
+
+### 5. Compute and compare checksums.
+
+function checksum() {
+ if command -v openssl >/dev/null; then
+ openssl sha1 $$1 | cut -f 2 -d ' '
+ elif command -v sha256sum >/dev/null; then
+ sha256sum $$1 | cut -f 1 -d ' '
+ elif command -v shasum >/dev/null; then
+ cat $$1 | shasum -a 256 | cut -f 1 -d ' '
+ else
+ echo please install openssl >&2
+ exit 1
+ fi
+}
+SUM1=$$(checksum "$$F1")
+SUM2=$$(checksum "$$F2")
+if [[ $${SUM1} != $${SUM2} ]]; then
+ echo "ERROR: $$ERROR_MSG" >&2
+ echo "$$GOLDEN $${SUM1}" >&2
+ echo "$$ACTUAL $${SUM2}" >&2
+ exit 1
+fi
+eof""",
+ )
+
+ native.sh_test(
+ name = name,
+ srcs = [name + "-src.sh"],
+ data = [
+ "@bazel_tools//tools/bash/runfiles",
+ actual,
+ golden,
+ ],
+ args = [
+ "$(location %s)" % golden,
+ "$(location %s)" % actual,
+ error_message,
+ ],
+ **kwargs
+ )