#!/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 behavior of fx klog


BT_FILE_DEPS=(
  "scripts/fx"
  "tools/devshell/contrib/lib/symbol-index.sh"
  "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/symbolize"
  "tools/devshell/klog"
)

declare fx symbolize loglistener symbol_index

BT_SET_UP() {
  source "${BT_TEMP_DIR}/tools/devshell/tests/lib/fuchsia-mock.sh"
  fx="$(btf::setup_fx)"
  symbolize="$(btf::make_hosttools_mock symbolize)"
  loglistener="$(btf::make_installed_hosttools_mock loglistener)"
  symbol_index="$(btf::make_hosttools_mock symbol-index)"
}

TEST_klog_local() {
  BT_EXPECT ${fx} klog --legacy
  source "${symbolize}.mock_state"
  local symbol_args="$(count_symbol_server_args)"
  BT_EXPECT_EQ "${symbol_args}" "0" "symbolize should not get any -symbol-server arguments: ${symbol_args}"
}

TEST_klog_remote() {
  BT_EXPECT ${fx} klog --legacy -r
  source "${symbolize}.mock_state"
  local symbol_args="$(count_symbol_server_args)"
  BT_EXPECT_EQ $((symbol_args>0)) "1" "symbolize should get at least one -symbol-server argument: ${symbol_args}"
}

TEST_klog_remote_long() {
  BT_EXPECT ${fx} klog --legacy --remote-symbols
  source "${symbolize}.mock_state"
  local symbol_args="$(count_symbol_server_args)"
  BT_EXPECT_EQ $((symbol_args>0)) "1" "symbolize should get at least one -symbol-server argument: ${symbol_args}"
}

count_symbol_server_args() {
  local symbol_server_args=0
  for i in "${!BT_MOCK_ARGS[@]}"; do
    if [[ "${BT_MOCK_ARGS[$i]}" == "-symbol-server" ]]; then
      ((symbol_server_args++))
    fi
  done
  echo ${symbol_server_args}
}

BT_RUN_TESTS "$@"
