// 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) {
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::HashFunction> hash_function =
      llcpp::fuchsia::hardware::block::verified::HashFunction::SHA256;
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::BlockSize> block_size =
      llcpp::fuchsia::hardware::block::verified::BlockSize::SIZE_4096;
  auto config = llcpp::fuchsia::hardware::block::verified::Config::Builder(
                    std::make_unique<llcpp::fuchsia::hardware::block::verified::Config::Frame>())
                    .set_hash_function(fidl::unowned_ptr(&hash_function))
                    .set_block_size(fidl::unowned_ptr(&block_size))
                    .build();

  block_info_t blk;
  blk.block_size = 4096;

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

TEST(ConfigCheckTest, Accepts4kBlockSHA256HashFunction512BackingBlockSize) {
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::HashFunction> hash_function =
      llcpp::fuchsia::hardware::block::verified::HashFunction::SHA256;
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::BlockSize> block_size =
      llcpp::fuchsia::hardware::block::verified::BlockSize::SIZE_4096;
  auto config = llcpp::fuchsia::hardware::block::verified::Config::Builder(
                    std::make_unique<llcpp::fuchsia::hardware::block::verified::Config::Frame>())
                    .set_hash_function(fidl::unowned_ptr(&hash_function))
                    .set_block_size(fidl::unowned_ptr(&block_size))
                    .build();

  block_info_t blk;
  blk.block_size = 512;

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

TEST(ConfigCheckTest, RejectsMissingHashFunction) {
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::BlockSize> block_size =
      llcpp::fuchsia::hardware::block::verified::BlockSize::SIZE_4096;
  auto config = llcpp::fuchsia::hardware::block::verified::Config::Builder(
                    std::make_unique<llcpp::fuchsia::hardware::block::verified::Config::Frame>())
                    .set_block_size(fidl::unowned_ptr(&block_size))
                    .build();

  block_info_t blk;
  blk.block_size = 4096;

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

TEST(ConfigCheckTest, RejectsMissingBlockSize) {
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::HashFunction> hash_function =
      llcpp::fuchsia::hardware::block::verified::HashFunction::SHA256;
  auto config = llcpp::fuchsia::hardware::block::verified::Config::Builder(
                    std::make_unique<llcpp::fuchsia::hardware::block::verified::Config::Frame>())
                    .set_hash_function(fidl::unowned_ptr(&hash_function))
                    .build();

  block_info_t blk;
  blk.block_size = 4096;

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

TEST(ConfigCheckTest, RejectsIfBlockSizeUnsupportable) {
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::HashFunction> hash_function =
      llcpp::fuchsia::hardware::block::verified::HashFunction::SHA256;
  fidl::aligned<llcpp::fuchsia::hardware::block::verified::BlockSize> block_size =
      llcpp::fuchsia::hardware::block::verified::BlockSize::SIZE_4096;
  auto config = llcpp::fuchsia::hardware::block::verified::Config::Builder(
                    std::make_unique<llcpp::fuchsia::hardware::block::verified::Config::Frame>())
                    .set_hash_function(fidl::unowned_ptr(&hash_function))
                    .set_block_size(fidl::unowned_ptr(&block_size))
                    .build();

  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
