#!/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 expected behavior of optional features library

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

declare fx

BT_SET_UP() {
  source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"
  fx="$(btf::setup_fx)"
}

TEST_disable_feature() {
  local valid_feature="myfeature"
  cat >> "${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh" <<EOF
    list_optional_features() {
      echo "${valid_feature}"
    }
    is_feature_enabled_by_default() {
      return 0  # enabled by default
    }
EOF

  local cmd="mycmd"
  local cmd_path="${BT_TEMP_DIR}/tools/devshell/${cmd}"
  mkdir -p "$(dirname "${cmd_path}")"
  # create a command that runs is_feature_enabled and returns its exit code
  cat >"${cmd_path}" <<EOF
#!/bin/bash
source ${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh || exit \$\?
is_feature_enabled "${valid_feature}"
EOF
  chmod u+x "${cmd_path}"
  # check that the command, when executed through fx, works as intended for
  # an optional feature. It should return 0 (true), since the feature
  # is not disabled explicitly, hence enabled.
  BT_EXPECT ${fx} ${cmd}
  # Same, --enable has no effect
  BT_EXPECT ${fx} --enable=${valid_feature} ${cmd}

  # Now it should return 1 (false), since the feature is explicitly disabled
  # in the fx invocation.
  BT_EXPECT_FAIL ${fx} --disable=${valid_feature} ${cmd}
}

TEST_enable_feature() {
  local valid_feature="myfeature"
  cat >> "${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh" <<EOF
    list_optional_features() {
      echo "${valid_feature}"
    }
    is_feature_enabled_by_default() {
      return 1  # disabled by default
    }
EOF

  local cmd="mycmd"
  local cmd_path="${BT_TEMP_DIR}/tools/devshell/${cmd}"
  mkdir -p "$(dirname "${cmd_path}")"
  # create a command that runs is_feature_enabled and returns its exit code
  cat >"${cmd_path}" <<EOF
#!/bin/bash
source ${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh || exit \$\?
is_feature_enabled "${valid_feature}"
EOF
  chmod u+x "${cmd_path}"
  # check that the command, when executed through fx, works as intended for
  # an optional feature.
  # It should return 1 (false), since the feature is not enabled explicitly, hence disabled.
  BT_EXPECT_FAIL ${fx} ${cmd}
  # Same, --disable has no effect
  BT_EXPECT_FAIL ${fx} --disable=${valid_feature} ${cmd}

  # Should return 0 (true), since the feature is explicitly enabled
  # in the fx invocation.
  BT_EXPECT ${fx} --enable=${valid_feature} ${cmd}

}

TEST_features_are_valid() {
  source "${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh"
  for f in $(list_optional_features); do
    # no spaces
    if [[ $f =~ " " ]]; then
      BT_FAIL "Optional feature '${f}' should not contain spaces"
    fi

    # reverse checking
    BT_EXPECT is_valid_feature "$f"
  done
}

TEST_get_fx_flags_non_default_features() {
  cat >> "${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh" <<EOF
    list_optional_features() {
      echo "feature1" "feature2"
    }
    is_feature_enabled_by_default() {
      if [[ "\$1" == "feature1" ]]; then return 0; fi  # enabled by default
      if [[ "\$1" == "feature2" ]]; then return 1; fi  # disabled by default
    }
EOF

  local cmd="mycmd"
  local cmd_path="${BT_TEMP_DIR}/tools/devshell/${cmd}"
  mkdir -p "$(dirname "${cmd_path}")"
  # create a command that prints get_fx_flags_non_default_features
  cat >"${cmd_path}" <<EOF
#!/bin/bash
source ${BT_TEMP_DIR}/tools/devshell/lib/fx-optional-features.sh || exit \$\?
get_fx_flags_non_default_features
EOF
  chmod u+x "${cmd_path}"

  BT_EXPECT_EQ "$(${fx} --enable=feature1 ${cmd})" ""  # feature1 is enabled by default
  BT_EXPECT_EQ "$(${fx} --disable=feature1 ${cmd})" "--disable=feature1"

  BT_EXPECT_EQ "$(${fx} --enable=feature2 ${cmd})" "--enable=feature2"
  BT_EXPECT_EQ "$(${fx} --disable=feature2 ${cmd})" ""  # feature2 is disabled by default

  BT_EXPECT_EQ "$(${fx} --disable=feature1 --enable=feature2 ${cmd})" "--disable=feature1 --enable=feature2"
}
BT_RUN_TESTS "$@"
