blob: 52fc5c0236ef783001423149848a79b0b433f47c [file] [log] [blame]
// Copyright 2021 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 SRC_SYS_FUZZING_FRAMEWORK_TESTING_ADAPTER_H_
#define SRC_SYS_FUZZING_FRAMEWORK_TESTING_ADAPTER_H_
#include <fuchsia/fuzzer/cpp/fidl.h>
#include <fuchsia/mem/cpp/fidl.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/interface_request.h>
#include <zircon/compiler.h>
#include <memory>
#include <string>
#include <vector>
#include "src/lib/fxl/macros.h"
#include "src/sys/fuzzing/common/async-eventpair.h"
#include "src/sys/fuzzing/common/async-types.h"
#include "src/sys/fuzzing/common/input.h"
#include "src/sys/fuzzing/common/shared-memory.h"
namespace fuzzing {
using ::fuchsia::fuzzer::TargetAdapter;
using ::fuchsia::mem::Buffer;
// This class implements |fuchsia.fuzzer.TargetAdapter| for unit testing, and gives tests fine-
// grained control over the signals and test inputs exchanged with the runner.
class FakeTargetAdapter final : public TargetAdapter {
public:
explicit FakeTargetAdapter(ExecutorPtr executor);
~FakeTargetAdapter() override = default;
// Provides a request handler for the engine to connect to the target adapter.
fidl::InterfaceRequestHandler<TargetAdapter> GetHandler();
// Records the command-line parameters.
void SetParameters(const std::vector<std::string>& parameters);
// FIDL methods.
void GetParameters(GetParametersCallback callback) override;
void Connect(zx::eventpair eventpair, zx::vmo test_input, ConnectCallback callback) override;
// Returns a promise to |AwaitStart| and then |Finish|.
ZxPromise<Input> TestOneInput();
// Returns a promise that waits for a start signal and returns the provided test input.
ZxPromise<Input> AwaitStart();
// Sends a signal to the engine that indicates the target adapter is finished with a run.
__WARN_UNUSED_RESULT zx_status_t Finish();
// Returns a promise that waits for the client to disconnect.
ZxPromise<> AwaitDisconnect();
private:
fidl::Binding<TargetAdapter> binding_;
ExecutorPtr executor_;
std::vector<std::string> parameters_;
AsyncEventPair eventpair_;
SharedMemory test_input_;
fpromise::suspended_task suspended_;
Scope scope_;
FXL_DISALLOW_COPY_ASSIGN_AND_MOVE(FakeTargetAdapter);
};
} // namespace fuzzing
#endif // SRC_SYS_FUZZING_FRAMEWORK_TESTING_ADAPTER_H_