blob: 01a510e0569c811da3748622795e364ca1eb8629 [file] [log] [blame]
// 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.
// Tests minfs format behavior.
#include "src/storage/minfs/format.h"
#include <gtest/gtest.h>
namespace minfs {
namespace {
TEST(MinfsFormat, MinfsSuperblock) {
minfs::Superblock info = {};
info.block_count = 29;
info.ibm_block = 2;
info.abm_block = 3;
info.ino_block = 5;
info.integrity_start_block = 11;
info.dat_block = 19;
info.ibm_slices = 3;
info.abm_slices = 5;
info.ino_slices = 11;
info.integrity_slices = 13;
info.dat_slices = 17;
ASSERT_FALSE(info.GetFlagFvm());
ASSERT_EQ(InodeBitmapBlocks(info), info.abm_block - info.ibm_block);
ASSERT_EQ(BlockBitmapBlocks(info), info.ino_block - info.abm_block);
ASSERT_EQ(InodeBlocks(info), info.integrity_start_block - info.ino_block);
ASSERT_EQ(JournalBlocks(info),
info.dat_block - info.integrity_start_block - kBackupSuperblockBlocks);
ASSERT_EQ(DataBlocks(info), info.block_count);
ASSERT_EQ(NonDataBlocks(info), InodeBitmapBlocks(info) + BlockBitmapBlocks(info) +
InodeBlocks(info) + JournalBlocks(info));
}
TEST(MinfsFormat, MinfsSuperblockOnFvm) {
minfs::Superblock info = {};
info.block_count = 29;
info.ibm_block = 2;
info.abm_block = 3;
info.ino_block = 5;
info.integrity_start_block = 11;
info.dat_block = 19;
info.slice_size = 81920;
info.ibm_slices = 3;
info.abm_slices = 5;
info.ino_slices = 11;
info.integrity_slices = 13;
info.dat_slices = 17;
SetMinfsFlagFvm(info);
ASSERT_TRUE(info.GetFlagFvm());
auto blocks_per_slice = static_cast<blk_t>(info.slice_size / kMinfsBlockSize);
ASSERT_EQ(InodeBitmapBlocks(info), info.ibm_slices * blocks_per_slice);
ASSERT_EQ(BlockBitmapBlocks(info), info.abm_slices * blocks_per_slice);
ASSERT_EQ(InodeBlocks(info), info.ino_slices * blocks_per_slice);
ASSERT_EQ(JournalBlocks(info),
info.integrity_slices * blocks_per_slice - kBackupSuperblockBlocks);
ASSERT_EQ(DataBlocks(info), info.dat_slices * blocks_per_slice);
ASSERT_EQ(NonDataBlocks(info), InodeBitmapBlocks(info) + BlockBitmapBlocks(info) +
InodeBlocks(info) + JournalBlocks(info));
}
TEST(DirentSizeTest, ZeroNameLength) {
constexpr uint8_t kNameLength = 0;
ASSERT_EQ(DirentSize(kNameLength), sizeof(Dirent));
}
TEST(DirentSizeTest, AlignedNameLength) {
constexpr uint8_t kNameLength = 3 * kMinfsDirentAlignment;
ASSERT_EQ(DirentSize(kNameLength), sizeof(Dirent) + kNameLength);
}
TEST(DirentSizeTest, UnalignedNameLength) {
constexpr uint8_t kNameLength = 4 * kMinfsDirentAlignment;
ASSERT_EQ(DirentSize(kNameLength - 1), sizeof(Dirent) + kNameLength);
}
} // namespace
} // namespace minfs