|  | #!/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. | 
|  |  | 
|  | set -eu | 
|  |  | 
|  | if ! stat "$0" >&/dev/null; then | 
|  | echo >&2 "ERROR[runfiles_windows_test.sh] cannot locate GNU coreutils" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | function _log_base() { | 
|  | prefix=$1 | 
|  | shift | 
|  | echo >&2 "${prefix}[$(basename "$0") $(date "+%H:%M:%S.%N (%z)")] $@" | 
|  | } | 
|  |  | 
|  | function log_fatal() { | 
|  | _log_base "ERROR" "$@" | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | function fail() { | 
|  | _log_base "FAILED" "$@" | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | # Look up runfiles.sh manually, do not rely on rlocation being already defined. | 
|  | # If all is working well, then rlocation should already be defined, because the | 
|  | # native launcher of the sh_test already sourced runfiles.sh from @bazel_tools, | 
|  | # but this test exercises runfiles.sh itself (from HEAD). | 
|  | [ -n "${RUNFILES_MANIFEST_FILE:-}" ] \ | 
|  | || log_fatal "RUNFILES_MANIFEST_FILE is undefined or empty" | 
|  | runfiles_sh="$(cat "$RUNFILES_MANIFEST_FILE" \ | 
|  | | fgrep "io_bazel/src/tools/runfiles/runfiles.sh" \ | 
|  | | cut -d' ' -f2-)" | 
|  | [ -n "$runfiles_sh" ] || fail "cannot find runfiles.sh" | 
|  |  | 
|  | # Unset existing definitions of the functions we want to test. | 
|  | if type rlocation >&/dev/null; then | 
|  | unset is_absolute | 
|  | unset is_windows | 
|  | unset rlocation | 
|  | fi | 
|  | if type rlocation >&/dev/null; then | 
|  | fail "rlocation is still defined" | 
|  | fi | 
|  |  | 
|  | # Assert that runfiles.sh needs $RUNFILES_MANIFEST_FILE. | 
|  | unset RUNFILES_MANIFEST_FILE | 
|  | if (source "$runfiles_sh" >&/dev/null) then | 
|  | fail "should fail to source '$runfiles_sh'" | 
|  | fi | 
|  |  | 
|  | # Set a mock $RUNFILES_MANIFEST_FILE. | 
|  | export RUNFILES_MANIFEST_FILE="$TEST_TMPDIR/mock-runfiles.txt" | 
|  | cat >"$RUNFILES_MANIFEST_FILE" <<'end_of_manifest' | 
|  | runfile/without/absolute/path | 
|  | runfile/spaceless c:\path\to\runfile1 | 
|  | runfile/spaceful c:\path\to\runfile with spaces | 
|  | end_of_manifest | 
|  |  | 
|  | # Source runfiles.sh and exercise its functions. | 
|  | source "$runfiles_sh" || fail "cannot source '${runfiles_sh}'" | 
|  |  | 
|  | # Exercise the functions in runfiles.sh. | 
|  | is_windows || fail "expected is_windows() to be true" | 
|  |  | 
|  | is_absolute "d:/foo" || fail "expected d:/foo to be absolute" | 
|  | is_absolute "D:\\foo" || fail "expected D:\\foo to be absolute" | 
|  | if is_absolute "/foo"; then | 
|  | fail "expected /foo not to be absolute" | 
|  | fi | 
|  |  | 
|  | [[ -z "$(rlocation runfile/without/absolute/path)" ]] \ | 
|  | || fail "rlocation 1 failed" | 
|  | [[ "$(rlocation runfile/spaceless)" = "c:\\path\\to\\runfile1" ]] \ | 
|  | || fail "rlocation 2 failed" | 
|  | [[ "$(rlocation runfile/spaceful)" = "c:\\path\\to\\runfile with spaces" ]] \ | 
|  | || fail "rlocation 3 failed" | 
|  | [[ "$(rlocation "c:\\some absolute/path")" = "c:\\some absolute/path" ]] \ | 
|  | || fail "rlocation 4 failed" |