blob: 712ba8e9c6f654832fd579938109ad7884bd4242 [file] [log] [blame]
// 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 <fidl/examples/routing/echo/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/fidl/cpp/string.h>
#include <lib/sys/cpp/component_context.h>
#include <lib/syslog/cpp/log_settings.h>
#include <lib/syslog/cpp/macros.h>
#include <cstdlib>
#include <iostream>
#include <string>
int main(int argc, const char* argv[], char* envp[]) {
fuchsia_logging::SetTags({"echo_client"});
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
// Connect to the fidl.examples.routing.Echo protocol
fidl::examples::routing::echo::EchoPtr echo_proxy;
auto context = sys::ComponentContext::Create();
context->svc()->Connect(echo_proxy.NewRequest());
// Sets an error handler that will be called if an error causes the underlying
// channel to be closed.
echo_proxy.set_error_handler([&loop](zx_status_t status) {
FX_SLOG(WARNING, "Echo protocol failed", FX_KV("status", status));
ZX_ASSERT(status == ZX_ERR_UNAVAILABLE);
loop.Quit();
});
// The `echo` channel should be closed with an epitaph because routing failed (see
// echo_realm.cml)
//
// The epitaph itself is just a zx_status_t. To get detailed information about why the routing
// failed, you'll need to check the kernel debuglog.
echo_proxy->EchoString("Hippos rule!", [&](fidl::StringPtr response) {
FX_SLOG(INFO, "Server response", FX_KV("response", response->c_str()));
loop.Quit();
});
loop.Run();
loop.ResetQuit();
// Connect to the fidl.examples.routing.Echo2 protocol
fidl::examples::routing::echo::EchoPtr echo2_proxy;
auto request = echo2_proxy.NewRequest();
context->svc()->Connect("fidl.examples.routing.echo.Echo2", request.TakeChannel());
// Sets an error handler that will be called if an error causes the underlying
// channel to be closed.
echo2_proxy.set_error_handler([&loop](zx_status_t status) {
FX_SLOG(WARNING, "Echo2 protocol failed", FX_KV("status", status));
ZX_ASSERT(status == ZX_ERR_PEER_CLOSED);
loop.Quit();
});
// The `echo2` channel should be closed because routing succeeded but the runner failed to
// start the component. The channel won't have an epitaph set; the runner closes the source
// component's outgoing directory request handle and that causes the channel for the service
// connection to be closed as well.
echo2_proxy->EchoString("Hippos rule!", [&](fidl::StringPtr response) {
FX_SLOG(INFO, "Server response", FX_KV("response", response->c_str()));
loop.Quit();
});
loop.Run();
return 0;
}