#!/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 devfinder

# 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)"
  devfinder="$(btf::make_installed_hosttools_mock device-finder)"
}

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 devfinder: ${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 devfinder: ${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 "${devfinder}.mock_state" "list" "-ipv4=${FX_ENABLE_IPV4}" "--full"
  not_expect_args "${devfinder}.mock_state" "-mdns=false"
}

# 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 "${devfinder}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${devfinder}.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 "${devfinder}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${devfinder}.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 "${devfinder}.mock_state"
    BT_EXPECT_FILE_DOES_NOT_EXIST "${devfinder}.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}" > "${devfinder}.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}" > "${devfinder}.mock_stdout"
  ${fx} get-device-addr >/dev/null
  expect_args "${devfinder}.mock_state" "-ipv4=${FX_ENABLE_IPV4}"
  not_expect_args "${devfinder}.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}" > "${devfinder}.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.
  expect_args "${devfinder}.mock_state.1" "-ipv4=${FX_ENABLE_IPV4}"
  not_expect_args "${devfinder}.mock_state.1" "-mdns=false"
  expect_args "${devfinder}.mock_state.2" "-ipv4=${FX_ENABLE_IPV4}"
  not_expect_args "${devfinder}.mock_state.2" "-mdns=false"
}

BT_RUN_TESTS "$@"
