// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fuchsia_web/webengine/test/isolated_archivist.h"
#include <lib/async/default.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/sys/cpp/service_directory.h>
#include <utility>
#include "base/fuchsia/fuchsia_component_connect.h"
#include "base/fuchsia/fuchsia_logging.h"
#include "base/fuchsia/process_context.h"
IsolatedArchivist::IsolatedArchivist(
::sys::OutgoingDirectory& outgoing_directory) {
// Redirect the LogSink service to the isolated archivist instance.
zx_status_t status =
outgoing_directory.RemovePublicService<fuchsia_logger::LogSink>(
fidl::DiscoverableProtocolName<fuchsia_logger::LogSink>);
ZX_CHECK(status == ZX_OK, status) << "Remove LogSink service";
auto service_directory = base::ComponentContextForProcess()->svc();
log_sink_publisher_.emplace(
&outgoing_directory,
[](fidl::ServerEnd<fuchsia_logger::LogSink> server_end) {
auto result = base::fuchsia_component::Connect(
std::move(server_end), "fuchsia.logger.LogSink.isolated");
if (result.is_error()) {
ZX_DLOG(ERROR, result.status_value())
<< "Failed to connect to fuchsia.logger.LogSink.isolated";
}
});
auto log_client_end = base::fuchsia_component::Connect<fuchsia_logger::Log>(
"fuchsia.logger.Log.isolated");
ZX_CHECK(log_client_end.is_ok(), log_client_end.status_value());
log_.Bind(std::move(log_client_end.value()), async_get_default_dispatcher());
}
IsolatedArchivist::~IsolatedArchivist() = default;