| #!/bin/bash | |
| # Copyright 2019 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 expected usage of ssh in fx scripts | |
| # Source platform.sh so that we can point to jq and include it as a runtime dependency. | |
| source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)/../../lib/platform.sh" || exit $? | |
| BT_FILE_DEPS=( | |
| "prebuilt/third_party/jq/${HOST_PLATFORM}/bin/jq" | |
| "scripts/fx" | |
| "tools/devshell/jq.fx" | |
| "tools/devshell/lib/fx-cmd-locator.sh" | |
| "tools/devshell/lib/fx-optional-features.sh" | |
| "tools/devshell/lib/generate-ssh-config.sh" | |
| "tools/devshell/lib/vars.sh" | |
| "tools/devshell/lib/is_invoked_by_agent.sh" | |
| "tools/devshell/lib/agents.txt" | |
| "tools/devshell/lib/platform.sh" | |
| "tools/devshell/set-device" | |
| "tools/devshell/shell" | |
| ) | |
| BT_MOCKED_TOOLS=( | |
| "tools/devshell/ssh" | |
| ) | |
| declare fx ffx ssh | |
| BT_SET_UP() { | |
| source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh" | |
| fx="$(btf::setup_fx)" | |
| ffx="$(btf::make_installed_hosttools_mock ffx)" | |
| ssh="${BT_TEMP_DIR}/tools/devshell/ssh" | |
| } | |
| # ensure that "fx -t ipv4:port shell" calls ssh with expected address and port number | |
| TEST_ssh_ipv4_port() { | |
| addr="127.0.0.1:8022" | |
| cat >> "${ffx}.mock_side_effects" << EOF | |
| if [ "\$3" == "target" ] || [ "\$1" == "target" ]; then | |
| echo \$FUCHSIA_NODENAME | |
| else | |
| echo "/path/to/ssh.priv" | |
| fi | |
| EOF | |
| BT_EXPECT ${fx} -t "127.0.0.1:8022" shell | |
| BT_EXPECT btf::does-mock-args-contain "${ssh}.mock_state" "-p" "8022" "127.0.0.1" | |
| } | |
| # ensure that "fx -t [ipv6]:port shell" calls ssh with expected address and port number | |
| TEST_ssh_ipv6_port() { | |
| addr="[fe80::7:8%eth0]:222" | |
| cat >> "${ffx}.mock_side_effects" << EOF | |
| if [ "\$3" == "target" ] || [ "\$1" == "target" ]; then | |
| echo \$FUCHSIA_NODENAME | |
| else | |
| echo "/path/to/ssh.priv" | |
| fi | |
| EOF | |
| BT_EXPECT ${fx} -t "[fe80::7:8%eth0]:222" shell | |
| BT_EXPECT btf::does-mock-args-contain "${ssh}.mock_state" "-p" "222" "fe80::7:8%eth0" | |
| } | |
| # ensure that fx shell fails because hostname has invalid character (_) | |
| TEST_ssh_invalid_hostname_port() { | |
| BT_EXPECT_FAIL ${fx} -t "invalid_hostname" shell 2> /dev/null | |
| BT_EXPECT_FAIL ${fx} -t "invalid_hostname:22" shell 2> /dev/null | |
| } | |
| # ensure that "fx -t ipv6:port shell" fails because of invalid formats | |
| TEST_ssh_invalid_ipv6_port() { | |
| # no brackets | |
| BT_EXPECT_FAIL ${fx} -t "fe80::7:8%eth0:222" shell 2> /dev/null | |
| # more than 7 colons | |
| BT_EXPECT_FAIL ${fx} -t "[2001:db8:aaaa:bbbb:cccc:dddd:0:1:0]" shell 2> /dev/null | |
| BT_EXPECT_FAIL ${fx} -t "[2001:db8:aaaa:bbbb:cccc:dddd:0:1:44f%enx44070ba0044e]" shell 2> /dev/null | |
| } | |
| # ensure that "fx -t addr shell" calls ssh with expected address and no port number | |
| TEST_ssh_addr() { | |
| addr="127.0.0.1" | |
| cat >> "${ffx}.mock_side_effects" << EOF | |
| if [ "\$3" == "target" ] || [ "\$1" == "target" ]; then | |
| echo \$FUCHSIA_NODENAME | |
| else | |
| echo "/path/to/ssh.priv" | |
| fi | |
| EOF | |
| BT_EXPECT ${fx} -t "127.0.0.1" shell | |
| BT_EXPECT btf::does-mock-args-contain "${ssh}.mock_state" "127.0.0.1" | |
| BT_EXPECT btf::does-mock-args-not-contain "${ssh}.mock_state" "-p" | |
| } | |
| # ensure that "fx shell" calls ssh with address returned by ffx and the proper port number | |
| TEST_ssh_resolve_addr_port() { | |
| local ipv6="fe80::4607:bff:fea0:44f%enx44070ba0044e" | |
| cat >> "${ffx}.mock_side_effects" << EOF | |
| if [ "\$*" == *"target list --format addresses"* ]; then | |
| echo $ipv6 | |
| elif [ "\$4" == "default" ]; then | |
| echo $ipv6 | |
| else | |
| echo "/path/to/ssh.priv" | |
| fi | |
| EOF | |
| BT_EXPECT ${fx} shell | |
| BT_EXPECT btf::does-mock-args-contain "${ssh}.mock_state" "${ipv6}" | |
| BT_EXPECT btf::does-mock-args-not-contain "${ssh}.mock_state" "-p" | |
| } | |
| BT_RUN_TESTS "$@" |