22 #include <gtest/gtest.h>
44 #include "src/proto/grpc/testing/echo.grpc.pb.h"
51 #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
64 queue_pending_data(pending_data),
70 bool queue_pending_data;
75 return out <<
"TestScenario{server_has_port="
76 << (
scenario.server_has_port ?
"true" :
"false")
77 <<
", queue_pending_data="
78 << (
scenario.queue_pending_data ?
"true" :
"false")
79 <<
", credentials='" <<
scenario.credentials_type <<
"'}";
83 std::ostringstream
out;
101 grpc_schedule_on_exec_ctx);
105 running_thread_.join();
111 void SetQueueData() { queue_data_ =
true; }
121 std::unique_ptr<experimental::ExternalConnectionAcceptor> acceptor) {
122 connection_acceptor_ =
std::move(acceptor);
129 std::lock_guard<std::mutex> lock(
mu_);
140 std::lock_guard<std::mutex> lock(
mu_);
147 auto*
self =
static_cast<TestTcpServer*
>(
arg);
148 self->OnConnect(
tcp, accepting_pollset, acceptor);
152 auto*
self =
static_cast<TestTcpServer*
>(
arg);
153 self->OnFdReleased(
err);
170 experimental::ExternalConnectionAcceptor::NewConnectionParameters
p;
171 p.listener_fd = listener_fd_;
180 p.read_buffer = ByteBuffer(&
data, 1);
182 gpr_log(
GPR_INFO,
"Handing off fd %d with data size %d from listener fd %d",
183 fd_,
static_cast<int>(
p.read_buffer.Length()), listener_fd_);
184 connection_acceptor_->HandleNewConnection(&p);
190 int listener_fd_ = -1;
192 bool queue_data_ =
false;
198 std::unique_ptr<experimental::ExternalConnectionAcceptor>
199 connection_acceptor_;
209 void SetUp()
override {
210 if (GetParam().queue_pending_data) {
211 tcp_server1_.SetQueueData();
212 tcp_server2_.SetQueueData();
214 tcp_server1_.Start();
215 tcp_server2_.Start();
217 if (GetParam().server_has_port) {
229 auto acceptor1 =
builder.experimental().AddExternalConnectionAcceptor(
232 tcp_server1_.SetAcceptor(
std::move(acceptor1));
233 auto acceptor2 =
builder.experimental().AddExternalConnectionAcceptor(
236 tcp_server2_.SetAcceptor(
std::move(acceptor2));
245 void TearDown()
override {
246 tcp_server1_.Shutdown();
247 tcp_server2_.Shutdown();
258 ChannelArguments
args;
264 stub_handoff1_ = EchoTestService::NewStub(channel_handoff1_);
267 stub_handoff2_ = EchoTestService::NewStub(channel_handoff2_);
268 if (GetParam().server_has_port) {
269 ChannelArguments direct_args;
275 stub_direct_ = EchoTestService::NewStub(channel_direct_);
282 std::shared_ptr<Channel> channel_handoff1_;
283 std::unique_ptr<EchoTestService::Stub> stub_handoff1_;
284 std::shared_ptr<Channel> channel_handoff2_;
285 std::unique_ptr<EchoTestService::Stub> stub_handoff2_;
287 std::shared_ptr<Channel> channel_direct_;
288 std::unique_ptr<EchoTestService::Stub> stub_direct_;
289 std::unique_ptr<Server>
server_;
292 TestTcpServer tcp_server1_;
293 TestTcpServer tcp_server2_;
297 void SendRpc(EchoTestService::Stub*
stub,
int num_rpcs) {
300 request.set_message(
"Hello hello hello hello");
302 for (
int i = 0;
i < num_rpcs; ++
i) {
312 std::vector<std::string> credentials_types;
323 nullptr) !=
nullptr) {
328 for (
const auto& cred : credentials_types) {
329 for (
auto server_has_port : {
true,
false}) {
330 for (
auto queue_pending_data : {
true,
false}) {
331 scenarios.emplace_back(server_has_port, queue_pending_data, cred);
338 TEST_P(PortSharingEnd2endTest, HandoffAndDirectCalls) {
340 SendRpc(stub_handoff1_.get(), 5);
341 if (GetParam().server_has_port) {
342 SendRpc(stub_direct_.get(), 5);
346 TEST_P(PortSharingEnd2endTest, MultipleHandoff) {
347 for (
int i = 0;
i < 3;
i++) {
349 SendRpc(stub_handoff2_.get(), 1);
353 TEST_P(PortSharingEnd2endTest, TwoHandoffPorts) {
354 for (
int i = 0;
i < 3;
i++) {
356 SendRpc(stub_handoff1_.get(), 5);
357 SendRpc(stub_handoff2_.get(), 5);
368 #endif // GRPC_POSIX_SOCKET_TCP_SERVER
370 int main(
int argc,
char** argv) {