#!/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 device-finder in fx scripts


BT_FILE_DEPS=(
  "scripts/fx"
  "tools/devshell/lib/vars.sh"
  "tools/devshell/lib/fx-cmd-locator.sh"
  "tools/devshell/lib/fx-optional-features.sh"
  "tools/devshell/lib/platform.sh"
  "tools/devshell/set-device"
  "tools/devshell/get-device-addr"
  "tools/devshell/shell"
)

declare fx ffx

# Ensure that the variable influences the output
export FX_ENABLE_IPV4=dummyarg

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)"
}

not_expect_args() {
  local mock_state_file="$1"
  shift
  for arg in "$@"; do
    if btf::does-mock-args-contain "${mock_state_file}" "$arg"; then
      btf::_fail 1 "Argument ${arg} found but not expected in call to ffx: ${mock_state_file}"
      return 1
    fi
  done
}

expect_args() {
  local mock_state_file="$1"
  shift
  for arg in "$@"; do
    if btf::does-mock-args-not-contain "${mock_state_file}" "$arg"; then
      btf::_fail 1 "Expected argument ${arg} not found in call to ffx: ${mock_state_file}"
      return 1
    fi
  done
}

# ensure that set-device invocations of device-finder use the proper network flags
TEST_setdevice() {
  ${fx} set-device >/dev/null 2>&1
  expect_args "${ffx}.mock_state" "target" "list" "--format" "s"
}

# ensure that get-fuchsia-device-addr doesn't try to resolve IPv4 addresses
TEST_getdeviceaddr_resolved_ipv4_addresses() {
  local addrs=("127.0.0.1" "255.255.255.255" "1.0.0.1")
  for addr in "${addrs[@]}"; do
    BT_EXPECT_EQ "$(${fx} -d "${addr}" get-device-addr)" "${addr}"
    BT_EXPECT_EQ "$(${fx} -d "${addr}:8022" get-device-addr)" "${addr}"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state.1"
  done
}

# ensure that get-fuchsia-device-addr doesn't try to resolve IPv6 addresses
# using "fx set-device 'address'"
TEST_getdeviceaddr_resolved_ipv6_addresses_setdevice() {
  local addrs=("1:2:3:4" "1::" "b1::8" "1:2:3:4:5:6::8" \
    "1:2:3:4:5:6::8" "1::7:f8" "1:a2:3:b4:5::7:8" "1:2:3:d4:5e::8" "a1::6:7:8" \
    "1:2:c3:4a::6:7:8f" "1:2:3:4::8" "1::5:6:d7:8" "1:2:3::5:6:7:8" "d1:2:3::8" \
    "1::4:5:6:7:8" "1:2::4:5:6:7:8" "1:2::8" "c1::e3:4:5:6:7:8" "1::3:4:5:6:7:8" \
    "c1::8" "::8" "::" "fe80::7:8%eth0" "fe80::7:8%1" )
  for addr in "${addrs[@]}"; do
    # fx syntax requires that IPv6 address is surrounded by square brackets
    BT_EXPECT ${fx} set-device "[${addr}]" >/dev/null
    BT_EXPECT_EQ "$(${fx} get-device-addr)" "${addr}"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state.1"
  done
}

# ensure that get-fuchsia-device-addr doesn't try to resolve IPv6 addresses
# using "fx -d 'address' ..."
TEST_getdeviceaddr_resolved_ipv6_addresses() {
  local addrs=("1:2:3:4" "1::" "b1::8" "1:2:3:4:5:6::8" \
    "1:2:3:4:5:6::8" "1::7:f8" "1:a2:3:b4:5::7:8" "1:2:3:d4:5e::8" "a1::6:7:8" \
    "1:2:c3:4a::6:7:8f" "1:2:3:4::8" "1::5:6:d7:8" "1:2:3::5:6:7:8" "d1:2:3::8" \
    "1::4:5:6:7:8" "1:2::4:5:6:7:8" "1:2::8" "c1::e3:4:5:6:7:8" "1::3:4:5:6:7:8" \
    "c1::8" "::8" "::" "fe80::7:8%eth0" "fe80::7:8%1" )
  for addr in "${addrs[@]}"; do
    # fx syntax requires that IPv6 address is surrounded by square brackets
    BT_EXPECT_EQ "$(${fx} -d "[${addr}]" get-device-addr)" "${addr}"
    # also test with ssh port
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${ffx}.mock_state.1"
  done
}

# test a name that looks like an ipv4 ip but is not
TEST_getdeviceaddr_name_looks_like_ipv4() {
  local name="1.1.244"
  ip="127.0.0.1"
  echo "${ip}" > "${ffx}.mock_stdout"
  BT_EXPECT_EQ "$(${fx} -d "${name}" get-device-addr)" "${ip}"
}

# ensure that get-fuchsia-device-addr invocations of device-finder use the proper network flags
TEST_getdeviceaddr_singledevice() {
  local ip="fe80::c0ff:eec0:ffee%coffee"
  echo "${ip}" > "${ffx}.mock_stdout"
  ${fx} get-device-addr >/dev/null
  not_expect_args "${ffx}.mock_state" "-mdns=false"
}

# ensure that get-fuchsia-device-addr invocations of device-finder use the proper network flags
TEST_getdeviceaddr_multipledevice() {
  local ip1="ccff::c0ff:eec0:ffee%coffee"
  local ip2="00ee::c0ff:eec0:ffee%coffee"
  echo -e "${ip1}\n${ip2}" > "${ffx}.mock_stdout"
  # in this test we don't care about the results of get-device-addr
  ${fx} get-device-addr >/dev/null 2>&1
  # first device-finder call is for a regular list and
  # second device-finder call is for a -full list. Both require the same network
  # flags.
  not_expect_args "${ffx}.mock_state.1" "-mdns=false"
  not_expect_args "${ffx}.mock_state.2" "-mdns=false"
}

BT_RUN_TESTS "$@"
