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

#include "disk_inspector/inspector_transaction_handler.h"

#include <cstring>

#include <gtest/gtest.h>
#include <storage/buffer/vmo_buffer.h>

#include "src/storage/lib/block_client/cpp/fake_block_device.h"

namespace disk_inspector {
namespace {

using block_client::FakeBlockDevice;

constexpr uint64_t kBlockCount = 1 << 15;
constexpr uint32_t kBlockSize = 512;
constexpr uint64_t kBufferCapacity = 20;
constexpr uint64_t kDeviceOffset = 37;

TEST(InspectorTransactionHandlerTest, ConstructFailWithBlockSizeMismatch) {
  auto device = std::make_unique<FakeBlockDevice>(kBlockCount, kBlockSize);
  // InspectorTransactionHandler block size must be a multiple of the underlying block size.
  std::unique_ptr<InspectorTransactionHandler> handler;
  ASSERT_NE(ZX_OK, InspectorTransactionHandler::Create(std::move(device), 20, &handler));
}

TEST(InspectorTransactionHandlerTest, WriteToDeviceAndReadBack) {
  auto device = std::make_unique<FakeBlockDevice>(kBlockCount, kBlockSize);
  std::unique_ptr<InspectorTransactionHandler> handler;
  ASSERT_EQ(ZX_OK, InspectorTransactionHandler::Create(std::move(device), kBlockSize, &handler));

  // Write operation
  storage::VmoBuffer write_buffer;
  ASSERT_EQ(ZX_OK,
            write_buffer.Initialize(handler.get(), kBufferCapacity, kBlockSize, "write-buffer"));

  // Fill |buffer| with some arbitrary data.
  char buf[kBlockSize * kBufferCapacity];
  memset(buf, 'a', sizeof(buf));
  for (size_t i = 0; i < kBufferCapacity; i++) {
    memcpy(write_buffer.Data(i), buf, kBlockSize);
  }

  storage::Operation write_op = {
      .type = storage::OperationType::kWrite,
      .vmo_offset = 0,
      .dev_offset = kDeviceOffset,
      .length = kBufferCapacity,
  };
  ASSERT_EQ(ZX_OK, handler->RunOperation(write_op, &write_buffer));

  // Read operation
  storage::VmoBuffer read_buffer;
  ASSERT_EQ(ZX_OK,
            read_buffer.Initialize(handler.get(), kBufferCapacity, kBlockSize, "read-buffer"));

  storage::Operation read_op = {
      .type = storage::OperationType::kRead,
      .vmo_offset = 0,
      .dev_offset = kDeviceOffset,
      .length = kBufferCapacity,
  };
  ASSERT_EQ(ZX_OK, handler->RunOperation(read_op, &read_buffer));

  EXPECT_EQ(std::memcmp(buf, read_buffer.Data(0), kBufferCapacity * kBlockSize), 0);
}

}  // namespace
}  // namespace disk_inspector
