blob: a78cef2c9f189348e399bc26c4a8f539338e51c8 [file] [log] [blame]
// Copyright 2022 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 <fidl/fuchsia.ldsvc/cpp/wire.h>
#include <lib/elfldltl/testing/get-test-data.h>
#include <lib/fdio/fd.h>
#include <lib/zx/channel.h>
#include <zircon/dlfcn.h>
#include <zircon/status.h>
#include <zircon/types.h>
#include <cerrno>
#include <gtest/gtest.h>
namespace elfldltl::testing {
// Fuchsia-specific implementation of TryGetTestLib (see get-test-data-path.cc);
// a custom implementation is needed because fdio open does not support
// returning an executable fd.
fbl::unique_fd TryGetTestLib(std::string_view libname) {
fbl::unique_fd fd;
zx::vmo lib_vmo = TryGetTestLibVmo(libname);
// If the VMO is not found, return the default-constructed invalid fd to the
// caller.
if (!lib_vmo) {
return fd;
}
// Create and return a valid FD for the VMO handle.
int fd_out;
zx_status_t status = fdio_fd_create(lib_vmo.release(), &fd_out);
EXPECT_EQ(status, ZX_OK) << libname << ": fdio_fd_create: " << zx_status_get_string(status);
return fbl::unique_fd{fd_out};
}
fbl::unique_fd GetTestLib(std::string_view libname) {
auto fd = TryGetTestLib(libname);
EXPECT_TRUE(fd) << "elfldltl::GetTestLib(\"" << libname << "\"): VMO not found";
return fd;
}
} // namespace elfldltl::testing