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

readonly SERVE_UPDATES_PORT=8083

BT_FILE_DEPS=(
  "out/default/host_x64/pm"
  "tools/devshell/lib/vars.sh"
  "tools/devshell/tests/subcommands/data/fx_serve_update_test/testpackage.cmx"
  "tools/devshell/tests/subcommands/data/fx_serve_update_test/testpackage.json"
  "tools/devshell/tests/subcommands/data/fx_serve_update_test/testpackage.manifest"
  "tools/devshell/serve-updates"
)

# Build a fake gn to satisfy vars.sh and some other commands to satisfy
# serve-updates.
BT_MOCKED_TOOLS=(
  "tools/devshell/add-update-source"
  "tools/devshell/shell"
)

BT_SET_UP() {
  declare -i TEST_SERVE_UPDATES_PID=
  declare TEST_WITH_MOCK=true
  # Process optional test arguments:
  #    fx run-bash-test fx_serve_update_test -- --nomock
  set -- "${BT_TEST_ARGS[@]}"
  while (( $# > 0 )); do
    local opt="$1"; shift
    case "${opt}" in
      --nomock)
        TEST_WITH_MOCK=false
        ;;
      *)
        btf::stderr "Invalid test arguments after ' -- ': $@"
        btf::stderr "Supported option(s):"
        btf::stderr "  --nomock (connect to a live server, instead of the default mock server)"
        return 1
    esac
  done

  FUCHSIA_DIR="${BT_TEMP_DIR}"
  FUCHSIA_BUILD_DIR="${FUCHSIA_DIR}/out/default"
  FUCHSIA_DEVSHELL_DIR="${FUCHSIA_DIR}/tools/devshell"
  readonly PM="${FUCHSIA_BUILD_DIR}/host_x64/pm"
  readonly REPODIR="${FUCHSIA_BUILD_DIR}/amber-files"

  # Fake fuchsia dir configuration.
  echo "out/default" > "${FUCHSIA_DIR}/.fx-build-dir"
  touch "${FUCHSIA_BUILD_DIR}/args.gn"
  touch "${FUCHSIA_BUILD_DIR}/fx.config"

  if $TEST_WITH_MOCK; then
    local -r serve_updates="${FUCHSIA_DIR}/tools/devshell/serve-updates"
    btf::make_mock "${serve_updates}"

    # When the mock serve-updates is called, serve a mock json file on the port
    local nc_opts=( -l ${SERVE_UPDATES_PORT} )
    if [[ "$(uname -s)" != "Darwin" ]]; then
      nc_opts+=( -q 0 )
    fi
    cat > "${serve_updates}.mock_side_effects" <<EOF
      while [[ ! -e ${REPODIR}/repository/targets.json ]]; do
        sleep 1
      done
      nc ${nc_opts[@]} 2>&1 >/dev/null <<EOHTTP
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: netcat!

\$(cat ${REPODIR}/repository/targets.json)
EOHTTP
[[ $? -eq 0 ]] || exit $?
EOF
  fi
}

BT_TEAR_DOWN() {
  if [[ -n "${TEST_SERVE_UPDATES_PID}" ]]; then
    if kill -0 "${TEST_SERVE_UPDATES_PID}" 2> /dev/null; then
      kill -TERM "${TEST_SERVE_UPDATES_PID}" 2> /dev/null
      wait "${TEST_SERVE_UPDATES_PID}" 2> /dev/null
    fi
  fi
}

_get_targets() {
  curl -s http://127.0.0.1:${SERVE_UPDATES_PORT}/targets.json? > targets.json
  return $?
}

TEST_fx_serve_updates() {
  # The pm tool needs to exist.
  BT_ASSERT_FILE_EXISTS "${PM}"

  cd data/fx_serve_update_test

  # Build the package from the manifest.
  "${PM}" -o testpackage -m testpackage.manifest build

  # Archive the package to a .far.
  (cd testpackage; "${PM}" archive)

  # Generate an empty repo and fill it with the .far.
  "${PM}" newrepo -repo "${REPODIR}"
  "${PM}" publish -a -f testpackage/testpackage-0.far -r "${REPODIR}"
  BT_ASSERT_FILE_EXISTS "${REPODIR}/repository/targets.json"

  # Fire up fx serve-updates. Note, test output is captured, so re-route background task output
  # to stderr to avoid hanging.
  >&2 "${FUCHSIA_DEVSHELL_DIR}/serve-updates" &
  TEST_SERVE_UPDATES_PID=$!

  # Request the list of targets (but wait if the server isn't alive yet).
  local -i max_tries=10
  local -i try_count=1
  local -i status=0
  _get_targets
  status=$?
  while (( $status != 0 && try_count < max_tries )); do
    sleep 0.1
    _get_targets
    status=$?
    : $(( try_count++ ))
  done

  BT_ASSERT_GOOD_STATUS "${status}" "Failed to get targets.json after ${max_tries} attempts. Last status was '${status}'."

  # Confirm testpackage is one of the targets.
  BT_EXPECT_FILE_CONTAINS_SUBSTRING targets.json "testpackage/0"
}

BT_RUN_TESTS "$@"
