blob: 86e4f7b311b7d1a34ab7129caf9840f8c7cd0945 [file] [log] [blame] [edit]
// 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/serversuite/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/cpp/task.h>
#include <lib/async/default.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/synchronous_interface_ptr.h>
#include <lib/sys/cpp/component_context.h>
#include <stdio.h>
#include <iostream>
#include <memory>
#include "lib/fidl/cpp/interface_request.h"
template <fidl::serversuite::AnyTarget::Tag TARGET>
struct TargetTypes;
class ClosedTargetControllerServer : public fidl::serversuite::ClosedTargetController {
public:
ClosedTargetControllerServer() = default;
void CloseWithEpitaph(int32_t epitaph_status) override {
ZX_ASSERT(ZX_OK == sut_binding_->Close(epitaph_status));
}
void set_sut_binding(fidl::Binding<fidl::serversuite::ClosedTarget>* sut_binding) {
sut_binding_ = sut_binding;
}
private:
fidl::Binding<fidl::serversuite::ClosedTarget>* sut_binding_ = nullptr;
};
class ClosedTargetServer : public fidl::serversuite::ClosedTarget {
public:
ClosedTargetServer() = default;
void OneWayNoPayload() override {
std::cout << "ClosedTarget.OneWayNoPayload()" << std::endl;
controller_binding_->events().ReceivedOneWayNoPayload();
}
void TwoWayNoPayload(TwoWayNoPayloadCallback callback) override {
std::cout << "ClosedTarget.TwoWayNoPayload()" << std::endl;
callback();
}
void TwoWayStructPayload(int8_t v, TwoWayStructPayloadCallback callback) override {
std::cout << "ClosedTarget.TwoWayStructPayload()" << std::endl;
callback(v);
}
void TwoWayTablePayload(::fidl::serversuite::ClosedTargetTwoWayTablePayloadRequest request,
TwoWayTablePayloadCallback callback) override {
std::cout << "ClosedTarget.TwoWayTablePayload()" << std::endl;
fidl::serversuite::ClosedTargetTwoWayTablePayloadResponse response;
response.set_v(request.v());
callback(std::move(response));
}
void TwoWayUnionPayload(::fidl::serversuite::ClosedTargetTwoWayUnionPayloadRequest request,
TwoWayUnionPayloadCallback callback) override {
std::cout << "ClosedTarget.TwoWayUnionPayload()" << std::endl;
fidl::serversuite::ClosedTargetTwoWayUnionPayloadResponse response;
response.set_v(request.v());
callback(std::move(response));
}
void TwoWayResult(::fidl::serversuite::ClosedTargetTwoWayResultRequest request,
TwoWayResultCallback callback) override {
std::cout << "ClosedTarget.TwoWayResult()" << std::endl;
switch (request.Which()) {
case fidl::serversuite::ClosedTargetTwoWayResultRequest::kPayload:
callback(fidl::serversuite::ClosedTarget_TwoWayResult_Result::WithResponse(
fidl::serversuite::ClosedTarget_TwoWayResult_Response(request.payload())));
break;
case fidl::serversuite::ClosedTargetTwoWayResultRequest::kError:
callback(fidl::serversuite::ClosedTarget_TwoWayResult_Result::WithErr(
std::move(request.error())));
break;
case fidl::serversuite::ClosedTargetTwoWayResultRequest::Invalid:
ZX_PANIC("unexpected invalid case");
break;
}
}
void GetHandleRights(zx::handle handle, GetHandleRightsCallback callback) override {
zx_info_handle_basic_t info;
ZX_ASSERT(ZX_OK ==
handle.get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr));
callback(info.rights);
}
void GetSignalableEventRights(zx::event event,
GetSignalableEventRightsCallback callback) override {
zx_info_handle_basic_t info;
ZX_ASSERT(ZX_OK == event.get_info(ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr));
callback(info.rights);
}
void EchoAsTransferableSignalableEvent(
zx::handle handle, EchoAsTransferableSignalableEventCallback callback) override {
callback(zx::event(handle.release()));
}
void ByteVectorSize(std::vector<uint8_t> vec, ByteVectorSizeCallback callback) override {
callback(static_cast<uint32_t>(vec.size()));
}
void HandleVectorSize(std::vector<zx::event> vec, HandleVectorSizeCallback callback) override {
callback(static_cast<uint32_t>(vec.size()));
}
void CreateNByteVector(uint32_t n, CreateNByteVectorCallback callback) override {
std::vector<uint8_t> bytes(n);
callback(std::move(bytes));
}
void CreateNHandleVector(uint32_t n, CreateNHandleVectorCallback callback) override {
std::vector<zx::event> handles(n);
for (auto& handle : handles) {
ZX_ASSERT(ZX_OK == zx::event::create(0, &handle));
}
callback(std::move(handles));
}
void set_controller_binding(
fidl::Binding<fidl::serversuite::ClosedTargetController>* controller_binding) {
controller_binding_ = controller_binding;
}
private:
fidl::Binding<fidl::serversuite::ClosedTargetController>* controller_binding_ = nullptr;
};
template <>
struct TargetTypes<fidl::serversuite::AnyTarget::Tag::kClosedTarget> {
using Controller = fidl::serversuite::ClosedTargetController;
using Sut = fidl::serversuite::ClosedTarget;
using ControllerServer = ClosedTargetControllerServer;
using SutServer = ClosedTargetServer;
using ServerPair = fidl::serversuite::ClosedTargetServerPair;
};
class AjarTargetControllerServer : public fidl::serversuite::AjarTargetController {
public:
AjarTargetControllerServer() = default;
};
class AjarTargetServer : public fidl::serversuite::AjarTarget {
public:
AjarTargetServer() = default;
void set_controller_binding(
fidl::Binding<fidl::serversuite::AjarTargetController>* controller_binding) {
controller_binding_ = controller_binding;
}
protected:
void handle_unknown_method(uint64_t ordinal) override {
controller_binding_->events().ReceivedUnknownMethod(
ordinal, fidl::serversuite::UnknownMethodType::ONE_WAY);
}
private:
fidl::Binding<fidl::serversuite::AjarTargetController>* controller_binding_ = nullptr;
};
template <>
struct TargetTypes<fidl::serversuite::AnyTarget::Tag::kAjarTarget> {
using Controller = fidl::serversuite::AjarTargetController;
using Sut = fidl::serversuite::AjarTarget;
using ControllerServer = AjarTargetControllerServer;
using SutServer = AjarTargetServer;
using ServerPair = fidl::serversuite::AjarTargetServerPair;
};
class OpenTargetControllerServer : public fidl::serversuite::OpenTargetController {
public:
OpenTargetControllerServer() = default;
void SendStrictEvent(SendStrictEventCallback callback) override {
sut_binding_->events().StrictEvent();
callback(fidl::serversuite::OpenTargetController_SendStrictEvent_Result::WithResponse({}));
}
void SendFlexibleEvent(SendFlexibleEventCallback callback) override {
sut_binding_->events().FlexibleEvent();
callback(fidl::serversuite::OpenTargetController_SendFlexibleEvent_Result::WithResponse({}));
}
void set_sut_binding(fidl::Binding<fidl::serversuite::OpenTarget>* sut_binding) {
sut_binding_ = sut_binding;
}
private:
fidl::Binding<fidl::serversuite::OpenTarget>* sut_binding_ = nullptr;
};
class OpenTargetServer : public fidl::serversuite::OpenTarget {
public:
OpenTargetServer() = default;
void StrictOneWay() override { controller_binding_->events().ReceivedStrictOneWay(); }
void FlexibleOneWay() override { controller_binding_->events().ReceivedFlexibleOneWay(); }
void StrictTwoWay(StrictTwoWayCallback callback) override { callback(); }
void StrictTwoWayFields(int32_t reply_with, StrictTwoWayFieldsCallback callback) override {
callback(reply_with);
}
void StrictTwoWayErr(::fidl::serversuite::OpenTargetStrictTwoWayErrRequest request,
StrictTwoWayErrCallback callback) override {
if (request.is_reply_success()) {
callback(fidl::serversuite::OpenTarget_StrictTwoWayErr_Result::WithResponse({}));
} else if (request.is_reply_error()) {
callback(fidl::serversuite::OpenTarget_StrictTwoWayErr_Result::WithErr(
std::move(request.reply_error())));
} else {
ZX_PANIC("Unrecognized StrictTwoWayErr Request Variant");
}
}
void StrictTwoWayFieldsErr(::fidl::serversuite::OpenTargetStrictTwoWayFieldsErrRequest request,
StrictTwoWayFieldsErrCallback callback) override {
if (request.is_reply_success()) {
callback(fidl::serversuite::OpenTarget_StrictTwoWayFieldsErr_Result::WithResponse(
fidl::serversuite::OpenTarget_StrictTwoWayFieldsErr_Response(request.reply_success())));
} else if (request.is_reply_error()) {
callback(fidl::serversuite::OpenTarget_StrictTwoWayFieldsErr_Result::WithErr(
std::move(request.reply_error())));
} else {
ZX_PANIC("Unrecognized StrictTwoWayFieldsErr Request Variant");
}
}
void FlexibleTwoWay(FlexibleTwoWayCallback callback) override {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWay_Result::WithResponse({}));
}
void FlexibleTwoWayFields(int32_t reply_with, FlexibleTwoWayFieldsCallback callback) override {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWayFields_Result::WithResponse(
fidl::serversuite::OpenTarget_FlexibleTwoWayFields_Response(reply_with)));
}
void FlexibleTwoWayErr(::fidl::serversuite::OpenTargetFlexibleTwoWayErrRequest request,
FlexibleTwoWayErrCallback callback) override {
if (request.is_reply_success()) {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWayErr_Result::WithResponse({}));
} else if (request.is_reply_error()) {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWayErr_Result::WithErr(
std::move(request.reply_error())));
} else {
ZX_PANIC("Unrecognized FlexibleTwoWayErr Request Variant");
}
}
void FlexibleTwoWayFieldsErr(
::fidl::serversuite::OpenTargetFlexibleTwoWayFieldsErrRequest request,
FlexibleTwoWayFieldsErrCallback callback) override {
if (request.is_reply_success()) {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWayFieldsErr_Result::WithResponse(
fidl::serversuite::OpenTarget_FlexibleTwoWayFieldsErr_Response(request.reply_success())));
} else if (request.is_reply_error()) {
callback(fidl::serversuite::OpenTarget_FlexibleTwoWayFieldsErr_Result::WithErr(
std::move(request.reply_error())));
} else {
ZX_PANIC("Unrecognized FlexibleTwoWayFieldsErr Request Variant");
}
}
void set_controller_binding(
fidl::Binding<fidl::serversuite::OpenTargetController>* controller_binding) {
controller_binding_ = controller_binding;
}
protected:
void handle_unknown_method(uint64_t ordinal, bool method_has_response) override {
auto unknown_method_type = method_has_response ? fidl::serversuite::UnknownMethodType::TWO_WAY
: fidl::serversuite::UnknownMethodType::ONE_WAY;
controller_binding_->events().ReceivedUnknownMethod(ordinal, unknown_method_type);
}
private:
fidl::Binding<fidl::serversuite::OpenTargetController>* controller_binding_ = nullptr;
};
template <>
struct TargetTypes<fidl::serversuite::AnyTarget::Tag::kOpenTarget> {
using Controller = fidl::serversuite::OpenTargetController;
using Sut = fidl::serversuite::OpenTarget;
using ControllerServer = OpenTargetControllerServer;
using SutServer = OpenTargetServer;
using ServerPair = fidl::serversuite::OpenTargetServerPair;
};
class LargeMessageTargetControllerServer : public fidl::serversuite::LargeMessageTargetController {
public:
LargeMessageTargetControllerServer() = default;
};
class LargeMessageTargetServer : public fidl::serversuite::LargeMessageTarget {
public:
LargeMessageTargetServer() = default;
void DecodeBoundedKnownToBeSmall(::std::vector<uint8_t> bytes) override {
std::cout << "LargeMessageTarget.DecodeBoundedKnownToBeSmall()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::DECODE_BOUNDED_KNOWN_TO_BE_SMALL);
}
void DecodeBoundedMaybeLarge(::std::vector<uint8_t> bytes) override {
std::cout << "LargeMessageTarget.DecodeBoundedMaybeLarge()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::DECODE_BOUNDED_MAYBE_LARGE);
}
void DecodeSemiBoundedBelievedToBeSmall(
::fidl::serversuite::SemiBoundedBelievedToBeSmall SemiBoundedBelievedToBeSmall) override {
std::cout << "LargeMessageTarget.DecodeSemiBoundedBelievedToBeSmall()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::
DECODE_SEMI_BOUNDED_BELIEVED_TO_BE_SMALL);
}
void DecodeSemiBoundedMaybeLarge(
::fidl::serversuite::SemiBoundedMaybeLarge SemiBoundedMaybeLarge) override {
std::cout << "LargeMessageTarget.DecodeSemiBoundedMaybeLarge()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::DECODE_SEMI_BOUNDED_MAYBE_LARGE);
}
void DecodeUnboundedMaybeLargeValue(::std::vector<uint8_t> bytes) override {
std::cout << "LargeMessageTarget.DecodeUnboundedMaybeLargeValue()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::DECODE_UNBOUNDED_MAYBE_LARGE_VALUE);
}
void DecodeUnboundedMaybeLargeResource(
::std::array<::fidl::serversuite::Elements, 64> elements) override {
std::cout << "LargeMessageTarget.DecodeUnboundedMaybeLargeResource()" << std::endl;
controller_binding_->events().ReceivedOneWay(
::fidl::serversuite::LargeMessageTargetOneWayMethod::DECODE_UNBOUNDED_MAYBE_LARGE_RESOURCE);
}
void EncodeBoundedKnownToBeSmall(::std::vector<uint8_t> bytes,
EncodeBoundedKnownToBeSmallCallback callback) override {
std::cout << "LargeMessageTarget.EncodeBoundedKnownToBeSmall()" << std::endl;
callback(bytes);
}
void EncodeBoundedMaybeLarge(::std::vector<uint8_t> bytes,
EncodeBoundedMaybeLargeCallback callback) override {
std::cout << "LargeMessageTarget.EncodeBoundedMaybeLarge()" << std::endl;
callback(bytes);
}
void EncodeSemiBoundedBelievedToBeSmall(
::fidl::serversuite::SemiBoundedBelievedToBeSmall payload,
EncodeSemiBoundedBelievedToBeSmallCallback callback) override {
std::cout << "LargeMessageTarget.EncodeSemiBoundedBelievedToBeSmall()" << std::endl;
callback(std::move(payload));
}
void EncodeSemiBoundedMaybeLarge(::fidl::serversuite::SemiBoundedMaybeLarge payload,
EncodeSemiBoundedMaybeLargeCallback callback) override {
std::cout << "LargeMessageTarget.EncodeSemiBoundedMaybeLarge()" << std::endl;
callback(std::move(payload));
}
void EncodeUnboundedMaybeLargeValue(::std::vector<uint8_t> bytes,
EncodeUnboundedMaybeLargeValueCallback callback) override {
std::cout << "LargeMessageTarget.EncodeUnboundedMaybeLargeValue()" << std::endl;
callback(bytes);
}
void EncodeUnboundedMaybeLargeResource(
bool populate_unset_handles, ::fidl::serversuite::UnboundedMaybeLargeResource data,
EncodeUnboundedMaybeLargeResourceCallback callback) override {
// TODO(fxbug.dev/114263): Support populating unset handles.
std::cout << "LargeMessageTarget.EncodeUnboundedMaybeLargeResource()" << std::endl;
callback(std::move(data.elements));
}
void set_controller_binding(
fidl::Binding<fidl::serversuite::LargeMessageTargetController>* controller_binding) {
controller_binding_ = controller_binding;
}
protected:
void handle_unknown_method(uint64_t ordinal, bool method_has_response) override {
auto unknown_method_type = method_has_response ? fidl::serversuite::UnknownMethodType::TWO_WAY
: fidl::serversuite::UnknownMethodType::ONE_WAY;
controller_binding_->events().ReceivedUnknownMethod(ordinal, unknown_method_type);
}
private:
fidl::Binding<fidl::serversuite::LargeMessageTargetController>* controller_binding_ = nullptr;
};
template <>
struct TargetTypes<fidl::serversuite::AnyTarget::Tag::kLargeMessageTarget> {
using Controller = fidl::serversuite::LargeMessageTargetController;
using Sut = fidl::serversuite::LargeMessageTarget;
using ControllerServer = LargeMessageTargetControllerServer;
using SutServer = LargeMessageTargetServer;
using ServerPair = fidl::serversuite::LargeMessageTargetServerPair;
};
class ActiveServerBase {
public:
virtual ~ActiveServerBase() = default;
};
template <fidl::serversuite::AnyTarget::Tag TARGET>
class ActiveServer : public ActiveServerBase {
public:
using Controller = typename TargetTypes<TARGET>::Controller;
using Sut = typename TargetTypes<TARGET>::Sut;
using ControllerServer = typename TargetTypes<TARGET>::ControllerServer;
using SutServer = typename TargetTypes<TARGET>::SutServer;
using ServerPair = typename TargetTypes<TARGET>::ServerPair;
ActiveServer() = default;
~ActiveServer() override = default;
void Bind(ServerPair& server_pair, async_dispatcher_t* dispatcher) {
sut_binding_->set_error_handler([this](zx_status_t status) {
controller_binding_->events().WillTeardown(fidl::serversuite::TeardownReason::OTHER);
});
controller_binding_->Bind(std::move(server_pair.controller), dispatcher);
sut_binding_->Bind(std::move(server_pair.sut), dispatcher);
}
std::unique_ptr<ControllerServer> controller_server_ = std::make_unique<ControllerServer>();
std::unique_ptr<SutServer> sut_server_ = std::make_unique<SutServer>();
std::unique_ptr<fidl::Binding<Controller>> controller_binding_ =
std::make_unique<fidl::Binding<Controller>>(controller_server_.get());
std::unique_ptr<fidl::Binding<Sut>> sut_binding_ =
std::make_unique<fidl::Binding<Sut>>(sut_server_.get());
};
class RunnerServer : public fidl::serversuite::Runner {
public:
explicit RunnerServer(async_dispatcher_t* dispatcher) : dispatcher_(dispatcher) {}
void IsTestEnabled(fidl::serversuite::Test test, IsTestEnabledCallback callback) override {
switch (test) {
case fidl::serversuite::Test::IGNORE_DISABLED:
// This case will forever be false, as it is intended to validate the "test disabling"
// functionality of the runner itself.
callback(false);
return;
case fidl::serversuite::Test::SERVER_SENDS_TOO_FEW_RIGHTS:
case fidl::serversuite::Test::RESPONSE_EXCEEDS_BYTE_LIMIT:
case fidl::serversuite::Test::RESPONSE_EXCEEDS_HANDLE_LIMIT:
callback(false);
return;
case fidl::serversuite::Test::V1_TWO_WAY_NO_PAYLOAD:
case fidl::serversuite::Test::V1_TWO_WAY_STRUCT_PAYLOAD:
// TODO(fxbug.dev/99738): HLCPP bindings should reject V1 wire format.
callback(false);
return;
case fidl::serversuite::Test::GOOD_DECODE_BOUNDED_MAYBE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_DECODE_SEMI_BOUNDED_UNKNOWABLE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_DECODE_SEMI_BOUNDED_MAYBE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_DECODE_UNBOUNDED_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_DECODE_63_HANDLE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_DECODE_UNKNOWN_LARGE_MESSAGE:
case fidl::serversuite::Test::BAD_DECODE_BYTE_OVERFLOW_FLAG_SET_ON_BOUNDED_SMALL_MESSAGE:
case fidl::serversuite::Test::BAD_DECODE_BYTE_OVERFLOW_FLAG_SET_ON_UNBOUNDED_SMALL_MESSAGE:
case fidl::serversuite::Test::BAD_DECODE_BYTE_OVERFLOW_FLAG_UNSET_ON_UNBOUNDED_LARGE_MESSAGE:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_OMITTED:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_TOO_SMALL:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_TOO_LARGE:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_TOP_HALF_UNZEROED:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_BYTE_COUNT_IS_ZERO:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_BYTE_COUNT_BELOW_MINIMUM:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_NO_HANDLES:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_TOO_FEW_HANDLES:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_64_HANDLES:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_LAST_HANDLE_NOT_VMO:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_LAST_HANDLE_INSUFFICIENT_RIGHTS:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_LAST_HANDLE_EXCESSIVE_RIGHTS:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_VMO_TOO_SMALL:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_BYTE_COUNT_TOO_SMALL:
case fidl::serversuite::Test::BAD_DECODE_LARGE_MESSAGE_INFO_BYTE_COUNT_TOO_LARGE:
callback(false);
// TODO(fxbug.dev/114261): Test decoding large messages.
return;
case fidl::serversuite::Test::GOOD_ENCODE_BOUNDED_MAYBE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_ENCODE_SEMI_BOUNDED_MAYBE_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_ENCODE_UNBOUNDED_LARGE_MESSAGE:
case fidl::serversuite::Test::GOOD_ENCODE_63_HANDLE_LARGE_MESSAGE:
case fidl::serversuite::Test::BAD_ENCODE_64_HANDLE_LARGE_MESSAGE:
callback(false);
// TODO(fxbug.dev/114263): Test encoding large messages.
return;
default:
callback(true);
return;
}
}
void IsTeardownReasonSupported(IsTeardownReasonSupportedCallback callback) override {
callback(false);
}
void Start(fidl::serversuite::AnyTarget target, StartCallback callback) override {
if (target.is_closed_target()) {
auto active_server =
std::make_unique<ActiveServer<fidl::serversuite::AnyTarget::Tag::kClosedTarget>>();
active_server->controller_server_->set_sut_binding(active_server->sut_binding_.get());
active_server->sut_server_->set_controller_binding(active_server->controller_binding_.get());
active_server->Bind(target.closed_target(), dispatcher_);
active_server_ = std::move(active_server);
callback();
} else if (target.is_ajar_target()) {
auto active_server =
std::make_unique<ActiveServer<fidl::serversuite::AnyTarget::Tag::kAjarTarget>>();
active_server->sut_server_->set_controller_binding(active_server->controller_binding_.get());
active_server->Bind(target.ajar_target(), dispatcher_);
active_server_ = std::move(active_server);
callback();
} else if (target.is_open_target()) {
auto active_server =
std::make_unique<ActiveServer<fidl::serversuite::AnyTarget::Tag::kOpenTarget>>();
active_server->controller_server_->set_sut_binding(active_server->sut_binding_.get());
active_server->sut_server_->set_controller_binding(active_server->controller_binding_.get());
active_server->Bind(target.open_target(), dispatcher_);
active_server_ = std::move(active_server);
callback();
} else if (target.is_large_message_target()) {
auto active_server =
std::make_unique<ActiveServer<fidl::serversuite::AnyTarget::Tag::kLargeMessageTarget>>();
active_server->sut_server_->set_controller_binding(active_server->controller_binding_.get());
active_server->Bind(target.large_message_target(), dispatcher_);
active_server_ = std::move(active_server);
callback();
} else {
ZX_PANIC("Unrecognized target type.");
}
}
void CheckAlive(CheckAliveCallback callback) override { return callback(); }
private:
async_dispatcher_t* dispatcher_;
std::unique_ptr<ActiveServerBase> active_server_;
};
int main(int argc, const char** argv) {
std::cout << "HLCPP server: main" << std::endl;
async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
RunnerServer server(loop.dispatcher());
fidl::Binding<fidl::serversuite::Runner> binding(&server);
fidl::InterfaceRequestHandler<fidl::serversuite::Runner> handler =
[&](fidl::InterfaceRequest<fidl::serversuite::Runner> server_end) {
binding.Bind(std::move(server_end));
};
auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory();
context->outgoing()->AddPublicService(std::move(handler));
std::cout << "HLCPP server: ready!" << std::endl;
return loop.Run();
}