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

BT_FILE_DEPS=(
  "tools/devshell/lib/vars.sh"
  "tools/devshell/lib/prebuilt.sh"
)

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../../lib/vars.sh || exit $?

# Replace fx-gen and fx-config-read with stubs.
unset -f fx-gen fx-config-read

fx-gen() {
  return 0
}

fx-config-read() {
  return 0
}

TEST_environment() {
  # This variable should be empty.
  BT_EXPECT_EMPTY "${devshell_lib_dir}"
}

TEST_fx-warn() {
  BT_ASSERT_FUNCTION_EXISTS fx-warn

  # Capture stderr.
  local result
  result=$( fx-warn some warning 2>&1 )
  BT_EXPECT_STRING_CONTAINS_SUBSTRING "${result}" "some warning"
}

TEST_fx-error() {
  BT_ASSERT_FUNCTION_EXISTS fx-error

  # Capture stderr.
  local result
  result=$( fx-error some error 2>&1 )
  BT_EXPECT_STRING_CONTAINS_SUBSTRING "${result}" "some error"
}

TEST_fx-build-dir-write() {
  BT_ASSERT_FUNCTION_EXISTS fx-build-dir-write

  local -r BUILD_DIR="build"
  fx-build-dir-write "${BUILD_DIR}"

  local -r EXPECTED_FILE="${FUCHSIA_DIR}/.fx-build-dir"
  BT_EXPECT_FILE_CONTAINS "${EXPECTED_FILE}" "${BUILD_DIR}"
}

TEST_fx-build-dir-if-present() {
  BT_ASSERT_FUNCTION_EXISTS fx-build-dir-if-present

  FUCHSIA_BUILD_DIR=""
  local -r CONFIG_FILE="${FUCHSIA_DIR}/.config"
  local -r BUILD_DIR_PATH="out"
  echo "FUCHSIA_BUILD_DIR=${BUILD_DIR_PATH}" > "${CONFIG_FILE}"

  BT_EXPECT fx-build-dir-if-present

  # Expect an absolute path.
  BT_EXPECT_EQ "${FUCHSIA_BUILD_DIR}" "${FUCHSIA_DIR}/${BUILD_DIR_PATH}"

  local -r FX_BUILD_DIR_FILE_PATH="${FUCHSIA_DIR}/.fx-build-dir"
  BT_EXPECT_FILE_CONTAINS "${FX_BUILD_DIR_FILE_PATH}" "${BUILD_DIR_PATH}"
  BT_EXPECT_FILE_DOES_NOT_EXIST "${CONFIG_FILE}"
}

TEST_fx-build-config-load() {
  BT_ASSERT_FUNCTION_EXISTS fx-build-config-load

  FUCHSIA_BUILD_DIR="out"
  local -r EXPECT_BUILD_DIR="${FUCHSIA_DIR}/${FUCHSIA_BUILD_DIR}"
  mkdir "${EXPECT_BUILD_DIR}"
  local -r FX_CONFIG_FILE_PATH="${EXPECT_BUILD_DIR}/fx.config"

  # Confirm testvar is not set before setting up the config file.
  BT_EXPECT_EQ "${testvar}" ""
  local -r TESTVAR_VALUE="my_value"
  echo "testvar=${TESTVAR_VALUE}" > "${FX_CONFIG_FILE_PATH}"

  BT_EXPECT fx-build-config-load

  # fx-build-config-load ensures FUCHSIA_BUILD_DIR is an absolute path.
  BT_EXPECT_EQ "${FUCHSIA_BUILD_DIR}" "${EXPECT_BUILD_DIR}"

  # fx-build-config-load should have loaded testvar from fx.config.
  BT_EXPECT_EQ "${testvar}" "${TESTVAR_VALUE}" \
    "testvar has unexpected value (${testvar})"
}


# Test parsing valid and invalid device names passed to "fx -d"
TEST_fx-getdeviceraw-and-isvaliddevice() {
  # Use subshells (parenthesis) in calls to get-device-raw to avoid premature exit
  local valids=(
      "127.0.0.1" "127.0.0.1:8022"
      ":8122"
      "strut-wind-ahead-turf" "strut-wind-ahead-turf:8111"
      "[::1]:22" "[fe80::7:8%eth0]:222" "[fe80::7:8%eth0]"
      "[fe80::4607:bff:fe68:41c9%zircon1-4]"
    )
  for valid in "${valids[@]}"; do
    BT_EXPECT is-valid-device "${valid}"
    BT_EXPECT "(" FUCHSIA_DEVICE_NAME="$valid" get-device-raw ")" > /dev/null
  done
  local invalids=(
      # no brackets:
      "::1" "::1:22" "fe80::7:8%eth0" "fe80::7:8%eth0:222"
      # invalid host names:
      "AAbbb" "aa_bbb" "xyz@bla.com"
      # more than 7 colons:
      "[2001:db8:aaaa:bbbb:cccc:dddd:0:1:0]" "[2001:db8:aaaa:bbbb:cccc:dddd:0:1:44f%enx44070ba0044e]"
      # invalid port numbers:
      ":122333" ":232a" ":-1"
    )
  for invalid in "${invalids[@]}"; do
    BT_EXPECT_FAIL is-valid-device "${invalid}"
    BT_EXPECT_FAIL "(" FUCHSIA_DEVICE_NAME="${invalid}" get-device-raw ")" 2> /dev/null
  done
}

