#!/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/fx-cmd-locator.sh"
  "tools/devshell/lib/fx-optional-features.sh"
  "tools/devshell/lib/vars.sh"
  "tools/devshell/lib/platform.sh"
  "tools/devshell/host-tool"
)

BT_MOCKED_TOOLS=(
  "tools/devshell/list-build-artifacts"
  "tools/devshell/build"
)

declare fx devfinder macfw

BT_SET_UP() {
  source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"
  fx="$(btf::setup_fx)"
  source "${BT_TEMP_DIR}/tools/devshell/lib/vars.sh"
  fx-config-read
  devfinder="$(btf::make_installed_hosttools_mock device-finder)"
  devfinder_rel="${devfinder##${FUCHSIA_BUILD_DIR}/}"
  cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
    [[ \$2 == "device-finder" ]] && echo ${devfinder_rel} && exit 0
    exit 1
EOF
  local uname="$(btf::make_mock_binary uname)"
  btf::add_binary_to_path "$uname"

  macfw="$(btf::make_mock_binary socketfilterfw)"
  btf::add_binary_to_path "$macfw"

  # Fake uname as MacOS
  cat > "${uname}.mock_side_effects" <<'EOF'
    [[ $1 == '-s' ]] && echo "Darwin"
    [[ $1 == '-m' ]] && echo "x86_64"
EOF

}

TEST_tool_executed() {
  BT_EXPECT ${fx} host-tool "device-finder" "--flag1" "arg1"
  btf::expect-mock-args "${devfinder}" "--flag1" "arg1"
}

TEST_tool_not_built() {
  BT_EXPECT ${fx} host-tool "device-finder" "--flag1" "arg1"
  # tool exists, so build should not be called
  BT_ASSERT_FILE_DOES_NOT_EXIST "${BT_TEMP_DIR}/tools/devshell/build.mock_state"
}

TEST_build_if_not_found() {
  # tool does not exist, but is known to the build, so build should be called
  mv "${devfinder}" "${devfinder}_backup"

  # recreate the tool when 'fx build' is called
  cat >"${BT_TEMP_DIR}/tools/devshell/build.mock_side_effects" <<EOF
    mv "${devfinder}_backup" "${devfinder}"
EOF

  # When run under the fx test framework, stdout is not a tty, so
  # host-tool will not build, instead it will print an error.
  BT_EXPECT_FAIL ${fx} host-tool "device-finder" "--flag1" "arg1" 2>/dev/null
  BT_ASSERT_FILE_DOES_NOT_EXIST "${BT_TEMP_DIR}/tools/devshell/build.mock_state"

  # HACK: this tool checks to see if stdout is a tty, and builds iff it
  # is, so it is mocked.
  cat >>"${BT_TEMP_DIR}/tools/devshell/lib/vars.sh" <<EOF
  function fx-is-stderr-tty {
    return 0
  }
EOF
  BT_EXPECT ${fx} host-tool "device-finder" "--flag1" "arg1"

  BT_ASSERT_FILE_EXISTS "${BT_TEMP_DIR}/tools/devshell/build.mock_state"
  btf::expect-mock-args "${devfinder}" "--flag1" "arg1"
}

TEST_no_build() {
  # tool does not exist, is known to the build, but --no-build is specified
  mv "${devfinder}" "${devfinder}_backup"

  # should fail because tool cannot be found
  BT_EXPECT_FAIL ${fx} host-tool "--no-build" "device-finder" "--flag1" "arg1" 2> /dev/null

  # ensure that build was not called
  BT_ASSERT_FILE_DOES_NOT_EXIST "${BT_TEMP_DIR}/tools/devshell/build.mock_state"
}

TEST_firewall_disabled() {
  echo "firewall disabled" > "${macfw}.mock_stdout"

  BT_EXPECT ${fx} host-tool --check-firewall "device-finder" "--flag1" "arg1"
  btf::expect-mock-args "${macfw}.mock_state" "--getglobalstate"
}

TEST_firewall_check_success() {
  echo "${devfinder} permitted" > "${macfw}.mock_stdout"

  BT_EXPECT ${fx} host-tool --check-firewall "device-finder" "--flag1" "arg1"
  btf::expect-mock-args "${macfw}.mock_state.2" "--getappblocked" "${devfinder}"
}

TEST_firewall_check_fail() {
  echo "device-finder cannot be allowed" > "${macfw}.mock_stdout"
  BT_EXPECT ${fx} host-tool --check-firewall "device-finder" "--flag1" "arg1" >/dev/null 2>&1
  btf::expect-mock-args "${macfw}.mock_state.2" "--getappblocked" "${devfinder}"
}

# test if sending the host-tool to the background and killing it effectively
# kills it as expected.
# the logic for this test is the following:
#  - execute a custom fx command (mycmd)
#  - 'fx mycmd' runs 'host-tool slow_tool' in the background, waits a bit and
#    attempts to kill it with SIGINT, simulating a user Ctrl+C in the foreground
#    command.
#  - 'slow_tool' should be stopped and have a chance to clean up resources, in
#    this case a lock file in a known location, which is checked as a condition
#    for the test to succeeed.
TEST_kill_bg_process() {
  lockfile="${BT_TEMP_DIR}/.slow_tool.lock"
  local frontend_cmd="${BT_TEMP_DIR}/tools/devshell/mycmd"
  cat >"${frontend_cmd}" <<EOF
  #!/bin/bash
  source ${BT_TEMP_DIR}/tools/devshell/lib/vars.sh
  fx-command-exec host-tool slow_tool &
  pid=\$!
  # give some time for slow_tool to create the lockfile
  SECONDS=0
  while [[ ! -f "$lockfile" ]] ; do
    if [[ $SECONDS -gt 10 ]]; then
      echo >&2 "ERROR, timed out waiting for lockfile to be created"
      exit 1
    fi
  done

  kill -SIGINT \$pid

  SECONDS=0
  while kill -0 \$pid >/dev/null 2>&1; do
    if [[ $SECONDS -gt 10 ]]; then
      echo >&2 "ERROR, timed out waiting for PID $pid to die"
      exit 1
    fi
  done
  exit $?
EOF
  chmod +x "${frontend_cmd}"

  local slow_tool="$(btf::make_installed_hosttools_mock slow_tool)"
  local slow_tool_rel="${slow_tool##${FUCHSIA_BUILD_DIR}/}"
  cat >"${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" <<EOF
    [[ \$2 == "slow_tool" ]] && echo ${slow_tool_rel} && exit 0
    exit 1
EOF
  cat >"${slow_tool}.mock_side_effects" <<EOF
  cleanup() {
    local st=\$1
    echo >&2 "cleanup executed, status \$st."
    rm -f "$lockfile"
    exit \$st
  }
  trap 'cleanup 0' SIGINT
  touch "$lockfile"
  c=0
  while (( c < 10 )); do
    sleep 1
    echo >&2 "sleeping inside slow_tool"
    (( c++ ))
  done
  echo >&2 "ERROR! timeout passed without slow_tool being killed: $slow_tool"
  cleanup 1
EOF

  local _out="${BT_TEMP_DIR}/_out.log"
  BT_EXPECT ${fx} mycmd >"$_out" 2>&1
  BT_EXPECT_FILE_DOES_NOT_EXIST "$lockfile"
}

BT_RUN_TESTS "$@"
