// 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 "src/storage/blobfs/blobfs_fixtures.h"

#include <fcntl.h>
#include <fuchsia/io/llcpp/fidl.h>

#include <fvm/format.h>
#include <gtest/gtest.h>

namespace {

void CheckBlobfsInfo(fs::FilesystemTest* test) {
  ::llcpp::fuchsia::io::FilesystemInfo info;
  ASSERT_NO_FAILURES(test->GetFsInfo(&info));

  const char kFsName[] = "blobfs";
  const char* name = reinterpret_cast<const char*>(info.name.data());
  ASSERT_STR_EQ(kFsName, name);
  ASSERT_LE(info.used_nodes, info.total_nodes, "Used nodes greater than free nodes");
  ASSERT_LE(info.used_bytes, info.total_bytes, "Used bytes greater than free bytes");
}

}  // namespace

void BlobfsTest::CheckInfo() { CheckBlobfsInfo(this); }

void BlobfsFixedDiskSizeTest::CheckInfo() { CheckBlobfsInfo(this); }

void BlobfsTestWithFvm::CheckInfo() { CheckBlobfsInfo(this); }

void BlobfsTestWithFvm::CheckPartitionSize() {
  // Minimum size required by ResizePartition test:
  const size_t kMinDataSize = 507 * kTestFvmSliceSize;
  const size_t kMinFvmSize =
      fvm::Header::FromDiskSize(fvm::kMaxUsablePartitions, kMinDataSize, kTestFvmSliceSize)
          .fvm_partition_size;
  ASSERT_GE(environment_->disk_size(), kMinFvmSize, "Insufficient disk space for FVM tests");
}

void BlobfsFixedDiskSizeTestWithFvm::CheckInfo() { CheckBlobfsInfo(this); }
