Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

258 řádky
9.9 KiB

  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. package main
  19. import (
  20. "flag"
  21. "net"
  22. "strconv"
  23. "google.golang.org/grpc"
  24. _ "google.golang.org/grpc/balancer/grpclb"
  25. "google.golang.org/grpc/credentials"
  26. "google.golang.org/grpc/credentials/alts"
  27. "google.golang.org/grpc/credentials/google"
  28. "google.golang.org/grpc/credentials/oauth"
  29. "google.golang.org/grpc/grpclog"
  30. "google.golang.org/grpc/interop"
  31. testpb "google.golang.org/grpc/interop/grpc_testing"
  32. "google.golang.org/grpc/resolver"
  33. "google.golang.org/grpc/testdata"
  34. )
  35. const (
  36. googleDefaultCredsName = "google_default_credentials"
  37. )
  38. var (
  39. caFile = flag.String("ca_file", "", "The file containning the CA root cert file")
  40. useTLS = flag.Bool("use_tls", false, "Connection uses TLS if true")
  41. useALTS = flag.Bool("use_alts", false, "Connection uses ALTS if true (this option can only be used on GCP)")
  42. customCredentialsType = flag.String("custom_credentials_type", "", "Custom creds to use, excluding TLS or ALTS")
  43. altsHSAddr = flag.String("alts_handshaker_service_address", "", "ALTS handshaker gRPC service address")
  44. testCA = flag.Bool("use_test_ca", false, "Whether to replace platform root CAs with test CA as the CA root")
  45. serviceAccountKeyFile = flag.String("service_account_key_file", "", "Path to service account json key file")
  46. oauthScope = flag.String("oauth_scope", "", "The scope for OAuth2 tokens")
  47. defaultServiceAccount = flag.String("default_service_account", "", "Email of GCE default service account")
  48. serverHost = flag.String("server_host", "localhost", "The server host name")
  49. serverPort = flag.Int("server_port", 10000, "The server port number")
  50. tlsServerName = flag.String("server_host_override", "", "The server name use to verify the hostname returned by TLS handshake if it is not empty. Otherwise, --server_host is used.")
  51. testCase = flag.String("test_case", "large_unary",
  52. `Configure different test cases. Valid options are:
  53. empty_unary : empty (zero bytes) request and response;
  54. large_unary : single request and (large) response;
  55. client_streaming : request streaming with single response;
  56. server_streaming : single request with response streaming;
  57. ping_pong : full-duplex streaming;
  58. empty_stream : full-duplex streaming with zero message;
  59. timeout_on_sleeping_server: fullduplex streaming on a sleeping server;
  60. compute_engine_creds: large_unary with compute engine auth;
  61. service_account_creds: large_unary with service account auth;
  62. jwt_token_creds: large_unary with jwt token auth;
  63. per_rpc_creds: large_unary with per rpc token;
  64. oauth2_auth_token: large_unary with oauth2 token auth;
  65. google_default_credentials: large_unary with google default credentials
  66. cancel_after_begin: cancellation after metadata has been sent but before payloads are sent;
  67. cancel_after_first_response: cancellation after receiving 1st message from the server;
  68. status_code_and_message: status code propagated back to client;
  69. special_status_message: Unicode and whitespace is correctly processed in status message;
  70. custom_metadata: server will echo custom metadata;
  71. unimplemented_method: client attempts to call unimplemented method;
  72. unimplemented_service: client attempts to call unimplemented service.`)
  73. )
  74. type credsMode uint8
  75. const (
  76. credsNone credsMode = iota
  77. credsTLS
  78. credsALTS
  79. credsGoogleDefaultCreds
  80. )
  81. func main() {
  82. flag.Parse()
  83. var useGDC bool // use google default creds
  84. if *customCredentialsType != "" {
  85. if *customCredentialsType != googleDefaultCredsName {
  86. grpclog.Fatalf("custom_credentials_type can only be set to %v or not set", googleDefaultCredsName)
  87. }
  88. useGDC = true
  89. }
  90. if (*useTLS && *useALTS) || (*useTLS && useGDC) || (*useALTS && useGDC) {
  91. grpclog.Fatalf("only one of TLS, ALTS and google default creds can be used")
  92. }
  93. var credsChosen credsMode
  94. switch {
  95. case *useTLS:
  96. credsChosen = credsTLS
  97. case *useALTS:
  98. credsChosen = credsALTS
  99. case useGDC:
  100. credsChosen = credsGoogleDefaultCreds
  101. }
  102. resolver.SetDefaultScheme("dns")
  103. serverAddr := net.JoinHostPort(*serverHost, strconv.Itoa(*serverPort))
  104. var opts []grpc.DialOption
  105. switch credsChosen {
  106. case credsTLS:
  107. var sn string
  108. if *tlsServerName != "" {
  109. sn = *tlsServerName
  110. }
  111. var creds credentials.TransportCredentials
  112. if *testCA {
  113. var err error
  114. if *caFile == "" {
  115. *caFile = testdata.Path("ca.pem")
  116. }
  117. creds, err = credentials.NewClientTLSFromFile(*caFile, sn)
  118. if err != nil {
  119. grpclog.Fatalf("Failed to create TLS credentials %v", err)
  120. }
  121. } else {
  122. creds = credentials.NewClientTLSFromCert(nil, sn)
  123. }
  124. opts = append(opts, grpc.WithTransportCredentials(creds))
  125. case credsALTS:
  126. altsOpts := alts.DefaultClientOptions()
  127. if *altsHSAddr != "" {
  128. altsOpts.HandshakerServiceAddress = *altsHSAddr
  129. }
  130. altsTC := alts.NewClientCreds(altsOpts)
  131. opts = append(opts, grpc.WithTransportCredentials(altsTC))
  132. case credsGoogleDefaultCreds:
  133. opts = append(opts, grpc.WithCredentialsBundle(google.NewDefaultCredentials()))
  134. case credsNone:
  135. opts = append(opts, grpc.WithInsecure())
  136. default:
  137. grpclog.Fatal("Invalid creds")
  138. }
  139. if credsChosen == credsTLS {
  140. if *testCase == "compute_engine_creds" {
  141. opts = append(opts, grpc.WithPerRPCCredentials(oauth.NewComputeEngine()))
  142. } else if *testCase == "service_account_creds" {
  143. jwtCreds, err := oauth.NewServiceAccountFromFile(*serviceAccountKeyFile, *oauthScope)
  144. if err != nil {
  145. grpclog.Fatalf("Failed to create JWT credentials: %v", err)
  146. }
  147. opts = append(opts, grpc.WithPerRPCCredentials(jwtCreds))
  148. } else if *testCase == "jwt_token_creds" {
  149. jwtCreds, err := oauth.NewJWTAccessFromFile(*serviceAccountKeyFile)
  150. if err != nil {
  151. grpclog.Fatalf("Failed to create JWT credentials: %v", err)
  152. }
  153. opts = append(opts, grpc.WithPerRPCCredentials(jwtCreds))
  154. } else if *testCase == "oauth2_auth_token" {
  155. opts = append(opts, grpc.WithPerRPCCredentials(oauth.NewOauthAccess(interop.GetToken(*serviceAccountKeyFile, *oauthScope))))
  156. }
  157. }
  158. opts = append(opts, grpc.WithBlock())
  159. conn, err := grpc.Dial(serverAddr, opts...)
  160. if err != nil {
  161. grpclog.Fatalf("Fail to dial: %v", err)
  162. }
  163. defer conn.Close()
  164. tc := testpb.NewTestServiceClient(conn)
  165. switch *testCase {
  166. case "empty_unary":
  167. interop.DoEmptyUnaryCall(tc)
  168. grpclog.Infoln("EmptyUnaryCall done")
  169. case "large_unary":
  170. interop.DoLargeUnaryCall(tc)
  171. grpclog.Infoln("LargeUnaryCall done")
  172. case "client_streaming":
  173. interop.DoClientStreaming(tc)
  174. grpclog.Infoln("ClientStreaming done")
  175. case "server_streaming":
  176. interop.DoServerStreaming(tc)
  177. grpclog.Infoln("ServerStreaming done")
  178. case "ping_pong":
  179. interop.DoPingPong(tc)
  180. grpclog.Infoln("Pingpong done")
  181. case "empty_stream":
  182. interop.DoEmptyStream(tc)
  183. grpclog.Infoln("Emptystream done")
  184. case "timeout_on_sleeping_server":
  185. interop.DoTimeoutOnSleepingServer(tc)
  186. grpclog.Infoln("TimeoutOnSleepingServer done")
  187. case "compute_engine_creds":
  188. if credsChosen != credsTLS {
  189. grpclog.Fatalf("TLS credentials need to be set for compute_engine_creds test case.")
  190. }
  191. interop.DoComputeEngineCreds(tc, *defaultServiceAccount, *oauthScope)
  192. grpclog.Infoln("ComputeEngineCreds done")
  193. case "service_account_creds":
  194. if credsChosen != credsTLS {
  195. grpclog.Fatalf("TLS credentials need to be set for service_account_creds test case.")
  196. }
  197. interop.DoServiceAccountCreds(tc, *serviceAccountKeyFile, *oauthScope)
  198. grpclog.Infoln("ServiceAccountCreds done")
  199. case "jwt_token_creds":
  200. if credsChosen != credsTLS {
  201. grpclog.Fatalf("TLS credentials need to be set for jwt_token_creds test case.")
  202. }
  203. interop.DoJWTTokenCreds(tc, *serviceAccountKeyFile)
  204. grpclog.Infoln("JWTtokenCreds done")
  205. case "per_rpc_creds":
  206. if credsChosen != credsTLS {
  207. grpclog.Fatalf("TLS credentials need to be set for per_rpc_creds test case.")
  208. }
  209. interop.DoPerRPCCreds(tc, *serviceAccountKeyFile, *oauthScope)
  210. grpclog.Infoln("PerRPCCreds done")
  211. case "oauth2_auth_token":
  212. if credsChosen != credsTLS {
  213. grpclog.Fatalf("TLS credentials need to be set for oauth2_auth_token test case.")
  214. }
  215. interop.DoOauth2TokenCreds(tc, *serviceAccountKeyFile, *oauthScope)
  216. grpclog.Infoln("Oauth2TokenCreds done")
  217. case "google_default_credentials":
  218. if credsChosen != credsGoogleDefaultCreds {
  219. grpclog.Fatalf("GoogleDefaultCredentials need to be set for google_default_credentials test case.")
  220. }
  221. interop.DoGoogleDefaultCredentials(tc, *defaultServiceAccount)
  222. grpclog.Infoln("GoogleDefaultCredentials done")
  223. case "cancel_after_begin":
  224. interop.DoCancelAfterBegin(tc)
  225. grpclog.Infoln("CancelAfterBegin done")
  226. case "cancel_after_first_response":
  227. interop.DoCancelAfterFirstResponse(tc)
  228. grpclog.Infoln("CancelAfterFirstResponse done")
  229. case "status_code_and_message":
  230. interop.DoStatusCodeAndMessage(tc)
  231. grpclog.Infoln("StatusCodeAndMessage done")
  232. case "special_status_message":
  233. interop.DoSpecialStatusMessage(tc)
  234. grpclog.Infoln("SpecialStatusMessage done")
  235. case "custom_metadata":
  236. interop.DoCustomMetadata(tc)
  237. grpclog.Infoln("CustomMetadata done")
  238. case "unimplemented_method":
  239. interop.DoUnimplementedMethod(conn)
  240. grpclog.Infoln("UnimplementedMethod done")
  241. case "unimplemented_service":
  242. interop.DoUnimplementedService(testpb.NewUnimplementedServiceClient(conn))
  243. grpclog.Infoln("UnimplementedService done")
  244. default:
  245. grpclog.Fatal("Unsupported test case: ", *testCase)
  246. }
  247. }