blob: 1d5d113c409938223b5a9a094cf2347bfd57ccd2 [file] [log] [blame]
// Copyright 2024 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.
#include "src/devices/bin/driver_manager/tests/test_pkg.h"
namespace test_utils {
TestPkg::TestPkg(fidl::ServerEnd<fuchsia_io::Directory> server,
std::string_view module_test_pkg_path, std::string_view module_open_path,
const std::vector<std::string_view> expected_libs,
const std::vector<ModuleConfig> additional_modules_configs)
: module_(module_test_pkg_path) {
EXPECT_EQ(ZX_OK, loop_.StartThread());
for (auto& module : additional_modules_configs) {
additional_modules_.emplace_back(
Module{.file = TestFile{module.test_pkg_path}, .open_path = std::string(module.open_path)});
additional_modules_.back().binding =
std::make_unique<fidl::Binding<fuchsia::io::File>>(&additional_modules_.back().file);
}
// Construct the test files for the expected libs.
for (auto name : expected_libs) {
auto path = std::string(kLibPathPrefix).append(name);
libname_to_file_.emplace(std::piecewise_construct, std::forward_as_tuple(name),
std::forward_as_tuple(path.c_str()));
}
lib_dir_.SetOpenHandler(
[this](fuchsia::io::Flags flags, const std::string& path, zx::channel object) {
EXPECT_EQ(fuchsia::io::PERM_READABLE | fuchsia::io::PERM_EXECUTABLE, flags);
auto it = libname_to_file_.find(path);
EXPECT_NE(it, libname_to_file_.end());
lib_file_bindings_.push_back(std::make_unique<fidl::Binding<fuchsia::io::File>>(
&(it->second), std::move(object), loop_.dispatcher()));
});
pkg_binding_.Bind(server.TakeChannel(), loop_.dispatcher());
pkg_dir_.SetOpenHandler([this, module_open_path = std::string(module_open_path)](
fuchsia::io::Flags flags, std::string path, zx::channel object) {
if (strcmp(path.c_str(), "lib") == 0) {
EXPECT_EQ(fuchsia::io::Flags::PROTOCOL_DIRECTORY | fuchsia::io::PERM_READABLE |
fuchsia::io::PERM_EXECUTABLE,
flags);
lib_dir_binding_.Bind(std::move(object), loop_.dispatcher());
} else if (strcmp(path.c_str(), module_open_path.c_str()) == 0) {
EXPECT_EQ(fuchsia::io::PERM_READABLE | fuchsia::io::PERM_EXECUTABLE, flags);
module_binding_.Bind(std::move(object), loop_.dispatcher());
} else {
for (auto& module : additional_modules_) {
if (strcmp(path.c_str(), module.open_path.c_str()) == 0) {
EXPECT_EQ(fuchsia::io::PERM_READABLE | fuchsia::io::PERM_EXECUTABLE, flags);
module.binding->Bind(std::move(object), loop_.dispatcher());
}
}
}
});
}
} // namespace test_utils