blob: 3ac004a9853d2899711581c7ac63992a4c494e45 [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 fssh correctly discovers and connects to a Fuchsia
# device.
set -e
BT_INIT_TEMP_DIR() {
# This authorized_keys file must not be empty, but its contents aren't used.
mkdir -p "${BT_TEMP_DIR}/scripts/sdk/gn/base/testdata"
echo ssh-ed25519 00000000000000000000000000000000000000000000000000000000000000000000 \
>"${BT_TEMP_DIR}/scripts/sdk/gn/base/testdata/authorized_keys"
}
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"
FCONFIG_CMD="${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fconfig.sh"
# Add the ssh mock to the path so fssh uses it vs. the real ssh.
SSH_MOCK_PATH="${BT_TEMP_DIR}/isolated_path_for"
export PATH="${SSH_MOCK_PATH}:${PATH}"
}
# 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
}
TEST_fssh_help() {
BT_EXPECT_FAIL "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" --help > "${BT_TEMP_DIR}/usage.txt"
readonly EXPECTED_HELP="Usage: fssh.sh [args]
[--help]
This message.
[--device-name <device hostname>]
Connects to the device with the given device hostname. Cannot be used with --device-ip.
Defaults to the value from \`fconfig.sh get device-name\`.
[--device-ip <device ip>]
Connects to the device with the given device ip address. Cannot be used with --device-name.
Defaults to the value from \`fconfig.sh get device-ip\`.
Note: If defaults are configured for both device-name and device-ip, then device-ip is used.
If the device is specified at all, then the first device discovered is used.
[--private-key <identity file>]
Uses additional private key when using ssh to access the device.
[--sshconfig <sshconfig file>]
Use the specified sshconfig file instead of fssh's version.
[-q|--quiet]
Suppress non-error output from fssh.sh (but not from the remote command).
All positional arguments are passed through to SSH to be executed on the device."
BT_EXPECT_FILE_CONTAINS "${BT_TEMP_DIR}/usage.txt" "${EXPECTED_HELP}"
}
# Verifies that the correct ssh command is run by fssh.
TEST_fssh() {
set_up_device_finder
# Run command.
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh"
# Verify that ssh was run correctly.
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
gn-test-check-mock-args _ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" fe80::c0ff:eec0:ffee%coffee
BT_EXPECT_FILE_DOES_NOT_EXIST "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/ssh.mock_state"
}
TEST_fssh_by_ip() {
set_up_device_finder
# Run command.
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" --device-ip fe80::d098:513f:9cfb:eb53%hardcoded
# Verify that ssh was run correctly.
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
gn-test-check-mock-args _ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" fe80::d098:513f:9cfb:eb53%hardcoded
}
TEST_fssh_by_name() {
set_up_device_finder
# Run command.
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" --device-name coffee-coffee-coffee-coffee
# Verify that ssh was run correctly.
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
gn-test-check-mock-args _ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" fe80::c0ff:eec0:ffee%coffee
}
TEST_fssh_name_not_found() {
echo 2 > "${MOCKED_DEVICE_FINDER}.mock_status"
echo "2020/02/25 07:42:59 no devices with domain matching 'name-not-found'" > "${MOCKED_DEVICE_FINDER}.stderr"
# Run command.
BT_EXPECT_FAIL "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" --device-name name-not-found
}
TEST_fssh_with_ip_prop() {
set_up_device_finder
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" > "out.txt"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "out.txt" "Using device address 192.1.1.2"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "192.1.1.2")
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fssh_with_name_prop() {
set_up_device_finder
BT_EXPECT "${FCONFIG_CMD}" set device-name "coffee-coffee-coffee-coffee"
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" > "out.txt"
BT_EXPECT_FILE_CONTAINS_SUBSTRING "out.txt" "Using device name coffee-coffee-coffee-coffee"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "fe80::c0ff:eec0:ffee%coffee")
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fssh_with_ip_prop_quiet() {
set_up_device_finder
echo "my-super-cool-device" > "${SSH_MOCK_PATH}/ssh.mock_stdout"
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" "-q" "hostname" > "out.txt"
# Make sure output only contains content from stdout of the remote command.
BT_EXPECT_FILE_CONTAINS "out.txt" "my-super-cool-device"
# Verify that ssh was run correctly.
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
gn-test-check-mock-args _ANY_ -F "${FUCHSIA_WORK_DIR}/sshconfig" "192.1.1.2" "hostname"
}
TEST_fssh_with_all_props() {
set_up_device_finder
BT_EXPECT "${FCONFIG_CMD}" set device-ip "192.1.1.2"
BT_EXPECT "${FCONFIG_CMD}" set device-name "coffee-coffee-coffee-coffee"
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" > "out.txt"
# Preference is given to device-ip.
BT_EXPECT_FILE_CONTAINS_SUBSTRING "out.txt" "Using device address 192.1.1.2"
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "${FUCHSIA_WORK_DIR}/sshconfig" "192.1.1.2")
gn-test-check-mock-args "${expected_args[@]}"
}
TEST_fssh_with_custom_sshconfig() {
set_up_device_finder
BT_EXPECT "${BT_TEMP_DIR}/scripts/sdk/gn/base/bin/fssh.sh" "--sshconfig" "custom-sshconfig" hostname
# shellcheck disable=SC1090
source "${SSH_MOCK_PATH}/ssh.mock_state"
expected_args=("${SSH_MOCK_PATH}/ssh" -F "custom-sshconfig" "fe80::c0ff:eec0:ffee%coffee" hostname)
gn-test-check-mock-args "${expected_args[@]}"
}
# Test initialization.
# shellcheck disable=SC2034
BT_FILE_DEPS=(
scripts/sdk/gn/base/bin/fconfig.sh
scripts/sdk/gn/base/bin/fssh.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/tools/x64/device-finder
scripts/sdk/gn/base/tools/arm64/device-finder
isolated_path_for/ssh
)
BT_RUN_TESTS "$@"