blob: c225493ae3423465ae918e1ad7ef839921b60cba [file] [log] [blame]
#!/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"