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

#include <fuchsia/hardware/block/verified/llcpp/fidl.h>

#include <zxtest/zxtest.h>

#include "src/devices/block/drivers/block-verity/config.h"

namespace {

TEST(ConfigCheckTest, Accepts4kBlockSHA256HashFunction) {
  fuchsia_hardware_block_verified::wire::HashFunction hash_function =
      fuchsia_hardware_block_verified::wire::HashFunction::kSha256;
  fuchsia_hardware_block_verified::wire::BlockSize block_size =
      fuchsia_hardware_block_verified::wire::BlockSize::kSize4096;
  fidl::FidlAllocator allocator;
  fuchsia_hardware_block_verified::wire::Config config(allocator);
  config.set_hash_function(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::HashFunction>::FromExternal(
          &hash_function));
  config.set_block_size(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::BlockSize>::FromExternal(
          &block_size));

  block_info_t blk;
  blk.block_size = 4096;

  EXPECT_OK(block_verity::CheckConfig(config, blk));
}

TEST(ConfigCheckTest, Accepts4kBlockSHA256HashFunction512BackingBlockSize) {
  fuchsia_hardware_block_verified::wire::HashFunction hash_function =
      fuchsia_hardware_block_verified::wire::HashFunction::kSha256;
  fuchsia_hardware_block_verified::wire::BlockSize block_size =
      fuchsia_hardware_block_verified::wire::BlockSize::kSize4096;
  fidl::FidlAllocator allocator;
  fuchsia_hardware_block_verified::wire::Config config(allocator);
  config.set_hash_function(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::HashFunction>::FromExternal(
          &hash_function));
  config.set_block_size(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::BlockSize>::FromExternal(
          &block_size));

  block_info_t blk;
  blk.block_size = 512;

  EXPECT_OK(block_verity::CheckConfig(config, blk));
}

TEST(ConfigCheckTest, RejectsMissingHashFunction) {
  fuchsia_hardware_block_verified::wire::BlockSize block_size =
      fuchsia_hardware_block_verified::wire::BlockSize::kSize4096;
  fidl::FidlAllocator allocator;
  fuchsia_hardware_block_verified::wire::Config config(allocator);
  config.set_block_size(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::BlockSize>::FromExternal(
          &block_size));

  block_info_t blk;
  blk.block_size = 4096;

  EXPECT_EQ(ZX_ERR_INVALID_ARGS, block_verity::CheckConfig(config, blk));
}

TEST(ConfigCheckTest, RejectsMissingBlockSize) {
  fuchsia_hardware_block_verified::wire::HashFunction hash_function =
      fuchsia_hardware_block_verified::wire::HashFunction::kSha256;
  fidl::FidlAllocator allocator;
  fuchsia_hardware_block_verified::wire::Config config(allocator);
  config.set_hash_function(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::HashFunction>::FromExternal(
          &hash_function));

  block_info_t blk;
  blk.block_size = 4096;

  EXPECT_EQ(ZX_ERR_INVALID_ARGS, block_verity::CheckConfig(config, blk));
}

TEST(ConfigCheckTest, RejectsIfBlockSizeUnsupportable) {
  fuchsia_hardware_block_verified::wire::HashFunction hash_function =
      fuchsia_hardware_block_verified::wire::HashFunction::kSha256;
  fuchsia_hardware_block_verified::wire::BlockSize block_size =
      fuchsia_hardware_block_verified::wire::BlockSize::kSize4096;
  fidl::FidlAllocator allocator;
  fuchsia_hardware_block_verified::wire::Config config(allocator);
  config.set_hash_function(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::HashFunction>::FromExternal(
          &hash_function));
  config.set_block_size(
      fidl::ObjectView<fuchsia_hardware_block_verified::wire::BlockSize>::FromExternal(
          &block_size));

  block_info_t blk;
  // not a divisor of 4k
  blk.block_size = 640;
  EXPECT_EQ(ZX_ERR_INVALID_ARGS, block_verity::CheckConfig(config, blk));
  blk.block_size = 8192;
  EXPECT_EQ(ZX_ERR_INVALID_ARGS, block_verity::CheckConfig(config, blk));
}

}  // namespace
