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

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

#include <fvm/format.h>
#include <zxtest/zxtest.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); }
