blob: fe627f7b12e339b959d68ceffb1d35f801ad10ab [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.
#include "src/sys/fuzzing/libfuzzer/testing/relay.h"
#include <lib/fidl/cpp/interface_request.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/status.h>
namespace fuzzing {
RelayImpl::RelayImpl(ExecutorPtr executor) : executor_(std::move(executor)) {}
fidl::InterfaceRequestHandler<Relay> RelayImpl::GetHandler() {
return [this](fidl::InterfaceRequest<Relay> request) {
bindings_.AddBinding(this, std::move(request), executor_->dispatcher());
};
}
void RelayImpl::SetTestData(SignaledBuffer test_data, SetTestDataCallback callback) {
auto completer = std::move(completer_);
if (!completer) {
Bridge<SignaledBuffer> test_data_bridge;
completer = std::move(test_data_bridge.completer);
consumer_ = std::move(test_data_bridge.consumer);
}
Bridge<> finish_bridge;
finish_ = std::move(finish_bridge.completer);
executor_->schedule_task(
finish_bridge.consumer.promise().and_then([callback = std::move(callback)] { callback(); }));
completer.complete_ok(std::move(test_data));
}
void RelayImpl::WatchTestData(WatchTestDataCallback callback) {
auto consumer = std::move(consumer_);
if (!consumer) {
Bridge<SignaledBuffer> test_data_bridge;
completer_ = std::move(test_data_bridge.completer);
consumer = std::move(test_data_bridge.consumer);
}
executor_->schedule_task(
consumer.promise().and_then([callback = std::move(callback)](SignaledBuffer& test_data) {
callback(std::move(test_data));
}));
}
void RelayImpl::Finish() { finish_.complete_ok(); }
} // namespace fuzzing