#!/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 the helper functions defined in //tools/devshell/lib/fvm.sh

BT_FILE_DEPS=(
  "tools/devshell/lib/fvm.sh"
  "tools/devshell/lib/fx-cmd-locator.sh"
  "tools/devshell/lib/platform.sh"
  "tools/devshell/lib/vars.sh"
)

BT_SET_UP() {
  source "${BT_TEMP_DIR}/tools/devshell/lib/fvm.sh"
  source "${BT_TEMP_DIR}/tools/devshell/lib/vars.sh"
  source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"

  FUCHSIA_BUILD_DIR="${BT_TEMP_DIR}/out/default"
  mkdir -p "${FUCHSIA_BUILD_DIR}"

  fvm_raw="${FUCHSIA_BUILD_DIR}/fvm.blk"
  fvm_sparse="${FUCHSIA_BUILD_DIR}/fvm.sparse.blk"
  fvm_fastboot="${FUCHSIA_BUILD_DIR}/fvm.fastboot.blk"
  touch "${fvm_raw}"
  touch "${fvm_sparse}"
  touch "${fvm_fastboot}"
}

TEST_fx-fvm-find-raw-source() {
  # If all FVM files are present, we should use raw by default.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo "fvm.blk"
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo "fvm.sparse.blk"
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF
  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" "${fvm_raw}"
}

TEST_fx-fvm-find-raw-source_no_raw_path() {
  # If the raw FVM path is missing, fall back to sparse FVM.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo ""
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo "fvm.sparse.blk"
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF

  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" "${fvm_sparse}"
}

TEST_fx-fvm-find-raw-source_no_raw_or_sparse_path() {
  # If the raw and sparse FVM paths are missing, fall back to fastboot FVM.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo ""
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo ""
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF

  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" "${fvm_fastboot}"
}

TEST_fx-fvm-find-raw-source_no_paths() {
  # If all FVM paths are missing, output should be empty.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo ""
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo ""
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo ""
fi
EOF

  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" ""
}

TEST_fx-fvm-find-raw-source_no_raw_file() {
  # If the raw FVM file is missing, fall back to sparse FVM.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo "fvm.blk"
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo "fvm.sparse.blk"
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF
  rm -f "${fvm_raw}"
  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" "${fvm_sparse}"
}

TEST_fx-fvm-find-raw-source_no_raw_or_sparse_files() {
  # If the raw and sparse FVM files are missing, fall back to fastboot FVM.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo "fvm.blk"
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo "fvm.sparse.blk"
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF
  rm -f "${fvm_raw}"
  rm -f "${fvm_sparse}"
  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" "${fvm_fastboot}"
}

TEST_fx-fvm-find-raw-source_no_files() {
  # If all FVM files are missing, output should be empty.
  btf::make_mock "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts"
  cat > "${BT_TEMP_DIR}/tools/devshell/list-build-artifacts.mock_side_effects" << "EOF"
if [[ "$@" == "--name storage-full --allow-empty images" ]] ; then
  echo "fvm.blk"
elif [[ "$@" == "--name storage-sparse --allow-empty images" ]] ; then
  echo "fvm.sparse.blk"
elif [[ "$@" == "--name fvm.fastboot --allow-empty images" ]] ; then
  echo "fvm.fastboot.blk"
fi
EOF
  rm -f "${fvm_raw}"
  rm -f "${fvm_sparse}"
  rm -f "${fvm_fastboot}"
  BT_ASSERT_EQ "$(fx-fvm-find-raw-source)" ""
}

BT_RUN_TESTS "$@"
