blob: 8edc5d6b2efd6e7c32a957d79170f8439b9ba029 [file] [log] [blame]
// 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.
#ifndef LIB_LD_TEST_LD_STARTUP_SPAWN_PROCESS_TESTS_POSIX_H_
#define LIB_LD_TEST_LD_STARTUP_SPAWN_PROCESS_TESTS_POSIX_H_
#include <signal.h>
#include <cstdint>
#include <initializer_list>
#include <string>
#include <vector>
#include <fbl/unique_fd.h>
#include <gtest/gtest.h>
#include "ld-load-tests-posix-base.h"
// The spawned-process tests work by using the normal system program loader
// such that it loads the executable and finds the dynamic linker as its
// PT_INTERP in the standard way.
namespace ld::testing {
// On POSIX-like systems this means using posix_spawn. There is just one big
// operation, really. So all the methods before Run() just collect details of
// what to do.
class LdStartupSpawnProcessTests : public ::testing::Test, public LdLoadTestsPosixBase {
public:
static constexpr int64_t kRunFailureForTrap = 128 + SIGILL;
static constexpr int64_t kRunFailureForBadPointer = 128 + SIGSEGV;
void Init(std::initializer_list<std::string_view> args = {},
std::initializer_list<std::string_view> env = {});
void Load(std::string_view executable_name);
int64_t Run();
template <class... Reports>
void LoadAndFail(std::string_view name, Reports&&... reports) {
ASSERT_NO_FATAL_FAILURE(StartupLoadAndFail(*this, name, std::forward<Reports>(reports)...));
}
~LdStartupSpawnProcessTests();
private:
std::string executable_;
std::vector<std::string> argv_, envp_;
pid_t pid_ = -1;
};
} // namespace ld::testing
#endif // LIB_LD_TEST_LD_STARTUP_SPAWN_PROCESS_TESTS_POSIX_H_