blob: 9a7b78304599ab34957f133eb8cfc79401e682d5 [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.
#
# Tests for fuchsia-common.sh library script
# shellcheck disable=SC2034
BT_FILE_DEPS=(
"scripts/sdk/gn/base/bin/fuchsia-common.sh"
"scripts/sdk/gn/testdata/meta/manifest.json"
)
MOCKED_SSH_BIN="mocked/ssh"
MOCKED_DEVICE_FINDER="scripts/sdk/gn/base/tools/device-finder"
MOCKED_GSUTIL="mocked/gsutil"
MOCKED_CIPD="mocked/cipd"
MOCKED_PGREP="mocked/pgrep"
MOCKED_KILL="mocked/kill"
# shellcheck disable=SC2034
BT_MOCKED_TOOLS=(
"${MOCKED_SSH_BIN}"
"${MOCKED_DEVICE_FINDER}"
"${MOCKED_GSUTIL}"
"${MOCKED_CIPD}"
"${MOCKED_PGREP}"
"${MOCKED_KILL}"
)
BT_SET_UP() {
cat > "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_side_effects" <<"EOF"
echo "$@"
EOF
# Add mocked system tools to the path.
export PATH="${BT_TEMP_DIR}/mocked:${PATH}"
if [ "$(type -t kill)" = "builtin" ]; then
kill() {
"${BT_TEMP_DIR}/${MOCKED_KILL}" "$@"
}
fi
# Copy the SDK manifest to the expected location
mkdir -p "${BT_TEMP_DIR}/scripts/sdk/gn/base/meta"
cp "${BT_TEMP_DIR}/scripts/sdk/gn/testdata/meta/manifest.json" "${BT_TEMP_DIR}/scripts/sdk/gn/base/meta/manifest.json"
# 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"
# Source the library file.
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fuchsia-common.sh"
}
TEST_data-dir-by-env() {
# Tests that the data directory can be overridden by using the FUCHSIA_SDK_DATA_DIR varable.
export FUCHSIA_SDK_DATA_DIR="${BT_TEMP_DIR}/data-dir-by-env"
mkdir -p "${FUCHSIA_SDK_DATA_DIR}"
BT_ASSERT_FUNCTION_EXISTS get-fuchsia-sshconfig-file
FILE_LOCATION="$(get-fuchsia-sshconfig-file)"
BT_EXPECT_EQ "${FILE_LOCATION}" "${FUCHSIA_SDK_DATA_DIR}/sshconfig"
}
TEST_fx-warn() {
BT_ASSERT_FUNCTION_EXISTS fx-warn
fx-warn "This is a test" 2>fx-warn-stderr.txt > fx-warn-stdout.txt
BT_EXPECT_FILE_CONTAINS "fx-warn-stderr.txt" "WARNING: This is a test"
[ ! -s fx-warn-stdout.txt ] || BT_EXPECT_GOOD_STATUS $?
}
TEST_fx-error() {
BT_ASSERT_FUNCTION_EXISTS fx-error
fx-error "This is a test" 2>fx-error-stderr.txt > fx-error-stdout.txt
BT_EXPECT_FILE_CONTAINS "fx-error-stderr.txt" "ERROR: This is a test"
[ ! -s fx-error-stdout.txt ] || BT_EXPECT_GOOD_STATUS $?
}
TEST_ssh-cmd() {
BT_ASSERT_FUNCTION_EXISTS ssh-cmd
cat > "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_side_effects" <<"EOF"
echo "$@"
EOF
ssh-cmd remote-host ls -l > /dev/null
BT_EXPECT_GOOD_STATUS $?
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_SSH_BIN}.mock_state"
EXPECTED_SSH_CMD_LINE=("${BT_TEMP_DIR}/${MOCKED_SSH_BIN}" "-F" "${FUCHSIA_WORK_DIR}/sshconfig" "remote-host" "ls" "-l")
BT_EXPECT_EQ "${EXPECTED_SSH_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}"
}
TEST_get-device-name() {
BT_ASSERT_FUNCTION_EXISTS get-device-name
cat > "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_side_effects" <<"EOF"
echo fe80::4607:bff:fe69:b53e%enx44070b69b53f atom-device-name-mocked
EOF
DEVICE_NAME="$(get-device-name)"
BT_EXPECT_EQ "${DEVICE_NAME}" "atom-device-name-mocked"
}
TEST_get-device-ip-by-name() {
BT_ASSERT_FUNCTION_EXISTS get-device-ip-by-name
MOCK_DEVICE="atom-device-name-mocked"
get-device-ip-by-name "$(get-fuchsia-sdk-dir)" "${MOCK_DEVICE}"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state"
EXPECTED_DEVICE_FINDER_CMD_LINE=("${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" "resolve" "-device-limit" "1" "-ipv4=false" "-netboot" "${MOCK_DEVICE}")
BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}"
}
TEST_get-device-ip-by-name-no-args() {
BT_ASSERT_FUNCTION_EXISTS get-device-ip-by-name
BT_EXPECT get-device-ip-by-name > /dev/null
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state"
EXPECTED_DEVICE_FINDER_CMD_LINE=("${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" "list" "-netboot" "-device-limit" "1" "-ipv4=false")
BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}"
}
TEST_get-device-ip() {
BT_ASSERT_FUNCTION_EXISTS get-device-ip
MOCK_DEVICE="atom-device-name-mocked"
BT_EXPECT get-device-ip
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state"
EXPECTED_DEVICE_FINDER_CMD_LINE=("${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" "list" "-netboot" "-device-limit" "1" "-ipv4=false")
BT_EXPECT_EQ "${EXPECTED_DEVICE_FINDER_CMD_LINE[*]}" "${BT_MOCK_ARGS[*]}"
}
TEST_get-host-ip-any() {
BT_ASSERT_FUNCTION_EXISTS get-host-ip
cat > "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_side_effects" <<"EOF"
if [[ "${1}" == list ]]; then
echo "fe80::4607:bff:fe69:b53e%enx44070b69b53f atom-device-name-mocked"
else
echo "fe80::4600:fff:fefe:b555%enx010101010101"
fi
EOF
HOST_IP="$(get-host-ip)"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state.1"
expected_cmd_line=( "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" list -netboot -device-limit 1 -full )
BT_EXPECT_EQ "${expected_cmd_line[*]}" "${BT_MOCK_ARGS[*]}"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state.2"
expected_cmd_line=( "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" resolve -local "-ipv4=false" atom-device-name-mocked )
BT_EXPECT_EQ "${expected_cmd_line[*]}" "${BT_MOCK_ARGS[*]}"
BT_EXPECT_EQ "${HOST_IP}" "fe80::4600:fff:fefe:b555"
}
TEST_get-host-ip() {
BT_ASSERT_FUNCTION_EXISTS get-host-ip
cat > "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_side_effects" <<"EOF"
echo "fe80::4600:fff:fefe:b555%enx010101010101"
EOF
HOST_IP="$(get-host-ip "$(get-fuchsia-sdk-dir)" "atom-device-name-mocked")"
# shellcheck disable=SC1090
source "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}.mock_state"
expected_cmd_line=( "${BT_TEMP_DIR}/${MOCKED_DEVICE_FINDER}" resolve -local "-ipv4=false" "atom-device-name-mocked" )
BT_EXPECT_EQ "${expected_cmd_line[*]}" "${BT_MOCK_ARGS[*]}"
BT_EXPECT_EQ "${HOST_IP}" "fe80::4600:fff:fefe:b555"
}
TEST_get-sdk-version() {
BT_ASSERT_FUNCTION_EXISTS get-sdk-version
SDK_VERSION="$(get-sdk-version)"
BT_EXPECT_EQ "${SDK_VERSION}" "8890373976687374912"
}
TEST_run-gsutil() {
BT_ASSERT_FUNCTION_EXISTS run-gsutil
cat > "${BT_TEMP_DIR}/${MOCKED_GSUTIL}.mock_side_effects" <<EOF
echo "gs://fuchsia/development/LATEST"
EOF
RESULT="$(run-gsutil ls gs://fuchsia/development/LATEST)"
BT_EXPECT_EQ "${RESULT}" "gs://fuchsia/development/LATEST"
}
TEST_run-cipd() {
BT_ASSERT_FUNCTION_EXISTS run-cipd
cat > "${BT_TEMP_DIR}/${MOCKED_CIPD}.mock_side_effects" <<EOF
echo "fuchsia/"
EOF
RESULT="$(run-cipd ls)"
BT_EXPECT_EQ "${RESULT}" "fuchsia/"
}
TEST_get-available-images() {
BT_ASSERT_FUNCTION_EXISTS get-available-images
cat > "${BT_TEMP_DIR}/${MOCKED_GSUTIL}.mock_side_effects" <<"EOF"
if [[ "${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"
else
echo "CommandException: One or more URLs matched no objects."
exit 1
fi
EOF
RESULT_LIST=()
IFS=' ' read -r -a RESULT_LIST <<< "$(get-available-images "sdk_id")"
BT_EXPECT_EQ "${RESULT_LIST[*]}" "image1 image2 image3"
IFS=' ' read -r -a RESULT_LIST <<< "$(get-available-images "sdk_id" "other")"
BT_EXPECT_EQ "${RESULT_LIST[*]}" "image4 image5 image6 image1 image2 image3"
BT_EXPECT_FAIL get-available-images "sdk_id" "invalid"
}
TEST_kill-running-pm_not_found() {
cat > "${BT_TEMP_DIR}/${MOCKED_PGREP}.mock_side_effects" <<"EOF"
echo ""
EOF
BT_EXPECT kill-running-pm 2> "${BT_TEMP_DIR}/kill-running-pm_output.txt"
BT_EXPECT_FILE_CONTAINS "${BT_TEMP_DIR}/kill-running-pm_output.txt" "WARNING: existing pm process not found"
}
TEST_kill-running-pm_found() {
if is-mac; then
pgrep_result="987654321"
else
pgrep_result="987654321 /path/tools/pm"
fi
cat > "${BT_TEMP_DIR}/${MOCKED_PGREP}.mock_side_effects" <<EOF
echo "${pgrep_result}"
EOF
BT_EXPECT kill-running-pm 2> "${BT_TEMP_DIR}/kill-running-pm_output.txt"
BT_EXPECT_FILE_CONTAINS "${BT_TEMP_DIR}/kill-running-pm_output.txt" "WARNING: Killing existing pm process"
}
TEST_get-fuchsia-property-names() {
# Don't copy the property names here, just confirm it is a list and they are valid.
BT_ASSERT_FUNCTION_EXISTS get-fuchsia-property-names
BT_ASSERT_FUNCTION_EXISTS is-valid-fuchsia-property
IFS=" " read -r -a prop_list <<< "$(get-fuchsia-property-names)"
# There should be between 1 and 10 properties
BT_ASSERT "(( ${#prop_list[@]} > 1 && ${#prop_list[@]} <= 10 ))"
for prop in "${prop_list[@]}"; do
BT_ASSERT is-valid-fuchsia-property "${prop}"
done
}
TEST_is-valid-fuchsia-property() {
BT_ASSERT is-valid-fuchsia-property "device-ip"
BT_ASSERT_FAIL is-valid-fuchsia-property "random-value"
}
TEST_set_and_get-fuchsia-property() {
BT_ASSERT_FUNCTION_EXISTS get-fuchsia-property
BT_ASSERT_FUNCTION_EXISTS set-fuchsia-property
BT_EXPECT set-fuchsia-property "device-ip" 100
value="$(get-fuchsia-property "device-ip")"
BT_EXPECT_EQ "$value" "100"
BT_EXPECT set-fuchsia-property "device-ip" ""
value="$(get-fuchsia-property "device-ip")"
BT_EXPECT_EQ "$value" ""
}
BT_RUN_TESTS "$@"