mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-18 17:00:30 -04:00
test: add inode_size_cache tests
This commit is contained in:
parent
a0c2b6c26b
commit
f0cd212c0e
@ -1854,3 +1854,75 @@ TEST(filesystem, read) {
|
||||
EXPECT_TRUE(ec);
|
||||
EXPECT_EQ(ec.value(), EINVAL);
|
||||
}
|
||||
|
||||
TEST(filesystem, inode_size_cache) {
|
||||
std::mt19937_64 rng;
|
||||
constexpr size_t kNumFragments{1000};
|
||||
constexpr size_t kNumFiles{100};
|
||||
std::uniform_int_distribution<size_t> file_fragments(1, 1024);
|
||||
std::uniform_int_distribution<size_t> file_dist(0, kNumFiles - 1);
|
||||
|
||||
std::vector<std::string> fragments;
|
||||
fragments.reserve(kNumFragments);
|
||||
for (size_t i = 0; i < kNumFragments; ++i) {
|
||||
fragments.emplace_back(test::create_random_string(256, rng));
|
||||
}
|
||||
|
||||
std::vector<std::string> files;
|
||||
files.reserve(kNumFiles);
|
||||
for (size_t i = 0; i < kNumFiles; ++i) {
|
||||
std::string file;
|
||||
auto num_fragments = file_fragments(rng);
|
||||
for (size_t j = 0; j < num_fragments; ++j) {
|
||||
file.append(fragments[rng() % kNumFragments]);
|
||||
}
|
||||
files.emplace_back(std::move(file));
|
||||
}
|
||||
|
||||
test::test_logger lgr;
|
||||
auto input = std::make_shared<test::os_access_mock>();
|
||||
input->add_dir("");
|
||||
input->add_dir("a");
|
||||
input->add_dir("b");
|
||||
input->add_dir("c");
|
||||
|
||||
std::map<std::string, size_t> file_sizes;
|
||||
|
||||
auto add_file = [&](std::string const& path) {
|
||||
auto const& content = files[file_dist(rng)];
|
||||
file_sizes[path] = content.size();
|
||||
input->add_file(path, content);
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < kNumFiles / 2; ++i) {
|
||||
add_file(fmt::format("a/file{}", i));
|
||||
add_file(fmt::format("b/file{}", i));
|
||||
add_file(fmt::format("c/file{}", i));
|
||||
}
|
||||
|
||||
writer::scanner_options options;
|
||||
options.inode_size_cache_min_chunk_count = 32;
|
||||
|
||||
writer::segmenter::config cfg;
|
||||
cfg.block_size_bits = 16;
|
||||
cfg.blockhash_window_size = 7;
|
||||
|
||||
auto fsimage = build_dwarfs(lgr, input, "null", cfg, options);
|
||||
auto mm = std::make_shared<test::mmap_mock>(std::move(fsimage));
|
||||
|
||||
reader::filesystem_options fsopts = {.metadata = {.check_consistency = true}};
|
||||
|
||||
reader::filesystem_v2 fs(lgr, *input, mm, fsopts);
|
||||
|
||||
// fs.dump(std::cout, {.features = reader::fsinfo_features::for_level(2)});
|
||||
|
||||
EXPECT_NO_THROW(fs.check(reader::filesystem_check_level::FULL));
|
||||
|
||||
for (auto const& [path, size] : file_sizes) {
|
||||
auto dev = fs.find(path);
|
||||
ASSERT_TRUE(dev);
|
||||
auto iv = dev->inode();
|
||||
auto st = fs.getattr(iv);
|
||||
EXPECT_EQ(st.size(), size);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user