| #!/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/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 "$@" |