blob: a5caf04fdfe157efb7fd173ea7e34e26b820a199 [file] [log] [blame] [edit]
// 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/framework/testing/adapter.h"
#include <lib/syslog/cpp/macros.h>
#include "src/sys/fuzzing/common/dispatcher.h"
namespace fuzzing {
FakeTargetAdapter::FakeTargetAdapter() : binding_(this) { sync_completion_signal(&wsync_); }
fidl::InterfaceRequestHandler<TargetAdapter> FakeTargetAdapter::GetHandler() {
return [&](fidl::InterfaceRequest<TargetAdapter> request) {
coordinator_.Reset();
binding_.Bind(std::move(request));
};
}
void FakeTargetAdapter::Connect(zx::eventpair eventpair, Buffer test_input,
ConnectCallback callback) {
test_input_.LinkReserved(std::move(test_input));
coordinator_.Pair(std::move(eventpair), [this](zx_signals_t observed) {
sync_completion_wait(&wsync_, ZX_TIME_INFINITE);
sync_completion_reset(&wsync_);
observed_ = observed;
sync_completion_signal(&rsync_);
return !(observed & ZX_EVENTPAIR_PEER_CLOSED);
});
callback();
}
zx_signals_t FakeTargetAdapter::AwaitSignal() {
sync_completion_wait(&rsync_, ZX_TIME_INFINITE);
sync_completion_reset(&rsync_);
auto observed = observed_;
sync_completion_signal(&wsync_);
return observed;
}
void FakeTargetAdapter::SignalPeer(Signal signal) { coordinator_.SignalPeer(signal); }
} // namespace fuzzing