blob: ca9bba4cc0abf1ab9009b8f6197fb79bb1570ecb [file] [log] [blame]
// Copyright 2018 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 GARNET_LIB_INFERIOR_CONTROL_TEST_SERVER_H_
#define GARNET_LIB_INFERIOR_CONTROL_TEST_SERVER_H_
#include <memory>
#include <string>
#include <vector>
#include <src/lib/fxl/macros.h>
#include <src/lib/fxl/strings/string_view.h>
#include <lib/sys/cpp/service_directory.h>
#include <lib/zx/channel.h>
#include <zircon/syscalls.h>
#include "gtest/gtest.h"
#include "garnet/lib/inferior_control/exception_port.h"
#include "garnet/lib/inferior_control/process.h"
#include "garnet/lib/inferior_control/server.h"
#include "garnet/lib/inferior_control/thread.h"
namespace inferior_control {
// Server baseclass for tests. Tests may subclass this if they need.
// NOTE: This class is generally not thread safe. Care must be taken when
// calling methods which modify the internal state of a TestServer instance.
class TestServer : public Server, public ::testing::Test {
public:
TestServer();
// ::testing::Test overrides
void SetUp() override;
void TearDown() override;
// Server overrides
bool Run() override;
bool SetupInferior(const std::vector<std::string>& argv,
zx::channel channel);
bool RunHelperProgram();
bool TestSuccessfulExit();
bool TestFailureExit();
protected:
// Delegate overrides.
void OnThreadStarting(Process* process, Thread* thread, zx_handle_t eport,
const zx_exception_context_t& context) override;
void OnThreadExiting(Process* process, Thread* thread, zx_handle_t eport,
const zx_exception_context_t& context) override;
void OnProcessTermination(Process* process) override;
void OnArchitecturalException(Process* process, Thread* thread,
zx_handle_t eport, const zx_excp_type_t type,
const zx_exception_context_t& context) override;
void OnSyntheticException(Process* process, Thread* thread,
zx_handle_t eport, zx_excp_type_t type,
const zx_exception_context_t& context) override;
private:
// exception_port_.Quit() can only be called after a successful call to
// exception_port_.Run(), so keep track of whether Run() succeeded.
bool exception_port_started_ = false;
std::shared_ptr<sys::ServiceDirectory> services_;
FXL_DISALLOW_COPY_AND_ASSIGN(TestServer);
};
} // namespace inferior_control
#endif // GARNET_LIB_INFERIOR_CONTROL_TEST_SERVER_H_