chore: support map_file without size argument

This commit is contained in:
Marcus Holland-Moritz 2024-01-01 16:56:46 +01:00
parent 7fd51fb80c
commit 3e1d69ea2a
6 changed files with 35 additions and 11 deletions

View File

@ -48,6 +48,8 @@ class os_access {
virtual std::filesystem::path
read_symlink(std::filesystem::path const& path) const = 0;
virtual std::unique_ptr<mmif>
map_file(std::filesystem::path const& path) const = 0;
virtual std::unique_ptr<mmif>
map_file(std::filesystem::path const& path, size_t size) const = 0;
virtual int access(std::filesystem::path const& path, int mode) const = 0;
virtual std::filesystem::path

View File

@ -41,6 +41,8 @@ class os_access_generic : public os_access {
std::filesystem::path
read_symlink(std::filesystem::path const& path) const override;
std::unique_ptr<mmif>
map_file(std::filesystem::path const& path) const override;
std::unique_ptr<mmif>
map_file(std::filesystem::path const& path, size_t size) const override;
int access(std::filesystem::path const& path, int mode) const override;
std::filesystem::path

View File

@ -67,6 +67,10 @@ fs::path os_access_generic::read_symlink(fs::path const& path) const {
return fs::read_symlink(path);
}
std::unique_ptr<mmif> os_access_generic::map_file(fs::path const& path) const {
return std::make_unique<mmap>(path);
}
std::unique_ptr<mmif>
os_access_generic::map_file(fs::path const& path, size_t size) const {
return std::make_unique<mmap>(path, size);

View File

@ -27,13 +27,20 @@ namespace test {
class mmap_mock : public mmif {
public:
mmap_mock(const std::string& data)
: data_(data)
, path_{"<mock-file>"} {}
: mmap_mock{data, "<mock-file>"} {}
mmap_mock(const std::string& data, std::filesystem::path const& path)
: data_{data}
, path_{path} {}
mmap_mock(const std::string& data, size_t size)
: mmap_mock{data, size, "<mock-file>"} {}
mmap_mock(const std::string& data, size_t size,
std::filesystem::path const& path)
: data_{data, 0, std::min(size, data.size())}
, path_{path} {}
void const* addr() const override { return data_.data(); }
size_t size() const override { return data_.size(); }

View File

@ -425,20 +425,27 @@ std::unique_ptr<mmif>
os_access_mock::map_file(fs::path const& path, size_t size) const {
if (auto de = find(path);
de && de->status.type() == posix_file_type::regular) {
return std::make_unique<mmap_mock>(std::visit(
overloaded{
[this](std::string const& str) { return str; },
[this](std::function<std::string()> const& fun) { return fun(); },
[this](auto const&) -> std::string {
throw std::runtime_error("oops in overloaded");
},
},
de->v));
return std::make_unique<mmap_mock>(
std::visit(overloaded{
[this](std::string const& str) { return str; },
[this](std::function<std::string()> const& fun) {
return fun();
},
[this](auto const&) -> std::string {
throw std::runtime_error("oops in overloaded");
},
},
de->v),
size);
}
throw std::runtime_error(fmt::format("oops in map_file: {}", path.string()));
}
std::unique_ptr<mmif> os_access_mock::map_file(fs::path const& path) const {
return map_file(path, std::numeric_limits<size_t>::max());
}
int os_access_mock::access(fs::path const& path, int) const {
return access_fail_set_.count(path) ? -1 : 0;
}

View File

@ -101,6 +101,8 @@ class os_access_mock : public os_access {
std::filesystem::path
read_symlink(std::filesystem::path const& path) const override;
std::unique_ptr<mmif>
map_file(std::filesystem::path const& path) const override;
std::unique_ptr<mmif>
map_file(std::filesystem::path const& path, size_t size) const override;