gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/grpc/interop/client/client.go (about) 1 /* 2 * 3 * Copyright 2014 gRPC authors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 // Binary client is an interop client. 20 package main 21 22 import ( 23 "flag" 24 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/insecure" 25 "io/ioutil" 26 "net" 27 "strconv" 28 "time" 29 30 "gitee.com/zhaochuninhefei/gmgo/x509" 31 32 tls "gitee.com/zhaochuninhefei/gmgo/gmtls" 33 34 "gitee.com/zhaochuninhefei/gmgo/grpc" 35 _ "gitee.com/zhaochuninhefei/gmgo/grpc/balancer/grpclb" 36 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials" 37 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/alts" 38 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/google" 39 "gitee.com/zhaochuninhefei/gmgo/grpc/credentials/oauth" 40 "gitee.com/zhaochuninhefei/gmgo/grpc/grpclog" 41 "gitee.com/zhaochuninhefei/gmgo/grpc/interop" 42 "gitee.com/zhaochuninhefei/gmgo/grpc/resolver" 43 "gitee.com/zhaochuninhefei/gmgo/grpc/testdata" 44 _ "gitee.com/zhaochuninhefei/gmgo/grpc/xds/googledirectpath" 45 46 testgrpc "gitee.com/zhaochuninhefei/gmgo/grpc/interop/grpc_testing" 47 ) 48 49 const ( 50 googleDefaultCredsName = "google_default_credentials" 51 computeEngineCredsName = "compute_engine_channel_creds" 52 ) 53 54 var ( 55 caFile = flag.String("ca_file", "", "The file containning the CA root cert file") 56 useTLS = flag.Bool("use_tls", false, "Connection uses TLS if true") 57 useALTS = flag.Bool("use_alts", false, "Connection uses ALTS if true (this option can only be used on GCP)") 58 customCredentialsType = flag.String("custom_credentials_type", "", "Custom creds to use, excluding TLS or ALTS") 59 altsHSAddr = flag.String("alts_handshaker_service_address", "", "ALTS handshaker gRPC service address") 60 testCA = flag.Bool("use_test_ca", false, "Whether to replace platform root CAs with test CA as the CA root") 61 serviceAccountKeyFile = flag.String("service_account_key_file", "", "Path to service account json key file") 62 oauthScope = flag.String("oauth_scope", "", "The scope for OAuth2 tokens") 63 defaultServiceAccount = flag.String("default_service_account", "", "Email of GCE default service account") 64 serverHost = flag.String("server_host", "localhost", "The server host name") 65 serverPort = flag.Int("server_port", 10000, "The server port number") 66 serviceConfigJSON = flag.String("service_config_json", "", "Disables service config lookups and sets the provided string as the default service config.") 67 soakIterations = flag.Int("soak_iterations", 10, "The number of iterations to use for the two soak tests: rpc_soak and channel_soak") 68 soakMaxFailures = flag.Int("soak_max_failures", 0, "The number of iterations in soak tests that are allowed to fail (either due to non-OK status code or exceeding the per-iteration max acceptable latency).") 69 soakPerIterationMaxAcceptableLatencyMs = flag.Int("soak_per_iteration_max_acceptable_latency_ms", 1000, "The number of milliseconds a single iteration in the two soak tests (rpc_soak and channel_soak) should take.") 70 soakOverallTimeoutSeconds = flag.Int("soak_overall_timeout_seconds", 10, "The overall number of seconds after which a soak test should stop and fail, if the desired number of iterations have not yet completed.") 71 tlsServerName = flag.String("server_host_override", "", "The server name used to verify the hostname returned by TLS handshake if it is not empty. Otherwise, --server_host is used.") 72 testCase = flag.String("test_case", "large_unary", 73 `Configure different test cases. Valid options are: 74 empty_unary : empty (zero bytes) request and response; 75 large_unary : single request and (large) response; 76 client_streaming : request streaming with single response; 77 server_streaming : single request with response streaming; 78 ping_pong : full-duplex streaming; 79 empty_stream : full-duplex streaming with zero message; 80 timeout_on_sleeping_server: fullduplex streaming on a sleeping server; 81 compute_engine_creds: large_unary with compute engine auth; 82 service_account_creds: large_unary with service account auth; 83 jwt_token_creds: large_unary with jwt token auth; 84 per_rpc_creds: large_unary with per rpc token; 85 oauth2_auth_token: large_unary with oauth2 token auth; 86 google_default_credentials: large_unary with google default credentials 87 compute_engine_channel_credentials: large_unary with compute engine creds 88 cancel_after_begin: cancellation after metadata has been sent but before payloads are sent; 89 cancel_after_first_response: cancellation after receiving 1st message from the server; 90 status_code_and_message: status code propagated back to client; 91 special_status_message: Unicode and whitespace is correctly processed in status message; 92 custom_metadata: server will echo custom metadata; 93 unimplemented_method: client attempts to call unimplemented method; 94 unimplemented_service: client attempts to call unimplemented service; 95 pick_first_unary: all requests are sent to one server despite multiple servers are resolved.`) 96 97 logger = grpclog.Component("interop") 98 ) 99 100 type credsMode uint8 101 102 const ( 103 credsNone credsMode = iota 104 credsTLS 105 credsALTS 106 credsGoogleDefaultCreds 107 credsComputeEngineCreds 108 ) 109 110 func main() { 111 flag.Parse() 112 var useGDC bool // use google default creds 113 var useCEC bool // use compute engine creds 114 if *customCredentialsType != "" { 115 switch *customCredentialsType { 116 case googleDefaultCredsName: 117 useGDC = true 118 case computeEngineCredsName: 119 useCEC = true 120 default: 121 logger.Fatalf("If set, custom_credentials_type can only be set to one of %v or %v", 122 googleDefaultCredsName, computeEngineCredsName) 123 } 124 } 125 if (*useTLS && *useALTS) || (*useTLS && useGDC) || (*useALTS && useGDC) || (*useTLS && useCEC) || (*useALTS && useCEC) { 126 logger.Fatalf("only one of TLS, ALTS, google default creds, or compute engine creds can be used") 127 } 128 129 var credsChosen credsMode 130 switch { 131 case *useTLS: 132 credsChosen = credsTLS 133 case *useALTS: 134 credsChosen = credsALTS 135 case useGDC: 136 credsChosen = credsGoogleDefaultCreds 137 case useCEC: 138 credsChosen = credsComputeEngineCreds 139 } 140 141 resolver.SetDefaultScheme("dns") 142 serverAddr := *serverHost 143 if *serverPort != 0 { 144 serverAddr = net.JoinHostPort(*serverHost, strconv.Itoa(*serverPort)) 145 } 146 var opts []grpc.DialOption 147 switch credsChosen { 148 case credsTLS: 149 var roots *x509.CertPool 150 if *testCA { 151 if *caFile == "" { 152 *caFile = testdata.Path("ca.pem") 153 } 154 b, err := ioutil.ReadFile(*caFile) 155 if err != nil { 156 logger.Fatalf("Failed to read root certificate file %q: %v", *caFile, err) 157 } 158 roots = x509.NewCertPool() 159 if !roots.AppendCertsFromPEM(b) { 160 logger.Fatalf("Failed to append certificates: %s", string(b)) 161 } 162 } 163 var creds credentials.TransportCredentials 164 if *tlsServerName != "" { 165 creds = credentials.NewClientTLSFromCert(roots, *tlsServerName) 166 } else { 167 creds = credentials.NewTLS(&tls.Config{RootCAs: roots}) 168 } 169 opts = append(opts, grpc.WithTransportCredentials(creds)) 170 case credsALTS: 171 altsOpts := alts.DefaultClientOptions() 172 if *altsHSAddr != "" { 173 altsOpts.HandshakerServiceAddress = *altsHSAddr 174 } 175 altsTC := alts.NewClientCreds(altsOpts) 176 opts = append(opts, grpc.WithTransportCredentials(altsTC)) 177 case credsGoogleDefaultCreds: 178 opts = append(opts, grpc.WithCredentialsBundle(google.NewDefaultCredentials())) 179 case credsComputeEngineCreds: 180 opts = append(opts, grpc.WithCredentialsBundle(google.NewComputeEngineCredentials())) 181 case credsNone: 182 // grpc.WithInsecure() is deprecated, use WithTransportCredentials and insecure.NewCredentials() instead. 183 //opts = append(opts, grpc.WithInsecure()) 184 opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) 185 default: 186 logger.Fatal("Invalid creds") 187 } 188 if credsChosen == credsTLS { 189 if *testCase == "compute_engine_creds" { 190 opts = append(opts, grpc.WithPerRPCCredentials(oauth.NewComputeEngine())) 191 } else if *testCase == "service_account_creds" { 192 jwtCreds, err := oauth.NewServiceAccountFromFile(*serviceAccountKeyFile, *oauthScope) 193 if err != nil { 194 logger.Fatalf("Failed to create JWT credentials: %v", err) 195 } 196 opts = append(opts, grpc.WithPerRPCCredentials(jwtCreds)) 197 } else if *testCase == "jwt_token_creds" { 198 jwtCreds, err := oauth.NewJWTAccessFromFile(*serviceAccountKeyFile) 199 if err != nil { 200 logger.Fatalf("Failed to create JWT credentials: %v", err) 201 } 202 opts = append(opts, grpc.WithPerRPCCredentials(jwtCreds)) 203 } else if *testCase == "oauth2_auth_token" { 204 opts = append(opts, grpc.WithPerRPCCredentials(oauth.NewOauthAccess(interop.GetToken(*serviceAccountKeyFile, *oauthScope)))) 205 } 206 } 207 if len(*serviceConfigJSON) > 0 { 208 opts = append(opts, grpc.WithDisableServiceConfig(), grpc.WithDefaultServiceConfig(*serviceConfigJSON)) 209 } 210 conn, err := grpc.Dial(serverAddr, opts...) 211 if err != nil { 212 logger.Fatalf("Fail to dial: %v", err) 213 } 214 defer func(conn *grpc.ClientConn) { 215 _ = conn.Close() 216 }(conn) 217 tc := testgrpc.NewTestServiceClient(conn) 218 switch *testCase { 219 case "empty_unary": 220 interop.DoEmptyUnaryCall(tc) 221 logger.Infoln("EmptyUnaryCall done") 222 case "large_unary": 223 interop.DoLargeUnaryCall(tc) 224 logger.Infoln("LargeUnaryCall done") 225 case "client_streaming": 226 interop.DoClientStreaming(tc) 227 logger.Infoln("ClientStreaming done") 228 case "server_streaming": 229 interop.DoServerStreaming(tc) 230 logger.Infoln("ServerStreaming done") 231 case "ping_pong": 232 interop.DoPingPong(tc) 233 logger.Infoln("Pingpong done") 234 case "empty_stream": 235 interop.DoEmptyStream(tc) 236 logger.Infoln("Emptystream done") 237 case "timeout_on_sleeping_server": 238 interop.DoTimeoutOnSleepingServer(tc) 239 logger.Infoln("TimeoutOnSleepingServer done") 240 case "compute_engine_creds": 241 if credsChosen != credsTLS { 242 logger.Fatalf("TLS credentials need to be set for compute_engine_creds test case.") 243 } 244 interop.DoComputeEngineCreds(tc, *defaultServiceAccount, *oauthScope) 245 logger.Infoln("ComputeEngineCreds done") 246 case "service_account_creds": 247 if credsChosen != credsTLS { 248 logger.Fatalf("TLS credentials need to be set for service_account_creds test case.") 249 } 250 interop.DoServiceAccountCreds(tc, *serviceAccountKeyFile, *oauthScope) 251 logger.Infoln("ServiceAccountCreds done") 252 case "jwt_token_creds": 253 if credsChosen != credsTLS { 254 logger.Fatalf("TLS credentials need to be set for jwt_token_creds test case.") 255 } 256 interop.DoJWTTokenCreds(tc, *serviceAccountKeyFile) 257 logger.Infoln("JWTtokenCreds done") 258 case "per_rpc_creds": 259 if credsChosen != credsTLS { 260 logger.Fatalf("TLS credentials need to be set for per_rpc_creds test case.") 261 } 262 interop.DoPerRPCCreds(tc, *serviceAccountKeyFile, *oauthScope) 263 logger.Infoln("PerRPCCreds done") 264 case "oauth2_auth_token": 265 if credsChosen != credsTLS { 266 logger.Fatalf("TLS credentials need to be set for oauth2_auth_token test case.") 267 } 268 interop.DoOauth2TokenCreds(tc, *serviceAccountKeyFile, *oauthScope) 269 logger.Infoln("Oauth2TokenCreds done") 270 case "google_default_credentials": 271 if credsChosen != credsGoogleDefaultCreds { 272 logger.Fatalf("GoogleDefaultCredentials need to be set for google_default_credentials test case.") 273 } 274 interop.DoGoogleDefaultCredentials(tc, *defaultServiceAccount) 275 logger.Infoln("GoogleDefaultCredentials done") 276 case "compute_engine_channel_credentials": 277 if credsChosen != credsComputeEngineCreds { 278 logger.Fatalf("ComputeEngineCreds need to be set for compute_engine_channel_credentials test case.") 279 } 280 interop.DoComputeEngineChannelCredentials(tc, *defaultServiceAccount) 281 logger.Infoln("ComputeEngineChannelCredentials done") 282 case "cancel_after_begin": 283 interop.DoCancelAfterBegin(tc) 284 logger.Infoln("CancelAfterBegin done") 285 case "cancel_after_first_response": 286 interop.DoCancelAfterFirstResponse(tc) 287 logger.Infoln("CancelAfterFirstResponse done") 288 case "status_code_and_message": 289 interop.DoStatusCodeAndMessage(tc) 290 logger.Infoln("StatusCodeAndMessage done") 291 case "special_status_message": 292 interop.DoSpecialStatusMessage(tc) 293 logger.Infoln("SpecialStatusMessage done") 294 case "custom_metadata": 295 interop.DoCustomMetadata(tc) 296 logger.Infoln("CustomMetadata done") 297 case "unimplemented_method": 298 interop.DoUnimplementedMethod(conn) 299 logger.Infoln("UnimplementedMethod done") 300 case "unimplemented_service": 301 interop.DoUnimplementedService(testgrpc.NewUnimplementedServiceClient(conn)) 302 logger.Infoln("UnimplementedService done") 303 case "pick_first_unary": 304 interop.DoPickFirstUnary(tc) 305 logger.Infoln("PickFirstUnary done") 306 case "rpc_soak": 307 interop.DoSoakTest(tc, serverAddr, opts, false /* resetChannel */, *soakIterations, *soakMaxFailures, time.Duration(*soakPerIterationMaxAcceptableLatencyMs)*time.Millisecond, time.Now().Add(time.Duration(*soakOverallTimeoutSeconds)*time.Second)) 308 logger.Infoln("RpcSoak done") 309 case "channel_soak": 310 interop.DoSoakTest(tc, serverAddr, opts, true /* resetChannel */, *soakIterations, *soakMaxFailures, time.Duration(*soakPerIterationMaxAcceptableLatencyMs)*time.Millisecond, time.Now().Add(time.Duration(*soakOverallTimeoutSeconds)*time.Second)) 311 logger.Infoln("ChannelSoak done") 312 default: 313 logger.Fatal("Unsupported test case: ", *testCase) 314 } 315 }