// Copyright 2022 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 <lib/syslog/cpp/macros.h>
#include <zircon/status.h>

#include "src/sys/fuzzing/common/component-context.h"
#include "src/sys/fuzzing/realmfuzzer/testing/coverage.h"

namespace fuzzing {
zx_status_t RunCoverage() {
  // Take start up handles.
  auto context = ComponentContext::Create();

  // Create the coverage forwarder.
  FakeCoverage coverage(context->executor());

  // See the note in target/instrumented-process.cc.
  // Serve `fuchsia.fuzzer.CoverageDataCollector` as `fuchsia.debugdata.Publisher`.
  if (auto status = context->AddPublicService(coverage.GetPublisherHandler()); status != ZX_OK) {
    FX_LOGS(ERROR) << " Failed to serve fuchsia.debugdata.Publisher: "
                   << zx_status_get_string(status);
    return status;
  }
  // Serve `fuchsia.fuzzer.CoverageDataProvider`.
  if (auto status = context->AddPublicService(coverage.GetProviderHandler()); status != ZX_OK) {
    FX_LOGS(ERROR) << " Failed to serve fuchsia.fuzzer.CoverageDataProvider: "
                   << zx_status_get_string(status);
    return status;
  }

  return context->Run();
}

}  // namespace fuzzing

int main() { return fuzzing::RunCoverage(); }
