blob: b049591037997b6d30f0bb66d696413581073a3c [file] [log] [blame]
#!/bin/bash
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Common helpers specific for Fuchsia in-tree testing.
btf::setup_fx() {
if [[ -z "${BT_TEMP_DIR}" ]]; then
echo "Cannot proceed, BT_TEMP_DIR is unset" 1>&2
exit 1
fi
local with_metrics=0
if [[ $# -gt 0 && "$1" == "1" ]]; then
with_metrics=1
fi
local _HOST_OUT_DIR="host_x64"
local _REL_BUILD_DIR="out/default"
local _FUCHSIA_DIR="${BT_TEMP_DIR}"
local _FUCHSIA_BUILD_DIR="${_FUCHSIA_DIR}/${_REL_BUILD_DIR}"
# Fake fuchsia dir configuration.
local _FX="${_FUCHSIA_DIR}/scripts/fx"
BT_ASSERT_FILE_EXISTS "${_FX}"
BT_ASSERT_FILE_EXISTS "${_FUCHSIA_DIR}/tools/devshell/lib/vars.sh"
BT_ASSERT_FILE_EXISTS "${_FUCHSIA_DIR}/tools/devshell/lib/prebuilt.sh"
# Fake a build directory with the minimal content so that fx work
mkdir -p "${_FUCHSIA_BUILD_DIR}" "${_FUCHSIA_BUILD_DIR}/${_HOST_OUT_DIR}" \
"${_FUCHSIA_DIR}/.jiri_root/bin" "${_FUCHSIA_DIR}/.ssh"
ln -s "${_FX}" "${_FUCHSIA_DIR}/.jiri_root/bin/fx"
echo "${_REL_BUILD_DIR}" > "${_FUCHSIA_DIR}/.fx-build-dir"
touch "${_FUCHSIA_BUILD_DIR}/args.gn"
touch "${_FUCHSIA_DIR}/.ssh/pkey"
cat > "${_FUCHSIA_BUILD_DIR}/fx.config" << EOF
# Generated by fuchsia-mock.sh.
FUCHSIA_BUILD_DIR='${_REL_BUILD_DIR}'
FUCHSIA_ARCH='x64'
FUCHSIA_BOARD_NAME=pc
FUCHSIA_ZBI_COMPRESSION=zstd
HOST_OUT_DIR='${_HOST_OUT_DIR}'
EOF
if (( with_metrics )); then
BT_ASSERT_FILE_EXISTS "${_FUCHSIA_DIR}/tools/devshell/lib/metrics.sh"
else
btf::make_mock "${_FUCHSIA_DIR}/tools/devshell/lib/metrics.sh"
cat > "${_FUCHSIA_DIR}/tools/devshell/lib/metrics.sh.mock_side_effects" <<EOF
function track-command-execution {
:
}
function track-command-finished {
:
}
EOF
fi
echo "${_FX}"
}
btf::setup_fx_with_metrics() {
btf::setup_fx 1
}
btf::_make_buildtool_mock() {
local rel_path="$1"
local path="${BT_TEMP_DIR}/${rel_path}"
btf::make_mock "${path}"
echo "${path}"
}
btf::make_installed_hosttools_mock() {
local hosttool_name="$1"
btf::_make_buildtool_mock "out/default/host-tools/${hosttool_name}"
}
btf::make_hosttools_mock() {
local hosttool_name="$1"
btf::_make_buildtool_mock "out/default/host_x64/${hosttool_name}"
}
btf::make_zircontools_mock() {
local zircontool_name="$1"
btf::_make_buildtool_mock "out/default.zircon/tools/${zircontool_name}"
}
btf::make_mock_binary() {
local -r _BIN_PATH="$(mktemp -d "${BT_TEMP_DIR}/binpath.XXXXXX")"
local tool_name="$1"
local tool_path="${_BIN_PATH}/${tool_name}"
btf::make_mock "${tool_path}"
echo "${tool_path}"
}
btf::add_binary_to_path() {
local tool_path="$(dirname "$1")"
export PATH="${tool_path}:$PATH"
}
# Verifies that the arguments in BT_MOCK_ARGS match the arguments to this function.
# The number and order of arguments must match, or non-zero is returned.
# If a value of an argument is un-important it can be marked with the string
# _ANY_. This allows for matching arguments that may have unique values, such as temp
# filenames.
# Args: toolname arg [arg] [arg] ...
# Returns: 0 if found; 1 if not found.
btf::expect-mock-args() {
local tool="$1"
BT_ASSERT_FILE_EXISTS "${tool}.mock_state"
shift
source "${tool}.mock_state"
local expected=("$@")
local actual=("${BT_MOCK_ARGS[@]:1}") # ignore the first arg, the mocked command
BT_EXPECT_EQ "${#actual[@]}" "${#expected[@]}"
for (( i=0; i<"${#expected[@]}"; i++ )); do
if [[ "${expected[$i]}" != "_ANY_" ]]; then
BT_EXPECT_EQ "${actual[$i]}" "${expected[$i]}"
fi
done
return 0
}
btf::does-mock-args-contain() {
local state_file="$1"
BT_ASSERT_FILE_EXISTS "${state_file}"
shift
source "${state_file}"
local expected=("$@")
local actual=("${BT_MOCK_ARGS[@]}")
local al=${#actual[@]}
local el=${#expected[@]}
if [[ $el -gt $al ]]; then
return 1
fi
for (( a=1; a<"$(( al - el + 1 ))"; a++ )); do
for (( e=0; e<"${el}"; e++ )); do
local shifted="$((a + e))"
if [[ "${expected[$e]}" != "_ANY_" && "${actual[$shifted]}" != "${expected[$e]}" ]]; then
continue 2 # continue the outer loop
fi
done
# if we got here, we went through all the expected arguments, so success
return 0
done
return 1
}
btf::does-mock-args-not-contain() {
local state_file="$1"
BT_ASSERT_FILE_EXISTS "${state_file}"
shift
source "${state_file}"
local expected=("$@")
local actual=("${BT_MOCK_ARGS[@]}")
local al=${#actual[@]}
local el=${#expected[@]}
if [[ $el -gt $al ]]; then
return 0
fi
for (( a=1; a<"$(( al - el + 1 ))"; a++ )); do
for (( e=0; e<"${el}"; e++ )); do
local shifted="$((a + e))"
if [[ "${expected[$e]}" != "_ANY_" && "${actual[$shifted]}" != "${expected[$e]}" ]]; then
continue 2 # continue the outer loop
fi
done
# if we got here, we went through all the expected arguments, so we found it
return 1
done
}