xref: /aosp_15_r20/external/grpc-grpc/test/cpp/interop/client_helper.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 "test/cpp/interop/client_helper.h"
20*cc02d7e2SAndroid Build Coastguard Worker 
21*cc02d7e2SAndroid Build Coastguard Worker #include <fstream>
22*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
23*cc02d7e2SAndroid Build Coastguard Worker #include <sstream>
24*cc02d7e2SAndroid Build Coastguard Worker 
25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/declare.h"
26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
27*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/escaping.h"
28*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/match.h"
29*cc02d7e2SAndroid Build Coastguard Worker 
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/grpc.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/alloc.h>
32*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h>
33*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h>
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/create_channel.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/credentials.h>
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/security/oauth2_utils.h"
38*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/create_test_channel.h"
39*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_credentials_provider.h"
40*cc02d7e2SAndroid Build Coastguard Worker 
41*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, custom_credentials_type);
42*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, default_service_account);
43*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, oauth_scope);
44*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, service_account_key_file);
45*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, server_host);
46*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, server_host_override);
47*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int32_t, server_port);
48*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, test_case);
49*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(bool, use_alts);
50*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(bool, use_test_ca);
51*cc02d7e2SAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(bool, use_tls);
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
54*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
55*cc02d7e2SAndroid Build Coastguard Worker 
GetServiceAccountJsonKey()56*cc02d7e2SAndroid Build Coastguard Worker std::string GetServiceAccountJsonKey() {
57*cc02d7e2SAndroid Build Coastguard Worker   static std::string json_key;
58*cc02d7e2SAndroid Build Coastguard Worker   if (json_key.empty()) {
59*cc02d7e2SAndroid Build Coastguard Worker     std::ifstream json_key_file(absl::GetFlag(FLAGS_service_account_key_file));
60*cc02d7e2SAndroid Build Coastguard Worker     std::stringstream key_stream;
61*cc02d7e2SAndroid Build Coastguard Worker     key_stream << json_key_file.rdbuf();
62*cc02d7e2SAndroid Build Coastguard Worker     json_key = key_stream.str();
63*cc02d7e2SAndroid Build Coastguard Worker   }
64*cc02d7e2SAndroid Build Coastguard Worker   return json_key;
65*cc02d7e2SAndroid Build Coastguard Worker }
66*cc02d7e2SAndroid Build Coastguard Worker 
GetOauth2AccessToken()67*cc02d7e2SAndroid Build Coastguard Worker std::string GetOauth2AccessToken() {
68*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<CallCredentials> creds = GoogleComputeEngineCredentials();
69*cc02d7e2SAndroid Build Coastguard Worker   char* token = grpc_test_fetch_oauth2_token_with_credentials(creds->c_creds_);
70*cc02d7e2SAndroid Build Coastguard Worker   GPR_ASSERT(token != nullptr);
71*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_INFO, "Get raw oauth2 access token: %s", token);
72*cc02d7e2SAndroid Build Coastguard Worker   std::string access_token(token + sizeof("Bearer ") - 1);
73*cc02d7e2SAndroid Build Coastguard Worker   gpr_free(token);
74*cc02d7e2SAndroid Build Coastguard Worker   return access_token;
75*cc02d7e2SAndroid Build Coastguard Worker }
76*cc02d7e2SAndroid Build Coastguard Worker 
UpdateActions(std::unordered_map<std::string,std::function<bool ()>> *)77*cc02d7e2SAndroid Build Coastguard Worker void UpdateActions(
78*cc02d7e2SAndroid Build Coastguard Worker     std::unordered_map<std::string, std::function<bool()>>* /*actions*/) {}
79*cc02d7e2SAndroid Build Coastguard Worker 
CreateChannelForTestCase(const std::string & test_case,std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>> interceptor_creators,ChannelArguments channel_args)80*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<Channel> CreateChannelForTestCase(
81*cc02d7e2SAndroid Build Coastguard Worker     const std::string& test_case,
82*cc02d7e2SAndroid Build Coastguard Worker     std::vector<
83*cc02d7e2SAndroid Build Coastguard Worker         std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
84*cc02d7e2SAndroid Build Coastguard Worker         interceptor_creators,
85*cc02d7e2SAndroid Build Coastguard Worker     ChannelArguments channel_args) {
86*cc02d7e2SAndroid Build Coastguard Worker   std::string server_uri = absl::GetFlag(FLAGS_server_host);
87*cc02d7e2SAndroid Build Coastguard Worker   int32_t port = absl::GetFlag(FLAGS_server_port);
88*cc02d7e2SAndroid Build Coastguard Worker   if (port != 0) {
89*cc02d7e2SAndroid Build Coastguard Worker     absl::StrAppend(&server_uri, ":", std::to_string(port));
90*cc02d7e2SAndroid Build Coastguard Worker   }
91*cc02d7e2SAndroid Build Coastguard Worker   std::shared_ptr<CallCredentials> creds;
92*cc02d7e2SAndroid Build Coastguard Worker   if (test_case == "compute_engine_creds") {
93*cc02d7e2SAndroid Build Coastguard Worker     creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
94*cc02d7e2SAndroid Build Coastguard Worker                     "google_default_credentials"
95*cc02d7e2SAndroid Build Coastguard Worker                 ? nullptr
96*cc02d7e2SAndroid Build Coastguard Worker                 : GoogleComputeEngineCredentials();
97*cc02d7e2SAndroid Build Coastguard Worker   } else if (test_case == "jwt_token_creds") {
98*cc02d7e2SAndroid Build Coastguard Worker     std::string json_key = GetServiceAccountJsonKey();
99*cc02d7e2SAndroid Build Coastguard Worker     std::chrono::seconds token_lifetime = std::chrono::hours(1);
100*cc02d7e2SAndroid Build Coastguard Worker     creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
101*cc02d7e2SAndroid Build Coastguard Worker                     "google_default_credentials"
102*cc02d7e2SAndroid Build Coastguard Worker                 ? nullptr
103*cc02d7e2SAndroid Build Coastguard Worker                 : ServiceAccountJWTAccessCredentials(json_key,
104*cc02d7e2SAndroid Build Coastguard Worker                                                      token_lifetime.count());
105*cc02d7e2SAndroid Build Coastguard Worker   } else if (test_case == "oauth2_auth_token") {
106*cc02d7e2SAndroid Build Coastguard Worker     creds = absl::GetFlag(FLAGS_custom_credentials_type) ==
107*cc02d7e2SAndroid Build Coastguard Worker                     "google_default_credentials"
108*cc02d7e2SAndroid Build Coastguard Worker                 ? nullptr
109*cc02d7e2SAndroid Build Coastguard Worker                 : AccessTokenCredentials(GetOauth2AccessToken());
110*cc02d7e2SAndroid Build Coastguard Worker   } else if (test_case == "pick_first_unary") {
111*cc02d7e2SAndroid Build Coastguard Worker     // allow the LB policy to be configured with service config
112*cc02d7e2SAndroid Build Coastguard Worker     channel_args.SetInt(GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION, 0);
113*cc02d7e2SAndroid Build Coastguard Worker     return CreateTestChannel(
114*cc02d7e2SAndroid Build Coastguard Worker         server_uri, absl::GetFlag(FLAGS_custom_credentials_type),
115*cc02d7e2SAndroid Build Coastguard Worker         absl::GetFlag(FLAGS_server_host_override),
116*cc02d7e2SAndroid Build Coastguard Worker         !absl::GetFlag(FLAGS_use_test_ca), creds, channel_args);
117*cc02d7e2SAndroid Build Coastguard Worker   }
118*cc02d7e2SAndroid Build Coastguard Worker   if (absl::GetFlag(FLAGS_custom_credentials_type).empty()) {
119*cc02d7e2SAndroid Build Coastguard Worker     transport_security security_type =
120*cc02d7e2SAndroid Build Coastguard Worker         absl::GetFlag(FLAGS_use_alts)
121*cc02d7e2SAndroid Build Coastguard Worker             ? ALTS
122*cc02d7e2SAndroid Build Coastguard Worker             : (absl::GetFlag(FLAGS_use_tls) ? TLS : INSECURE);
123*cc02d7e2SAndroid Build Coastguard Worker     return CreateTestChannel(
124*cc02d7e2SAndroid Build Coastguard Worker         server_uri, absl::GetFlag(FLAGS_server_host_override), security_type,
125*cc02d7e2SAndroid Build Coastguard Worker         !absl::GetFlag(FLAGS_use_test_ca), creds, channel_args,
126*cc02d7e2SAndroid Build Coastguard Worker         std::move(interceptor_creators));
127*cc02d7e2SAndroid Build Coastguard Worker   } else {
128*cc02d7e2SAndroid Build Coastguard Worker     if (interceptor_creators.empty()) {
129*cc02d7e2SAndroid Build Coastguard Worker       return CreateTestChannel(server_uri,
130*cc02d7e2SAndroid Build Coastguard Worker                                absl::GetFlag(FLAGS_custom_credentials_type), "",
131*cc02d7e2SAndroid Build Coastguard Worker                                false, creds, channel_args);
132*cc02d7e2SAndroid Build Coastguard Worker     } else {
133*cc02d7e2SAndroid Build Coastguard Worker       return CreateTestChannel(
134*cc02d7e2SAndroid Build Coastguard Worker           server_uri, absl::GetFlag(FLAGS_custom_credentials_type), creds,
135*cc02d7e2SAndroid Build Coastguard Worker           std::move(interceptor_creators), channel_args);
136*cc02d7e2SAndroid Build Coastguard Worker     }
137*cc02d7e2SAndroid Build Coastguard Worker   }
138*cc02d7e2SAndroid Build Coastguard Worker }
139*cc02d7e2SAndroid Build Coastguard Worker 
log_metadata_entry(const std::string & prefix,const grpc::string_ref & key,const grpc::string_ref & value)140*cc02d7e2SAndroid Build Coastguard Worker static void log_metadata_entry(const std::string& prefix,
141*cc02d7e2SAndroid Build Coastguard Worker                                const grpc::string_ref& key,
142*cc02d7e2SAndroid Build Coastguard Worker                                const grpc::string_ref& value) {
143*cc02d7e2SAndroid Build Coastguard Worker   std::string key_str(key.begin(), key.end());
144*cc02d7e2SAndroid Build Coastguard Worker   std::string value_str(value.begin(), value.end());
145*cc02d7e2SAndroid Build Coastguard Worker   if (absl::EndsWith(key_str, "-bin")) {
146*cc02d7e2SAndroid Build Coastguard Worker     value_str = absl::Base64Escape(value_str);
147*cc02d7e2SAndroid Build Coastguard Worker   }
148*cc02d7e2SAndroid Build Coastguard Worker   gpr_log(GPR_ERROR, "%s %s: %s", prefix.c_str(), key_str.c_str(),
149*cc02d7e2SAndroid Build Coastguard Worker           value_str.c_str());
150*cc02d7e2SAndroid Build Coastguard Worker }
151*cc02d7e2SAndroid Build Coastguard Worker 
Intercept(experimental::InterceptorBatchMethods * methods)152*cc02d7e2SAndroid Build Coastguard Worker void MetadataAndStatusLoggerInterceptor::Intercept(
153*cc02d7e2SAndroid Build Coastguard Worker     experimental::InterceptorBatchMethods* methods) {
154*cc02d7e2SAndroid Build Coastguard Worker   if (methods->QueryInterceptionHookPoint(
155*cc02d7e2SAndroid Build Coastguard Worker           experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA)) {
156*cc02d7e2SAndroid Build Coastguard Worker     auto initial_metadata = methods->GetRecvInitialMetadata();
157*cc02d7e2SAndroid Build Coastguard Worker 
158*cc02d7e2SAndroid Build Coastguard Worker     for (const auto& entry : *initial_metadata) {
159*cc02d7e2SAndroid Build Coastguard Worker       log_metadata_entry("GRPC_INITIAL_METADATA", entry.first, entry.second);
160*cc02d7e2SAndroid Build Coastguard Worker     }
161*cc02d7e2SAndroid Build Coastguard Worker   }
162*cc02d7e2SAndroid Build Coastguard Worker 
163*cc02d7e2SAndroid Build Coastguard Worker   if (methods->QueryInterceptionHookPoint(
164*cc02d7e2SAndroid Build Coastguard Worker           experimental::InterceptionHookPoints::POST_RECV_STATUS)) {
165*cc02d7e2SAndroid Build Coastguard Worker     auto trailing_metadata = methods->GetRecvTrailingMetadata();
166*cc02d7e2SAndroid Build Coastguard Worker     for (const auto& entry : *trailing_metadata) {
167*cc02d7e2SAndroid Build Coastguard Worker       log_metadata_entry("GRPC_TRAILING_METADATA", entry.first, entry.second);
168*cc02d7e2SAndroid Build Coastguard Worker     }
169*cc02d7e2SAndroid Build Coastguard Worker 
170*cc02d7e2SAndroid Build Coastguard Worker     auto status = methods->GetRecvStatus();
171*cc02d7e2SAndroid Build Coastguard Worker     gpr_log(GPR_ERROR, "GRPC_STATUS %d", status->error_code());
172*cc02d7e2SAndroid Build Coastguard Worker     gpr_log(GPR_ERROR, "GRPC_ERROR_MESSAGE %s",
173*cc02d7e2SAndroid Build Coastguard Worker             status->error_message().c_str());
174*cc02d7e2SAndroid Build Coastguard Worker   }
175*cc02d7e2SAndroid Build Coastguard Worker 
176*cc02d7e2SAndroid Build Coastguard Worker   methods->Proceed();
177*cc02d7e2SAndroid Build Coastguard Worker }
178*cc02d7e2SAndroid Build Coastguard Worker 
179*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
180*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
181