blob: 74588a7896a9915928d8cb17c40823e160c10527 [file] [log] [blame]
// Copyright 2022 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/lib/fs_management/cpp/options.h"
#include <gtest/gtest.h>
#include "fidl/fuchsia.fs.startup/cpp/wire_types.h"
#include "lib/fidl/cpp/wire/arena.h"
namespace fs_management {
namespace {
void AssertStartOptionsEqual(const fuchsia_fs_startup::wire::StartOptions& a,
const fuchsia_fs_startup::wire::StartOptions& b) {
ASSERT_EQ(a.has_read_only(), b.has_read_only());
if (a.has_read_only()) {
ASSERT_EQ(a.read_only(), b.read_only());
}
ASSERT_EQ(a.has_verbose(), b.has_verbose());
if (a.has_verbose()) {
ASSERT_EQ(a.verbose(), b.verbose());
}
ASSERT_EQ(a.has_write_compression_algorithm(), b.has_write_compression_algorithm());
if (a.has_write_compression_algorithm()) {
ASSERT_EQ(a.write_compression_algorithm(), b.write_compression_algorithm());
}
ASSERT_EQ(a.has_write_compression_level(), b.has_write_compression_level());
if (a.has_write_compression_level()) {
ASSERT_EQ(a.write_compression_level(), b.write_compression_level());
}
ASSERT_EQ(a.has_cache_eviction_policy_override(), b.has_cache_eviction_policy_override());
if (a.has_cache_eviction_policy_override()) {
ASSERT_EQ(a.cache_eviction_policy_override(), b.cache_eviction_policy_override());
}
ASSERT_EQ(a.has_startup_profiling_seconds(), b.has_startup_profiling_seconds());
if (a.has_startup_profiling_seconds()) {
ASSERT_EQ(a.startup_profiling_seconds(), b.startup_profiling_seconds());
}
ASSERT_EQ(a.has_inline_crypto_enabled(), b.has_inline_crypto_enabled());
if (a.has_inline_crypto_enabled()) {
ASSERT_EQ(a.inline_crypto_enabled(), b.inline_crypto_enabled());
}
ASSERT_EQ(a.has_barriers_enabled(), b.has_barriers_enabled());
if (a.has_barriers_enabled()) {
ASSERT_EQ(a.barriers_enabled(), b.barriers_enabled());
}
}
void AssertFormatOptionsEqual(const fuchsia_fs_startup::wire::FormatOptions& a,
const fuchsia_fs_startup::wire::FormatOptions& b) {
ASSERT_EQ(a.has_verbose(), b.has_verbose());
if (a.has_verbose())
ASSERT_EQ(a.verbose(), b.verbose());
ASSERT_EQ(a.has_num_inodes(), b.has_num_inodes());
if (a.has_num_inodes())
ASSERT_EQ(a.num_inodes(), b.num_inodes());
ASSERT_EQ(a.has_deprecated_padded_blobfs_format(), b.has_deprecated_padded_blobfs_format());
if (a.has_deprecated_padded_blobfs_format())
ASSERT_EQ(a.deprecated_padded_blobfs_format(), b.deprecated_padded_blobfs_format());
ASSERT_EQ(a.has_fvm_data_slices(), b.has_fvm_data_slices());
if (a.has_fvm_data_slices())
ASSERT_EQ(a.fvm_data_slices(), b.fvm_data_slices());
ASSERT_EQ(a.has_sectors_per_cluster(), b.has_sectors_per_cluster());
if (a.has_sectors_per_cluster())
ASSERT_EQ(a.sectors_per_cluster(), b.sectors_per_cluster());
}
TEST(MountOptionsTest, DefaultOptions) {
MountOptions options;
fidl::Arena arena;
auto builder = fuchsia_fs_startup::wire::StartOptions::Builder(arena);
// This is the default, but we explicitly enumerate it here to be clear that it's the default.
builder.read_only(false);
builder.verbose(false);
fuchsia_fs_startup::wire::StartOptions expected_start_options = builder.Build();
auto start_options_or = options.as_start_options(arena);
ASSERT_TRUE(start_options_or.is_ok()) << start_options_or.status_string();
AssertStartOptionsEqual(*start_options_or, expected_start_options);
}
TEST(MountOptionsTest, AllOptionsSet) {
MountOptions options{
.readonly = true,
.verbose_mount = true,
.write_compression_algorithm = "UNCOMPRESSED",
.write_compression_level = 10,
.cache_eviction_policy = "NEVER_EVICT",
.fsck_after_every_transaction = true,
.startup_profiling_seconds = 5,
.inline_crypto_enabled = true,
.barriers_enabled = true,
};
fidl::Arena arena;
auto builder = fuchsia_fs_startup::wire::StartOptions::Builder(arena);
builder.read_only(true);
builder.verbose(true);
builder.write_compression_algorithm(
fuchsia_fs_startup::wire::CompressionAlgorithm::kUncompressed);
builder.write_compression_level(10);
builder.cache_eviction_policy_override(
fuchsia_fs_startup::wire::EvictionPolicyOverride::kNeverEvict);
builder.startup_profiling_seconds(5);
builder.inline_crypto_enabled(true);
builder.barriers_enabled(true);
fuchsia_fs_startup::wire::StartOptions expected_start_options = builder.Build();
auto start_options_or = options.as_start_options(arena);
ASSERT_TRUE(start_options_or.is_ok()) << start_options_or.status_string();
AssertStartOptionsEqual(*start_options_or, expected_start_options);
}
TEST(MountOptionsTest, ZstdChunkedEvictImmediately) {
MountOptions options{
.write_compression_algorithm = "ZSTD_CHUNKED",
.cache_eviction_policy = "EVICT_IMMEDIATELY",
};
fidl::Arena arena;
auto builder = fuchsia_fs_startup::wire::StartOptions::Builder(arena);
builder.read_only(false);
builder.verbose(false);
builder.write_compression_algorithm(fuchsia_fs_startup::wire::CompressionAlgorithm::kZstdChunked);
builder.cache_eviction_policy_override(
fuchsia_fs_startup::wire::EvictionPolicyOverride::kEvictImmediately);
fuchsia_fs_startup::wire::StartOptions expected_start_options = builder.Build();
auto start_options_or = options.as_start_options(arena);
ASSERT_TRUE(start_options_or.is_ok()) << start_options_or.status_string();
AssertStartOptionsEqual(*start_options_or, expected_start_options);
}
TEST(MkfsOptionsTest, DefaultOptions) {
MkfsOptions options;
fidl::Arena arena;
auto expected_format_options = fuchsia_fs_startup::wire::FormatOptions::Builder(arena)
.verbose(false)
.deprecated_padded_blobfs_format(false)
.fvm_data_slices(1)
.Build();
AssertFormatOptionsEqual(options.as_format_options(arena), expected_format_options);
}
TEST(MkfsOptionsTest, AllOptionsSet) {
MkfsOptions options{
.fvm_data_slices = 10,
.verbose = true,
.sectors_per_cluster = 2,
.deprecated_padded_blobfs_format = true,
.num_inodes = 100,
};
fidl::Arena arena;
auto expected_format_options = fuchsia_fs_startup::wire::FormatOptions::Builder(arena)
.fvm_data_slices(10)
.verbose(true)
.deprecated_padded_blobfs_format(true)
.num_inodes(100)
.sectors_per_cluster(2)
.Build();
AssertFormatOptionsEqual(options.as_format_options(arena), expected_format_options);
}
} // namespace
} // namespace fs_management