mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-15 07:16:13 -04:00
refactor(test_helpers): improve os_access_mock
flexibility / readability
This commit is contained in:
parent
5d2fefa918
commit
bfadb40615
@ -63,6 +63,41 @@ file_stat make_file_stat(simplestat const& ss) {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file_stat::uid_type constexpr kUid1{1000};
|
||||||
|
file_stat::uid_type constexpr kUid2{1337};
|
||||||
|
file_stat::uid_type constexpr kUid3{0};
|
||||||
|
file_stat::gid_type constexpr kGid1{100};
|
||||||
|
file_stat::gid_type constexpr kGid2{0};
|
||||||
|
file_stat::dev_type constexpr kDev1{0};
|
||||||
|
file_stat::dev_type constexpr kDev2{259};
|
||||||
|
file_stat::dev_type constexpr kDev3{261};
|
||||||
|
|
||||||
|
std::array<std::pair<std::string_view, test::simplestat>,
|
||||||
|
15> constexpr kTestEntries{{
|
||||||
|
// clang-format off
|
||||||
|
{"", { 1, posix_file_type::directory | 0777, 1, kUid1, kGid1, 0, kDev1, 1, 2, 3}},
|
||||||
|
{"test.pl", { 3, posix_file_type::regular | 0644, 2, kUid1, kGid1, 0, kDev1, 1001, 1002, 1003}},
|
||||||
|
{"somelink", { 4, posix_file_type::symlink | 0777, 1, kUid1, kGid1, 16, kDev1, 2001, 2002, 2003}},
|
||||||
|
{"somedir", { 5, posix_file_type::directory | 0777, 1, kUid1, kGid1, 0, kDev1, 3001, 3002, 3003}},
|
||||||
|
{"foo.pl", { 6, posix_file_type::regular | 0600, 2, kUid2, kGid2, 23456, kDev1, 4001, 4002, 4003}},
|
||||||
|
{"bar.pl", { 6, posix_file_type::regular | 0600, 2, kUid2, kGid2, 23456, kDev1, 4001, 4002, 4003}},
|
||||||
|
{"baz.pl", { 16, posix_file_type::regular | 0600, 2, kUid2, kGid2, 23456, kDev1, 8001, 8002, 8003}},
|
||||||
|
{"ipsum.txt", { 7, posix_file_type::regular | 0644, 1, kUid1, kGid1, 2000000, kDev1, 5001, 5002, 5003}},
|
||||||
|
{"somedir/ipsum.py", { 9, posix_file_type::regular | 0644, 1, kUid1, kGid1, 10000, kDev1, 6001, 6002, 6003}},
|
||||||
|
{"somedir/bad", { 10, posix_file_type::symlink | 0777, 1, kUid1, kGid1, 6, kDev1, 7001, 7002, 7003}},
|
||||||
|
{"somedir/pipe", { 12, posix_file_type::fifo | 0644, 1, kUid1, kGid1, 0, kDev1, 8001, 8002, 8003}},
|
||||||
|
{"somedir/null", { 13, posix_file_type::character | 0666, 1, kUid3, kGid2, 0, kDev2, 9001, 9002, 9003}},
|
||||||
|
{"somedir/zero", { 14, posix_file_type::character | 0666, 1, kUid3, kGid2, 0, kDev3, 4000010001, 4000020002, 4000030003}},
|
||||||
|
{"somedir/empty", {212, posix_file_type::regular | 0644, 1, kUid1, kGid1, 0, kDev1, 8101, 8102, 8103}},
|
||||||
|
{"empty", {210, posix_file_type::regular | 0644, 3, kUid2, kGid2, 0, kDev1, 8201, 8202, 8203}},
|
||||||
|
// clang-format on
|
||||||
|
}};
|
||||||
|
|
||||||
|
std::unordered_map<std::string_view, std::string_view> const kTestLinks{
|
||||||
|
{"somelink", "somedir/ipsum.py"},
|
||||||
|
{"somedir/bad", "../foo"},
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct os_access_mock::mock_dirent {
|
struct os_access_mock::mock_dirent {
|
||||||
@ -173,76 +208,31 @@ os_access_mock::os_access_mock()
|
|||||||
os_access_mock::~os_access_mock() = default;
|
os_access_mock::~os_access_mock() = default;
|
||||||
|
|
||||||
std::shared_ptr<os_access_mock> os_access_mock::create_test_instance() {
|
std::shared_ptr<os_access_mock> os_access_mock::create_test_instance() {
|
||||||
static const std::vector<std::pair<std::string, simplestat>> statmap{
|
|
||||||
{"", {1, posix_file_type::directory | 0777, 1, 1000, 100, 0, 0, 1, 2, 3}},
|
|
||||||
{"test.pl",
|
|
||||||
{3, posix_file_type::regular | 0644, 2, 1000, 100, 0, 0, 1001, 1002,
|
|
||||||
1003}},
|
|
||||||
{"somelink",
|
|
||||||
{4, posix_file_type::symlink | 0777, 1, 1000, 100, 16, 0, 2001, 2002,
|
|
||||||
2003}},
|
|
||||||
{"somedir",
|
|
||||||
{5, posix_file_type::directory | 0777, 1, 1000, 100, 0, 0, 3001, 3002,
|
|
||||||
3003}},
|
|
||||||
{"foo.pl",
|
|
||||||
{6, posix_file_type::regular | 0600, 2, 1337, 0, 23456, 0, 4001, 4002,
|
|
||||||
4003}},
|
|
||||||
{"bar.pl",
|
|
||||||
{6, posix_file_type::regular | 0600, 2, 1337, 0, 23456, 0, 4001, 4002,
|
|
||||||
4003}},
|
|
||||||
{"baz.pl",
|
|
||||||
{16, posix_file_type::regular | 0600, 2, 1337, 0, 23456, 0, 8001, 8002,
|
|
||||||
8003}},
|
|
||||||
{"ipsum.txt",
|
|
||||||
{7, posix_file_type::regular | 0644, 1, 1000, 100, 2000000, 0, 5001,
|
|
||||||
5002, 5003}},
|
|
||||||
{"somedir/ipsum.py",
|
|
||||||
{9, posix_file_type::regular | 0644, 1, 1000, 100, 10000, 0, 6001, 6002,
|
|
||||||
6003}},
|
|
||||||
{"somedir/bad",
|
|
||||||
{10, posix_file_type::symlink | 0777, 1, 1000, 100, 6, 0, 7001, 7002,
|
|
||||||
7003}},
|
|
||||||
{"somedir/pipe",
|
|
||||||
{12, posix_file_type::fifo | 0644, 1, 1000, 100, 0, 0, 8001, 8002,
|
|
||||||
8003}},
|
|
||||||
{"somedir/null",
|
|
||||||
{13, posix_file_type::character | 0666, 1, 0, 0, 0, 259, 9001, 9002,
|
|
||||||
9003}},
|
|
||||||
{"somedir/zero",
|
|
||||||
{14, posix_file_type::character | 0666, 1, 0, 0, 0, 261, 4000010001,
|
|
||||||
4000020002, 4000030003}},
|
|
||||||
{"somedir/empty",
|
|
||||||
{212, posix_file_type::regular | 0644, 1, 1000, 100, 0, 0, 8101, 8102,
|
|
||||||
8103}},
|
|
||||||
{"empty",
|
|
||||||
{210, posix_file_type::regular | 0644, 3, 1337, 0, 0, 0, 8201, 8202,
|
|
||||||
8203}},
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<std::string, std::string> linkmap{
|
|
||||||
{"somelink", "somedir/ipsum.py"},
|
|
||||||
{"somedir/bad", "../foo"},
|
|
||||||
};
|
|
||||||
|
|
||||||
auto m = std::make_shared<os_access_mock>();
|
auto m = std::make_shared<os_access_mock>();
|
||||||
|
|
||||||
for (auto const& kv : statmap) {
|
m->add_entries(kTestEntries, [&](std::string_view name) {
|
||||||
const auto& stat = kv.second;
|
return std::string(kTestLinks.at(name));
|
||||||
|
});
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void os_access_mock::add_entries(
|
||||||
|
std::span<std::pair<std::string_view, simplestat> const> entries,
|
||||||
|
std::function<std::string(std::string_view)> link_resolver) {
|
||||||
|
for (auto const& [name, stat] : entries) {
|
||||||
switch (stat.type()) {
|
switch (stat.type()) {
|
||||||
case posix_file_type::regular:
|
case posix_file_type::regular:
|
||||||
m->add(kv.first, stat, [size = stat.size] { return loremipsum(size); });
|
add(name, stat, [size = stat.size] { return loremipsum(size); });
|
||||||
break;
|
break;
|
||||||
case posix_file_type::symlink:
|
case posix_file_type::symlink:
|
||||||
m->add(kv.first, stat, linkmap.at(kv.first));
|
add(name, stat, link_resolver(name));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m->add(kv.first, stat);
|
add(name, stat);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void os_access_mock::add(fs::path const& path, simplestat const& st) {
|
void os_access_mock::add(fs::path const& path, simplestat const& st) {
|
||||||
|
@ -95,6 +95,10 @@ class os_access_mock : public os_access {
|
|||||||
|
|
||||||
size_t size() const;
|
size_t size() const;
|
||||||
|
|
||||||
|
void
|
||||||
|
add_entries(std::span<std::pair<std::string_view, simplestat> const> entries,
|
||||||
|
std::function<std::string(std::string_view)> link_resolver = {});
|
||||||
|
|
||||||
void add(std::filesystem::path const& path, simplestat const& st);
|
void add(std::filesystem::path const& path, simplestat const& st);
|
||||||
void add(std::filesystem::path const& path, simplestat const& st,
|
void add(std::filesystem::path const& path, simplestat const& st,
|
||||||
std::string const& contents);
|
std::string const& contents);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user