// 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/engine/coverage-client.h"

#include <fuchsia/fuzzer/cpp/fidl.h>
#include <lib/sync/completion.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/status.h>

#include <memory>

#include "src/lib/fxl/macros.h"
#include "src/sys/fuzzing/common/input.h"
#include "src/sys/fuzzing/common/options.h"
#include "src/sys/fuzzing/common/shared-memory.h"

namespace fuzzing {

using fuchsia::fuzzer::CoverageEventPtr;
using fuchsia::fuzzer::CoverageProvider;
using fuchsia::fuzzer::CoverageProviderPtr;

CoverageProviderClient::CoverageProviderClient(ExecutorPtr executor)
    : executor_(std::move(executor)) {}

void CoverageProviderClient::SetOptions(const OptionsPtr& options) {
  Connect();
  provider_->SetOptions(CopyOptions(*options));
}

Promise<CoverageEvent> CoverageProviderClient::WatchCoverageEvent() {
  Connect();
  Bridge<CoverageEvent> bridge;
  provider_->WatchCoverageEvent(bridge.completer.bind());
  return bridge.consumer.promise_or(fpromise::error());
}

void CoverageProviderClient::Connect() {
  if (provider_) {
    return;
  }
  FX_DCHECK(handler_);
  handler_(provider_.NewRequest(executor_->dispatcher()));
  provider_.set_error_handler([this](zx_status_t status) { provider_ = nullptr; });
}

}  // namespace fuzzing
