blob: 538370b18bd1bc98b7a660a3734f49857c456e2f [file] [log] [blame] [edit]
// Copyright 2023 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 "ld-remote-process-tests.h"
#include <lib/elfldltl/testing/diagnostics.h>
#include <lib/ld/remote-load-module.h>
#include <lib/zx/job.h>
#include <zircon/process.h>
namespace ld::testing {
constexpr std::string_view kLibprefix = LD_STARTUP_TEST_LIBPREFIX;
class LdRemoteProcessTests::MockLoader {
public:
MOCK_METHOD(zx::vmo, LoadObject, (std::string));
void ExpectLoadObject(std::string_view name) {
zx::vmo vmo;
const std::string path = std::filesystem::path("test") / "lib" / kLibprefix / name;
ASSERT_NO_FATAL_FAILURE(vmo = elfldltl::testing::GetTestLibVmo(path));
EXPECT_CALL(*this, LoadObject(std::string{name})).WillOnce(::testing::Return(std::move(vmo)));
}
private:
::testing::InSequence sequence_guard_;
};
void LdRemoteProcessTests::SetUp() {
GTEST_SKIP() << "TODO(fxb/134320): Skip until remote loading is implemented.";
}
LdRemoteProcessTests::LdRemoteProcessTests() = default;
LdRemoteProcessTests::~LdRemoteProcessTests() = default;
void LdRemoteProcessTests::Init(std::initializer_list<std::string_view> args) {
mock_loader_ = std::make_unique<MockLoader>();
std::string_view name = process_name();
zx::process process;
ASSERT_EQ(zx::process::create(*zx::job::default_job(), name.data(),
static_cast<uint32_t>(name.size()), 0, &process, &root_vmar_),
ZX_OK);
set_process(std::move(process));
// Initialize a log to pass ExpectLog statements in load-tests.cc.
fbl::unique_fd log_fd;
ASSERT_NO_FATAL_FAILURE(InitLog(log_fd));
ASSERT_EQ(zx::thread::create(this->process(), name.data(), static_cast<uint32_t>(name.size()), 0,
&thread_),
ZX_OK);
// TODO(fxbug.dev/134320): Load the stub dynamic linker and vdso.
}
void LdRemoteProcessTests::Needed(std::initializer_list<std::string_view> names) {
for (std::string_view name : names) {
mock_loader_->ExpectLoadObject(name);
}
}
void LdRemoteProcessTests::Load(std::string_view executable_name) {
using RemoteModule = RemoteLoadModule<>;
auto diag = elfldltl::testing::ExpectOkDiagnostics();
const std::string executable_path = std::filesystem::path("test") / "bin" / executable_name;
auto exec = std::make_unique<RemoteModule>(abi::Abi<>::kExecutableName);
zx::vmo vmo;
ASSERT_NO_FATAL_FAILURE(vmo = elfldltl::testing::GetTestLibVmo(executable_path));
auto info = exec->Decode(diag, std::move(vmo));
// TODO(fxbug.dev/134320): dependency enqueuing, relocation, loading.
}
int64_t LdRemoteProcessTests::Run() {
return LdLoadZirconProcessTestsBase::Run(nullptr, stack_size_, thread_, entry_, vdso_base_,
root_vmar());
}
} // namespace ld::testing