blob: 58782c8e1d76063e4fd296f80ef27dd4ac3a53c1 [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.
#
# Test that verifies that fserve starts up a package server. This test also
# verifies that fserve connects to a connected Fuchsia device and registers the
# package server with the device.
set -e
FSERVE_CMD="${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fserve.sh"
FCONFIG_CMD="${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fconfig.sh"
# Sets up an ssh mock binary on the $PATH of any subshell.
set_up_ssh() {
export PATH="${BT_TEMP_DIR}/isolated_path_for:${PATH}"
SSH_MOCK_PATH="${BT_TEMP_DIR}/isolated_path_for"
cat > "${SSH_MOCK_PATH}/ssh.mock_side_effects" <<"EOF"
if [[ "$*" =~ SSH_CONNECTION ]]; then
echo "172.20.100.10 38618 100.90.250.100 22"
elif [[ "$*" =~ "amber_ctl add_src" ]]; then
return 0
else
echo "$@"
fi
EOF
}
# Sets up a device-finder mock. The implemented mock aims to produce minimal
# output that parses correctly but is otherwise uninteresting.
set_up_device_finder() {
cat >"${MOCKED_DEVICE_FINDER}.mock_side_effects" <<"SETVAR"
while (("$#")); do
case "$1" in
--local)
# Emit a different address than the default so the device and the host can
# have different IP addresses.
echo fe80::1234%coffee
exit
;;
--full)
echo fe80::c0ff:eec0:ffee%coffee coffee-coffee-coffee-coffee
exit
;;
esac
shift
done
echo fe80::c0ff:eec0:ffee%coffee
SETVAR
}
# Sets up a gsutil mock. The implemented mock creates an empty gzipped tarball
# at the destination of the cp command.
set_up_gsutil() {
cat >"${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/gsutil.mock_side_effects" <<"SETVAR"
if [[ "$1" != "cp" ]]; then
# Ignore any invocations other than cp.
exit 0
fi
outpath="$3"
mkdir -p "$(dirname "${outpath}")"
touch foo
tar czf "${outpath}" foo
SETVAR
}
set_up_gsutil_multibucket() {
cat > "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/gsutil.mock_side_effects" <<"EOF"
if [[ "$1" == "ls" ]]; then
if [[ "${2}" == *unknown.tar.gz ]]; then
echo "ls: cannot access \'${2}\': No such file or directory"
exit 1
elif [[ "${2}" == gs://fuchsia/* ]]; then
echo "gs://fuchsia/development/sdk_id/images/image1.tgz"
echo "gs://fuchsia/development/sdk_id/images/image2.tgz"
echo "gs://fuchsia/development/sdk_id/images/image3.tgz"
elif [[ "${2}" == gs://other/* ]]; then
echo "gs://other/development/sdk_id/images/image4.tgz"
echo "gs://other/development/sdk_id/images/image5.tgz"
echo "gs://other/development/sdk_id/images/image6.tgz"
fi
elif [[ "$1" == "cp" ]]; then
outpath="$3"
mkdir -p "$(dirname "${outpath}")"
cp ../testdata/empty.tar.gz "${outpath}"
fi
EOF
}
# Creates a stub Core SDK hashes file. The filename is based on the SDK version
# in manifest.json.
set_up_sdk_stubs() {
# The filename is constructed from the Core SDK version ("id") in the
# manifest. See //scripts/sdk/gn/testdata/meta/manifest.json.
mkdir -p "${FUCHSIA_WORK_DIR}/image"
local tarball="${FUCHSIA_WORK_DIR}/8890373976687374912_generic-x64.tgz"
touch foo
tar czf "${tarball}" foo
local hash
hash=$(run-md5 "${tarball}" | cut -d ' ' -f 1)
echo "${hash} ${tarball}" >"${FUCHSIA_WORK_DIR}/image/image.md5"
}
# Verify that pm serve was run correctly.
TEST_fserve_starts_package_server() {
set_up_ssh
set_up_device_finder
set_up_gsutil
set_up_sdk_stubs
# Run command.
BT_EXPECT "${FSERVE_CMD}" --image generic-x64 > "${BT_TEMP_DIR}/fserve_starts_package_server.txt" 2>&1
# shellcheck disable=SC1090
source "${MOCKED_PM}.mock_state"
expected=("${MOCKED_PM}" serve -repo "${FUCHSIA_WORK_DIR}/packages/amber-files" -l ":8083" )
gn-test-check-mock-args "${expected[@]}"
# Verify that pm was only run once.
BT_EXPECT_FILE_DOES_NOT_EXIST "${MOCKED_PM}.mock_state.1"
}
# Verifies that the package server has been correctly registered with the
# Fuchsia device.
TEST_fserve_registers_package_server() {
set_up_ssh
set_up_device_finder
set_up_gsutil
set_up_sdk_stubs
# Run command.
BT_EXPECT "${FSERVE_CMD}" --image generic-x64 > "${BT_TEMP_DIR}/fserve_registers_package_server.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected=(_ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" "echo" "\$SSH_CONNECTION")
gn-test-check-mock-args "${expected[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
# The host address matches the mock in ssh
expected=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" amber_ctl add_src -f "http://172.20.100.10:8083/config.json" -n "devhost")
gn-test-check-mock-args "${expected[@]}"
}
# Verify that the tool fails if gsutil fails to find the specified image,
# and also doesn't list any available images
TEST_fserve_lists_notfound() {
cat > "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/gsutil.mock_side_effects" <<"EOF"
if [[ "$1" == "ls" ]]; then
echo "ls: cannot access \'${2}\': No such file or directory"
exit 1
elif [[ "$1" == "cp" ]]; then
echo "CommandException: No URLs matched: \'${2}\'"
exit 1
fi
EOF
BT_EXPECT_FAIL gn-test-run-bash-script "${FSERVE_CMD}" --image unknown > list_images_output.txt 2>&1
BT_EXPECT_FILE_CONTAINS_SUBSTRING "list_images_output.txt" "Packages for unknown not found"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "list_images_output.txt" "Could not get list of available images for"
}
# Verify image names are listed if the image is not found.
TEST_fserve_lists_images() {
set_up_gsutil_multibucket
BT_EXPECT_FAIL "${FSERVE_CMD}" --image unknown > list_images_output.txt 2>&1
BT_EXPECT_FILE_CONTAINS_SUBSTRING "list_images_output.txt" "image1 image2 image3"
BT_EXPECT_FAIL "${FSERVE_CMD}" --bucket other --image unknown > list_images_output.txt 2>&1
BT_EXPECT_FILE_CONTAINS_SUBSTRING "list_images_output.txt" "image4 image5 image6 image1 image2 image3"
}
TEST_fserve_device_name(){
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FSERVE_CMD}" --device-name coffee-coffee-coffee-coffee > /dev/null 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected=(_ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" "echo" "\$SSH_CONNECTION")
gn-test-check-mock-args "${expected[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" _ANY_ _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fserve_device_addr(){
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FSERVE_CMD}" --device-ip 192.1.1.1 > "${BT_TEMP_DIR}/fserve_device_addr_log.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.1 "echo" _ANY_ )
gn-test-check-mock-args "${expected_args[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.1 amber_ctl _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fserve_with_ip_prop() {
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${FSERVE_CMD}" > "${BT_TEMP_DIR}/fserve_with_props_log.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.2 "echo" _ANY_ )
gn-test-check-mock-args "${expected_args[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.2 amber_ctl _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fserve_with_name_prop() {
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FCONFIG_CMD}" set device-name "coffee-coffee-coffee-coffee"
BT_EXPECT "${FSERVE_CMD}" > "${BT_TEMP_DIR}/fserve_with_props_log.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" "echo" _ANY_ )
gn-test-check-mock-args "${expected_args[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee" amber_ctl _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fserve_with_all_props() {
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${FCONFIG_CMD}" set device-name "coffee-coffee-coffee-coffee"
BT_EXPECT "${FSERVE_CMD}" > "${BT_TEMP_DIR}/fserve_with_props_log.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.2 "echo" _ANY_ )
gn-test-check-mock-args "${expected_args[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" 192.1.1.2 amber_ctl _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fserve_custom_sshconfig(){
set_up_ssh
set_up_device_finder
set_up_gsutil
BT_EXPECT "${FSERVE_CMD}" --sshconfig my_custom_config --device-ip 192.1.1.1 > "${BT_TEMP_DIR}/fserve_custom_sshconfig.txt" 2>&1
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.1"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "my_custom_config" 192.1.1.1 "echo" _ANY_ )
gn-test-check-mock-args "${expected_args[@]}"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state.2"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "my_custom_config" 192.1.1.1 amber_ctl _ANY_ _ANY_ _ANY_ _ANY_ _ANY_)
gn-test-check-mock-args "${expected_args[@]}"
}
# Test initialization.
# shellcheck disable=SC2034
BT_FILE_DEPS=(
scripts/sdk/gn/base/bin/fserve.sh
scripts/sdk/gn/base/bin/fconfig.sh
scripts/sdk/gn/base/bin/fuchsia-common.sh
scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh
)
# shellcheck disable=SC2034
BT_MOCKED_TOOLS=(
scripts/sdk/gn/base/bin/gsutil
scripts/sdk/gn/base/tools/x64/device-finder
scripts/sdk/gn/base/tools/arm64/device-finder
scripts/sdk/gn/base/tools/x64/pm
scripts/sdk/gn/base/tools/arm64/pm
isolated_path_for/ssh
)
BT_SET_UP() {
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/scripts/sdk/gn/bash_tests/gn-bash-test-lib.sh"
# Make "home" directory in the test dir so the paths are stable."
mkdir -p "${BT_TEMP_DIR}/test-home"
export HOME="${BT_TEMP_DIR}/test-home"
FUCHSIA_WORK_DIR="${HOME}/.fuchsia"
MOCKED_DEVICE_FINDER="${BT_TEMP_DIR}/scripts/sdk/gn/base/$(gn-test-tools-subdir)/device-finder"
MOCKED_PM="${BT_TEMP_DIR}/scripts/sdk/gn/base/$(gn-test-tools-subdir)/pm"
}
BT_INIT_TEMP_DIR() {
mkdir -p "${BT_TEMP_DIR}/scripts/sdk/gn/base/meta"
# Create a stub SDK manifest.
cp "${BT_DEPS_ROOT}/scripts/sdk/gn/testdata/meta/manifest.json" \
"${BT_TEMP_DIR}/scripts/sdk/gn/base/meta/manifest.json"
}
BT_RUN_TESTS "$@"