From f95ae41a9bb6dd30662997823b769e8255122a7a Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 15 Jan 2024 22:07:13 +0100 Subject: [PATCH] test(filesystem): find_image_offset tests --- test/filesystem_test.cpp | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/test/filesystem_test.cpp b/test/filesystem_test.cpp index 7527e591..eed28b61 100644 --- a/test/filesystem_test.cpp +++ b/test/filesystem_test.cpp @@ -26,9 +26,13 @@ #include +#include + #include "dwarfs/filesystem_v2.h" +#include "dwarfs/fstypes.h" #include "dwarfs/mmap.h" +#include "mmap_mock.h" #include "test_logger.h" using namespace dwarfs; @@ -178,3 +182,84 @@ TEST(filesystem, metadata_symlink_unix) { EXPECT_EQ(-EINVAL, r.error()); } } + +namespace { + +std::string valid_v1_header() { + section_header hdr; + hdr.type = section_type::BLOCK; + hdr.compression = compression_type_v1::NONE; + hdr.length = 1; + std::string buf; + buf.resize(8 + sizeof(hdr)); + std::memcpy(buf.data(), "DWARFS\x02\x01", 8); + std::memcpy(buf.data() + 8, &hdr, sizeof(hdr)); + return buf; +} + +std::string valid_v2_header(uint32_t section_number = 0) { + section_header_v2 hdr; + std::memset(&hdr, 0, sizeof(hdr)); + std::memcpy(hdr.magic, "DWARFS", 6); + hdr.major = 2; + hdr.minor = 3; + hdr.number = section_number; + hdr.type = folly::to_underlying(section_type::BLOCK); + hdr.compression = folly::to_underlying(compression_type::NONE); + hdr.length = 1; + std::string buf; + buf.resize(sizeof(hdr)); + std::memcpy(buf.data(), &hdr, sizeof(hdr)); + return buf; +} + +} // namespace + +TEST(filesystem, find_image_offset) { + test::test_logger lgr; + + auto make_fs = + [&](std::string data, + filesystem_options const& opt = { + .image_offset = filesystem_options::IMAGE_OFFSET_AUTO}) { + return filesystem_v2( + lgr, std::make_shared(std::move(data)), opt); + }; + + auto throws_rt_error = [](auto substr) { + return ::testing::ThrowsMessage( + ::testing::HasSubstr(substr)); + }; + + auto throws_no_fs_found = throws_rt_error("no filesystem found"); + auto throws_no_schema = throws_rt_error("no metadata schema found"); + + std::string valid_fs; + { + mmap mm(test_dir / "unixlink.dwarfs"); + auto data = mm.span(); + valid_fs.assign(data.data(), data.size()); + } + auto v1_header = valid_v1_header(); + auto v2_header = valid_v2_header(); + auto prefix = "DWARFS\x02\x02 DWARFS\x02\x02 xxxxxxxxxxxxxxxxxxxxDWARFS\x02"; + + EXPECT_NO_THROW(make_fs(valid_fs)); + EXPECT_NO_THROW(make_fs(prefix + valid_fs)); + + EXPECT_THAT([&] { make_fs("dwarfs"); }, throws_no_fs_found); + EXPECT_THAT([&] { make_fs(v1_header + "X"); }, throws_no_schema); + EXPECT_THAT([&] { make_fs(v2_header + "X"); }, throws_no_fs_found); + EXPECT_THAT([&] { make_fs(v2_header + "X" + valid_v2_header(1) + "X"); }, + throws_no_schema); + EXPECT_THAT([&] { make_fs(prefix); }, throws_no_fs_found); + + for (size_t len = 0; len < valid_fs.size() - 1; ++len) { + auto truncated = valid_fs.substr(0, len); + EXPECT_THAT([&] { make_fs(truncated); }, ::testing::Throws()) + << "len=" << len; + EXPECT_THAT([&] { make_fs(prefix + truncated); }, + ::testing::Throws()) + << "len=" << len; + } +}