xref: /aosp_15_r20/external/grpc-grpc/test/cpp/interop/interop_test.cc (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #include <assert.h>
20*cc02d7e2SAndroid Build Coastguard Worker #include <signal.h>
21*cc02d7e2SAndroid Build Coastguard Worker #include <stdio.h>
22*cc02d7e2SAndroid Build Coastguard Worker #include <stdlib.h>
23*cc02d7e2SAndroid Build Coastguard Worker #include <string.h>
24*cc02d7e2SAndroid Build Coastguard Worker #include <sys/types.h>
25*cc02d7e2SAndroid Build Coastguard Worker #include <sys/wait.h>
26*cc02d7e2SAndroid Build Coastguard Worker #include <unistd.h>
27*cc02d7e2SAndroid Build Coastguard Worker 
28*cc02d7e2SAndroid Build Coastguard Worker #include <string>
29*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
30*cc02d7e2SAndroid Build Coastguard Worker 
31*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
32*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
33*cc02d7e2SAndroid Build Coastguard Worker 
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/alloc.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h>
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gpr/string.h"
38*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/crash.h"
39*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/iomgr/socket_utils_posix.h"
40*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/port.h"
41*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_config.h"
42*cc02d7e2SAndroid Build Coastguard Worker 
43*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::vector<std::string>, extra_client_flags, {},
44*cc02d7e2SAndroid Build Coastguard Worker           "Extra flags to pass to clients.");
45*cc02d7e2SAndroid Build Coastguard Worker 
46*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::vector<std::string>, extra_server_flags, {},
47*cc02d7e2SAndroid Build Coastguard Worker           "Extra flags to pass to server.");
48*cc02d7e2SAndroid Build Coastguard Worker 
test_client(const char * root,const char * host,int port)49*cc02d7e2SAndroid Build Coastguard Worker int test_client(const char* root, const char* host, int port) {
50*cc02d7e2SAndroid Build Coastguard Worker   int status;
51*cc02d7e2SAndroid Build Coastguard Worker   pid_t cli;
52*cc02d7e2SAndroid Build Coastguard Worker   cli = fork();
53*cc02d7e2SAndroid Build Coastguard Worker   if (cli == 0) {
54*cc02d7e2SAndroid Build Coastguard Worker     std::vector<char*> args;
55*cc02d7e2SAndroid Build Coastguard Worker     std::string command = absl::StrCat(root, "/interop_client");
56*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(const_cast<char*>(command.c_str()));
57*cc02d7e2SAndroid Build Coastguard Worker     std::string port_arg = absl::StrCat("--server_port=", port);
58*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(const_cast<char*>(port_arg.c_str()));
59*cc02d7e2SAndroid Build Coastguard Worker     auto extra_client_flags = absl::GetFlag(FLAGS_extra_client_flags);
60*cc02d7e2SAndroid Build Coastguard Worker     for (size_t i = 0; i < extra_client_flags.size(); i++) {
61*cc02d7e2SAndroid Build Coastguard Worker       args.push_back(const_cast<char*>(extra_client_flags[i].c_str()));
62*cc02d7e2SAndroid Build Coastguard Worker     }
63*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(nullptr);
64*cc02d7e2SAndroid Build Coastguard Worker     execv(args[0], args.data());
65*cc02d7e2SAndroid Build Coastguard Worker     return 1;
66*cc02d7e2SAndroid Build Coastguard Worker   }
67*cc02d7e2SAndroid Build Coastguard Worker   // wait for client
68*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_INFO, "Waiting for client: %s", host);
69*cc02d7e2SAndroid Build Coastguard Worker   if (waitpid(cli, &status, 0) == -1) return 2;
70*cc02d7e2SAndroid Build Coastguard Worker   if (!WIFEXITED(status)) return 4;
71*cc02d7e2SAndroid Build Coastguard Worker   if (WEXITSTATUS(status)) return WEXITSTATUS(status);
72*cc02d7e2SAndroid Build Coastguard Worker   return 0;
73*cc02d7e2SAndroid Build Coastguard Worker }
74*cc02d7e2SAndroid Build Coastguard Worker 
main(int argc,char ** argv)75*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
76*cc02d7e2SAndroid Build Coastguard Worker   grpc::testing::InitTest(&argc, &argv, true);
77*cc02d7e2SAndroid Build Coastguard Worker   char* me = argv[0];
78*cc02d7e2SAndroid Build Coastguard Worker   char* lslash = strrchr(me, '/');
79*cc02d7e2SAndroid Build Coastguard Worker   char root[1024];
80*cc02d7e2SAndroid Build Coastguard Worker   int port = grpc_pick_unused_port_or_die();
81*cc02d7e2SAndroid Build Coastguard Worker   int status;
82*cc02d7e2SAndroid Build Coastguard Worker   pid_t svr;
83*cc02d7e2SAndroid Build Coastguard Worker   int ret;
84*cc02d7e2SAndroid Build Coastguard Worker   int do_ipv6 = 1;
85*cc02d7e2SAndroid Build Coastguard Worker   // seed rng with pid, so we don't end up with the same random numbers as a
86*cc02d7e2SAndroid Build Coastguard Worker   // concurrently running test binary
87*cc02d7e2SAndroid Build Coastguard Worker   srand(getpid());
88*cc02d7e2SAndroid Build Coastguard Worker   if (!grpc_ipv6_loopback_available()) {
89*cc02d7e2SAndroid Build Coastguard Worker     gpr_log(GPR_INFO, "Can't bind to ::1.  Skipping IPv6 tests.");
90*cc02d7e2SAndroid Build Coastguard Worker     do_ipv6 = 0;
91*cc02d7e2SAndroid Build Coastguard Worker   }
92*cc02d7e2SAndroid Build Coastguard Worker   // figure out where we are
93*cc02d7e2SAndroid Build Coastguard Worker   if (lslash) {
94*cc02d7e2SAndroid Build Coastguard Worker     memcpy(root, me, lslash - me);
95*cc02d7e2SAndroid Build Coastguard Worker     root[lslash - me] = 0;
96*cc02d7e2SAndroid Build Coastguard Worker   } else {
97*cc02d7e2SAndroid Build Coastguard Worker     strcpy(root, ".");
98*cc02d7e2SAndroid Build Coastguard Worker   }
99*cc02d7e2SAndroid Build Coastguard Worker   // start the server
100*cc02d7e2SAndroid Build Coastguard Worker   svr = fork();
101*cc02d7e2SAndroid Build Coastguard Worker   if (svr == 0) {
102*cc02d7e2SAndroid Build Coastguard Worker     std::vector<char*> args;
103*cc02d7e2SAndroid Build Coastguard Worker     std::string command = absl::StrCat(root, "/interop_server");
104*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(const_cast<char*>(command.c_str()));
105*cc02d7e2SAndroid Build Coastguard Worker     std::string port_arg = absl::StrCat("--port=", port);
106*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(const_cast<char*>(port_arg.c_str()));
107*cc02d7e2SAndroid Build Coastguard Worker     auto extra_server_flags = absl::GetFlag(FLAGS_extra_server_flags);
108*cc02d7e2SAndroid Build Coastguard Worker     for (size_t i = 0; i < extra_server_flags.size(); i++) {
109*cc02d7e2SAndroid Build Coastguard Worker       args.push_back(const_cast<char*>(extra_server_flags[i].c_str()));
110*cc02d7e2SAndroid Build Coastguard Worker     }
111*cc02d7e2SAndroid Build Coastguard Worker     args.push_back(nullptr);
112*cc02d7e2SAndroid Build Coastguard Worker     execv(args[0], args.data());
113*cc02d7e2SAndroid Build Coastguard Worker     return 1;
114*cc02d7e2SAndroid Build Coastguard Worker   }
115*cc02d7e2SAndroid Build Coastguard Worker   // wait a little
116*cc02d7e2SAndroid Build Coastguard Worker   sleep(10);
117*cc02d7e2SAndroid Build Coastguard Worker   // start the clients
118*cc02d7e2SAndroid Build Coastguard Worker   ret = test_client(root, "127.0.0.1", port);
119*cc02d7e2SAndroid Build Coastguard Worker   if (ret != 0) return ret;
120*cc02d7e2SAndroid Build Coastguard Worker   ret = test_client(root, "::ffff:127.0.0.1", port);
121*cc02d7e2SAndroid Build Coastguard Worker   if (ret != 0) return ret;
122*cc02d7e2SAndroid Build Coastguard Worker   ret = test_client(root, "localhost", port);
123*cc02d7e2SAndroid Build Coastguard Worker   if (ret != 0) return ret;
124*cc02d7e2SAndroid Build Coastguard Worker   if (do_ipv6) {
125*cc02d7e2SAndroid Build Coastguard Worker     ret = test_client(root, "::1", port);
126*cc02d7e2SAndroid Build Coastguard Worker     if (ret != 0) return ret;
127*cc02d7e2SAndroid Build Coastguard Worker   }
128*cc02d7e2SAndroid Build Coastguard Worker   // wait for server
129*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_INFO, "Waiting for server");
130*cc02d7e2SAndroid Build Coastguard Worker   kill(svr, SIGINT);
131*cc02d7e2SAndroid Build Coastguard Worker   if (waitpid(svr, &status, 0) == -1) return 2;
132*cc02d7e2SAndroid Build Coastguard Worker   if (!WIFEXITED(status)) return 4;
133*cc02d7e2SAndroid Build Coastguard Worker   if (WEXITSTATUS(status)) return WEXITSTATUS(status);
134*cc02d7e2SAndroid Build Coastguard Worker   return 0;
135*cc02d7e2SAndroid Build Coastguard Worker }
136