#!/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 fx blobstats

# To update this test, you need to copy blob.manifest and blobs.json
# from your build configuration, and add all necessary packages to
# the data folder.
# Then, make sure to include these files to BT_FILE_DEPS and copy them
# to the temp folder in BT_SET_UP to make them available to the tests.

BT_LINKED_DEPS=(
  "prebuilt/third_party/dart"
  "scripts/blobstats"
  "scripts/third_party"
  "third_party"
)

BT_FILE_DEPS=(
  "scripts/fx"
  "tools/devshell/contrib/blobstats"
  "tools/devshell/lib/fx-cmd-locator.sh"
  "tools/devshell/lib/fx-optional-features.sh"
  "tools/devshell/lib/platform.sh"
  "tools/devshell/lib/vars.sh"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/blob.manifest"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/blobs.csv"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/blobs.json"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/bugreport_blobs.json"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/bugreport_meta.far"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/packages.csv"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/wlanif_blobs.json"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/wlanif_meta.far"
  "tools/devshell/tests/subcommands/data/fx_blobstats_test/wlanif.so"
)

declare fx DATA_DIR

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

  DATA_DIR="${BT_TEMP_DIR}/tools/devshell/tests/subcommands/data/fx_blobstats_test"
  cp "${DATA_DIR}/blobs.json" "${BT_TEMP_DIR}/out/default/blobs.json"

  IMAGES_DIR="${BT_TEMP_DIR}/out/default/obj/build/images"
  mkdir -p ${IMAGES_DIR}
  cp "${DATA_DIR}/blob.manifest" "${IMAGES_DIR}/blob.manifest"

  BUGREPORT_DIR="${BT_TEMP_DIR}/out/default/obj/src/developer/feedback/bugreport/bugreport"
  mkdir -p ${BUGREPORT_DIR}
  cp "${DATA_DIR}/bugreport_meta.far" "${BUGREPORT_DIR}/meta.far"
  cp "${DATA_DIR}/bugreport_blobs.json" "${BUGREPORT_DIR}/blobs.json"

  WLANIF_DIR="${BT_TEMP_DIR}/out/default/obj/src/connectivity/wlan/drivers/wlanif/wlanif"
  mkdir -p ${WLANIF_DIR}
  cp "${DATA_DIR}/wlanif_meta.far" "${WLANIF_DIR}/meta.far"
  cp "${DATA_DIR}/wlanif_blobs.json" "${WLANIF_DIR}/blobs.json"

  ARM64_SHARED_DIR="${BT_TEMP_DIR}/out/default/arm64-shared"
  mkdir -p ${ARM64_SHARED_DIR}
  cp "${DATA_DIR}/wlanif.so" "${ARM64_SHARED_DIR}/wlanif.so"
}

# Test that "fx blobstats" generates valid csv files
TEST_fxblobstats_csv() {
  local out="${BT_TEMP_DIR}/_fx_blobstats_output"
  BT_EXPECT ${fx} blobstats > "${out}"
  BT_ASSERT_FILE_EXISTS "${BT_TEMP_DIR}/out/default/blobs.csv"
  BT_ASSERT_FILE_EXISTS "${BT_TEMP_DIR}/out/default/packages.csv"

  GOLDEN_DIR="${BT_TEMP_DIR}/out/default/golden"
  mkdir -p ${GOLDEN_DIR}
  cp "${DATA_DIR}/blobs.csv" "${GOLDEN_DIR}/blobs.csv"
  cp "${DATA_DIR}/packages.csv" "${GOLDEN_DIR}/packages.csv"

  BT_EXPECT diff "${BT_TEMP_DIR}/out/default/blobs.csv" "${GOLDEN_DIR}/blobs.csv"
  BT_EXPECT diff "${BT_TEMP_DIR}/out/default/packages.csv" "${GOLDEN_DIR}/packages.csv"
}

BT_RUN_TESTS "$@"