#!/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"