blob: d1618cead0af0c09bb7216074fc5ca5b408a08e9 [file] [log] [blame]
// Copyright 2023 gRPC authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef GRPC_TEST_CORE_END2END_FIXTURES_SOCKPAIR_FIXTURE_H
#define GRPC_TEST_CORE_END2END_FIXTURES_SOCKPAIR_FIXTURE_H
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include <grpc/grpc.h>
#include <grpc/status.h>
#include <grpc/support/log.h>
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_args_preconditioning.h"
#include "src/core/lib/channel/channelz.h"
#include "src/core/lib/config/core_configuration.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/endpoint_pair.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/surface/channel.h"
#include "src/core/lib/surface/channel_stack_type.h"
#include "src/core/lib/surface/completion_queue.h"
#include "src/core/lib/surface/server.h"
#include "src/core/lib/transport/transport.h"
#include "src/core/lib/transport/transport_fwd.h"
#include "test/core/end2end/end2end_tests.h"
class SockpairFixture : public CoreTestFixture {
public:
explicit SockpairFixture(const grpc_core::ChannelArgs& ep_args)
: ep_(grpc_iomgr_create_endpoint_pair("fixture", ep_args.ToC().get())) {}
private:
virtual grpc_core::ChannelArgs MutateClientArgs(grpc_core::ChannelArgs args) {
return args;
}
virtual grpc_core::ChannelArgs MutateServerArgs(grpc_core::ChannelArgs args) {
return args;
}
grpc_server* MakeServer(const grpc_core::ChannelArgs& in_args) override {
auto args = MutateServerArgs(in_args);
grpc_core::ExecCtx exec_ctx;
grpc_transport* transport;
auto* server = grpc_server_create(args.ToC().get(), nullptr);
grpc_server_register_completion_queue(server, cq(), nullptr);
grpc_server_start(server);
auto server_channel_args = grpc_core::CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(args.ToC().get());
transport =
grpc_create_chttp2_transport(server_channel_args, ep_.server, false);
grpc_endpoint_add_to_pollset(ep_.server, grpc_cq_pollset(cq()));
grpc_core::Server* core_server = grpc_core::Server::FromC(server);
grpc_error_handle error = core_server->SetupTransport(
transport, nullptr, core_server->channel_args(), nullptr);
if (error.ok()) {
grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
} else {
grpc_transport_destroy(transport);
}
return server;
}
grpc_channel* MakeClient(const grpc_core::ChannelArgs& in_args) override {
grpc_core::ExecCtx exec_ctx;
auto args = grpc_core::CoreConfiguration::Get()
.channel_args_preconditioning()
.PreconditionChannelArgs(
MutateClientArgs(in_args)
.Set(GRPC_ARG_DEFAULT_AUTHORITY, "test-authority")
.ToC()
.get());
grpc_transport* transport;
transport = grpc_create_chttp2_transport(args, ep_.client, true);
auto channel = grpc_core::Channel::Create(
"socketpair-target", args, GRPC_CLIENT_DIRECT_CHANNEL, transport);
grpc_channel* client;
if (channel.ok()) {
client = channel->release()->c_ptr();
grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
} else {
client = grpc_lame_client_channel_create(
nullptr, static_cast<grpc_status_code>(channel.status().code()),
"lame channel");
grpc_transport_destroy(transport);
}
GPR_ASSERT(client);
return client;
}
grpc_endpoint_pair ep_;
};
#endif // GRPC_TEST_CORE_END2END_FIXTURES_SOCKPAIR_FIXTURE_H