#!/bin/bash
# Copyright 2020 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 fx fdt

BT_FILE_DEPS=(
  "scripts/fx"
  "tools/devshell/fdt"
  "tools/devshell/lib/fx-cmd-locator.sh"
  "tools/devshell/lib/fx-optional-features.sh"
  "tools/devshell/lib/platform.sh"
  "tools/devshell/lib/vars.sh"
)

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

# shellcheck disable=SC2034
BT_MOCKED_TOOLS=(
  "bin/cipd"
  "bin/open" # mock out MacOS' open command
  "bin/unzip"
)

BT_MKDIR_DEPS=(
  ".jiri_root"
)

declare fx

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

  export FUCHSIA_DEVICE_NAME="foo-bar-baz-quux"
  echo "::3%lo0" > "${devfinder}.mock_stdout"

  # Set up mocked replacements for system utils.
  export PATH="${BT_TEMP_DIR}/bin:${PATH}"

  cipd="${BT_TEMP_DIR}/bin/cipd"
  unzip="${BT_TEMP_DIR}/bin/unzip"
}

# Test that prebuilt is run with no args works with new binary.
TEST_noargs_uses_prebuilt_new_binary() {
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/macos/macos.zip"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted-temp"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/linux/fuchsia_devtools"

  BT_EXPECT ${fx} fdt

  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    BT_EXPECT btf::does-mock-args-contain "${unzip}.mock_state" "-d ${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted-temp"
  fi
}

# Test that prebuilt is run with no args works with old binary.
TEST_noargs_uses_prebuilt_old_binary() {
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos/macos.zip"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted-temp"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/linux/fuchsia_devtools"

  BT_EXPECT ${fx} fdt

  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    BT_EXPECT btf::does-mock-args-contain "${unzip}.mock_state" "-d ${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted-temp"
  fi
}

# Test that prebuilt fails if not downloaded.
TEST_prebuilt_unavailable() {
  local out="${BT_TEMP_DIR}/_fx_test_output"

  BT_EXPECT_FAIL ${fx} fdt > "${out}"
  BT_EXPECT_FILE_CONTAINS_SUBSTRING "${out}" "JIRI"
}

# Test that CIPD is used to fetch "latest" with the new binary.
TEST_uses_cipd_for_latest_new_binary() {
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/macos/macos.zip"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/macos-extracted-temp"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/linux/fuchsia_devtools"

  BT_EXPECT ${fx} fdt latest

  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    BT_EXPECT btf::does-mock-args-contain "${unzip}.mock_state" "-d ${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/macos-extracted-temp"
  fi
  BT_EXPECT btf::does-mock-args-contain "${cipd}.mock_state" "ensure"
}

# Test that CIPD is used to fetch "latest" with the old binary.
TEST_uses_cipd_for_latest_old_binary() {
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/macos/macos.zip"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/macos-extracted-temp"
  btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/linux/fuchsia_devtools"

  BT_EXPECT ${fx} fdt latest

  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    BT_EXPECT btf::does-mock-args-contain "${unzip}.mock_state" "-d ${BT_TEMP_DIR}/prebuilt/gui_tools/download/fuchsia_devtools/macos-extracted-temp"
  fi
  BT_EXPECT btf::does-mock-args-contain "${cipd}.mock_state" "ensure"
}

# Test that fx-export-device-address fills in environment variables.
TEST_uses_fx_export_device_address() {
  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    FDT="${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted-temp/Fuchsia DevTools.app"
    FDT_MOVED="${BT_TEMP_DIR}/prebuilt/gui_tools/fuchsia_devtools/macos-extracted/Fuchsia DevTools.app"
    btf::make_mock "${BT_TEMP_DIR}/prebuilt/gui_tools/macos/macos.zip"
    btf::make_mock "${FDT}"

    cat > "${BT_TEMP_DIR}/bin/open.mock_side_effects" <<EOF
    exec "${FDT_MOVED}"
EOF
    cat > "${FDT}.mock_side_effects" <<EOF
    echo "\${FX_DEVICE_NAME}" >> "${FDT_MOVED}.fx_device_name"
    echo "\${FX_DEVICE_ADDR}" >> "${FDT_MOVED}.fx_device_addr"
    echo "\${FX_SSH_ADDR}" >> "${FDT_MOVED}.fx_ssh_addr"
    echo "\${FX_SSH_PORT}" >> "${FDT_MOVED}.fx_ssh_port"
EOF
  else
    FDT="${BT_TEMP_DIR}/prebuilt/gui_tools/linux/fuchsia_devtools"
    btf::make_mock "${FDT}"

    cat > "${FDT}.mock_side_effects" <<EOF
    echo "\${FX_DEVICE_NAME}" >> "${FDT}.fx_device_name"
    echo "\${FX_DEVICE_ADDR}" >> "${FDT}.fx_device_addr"
    echo "\${FX_SSH_ADDR}" >> "${FDT}.fx_ssh_addr"
    echo "\${FX_SSH_PORT}" >> "${FDT}.fx_ssh_port"
EOF
  fi

  BT_EXPECT ${fx} fdt

  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    FDT="$FDT_MOVED"
  fi

  BT_EXPECT_FILE_CONTAINS "${FDT}.fx_device_name" "foo-bar-baz-quux"
  BT_EXPECT_FILE_CONTAINS "${FDT}.fx_device_addr" "::3%lo0"
  BT_EXPECT_FILE_CONTAINS "${FDT}.fx_ssh_addr" "[::3%lo0]"
  BT_EXPECT_FILE_CONTAINS "${FDT}.fx_ssh_port" ""
}

BT_RUN_TESTS "$@"