# Test extracting port from device name passed to "fx -d"
TEST_fx-get-device-ssh-port() {
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1" get-device-ssh-port)" ""
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1:8811" get-device-ssh-port)" "8811"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME=":8812" get-device-ssh-port)" "8812"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]" get-device-ssh-port)" ""
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]:22" get-device-ssh-port)" "22"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="strut-wind-ahead-turf:822" get-device-ssh-port)" "822"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%enx44070ba0044e]" get-device-ssh-port)" ""

  # seven colons inside the brackets plus the one prefixing the port, so 8 total
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%enx44070ba0044e]:22" get-device-ssh-port)" "22"
}

TEST_fx-get-device-addr-resource() {
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1" get-device-addr-resource)" "127.0.0.1"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1:8811" get-device-addr-resource)" "127.0.0.1"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]" get-device-addr-resource)" "[::1]"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]:22" get-device-addr-resource)" "[::1]"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%enx44070ba0044e]" get-device-addr-resource)" "[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%enx44070ba0044e]"
}

TEST_fx-get-device-addr-url() {
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1" get-device-addr-url)" "127.0.0.1"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="127.0.0.1:8811" get-device-addr-url)" "127.0.0.1"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]" get-device-addr-url)" "[::1]"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[::1]:22" get-device-addr-url)" "[::1]"
  BT_EXPECT_EQ "$(FUCHSIA_DEVICE_NAME="[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%enx44070ba0044e]" get-device-addr-url)" "[2001:db8:aaaa:bbbb:cccc:dddd:0:44f%25enx44070ba0044e]"
}

TEST_fx-export-device-address() {
  unset FUCHSIA_DEVICE_NAME
  unset FX_DEVICE_NAME
  unset FX_DEVICE_ADDR
  unset FX_SSH_ADDR
  unset FX_SSH_PORT

  export FUCHSIA_DEVICE_NAME="[::2%lo0]:1234"
  fx-export-device-address

  BT_EXPECT_EQ "${FX_DEVICE_NAME}" "[::2%lo0]"
  BT_EXPECT_EQ "${FX_DEVICE_ADDR}" "::2%lo0"
  BT_EXPECT_EQ "${FX_SSH_ADDR}" "[::2%lo0]"
  BT_EXPECT_EQ "${FX_SSH_PORT}" "1234"

  unset -f fx-device-finder
  fx-device-finder() {
    echo "::3%lo0"
  }

  export FUCHSIA_DEVICE_NAME="foo-bar-baz-quux:1234"
  fx-export-device-address

  BT_EXPECT_EQ "${FX_DEVICE_NAME}" "foo-bar-baz-quux"
  BT_EXPECT_EQ "${FX_DEVICE_ADDR}" "::3%lo0"
  BT_EXPECT_EQ "${FX_SSH_ADDR}" "[::3%lo0]"
  BT_EXPECT_EQ "${FX_SSH_PORT}" "1234"
}

# Ensure that fx-zbi uses FUCHSIA_ZBI_COMPRESSION
TEST_fx-zbi() {
  export FUCHSIA_ZBI_COMPRESSION="zstd.max"
  export ZIRCON_TOOLS_DIR="${BT_TEMP_DIR}/out/default.zircon/tools"
  local zbi="${ZIRCON_TOOLS_DIR}/zbi"
  btf::make_mock "${zbi}"
  BT_EXPECT fx-zbi
  source "${zbi}.mock_state"
  BT_EXPECT_EQ "${BT_MOCK_ARGS[1]}" "--compressed=${FUCHSIA_ZBI_COMPRESSION}" \
    "Expected a --compressed=${FUCHSIA_ZBI_COMPRESSION} argument to zbi binary, got '${BT_MOCK_ARGS[@]:1}'"
}

# Ensure that fx-zbi-default-compression doesn't use FUCHSIA_ZBI_COMPRESSION.
TEST_fx-zbi-default-compression() {
  export FUCHSIA_ZBI_COMPRESSION="zstd.max"
  export ZIRCON_TOOLS_DIR="${BT_TEMP_DIR}/out/default.zircon/tools"
  local zbi="${ZIRCON_TOOLS_DIR}/zbi"
  btf::make_mock "${zbi}"
  BT_EXPECT fx-zbi-default-compression
  source "${zbi}.mock_state"
  BT_EXPECT_EQ "${#BT_MOCK_ARGS[@]}" "1" \
    "Expected no args to zbi binary, got '${BT_MOCK_ARGS[@]:1}'"
}

BT_RUN_TESTS "$@"
