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 <mutex>
20*cc02d7e2SAndroid Build Coastguard Worker #include <thread>
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Worker #include "absl/memory/memory.h"
23*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/ascii.h"
24*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/match.h"
25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/strings/str_format.h"
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/grpc.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/alloc.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/time.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h>
32*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/client_context.h>
33*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/create_channel.h>
34*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/resource_quota.h>
35*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/auth_metadata_processor.h>
36*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/credentials.h>
37*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/server_credentials.h>
38*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server.h>
39*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_builder.h>
40*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_context.h>
41*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/string_ref.h>
42*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/test/channel_test_peer.h>
43*cc02d7e2SAndroid Build Coastguard Worker
44*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/client_channel/backup_poller.h"
45*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/config/config_vars.h"
46*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/crash.h"
47*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/env.h"
48*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/iomgr/iomgr.h"
49*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/security/credentials/credentials.h"
50*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
51*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/echo.grpc.pb.h"
52*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/port.h"
53*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/test_config.h"
54*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/end2end/interceptors_util.h"
55*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/end2end/test_service_impl.h"
56*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/string_ref_helper.h"
57*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_credentials_provider.h"
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker #ifdef GRPC_POSIX_SOCKET_EV
60*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/iomgr/ev_posix.h"
61*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPC_POSIX_SOCKET_EV
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Worker #include <gtest/gtest.h>
64*cc02d7e2SAndroid Build Coastguard Worker
65*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::system_clock;
66*cc02d7e2SAndroid Build Coastguard Worker
67*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
68*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
69*cc02d7e2SAndroid Build Coastguard Worker namespace {
70*cc02d7e2SAndroid Build Coastguard Worker
CheckIsLocalhost(const std::string & addr)71*cc02d7e2SAndroid Build Coastguard Worker bool CheckIsLocalhost(const std::string& addr) {
72*cc02d7e2SAndroid Build Coastguard Worker const std::string kIpv6("ipv6:%5B::1%5D:");
73*cc02d7e2SAndroid Build Coastguard Worker const std::string kIpv4MappedIpv6("ipv6:%5B::ffff:127.0.0.1%5D:");
74*cc02d7e2SAndroid Build Coastguard Worker const std::string kIpv4("ipv4:127.0.0.1:");
75*cc02d7e2SAndroid Build Coastguard Worker return addr.substr(0, kIpv4.size()) == kIpv4 ||
76*cc02d7e2SAndroid Build Coastguard Worker addr.substr(0, kIpv4MappedIpv6.size()) == kIpv4MappedIpv6 ||
77*cc02d7e2SAndroid Build Coastguard Worker addr.substr(0, kIpv6.size()) == kIpv6;
78*cc02d7e2SAndroid Build Coastguard Worker }
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard Worker const int kClientChannelBackupPollIntervalMs = 200;
81*cc02d7e2SAndroid Build Coastguard Worker
82*cc02d7e2SAndroid Build Coastguard Worker const char kTestCredsPluginErrorMsg[] = "Could not find plugin metadata.";
83*cc02d7e2SAndroid Build Coastguard Worker
84*cc02d7e2SAndroid Build Coastguard Worker const char kFakeToken[] = "fake_token";
85*cc02d7e2SAndroid Build Coastguard Worker const char kFakeSelector[] = "fake_selector";
86*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedFakeCredsDebugString[] =
87*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{GoogleIAMCredentials{Token:present,"
88*cc02d7e2SAndroid Build Coastguard Worker "AuthoritySelector:fake_selector}}";
89*cc02d7e2SAndroid Build Coastguard Worker
90*cc02d7e2SAndroid Build Coastguard Worker const char kWrongToken[] = "wrong_token";
91*cc02d7e2SAndroid Build Coastguard Worker const char kWrongSelector[] = "wrong_selector";
92*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedWrongCredsDebugString[] =
93*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{GoogleIAMCredentials{Token:present,"
94*cc02d7e2SAndroid Build Coastguard Worker "AuthoritySelector:wrong_selector}}";
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker const char kFakeToken1[] = "fake_token1";
97*cc02d7e2SAndroid Build Coastguard Worker const char kFakeSelector1[] = "fake_selector1";
98*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedFakeCreds1DebugString[] =
99*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{GoogleIAMCredentials{Token:present,"
100*cc02d7e2SAndroid Build Coastguard Worker "AuthoritySelector:fake_selector1}}";
101*cc02d7e2SAndroid Build Coastguard Worker
102*cc02d7e2SAndroid Build Coastguard Worker const char kFakeToken2[] = "fake_token2";
103*cc02d7e2SAndroid Build Coastguard Worker const char kFakeSelector2[] = "fake_selector2";
104*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedFakeCreds2DebugString[] =
105*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{GoogleIAMCredentials{Token:present,"
106*cc02d7e2SAndroid Build Coastguard Worker "AuthoritySelector:fake_selector2}}";
107*cc02d7e2SAndroid Build Coastguard Worker
108*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedAuthMetadataPluginKeyFailureCredsDebugString[] =
109*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{TestMetadataCredentials{key:TestPluginMetadata,"
110*cc02d7e2SAndroid Build Coastguard Worker "value:Does not matter, will fail the key is invalid.}}";
111*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedAuthMetadataPluginValueFailureCredsDebugString[] =
112*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{TestMetadataCredentials{key:test-plugin-metadata,"
113*cc02d7e2SAndroid Build Coastguard Worker "value:With illegal \n value.}}";
114*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedAuthMetadataPluginWithDeadlineCredsDebugString[] =
115*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{TestMetadataCredentials{key:meta_key,value:Does "
116*cc02d7e2SAndroid Build Coastguard Worker "not "
117*cc02d7e2SAndroid Build Coastguard Worker "matter}}";
118*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedNonBlockingAuthMetadataPluginFailureCredsDebugString[] =
119*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{TestMetadataCredentials{key:test-plugin-metadata,"
120*cc02d7e2SAndroid Build Coastguard Worker "value:Does not matter, will fail anyway (see 3rd param)}}";
121*cc02d7e2SAndroid Build Coastguard Worker const char
122*cc02d7e2SAndroid Build Coastguard Worker kExpectedNonBlockingAuthMetadataPluginAndProcessorSuccessCredsDebugString
123*cc02d7e2SAndroid Build Coastguard Worker [] = "CallCredentials{TestMetadataCredentials{key:test-plugin-"
124*cc02d7e2SAndroid Build Coastguard Worker "metadata,value:Dr Jekyll}}";
125*cc02d7e2SAndroid Build Coastguard Worker const char
126*cc02d7e2SAndroid Build Coastguard Worker kExpectedNonBlockingAuthMetadataPluginAndProcessorFailureCredsDebugString
127*cc02d7e2SAndroid Build Coastguard Worker [] = "CallCredentials{TestMetadataCredentials{key:test-plugin-"
128*cc02d7e2SAndroid Build Coastguard Worker "metadata,value:Mr Hyde}}";
129*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedBlockingAuthMetadataPluginFailureCredsDebugString[] =
130*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{TestMetadataCredentials{key:test-plugin-metadata,"
131*cc02d7e2SAndroid Build Coastguard Worker "value:Does not matter, will fail anyway (see 3rd param)}}";
132*cc02d7e2SAndroid Build Coastguard Worker const char kExpectedCompositeCallCredsDebugString[] =
133*cc02d7e2SAndroid Build Coastguard Worker "CallCredentials{CompositeCallCredentials{TestMetadataCredentials{"
134*cc02d7e2SAndroid Build Coastguard Worker "key:call-creds-key1,value:call-creds-val1},TestMetadataCredentials{key:"
135*cc02d7e2SAndroid Build Coastguard Worker "call-creds-key2,value:call-creds-val2}}}";
136*cc02d7e2SAndroid Build Coastguard Worker
137*cc02d7e2SAndroid Build Coastguard Worker class TestMetadataCredentialsPlugin : public MetadataCredentialsPlugin {
138*cc02d7e2SAndroid Build Coastguard Worker public:
139*cc02d7e2SAndroid Build Coastguard Worker static const char kGoodMetadataKey[];
140*cc02d7e2SAndroid Build Coastguard Worker static const char kBadMetadataKey[];
141*cc02d7e2SAndroid Build Coastguard Worker
TestMetadataCredentialsPlugin(const grpc::string_ref & metadata_key,const grpc::string_ref & metadata_value,bool is_blocking,bool is_successful,int delay_ms)142*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin(const grpc::string_ref& metadata_key,
143*cc02d7e2SAndroid Build Coastguard Worker const grpc::string_ref& metadata_value,
144*cc02d7e2SAndroid Build Coastguard Worker bool is_blocking, bool is_successful,
145*cc02d7e2SAndroid Build Coastguard Worker int delay_ms)
146*cc02d7e2SAndroid Build Coastguard Worker : metadata_key_(metadata_key.data(), metadata_key.length()),
147*cc02d7e2SAndroid Build Coastguard Worker metadata_value_(metadata_value.data(), metadata_value.length()),
148*cc02d7e2SAndroid Build Coastguard Worker is_blocking_(is_blocking),
149*cc02d7e2SAndroid Build Coastguard Worker is_successful_(is_successful),
150*cc02d7e2SAndroid Build Coastguard Worker delay_ms_(delay_ms) {}
151*cc02d7e2SAndroid Build Coastguard Worker
IsBlocking() const152*cc02d7e2SAndroid Build Coastguard Worker bool IsBlocking() const override { return is_blocking_; }
153*cc02d7e2SAndroid Build Coastguard Worker
GetMetadata(grpc::string_ref service_url,grpc::string_ref method_name,const grpc::AuthContext & channel_auth_context,std::multimap<std::string,std::string> * metadata)154*cc02d7e2SAndroid Build Coastguard Worker Status GetMetadata(
155*cc02d7e2SAndroid Build Coastguard Worker grpc::string_ref service_url, grpc::string_ref method_name,
156*cc02d7e2SAndroid Build Coastguard Worker const grpc::AuthContext& channel_auth_context,
157*cc02d7e2SAndroid Build Coastguard Worker std::multimap<std::string, std::string>* metadata) override {
158*cc02d7e2SAndroid Build Coastguard Worker if (delay_ms_ != 0) {
159*cc02d7e2SAndroid Build Coastguard Worker gpr_sleep_until(
160*cc02d7e2SAndroid Build Coastguard Worker gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
161*cc02d7e2SAndroid Build Coastguard Worker gpr_time_from_millis(delay_ms_, GPR_TIMESPAN)));
162*cc02d7e2SAndroid Build Coastguard Worker }
163*cc02d7e2SAndroid Build Coastguard Worker EXPECT_GT(service_url.length(), 0UL);
164*cc02d7e2SAndroid Build Coastguard Worker EXPECT_GT(method_name.length(), 0UL);
165*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(channel_auth_context.IsPeerAuthenticated());
166*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(metadata != nullptr);
167*cc02d7e2SAndroid Build Coastguard Worker if (is_successful_) {
168*cc02d7e2SAndroid Build Coastguard Worker metadata->insert(std::make_pair(metadata_key_, metadata_value_));
169*cc02d7e2SAndroid Build Coastguard Worker return Status::OK;
170*cc02d7e2SAndroid Build Coastguard Worker } else {
171*cc02d7e2SAndroid Build Coastguard Worker return Status(StatusCode::NOT_FOUND, kTestCredsPluginErrorMsg);
172*cc02d7e2SAndroid Build Coastguard Worker }
173*cc02d7e2SAndroid Build Coastguard Worker }
174*cc02d7e2SAndroid Build Coastguard Worker
DebugString()175*cc02d7e2SAndroid Build Coastguard Worker std::string DebugString() override {
176*cc02d7e2SAndroid Build Coastguard Worker return absl::StrFormat("TestMetadataCredentials{key:%s,value:%s}",
177*cc02d7e2SAndroid Build Coastguard Worker metadata_key_.c_str(), metadata_value_.c_str());
178*cc02d7e2SAndroid Build Coastguard Worker }
179*cc02d7e2SAndroid Build Coastguard Worker
180*cc02d7e2SAndroid Build Coastguard Worker private:
181*cc02d7e2SAndroid Build Coastguard Worker std::string metadata_key_;
182*cc02d7e2SAndroid Build Coastguard Worker std::string metadata_value_;
183*cc02d7e2SAndroid Build Coastguard Worker bool is_blocking_;
184*cc02d7e2SAndroid Build Coastguard Worker bool is_successful_;
185*cc02d7e2SAndroid Build Coastguard Worker int delay_ms_;
186*cc02d7e2SAndroid Build Coastguard Worker };
187*cc02d7e2SAndroid Build Coastguard Worker
188*cc02d7e2SAndroid Build Coastguard Worker const char TestMetadataCredentialsPlugin::kBadMetadataKey[] =
189*cc02d7e2SAndroid Build Coastguard Worker "TestPluginMetadata";
190*cc02d7e2SAndroid Build Coastguard Worker const char TestMetadataCredentialsPlugin::kGoodMetadataKey[] =
191*cc02d7e2SAndroid Build Coastguard Worker "test-plugin-metadata";
192*cc02d7e2SAndroid Build Coastguard Worker
193*cc02d7e2SAndroid Build Coastguard Worker class TestAuthMetadataProcessor : public AuthMetadataProcessor {
194*cc02d7e2SAndroid Build Coastguard Worker public:
195*cc02d7e2SAndroid Build Coastguard Worker static const char kGoodGuy[];
196*cc02d7e2SAndroid Build Coastguard Worker
TestAuthMetadataProcessor(bool is_blocking)197*cc02d7e2SAndroid Build Coastguard Worker explicit TestAuthMetadataProcessor(bool is_blocking)
198*cc02d7e2SAndroid Build Coastguard Worker : is_blocking_(is_blocking) {}
199*cc02d7e2SAndroid Build Coastguard Worker
GetCompatibleClientCreds()200*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> GetCompatibleClientCreds() {
201*cc02d7e2SAndroid Build Coastguard Worker return grpc::MetadataCredentialsFromPlugin(
202*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
203*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
204*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kGoodMetadataKey, kGoodGuy,
205*cc02d7e2SAndroid Build Coastguard Worker is_blocking_, true, 0)));
206*cc02d7e2SAndroid Build Coastguard Worker }
207*cc02d7e2SAndroid Build Coastguard Worker
GetIncompatibleClientCreds()208*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> GetIncompatibleClientCreds() {
209*cc02d7e2SAndroid Build Coastguard Worker return grpc::MetadataCredentialsFromPlugin(
210*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
211*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
212*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kGoodMetadataKey, "Mr Hyde",
213*cc02d7e2SAndroid Build Coastguard Worker is_blocking_, true, 0)));
214*cc02d7e2SAndroid Build Coastguard Worker }
215*cc02d7e2SAndroid Build Coastguard Worker
216*cc02d7e2SAndroid Build Coastguard Worker // Interface implementation
IsBlocking() const217*cc02d7e2SAndroid Build Coastguard Worker bool IsBlocking() const override { return is_blocking_; }
218*cc02d7e2SAndroid Build Coastguard Worker
Process(const InputMetadata & auth_metadata,AuthContext * context,OutputMetadata * consumed_auth_metadata,OutputMetadata * response_metadata)219*cc02d7e2SAndroid Build Coastguard Worker Status Process(const InputMetadata& auth_metadata, AuthContext* context,
220*cc02d7e2SAndroid Build Coastguard Worker OutputMetadata* consumed_auth_metadata,
221*cc02d7e2SAndroid Build Coastguard Worker OutputMetadata* response_metadata) override {
222*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(consumed_auth_metadata != nullptr);
223*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(context != nullptr);
224*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(response_metadata != nullptr);
225*cc02d7e2SAndroid Build Coastguard Worker auto auth_md =
226*cc02d7e2SAndroid Build Coastguard Worker auth_metadata.find(TestMetadataCredentialsPlugin::kGoodMetadataKey);
227*cc02d7e2SAndroid Build Coastguard Worker EXPECT_NE(auth_md, auth_metadata.end());
228*cc02d7e2SAndroid Build Coastguard Worker string_ref auth_md_value = auth_md->second;
229*cc02d7e2SAndroid Build Coastguard Worker if (auth_md_value == kGoodGuy) {
230*cc02d7e2SAndroid Build Coastguard Worker context->AddProperty(kIdentityPropName, kGoodGuy);
231*cc02d7e2SAndroid Build Coastguard Worker context->SetPeerIdentityPropertyName(kIdentityPropName);
232*cc02d7e2SAndroid Build Coastguard Worker consumed_auth_metadata->insert(std::make_pair(
233*cc02d7e2SAndroid Build Coastguard Worker string(auth_md->first.data(), auth_md->first.length()),
234*cc02d7e2SAndroid Build Coastguard Worker string(auth_md->second.data(), auth_md->second.length())));
235*cc02d7e2SAndroid Build Coastguard Worker return Status::OK;
236*cc02d7e2SAndroid Build Coastguard Worker } else {
237*cc02d7e2SAndroid Build Coastguard Worker return Status(StatusCode::UNAUTHENTICATED,
238*cc02d7e2SAndroid Build Coastguard Worker string("Invalid principal: ") +
239*cc02d7e2SAndroid Build Coastguard Worker string(auth_md_value.data(), auth_md_value.length()));
240*cc02d7e2SAndroid Build Coastguard Worker }
241*cc02d7e2SAndroid Build Coastguard Worker }
242*cc02d7e2SAndroid Build Coastguard Worker
243*cc02d7e2SAndroid Build Coastguard Worker private:
244*cc02d7e2SAndroid Build Coastguard Worker static const char kIdentityPropName[];
245*cc02d7e2SAndroid Build Coastguard Worker bool is_blocking_;
246*cc02d7e2SAndroid Build Coastguard Worker };
247*cc02d7e2SAndroid Build Coastguard Worker
248*cc02d7e2SAndroid Build Coastguard Worker const char TestAuthMetadataProcessor::kGoodGuy[] = "Dr Jekyll";
249*cc02d7e2SAndroid Build Coastguard Worker const char TestAuthMetadataProcessor::kIdentityPropName[] = "novel identity";
250*cc02d7e2SAndroid Build Coastguard Worker
251*cc02d7e2SAndroid Build Coastguard Worker class Proxy : public grpc::testing::EchoTestService::Service {
252*cc02d7e2SAndroid Build Coastguard Worker public:
Proxy(const std::shared_ptr<Channel> & channel)253*cc02d7e2SAndroid Build Coastguard Worker explicit Proxy(const std::shared_ptr<Channel>& channel)
254*cc02d7e2SAndroid Build Coastguard Worker : stub_(grpc::testing::EchoTestService::NewStub(channel)) {}
255*cc02d7e2SAndroid Build Coastguard Worker
Echo(ServerContext * server_context,const EchoRequest * request,EchoResponse * response)256*cc02d7e2SAndroid Build Coastguard Worker Status Echo(ServerContext* server_context, const EchoRequest* request,
257*cc02d7e2SAndroid Build Coastguard Worker EchoResponse* response) override {
258*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<ClientContext> client_context =
259*cc02d7e2SAndroid Build Coastguard Worker ClientContext::FromServerContext(*server_context);
260*cc02d7e2SAndroid Build Coastguard Worker return stub_->Echo(client_context.get(), *request, response);
261*cc02d7e2SAndroid Build Coastguard Worker }
262*cc02d7e2SAndroid Build Coastguard Worker
263*cc02d7e2SAndroid Build Coastguard Worker private:
264*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
265*cc02d7e2SAndroid Build Coastguard Worker };
266*cc02d7e2SAndroid Build Coastguard Worker
267*cc02d7e2SAndroid Build Coastguard Worker class TestServiceImplDupPkg
268*cc02d7e2SAndroid Build Coastguard Worker : public grpc::testing::duplicate::EchoTestService::Service {
269*cc02d7e2SAndroid Build Coastguard Worker public:
Echo(ServerContext *,const EchoRequest *,EchoResponse * response)270*cc02d7e2SAndroid Build Coastguard Worker Status Echo(ServerContext* /*context*/, const EchoRequest* /*request*/,
271*cc02d7e2SAndroid Build Coastguard Worker EchoResponse* response) override {
272*cc02d7e2SAndroid Build Coastguard Worker response->set_message("no package");
273*cc02d7e2SAndroid Build Coastguard Worker return Status::OK;
274*cc02d7e2SAndroid Build Coastguard Worker }
275*cc02d7e2SAndroid Build Coastguard Worker };
276*cc02d7e2SAndroid Build Coastguard Worker
277*cc02d7e2SAndroid Build Coastguard Worker class TestScenario {
278*cc02d7e2SAndroid Build Coastguard Worker public:
TestScenario(bool use_interceptors,bool use_proxy,bool inproc,const std::string & credentials_type,bool callback_server)279*cc02d7e2SAndroid Build Coastguard Worker TestScenario(bool use_interceptors, bool use_proxy, bool inproc,
280*cc02d7e2SAndroid Build Coastguard Worker const std::string& credentials_type, bool callback_server)
281*cc02d7e2SAndroid Build Coastguard Worker : use_interceptors_(use_interceptors),
282*cc02d7e2SAndroid Build Coastguard Worker use_proxy_(use_proxy),
283*cc02d7e2SAndroid Build Coastguard Worker inproc_(inproc),
284*cc02d7e2SAndroid Build Coastguard Worker credentials_type_(credentials_type),
285*cc02d7e2SAndroid Build Coastguard Worker callback_server_(callback_server) {}
286*cc02d7e2SAndroid Build Coastguard Worker
use_interceptors() const287*cc02d7e2SAndroid Build Coastguard Worker bool use_interceptors() const { return use_interceptors_; }
use_proxy() const288*cc02d7e2SAndroid Build Coastguard Worker bool use_proxy() const { return use_proxy_; }
inproc() const289*cc02d7e2SAndroid Build Coastguard Worker bool inproc() const { return inproc_; }
credentials_type() const290*cc02d7e2SAndroid Build Coastguard Worker const std::string& credentials_type() const { return credentials_type_; }
callback_server() const291*cc02d7e2SAndroid Build Coastguard Worker bool callback_server() const { return callback_server_; }
292*cc02d7e2SAndroid Build Coastguard Worker
293*cc02d7e2SAndroid Build Coastguard Worker std::string AsString() const;
294*cc02d7e2SAndroid Build Coastguard Worker
Name(const::testing::TestParamInfo<TestScenario> & info)295*cc02d7e2SAndroid Build Coastguard Worker static std::string Name(const ::testing::TestParamInfo<TestScenario>& info) {
296*cc02d7e2SAndroid Build Coastguard Worker return info.param.AsString();
297*cc02d7e2SAndroid Build Coastguard Worker }
298*cc02d7e2SAndroid Build Coastguard Worker
299*cc02d7e2SAndroid Build Coastguard Worker private:
300*cc02d7e2SAndroid Build Coastguard Worker bool use_interceptors_;
301*cc02d7e2SAndroid Build Coastguard Worker bool use_proxy_;
302*cc02d7e2SAndroid Build Coastguard Worker bool inproc_;
303*cc02d7e2SAndroid Build Coastguard Worker const std::string credentials_type_;
304*cc02d7e2SAndroid Build Coastguard Worker bool callback_server_;
305*cc02d7e2SAndroid Build Coastguard Worker };
306*cc02d7e2SAndroid Build Coastguard Worker
AsString() const307*cc02d7e2SAndroid Build Coastguard Worker std::string TestScenario::AsString() const {
308*cc02d7e2SAndroid Build Coastguard Worker std::string retval = use_interceptors_ ? "Interceptor" : "";
309*cc02d7e2SAndroid Build Coastguard Worker if (use_proxy_) retval += "Proxy";
310*cc02d7e2SAndroid Build Coastguard Worker if (inproc_) retval += "Inproc";
311*cc02d7e2SAndroid Build Coastguard Worker if (callback_server_) retval += "CallbackServer";
312*cc02d7e2SAndroid Build Coastguard Worker if (credentials_type_ == kInsecureCredentialsType) {
313*cc02d7e2SAndroid Build Coastguard Worker retval += "Insecure";
314*cc02d7e2SAndroid Build Coastguard Worker } else {
315*cc02d7e2SAndroid Build Coastguard Worker std::string creds_type = absl::AsciiStrToLower(credentials_type_);
316*cc02d7e2SAndroid Build Coastguard Worker if (!creds_type.empty()) creds_type[0] = absl::ascii_toupper(creds_type[0]);
317*cc02d7e2SAndroid Build Coastguard Worker retval += creds_type;
318*cc02d7e2SAndroid Build Coastguard Worker }
319*cc02d7e2SAndroid Build Coastguard Worker return retval;
320*cc02d7e2SAndroid Build Coastguard Worker }
321*cc02d7e2SAndroid Build Coastguard Worker
322*cc02d7e2SAndroid Build Coastguard Worker class End2endTest : public ::testing::TestWithParam<TestScenario> {
323*cc02d7e2SAndroid Build Coastguard Worker protected:
SetUpTestSuite()324*cc02d7e2SAndroid Build Coastguard Worker static void SetUpTestSuite() { grpc_init(); }
TearDownTestSuite()325*cc02d7e2SAndroid Build Coastguard Worker static void TearDownTestSuite() { grpc_shutdown(); }
End2endTest()326*cc02d7e2SAndroid Build Coastguard Worker End2endTest()
327*cc02d7e2SAndroid Build Coastguard Worker : is_server_started_(false),
328*cc02d7e2SAndroid Build Coastguard Worker kMaxMessageSize_(8192),
329*cc02d7e2SAndroid Build Coastguard Worker special_service_("special"),
330*cc02d7e2SAndroid Build Coastguard Worker first_picked_port_(0) {}
331*cc02d7e2SAndroid Build Coastguard Worker
TearDown()332*cc02d7e2SAndroid Build Coastguard Worker void TearDown() override {
333*cc02d7e2SAndroid Build Coastguard Worker if (is_server_started_) {
334*cc02d7e2SAndroid Build Coastguard Worker server_->Shutdown();
335*cc02d7e2SAndroid Build Coastguard Worker if (proxy_server_) proxy_server_->Shutdown();
336*cc02d7e2SAndroid Build Coastguard Worker }
337*cc02d7e2SAndroid Build Coastguard Worker if (first_picked_port_ > 0) {
338*cc02d7e2SAndroid Build Coastguard Worker grpc_recycle_unused_port(first_picked_port_);
339*cc02d7e2SAndroid Build Coastguard Worker }
340*cc02d7e2SAndroid Build Coastguard Worker }
341*cc02d7e2SAndroid Build Coastguard Worker
StartServer(const std::shared_ptr<AuthMetadataProcessor> & processor)342*cc02d7e2SAndroid Build Coastguard Worker void StartServer(const std::shared_ptr<AuthMetadataProcessor>& processor) {
343*cc02d7e2SAndroid Build Coastguard Worker int port = grpc_pick_unused_port_or_die();
344*cc02d7e2SAndroid Build Coastguard Worker first_picked_port_ = port;
345*cc02d7e2SAndroid Build Coastguard Worker server_address_ << "localhost:" << port;
346*cc02d7e2SAndroid Build Coastguard Worker // Setup server
347*cc02d7e2SAndroid Build Coastguard Worker BuildAndStartServer(processor);
348*cc02d7e2SAndroid Build Coastguard Worker }
349*cc02d7e2SAndroid Build Coastguard Worker
RestartServer(const std::shared_ptr<AuthMetadataProcessor> & processor)350*cc02d7e2SAndroid Build Coastguard Worker void RestartServer(const std::shared_ptr<AuthMetadataProcessor>& processor) {
351*cc02d7e2SAndroid Build Coastguard Worker if (is_server_started_) {
352*cc02d7e2SAndroid Build Coastguard Worker server_->Shutdown();
353*cc02d7e2SAndroid Build Coastguard Worker BuildAndStartServer(processor);
354*cc02d7e2SAndroid Build Coastguard Worker }
355*cc02d7e2SAndroid Build Coastguard Worker }
356*cc02d7e2SAndroid Build Coastguard Worker
BuildAndStartServer(const std::shared_ptr<AuthMetadataProcessor> & processor)357*cc02d7e2SAndroid Build Coastguard Worker void BuildAndStartServer(
358*cc02d7e2SAndroid Build Coastguard Worker const std::shared_ptr<AuthMetadataProcessor>& processor) {
359*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder builder;
360*cc02d7e2SAndroid Build Coastguard Worker ConfigureServerBuilder(&builder);
361*cc02d7e2SAndroid Build Coastguard Worker auto server_creds = GetCredentialsProvider()->GetServerCredentials(
362*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type());
363*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().credentials_type() != kInsecureCredentialsType) {
364*cc02d7e2SAndroid Build Coastguard Worker server_creds->SetAuthMetadataProcessor(processor);
365*cc02d7e2SAndroid Build Coastguard Worker }
366*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
367*cc02d7e2SAndroid Build Coastguard Worker std::vector<
368*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
369*cc02d7e2SAndroid Build Coastguard Worker creators;
370*cc02d7e2SAndroid Build Coastguard Worker // Add 20 phony server interceptors
371*cc02d7e2SAndroid Build Coastguard Worker creators.reserve(20);
372*cc02d7e2SAndroid Build Coastguard Worker for (auto i = 0; i < 20; i++) {
373*cc02d7e2SAndroid Build Coastguard Worker creators.push_back(std::make_unique<PhonyInterceptorFactory>());
374*cc02d7e2SAndroid Build Coastguard Worker }
375*cc02d7e2SAndroid Build Coastguard Worker builder.experimental().SetInterceptorCreators(std::move(creators));
376*cc02d7e2SAndroid Build Coastguard Worker }
377*cc02d7e2SAndroid Build Coastguard Worker builder.AddListeningPort(server_address_.str(), server_creds);
378*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().callback_server()) {
379*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService(&service_);
380*cc02d7e2SAndroid Build Coastguard Worker } else {
381*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService(&callback_service_);
382*cc02d7e2SAndroid Build Coastguard Worker }
383*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService("foo.test.youtube.com", &special_service_);
384*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService(&dup_pkg_service_);
385*cc02d7e2SAndroid Build Coastguard Worker
386*cc02d7e2SAndroid Build Coastguard Worker builder.SetSyncServerOption(ServerBuilder::SyncServerOption::NUM_CQS, 4);
387*cc02d7e2SAndroid Build Coastguard Worker builder.SetSyncServerOption(
388*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder::SyncServerOption::CQ_TIMEOUT_MSEC, 10);
389*cc02d7e2SAndroid Build Coastguard Worker
390*cc02d7e2SAndroid Build Coastguard Worker server_ = builder.BuildAndStart();
391*cc02d7e2SAndroid Build Coastguard Worker is_server_started_ = true;
392*cc02d7e2SAndroid Build Coastguard Worker }
393*cc02d7e2SAndroid Build Coastguard Worker
ConfigureServerBuilder(ServerBuilder * builder)394*cc02d7e2SAndroid Build Coastguard Worker virtual void ConfigureServerBuilder(ServerBuilder* builder) {
395*cc02d7e2SAndroid Build Coastguard Worker builder->SetMaxMessageSize(
396*cc02d7e2SAndroid Build Coastguard Worker kMaxMessageSize_); // For testing max message size.
397*cc02d7e2SAndroid Build Coastguard Worker }
398*cc02d7e2SAndroid Build Coastguard Worker
ResetChannel(std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>> interceptor_creators={})399*cc02d7e2SAndroid Build Coastguard Worker void ResetChannel(
400*cc02d7e2SAndroid Build Coastguard Worker std::vector<
401*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
402*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators = {}) {
403*cc02d7e2SAndroid Build Coastguard Worker if (!is_server_started_) {
404*cc02d7e2SAndroid Build Coastguard Worker StartServer(std::shared_ptr<AuthMetadataProcessor>());
405*cc02d7e2SAndroid Build Coastguard Worker }
406*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(is_server_started_);
407*cc02d7e2SAndroid Build Coastguard Worker ChannelArguments args;
408*cc02d7e2SAndroid Build Coastguard Worker auto channel_creds = GetCredentialsProvider()->GetChannelCredentials(
409*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type(), &args);
410*cc02d7e2SAndroid Build Coastguard Worker if (!user_agent_prefix_.empty()) {
411*cc02d7e2SAndroid Build Coastguard Worker args.SetUserAgentPrefix(user_agent_prefix_);
412*cc02d7e2SAndroid Build Coastguard Worker }
413*cc02d7e2SAndroid Build Coastguard Worker args.SetString(GRPC_ARG_SECONDARY_USER_AGENT_STRING, "end2end_test");
414*cc02d7e2SAndroid Build Coastguard Worker
415*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().inproc()) {
416*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().use_interceptors()) {
417*cc02d7e2SAndroid Build Coastguard Worker channel_ = grpc::CreateCustomChannel(server_address_.str(),
418*cc02d7e2SAndroid Build Coastguard Worker channel_creds, args);
419*cc02d7e2SAndroid Build Coastguard Worker } else {
420*cc02d7e2SAndroid Build Coastguard Worker channel_ = CreateCustomChannelWithInterceptors(
421*cc02d7e2SAndroid Build Coastguard Worker server_address_.str(), channel_creds, args,
422*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators.empty() ? CreatePhonyClientInterceptors()
423*cc02d7e2SAndroid Build Coastguard Worker : std::move(interceptor_creators));
424*cc02d7e2SAndroid Build Coastguard Worker }
425*cc02d7e2SAndroid Build Coastguard Worker } else {
426*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().use_interceptors()) {
427*cc02d7e2SAndroid Build Coastguard Worker channel_ = server_->InProcessChannel(args);
428*cc02d7e2SAndroid Build Coastguard Worker } else {
429*cc02d7e2SAndroid Build Coastguard Worker channel_ = server_->experimental().InProcessChannelWithInterceptors(
430*cc02d7e2SAndroid Build Coastguard Worker args, interceptor_creators.empty()
431*cc02d7e2SAndroid Build Coastguard Worker ? CreatePhonyClientInterceptors()
432*cc02d7e2SAndroid Build Coastguard Worker : std::move(interceptor_creators));
433*cc02d7e2SAndroid Build Coastguard Worker }
434*cc02d7e2SAndroid Build Coastguard Worker }
435*cc02d7e2SAndroid Build Coastguard Worker }
436*cc02d7e2SAndroid Build Coastguard Worker
ResetStub(std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>> interceptor_creators={})437*cc02d7e2SAndroid Build Coastguard Worker void ResetStub(
438*cc02d7e2SAndroid Build Coastguard Worker std::vector<
439*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
440*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators = {}) {
441*cc02d7e2SAndroid Build Coastguard Worker ResetChannel(std::move(interceptor_creators));
442*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_proxy()) {
443*cc02d7e2SAndroid Build Coastguard Worker proxy_service_ = std::make_unique<Proxy>(channel_);
444*cc02d7e2SAndroid Build Coastguard Worker int port = grpc_pick_unused_port_or_die();
445*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream proxyaddr;
446*cc02d7e2SAndroid Build Coastguard Worker proxyaddr << "localhost:" << port;
447*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder builder;
448*cc02d7e2SAndroid Build Coastguard Worker builder.AddListeningPort(proxyaddr.str(), InsecureServerCredentials());
449*cc02d7e2SAndroid Build Coastguard Worker builder.RegisterService(proxy_service_.get());
450*cc02d7e2SAndroid Build Coastguard Worker
451*cc02d7e2SAndroid Build Coastguard Worker builder.SetSyncServerOption(ServerBuilder::SyncServerOption::NUM_CQS, 4);
452*cc02d7e2SAndroid Build Coastguard Worker builder.SetSyncServerOption(
453*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder::SyncServerOption::CQ_TIMEOUT_MSEC, 10);
454*cc02d7e2SAndroid Build Coastguard Worker
455*cc02d7e2SAndroid Build Coastguard Worker proxy_server_ = builder.BuildAndStart();
456*cc02d7e2SAndroid Build Coastguard Worker
457*cc02d7e2SAndroid Build Coastguard Worker channel_ =
458*cc02d7e2SAndroid Build Coastguard Worker grpc::CreateChannel(proxyaddr.str(), InsecureChannelCredentials());
459*cc02d7e2SAndroid Build Coastguard Worker }
460*cc02d7e2SAndroid Build Coastguard Worker
461*cc02d7e2SAndroid Build Coastguard Worker stub_ = grpc::testing::EchoTestService::NewStub(channel_);
462*cc02d7e2SAndroid Build Coastguard Worker PhonyInterceptor::Reset();
463*cc02d7e2SAndroid Build Coastguard Worker }
464*cc02d7e2SAndroid Build Coastguard Worker
465*cc02d7e2SAndroid Build Coastguard Worker bool is_server_started_;
466*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<Channel> channel_;
467*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
468*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> server_;
469*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> proxy_server_;
470*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Proxy> proxy_service_;
471*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream server_address_;
472*cc02d7e2SAndroid Build Coastguard Worker const int kMaxMessageSize_;
473*cc02d7e2SAndroid Build Coastguard Worker TestServiceImpl service_;
474*cc02d7e2SAndroid Build Coastguard Worker CallbackTestServiceImpl callback_service_;
475*cc02d7e2SAndroid Build Coastguard Worker TestServiceImpl special_service_;
476*cc02d7e2SAndroid Build Coastguard Worker TestServiceImplDupPkg dup_pkg_service_;
477*cc02d7e2SAndroid Build Coastguard Worker std::string user_agent_prefix_;
478*cc02d7e2SAndroid Build Coastguard Worker int first_picked_port_;
479*cc02d7e2SAndroid Build Coastguard Worker };
480*cc02d7e2SAndroid Build Coastguard Worker
SendRpc(grpc::testing::EchoTestService::Stub * stub,int num_rpcs,bool with_binary_metadata)481*cc02d7e2SAndroid Build Coastguard Worker void SendRpc(grpc::testing::EchoTestService::Stub* stub, int num_rpcs,
482*cc02d7e2SAndroid Build Coastguard Worker bool with_binary_metadata) {
483*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
484*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
485*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello hello hello hello");
486*cc02d7e2SAndroid Build Coastguard Worker
487*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < num_rpcs; ++i) {
488*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
489*cc02d7e2SAndroid Build Coastguard Worker if (with_binary_metadata) {
490*cc02d7e2SAndroid Build Coastguard Worker char bytes[8] = {'\0', '\1', '\2', '\3',
491*cc02d7e2SAndroid Build Coastguard Worker '\4', '\5', '\6', static_cast<char>(i)};
492*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata("custom-bin", std::string(bytes, 8));
493*cc02d7e2SAndroid Build Coastguard Worker }
494*cc02d7e2SAndroid Build Coastguard Worker context.set_compression_algorithm(GRPC_COMPRESS_GZIP);
495*cc02d7e2SAndroid Build Coastguard Worker Status s = stub->Echo(&context, request, &response);
496*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
497*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
498*cc02d7e2SAndroid Build Coastguard Worker }
499*cc02d7e2SAndroid Build Coastguard Worker }
500*cc02d7e2SAndroid Build Coastguard Worker
501*cc02d7e2SAndroid Build Coastguard Worker // This class is for testing scenarios where RPCs are cancelled on the server
502*cc02d7e2SAndroid Build Coastguard Worker // by calling ServerContext::TryCancel()
503*cc02d7e2SAndroid Build Coastguard Worker class End2endServerTryCancelTest : public End2endTest {
504*cc02d7e2SAndroid Build Coastguard Worker protected:
505*cc02d7e2SAndroid Build Coastguard Worker // Helper for testing client-streaming RPCs which are cancelled on the server.
506*cc02d7e2SAndroid Build Coastguard Worker // Depending on the value of server_try_cancel parameter, this will test one
507*cc02d7e2SAndroid Build Coastguard Worker // of the following three scenarios:
508*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
509*cc02d7e2SAndroid Build Coastguard Worker // any messages from the client
510*cc02d7e2SAndroid Build Coastguard Worker //
511*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
512*cc02d7e2SAndroid Build Coastguard Worker // messages from the client
513*cc02d7e2SAndroid Build Coastguard Worker //
514*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
515*cc02d7e2SAndroid Build Coastguard Worker // the messages from the client
516*cc02d7e2SAndroid Build Coastguard Worker //
517*cc02d7e2SAndroid Build Coastguard Worker // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
TestRequestStreamServerCancel(ServerTryCancelRequestPhase server_try_cancel,int num_msgs_to_send)518*cc02d7e2SAndroid Build Coastguard Worker void TestRequestStreamServerCancel(
519*cc02d7e2SAndroid Build Coastguard Worker ServerTryCancelRequestPhase server_try_cancel, int num_msgs_to_send) {
520*cc02d7e2SAndroid Build Coastguard Worker RestartServer(std::shared_ptr<AuthMetadataProcessor>());
521*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
522*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
523*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
524*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
525*cc02d7e2SAndroid Build Coastguard Worker
526*cc02d7e2SAndroid Build Coastguard Worker // Send server_try_cancel value in the client metadata
527*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerTryCancelRequest,
528*cc02d7e2SAndroid Build Coastguard Worker std::to_string(server_try_cancel));
529*cc02d7e2SAndroid Build Coastguard Worker
530*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
531*cc02d7e2SAndroid Build Coastguard Worker
532*cc02d7e2SAndroid Build Coastguard Worker int num_msgs_sent = 0;
533*cc02d7e2SAndroid Build Coastguard Worker while (num_msgs_sent < num_msgs_to_send) {
534*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
535*cc02d7e2SAndroid Build Coastguard Worker if (!stream->Write(request)) {
536*cc02d7e2SAndroid Build Coastguard Worker break;
537*cc02d7e2SAndroid Build Coastguard Worker }
538*cc02d7e2SAndroid Build Coastguard Worker num_msgs_sent++;
539*cc02d7e2SAndroid Build Coastguard Worker }
540*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Sent %d messages", num_msgs_sent);
541*cc02d7e2SAndroid Build Coastguard Worker
542*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
543*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
544*cc02d7e2SAndroid Build Coastguard Worker
545*cc02d7e2SAndroid Build Coastguard Worker // At this point, we know for sure that RPC was cancelled by the server
546*cc02d7e2SAndroid Build Coastguard Worker // since we passed server_try_cancel value in the metadata. Depending on the
547*cc02d7e2SAndroid Build Coastguard Worker // value of server_try_cancel, the RPC might have been cancelled by the
548*cc02d7e2SAndroid Build Coastguard Worker // server at different stages. The following validates our expectations of
549*cc02d7e2SAndroid Build Coastguard Worker // number of messages sent in various cancellation scenarios:
550*cc02d7e2SAndroid Build Coastguard Worker
551*cc02d7e2SAndroid Build Coastguard Worker switch (server_try_cancel) {
552*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_BEFORE_PROCESSING:
553*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_DURING_PROCESSING:
554*cc02d7e2SAndroid Build Coastguard Worker // If the RPC is cancelled by server before / during messages from the
555*cc02d7e2SAndroid Build Coastguard Worker // client, it means that the client most likely did not get a chance to
556*cc02d7e2SAndroid Build Coastguard Worker // send all the messages it wanted to send. i.e num_msgs_sent <=
557*cc02d7e2SAndroid Build Coastguard Worker // num_msgs_to_send
558*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_sent, num_msgs_to_send);
559*cc02d7e2SAndroid Build Coastguard Worker break;
560*cc02d7e2SAndroid Build Coastguard Worker
561*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_AFTER_PROCESSING:
562*cc02d7e2SAndroid Build Coastguard Worker // If the RPC was cancelled after all messages were read by the server,
563*cc02d7e2SAndroid Build Coastguard Worker // the client did get a chance to send all its messages
564*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(num_msgs_sent, num_msgs_to_send);
565*cc02d7e2SAndroid Build Coastguard Worker break;
566*cc02d7e2SAndroid Build Coastguard Worker
567*cc02d7e2SAndroid Build Coastguard Worker default:
568*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Invalid server_try_cancel value: %d",
569*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel);
570*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(server_try_cancel > DO_NOT_CANCEL &&
571*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel <= CANCEL_AFTER_PROCESSING);
572*cc02d7e2SAndroid Build Coastguard Worker break;
573*cc02d7e2SAndroid Build Coastguard Worker }
574*cc02d7e2SAndroid Build Coastguard Worker
575*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
576*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
577*cc02d7e2SAndroid Build Coastguard Worker // Make sure that the server interceptors were notified
578*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
579*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
580*cc02d7e2SAndroid Build Coastguard Worker }
581*cc02d7e2SAndroid Build Coastguard Worker }
582*cc02d7e2SAndroid Build Coastguard Worker
583*cc02d7e2SAndroid Build Coastguard Worker // Helper for testing server-streaming RPCs which are cancelled on the server.
584*cc02d7e2SAndroid Build Coastguard Worker // Depending on the value of server_try_cancel parameter, this will test one
585*cc02d7e2SAndroid Build Coastguard Worker // of the following three scenarios:
586*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before writing
587*cc02d7e2SAndroid Build Coastguard Worker // any messages to the client
588*cc02d7e2SAndroid Build Coastguard Worker //
589*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while writing
590*cc02d7e2SAndroid Build Coastguard Worker // messages to the client
591*cc02d7e2SAndroid Build Coastguard Worker //
592*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after writing all
593*cc02d7e2SAndroid Build Coastguard Worker // the messages to the client
594*cc02d7e2SAndroid Build Coastguard Worker //
595*cc02d7e2SAndroid Build Coastguard Worker // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
TestResponseStreamServerCancel(ServerTryCancelRequestPhase server_try_cancel)596*cc02d7e2SAndroid Build Coastguard Worker void TestResponseStreamServerCancel(
597*cc02d7e2SAndroid Build Coastguard Worker ServerTryCancelRequestPhase server_try_cancel) {
598*cc02d7e2SAndroid Build Coastguard Worker RestartServer(std::shared_ptr<AuthMetadataProcessor>());
599*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
600*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
601*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
602*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
603*cc02d7e2SAndroid Build Coastguard Worker
604*cc02d7e2SAndroid Build Coastguard Worker // Send server_try_cancel in the client metadata
605*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerTryCancelRequest,
606*cc02d7e2SAndroid Build Coastguard Worker std::to_string(server_try_cancel));
607*cc02d7e2SAndroid Build Coastguard Worker
608*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
609*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->ResponseStream(&context, request);
610*cc02d7e2SAndroid Build Coastguard Worker
611*cc02d7e2SAndroid Build Coastguard Worker int num_msgs_read = 0;
612*cc02d7e2SAndroid Build Coastguard Worker while (num_msgs_read < kServerDefaultResponseStreamsToSend) {
613*cc02d7e2SAndroid Build Coastguard Worker if (!stream->Read(&response)) {
614*cc02d7e2SAndroid Build Coastguard Worker break;
615*cc02d7e2SAndroid Build Coastguard Worker }
616*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(),
617*cc02d7e2SAndroid Build Coastguard Worker request.message() + std::to_string(num_msgs_read));
618*cc02d7e2SAndroid Build Coastguard Worker num_msgs_read++;
619*cc02d7e2SAndroid Build Coastguard Worker }
620*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Read %d messages", num_msgs_read);
621*cc02d7e2SAndroid Build Coastguard Worker
622*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
623*cc02d7e2SAndroid Build Coastguard Worker
624*cc02d7e2SAndroid Build Coastguard Worker // Depending on the value of server_try_cancel, the RPC might have been
625*cc02d7e2SAndroid Build Coastguard Worker // cancelled by the server at different stages. The following validates our
626*cc02d7e2SAndroid Build Coastguard Worker // expectations of number of messages read in various cancellation
627*cc02d7e2SAndroid Build Coastguard Worker // scenarios:
628*cc02d7e2SAndroid Build Coastguard Worker switch (server_try_cancel) {
629*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_BEFORE_PROCESSING:
630*cc02d7e2SAndroid Build Coastguard Worker // Server cancelled before sending any messages. Which means the client
631*cc02d7e2SAndroid Build Coastguard Worker // wouldn't have read any
632*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(num_msgs_read, 0);
633*cc02d7e2SAndroid Build Coastguard Worker break;
634*cc02d7e2SAndroid Build Coastguard Worker
635*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_DURING_PROCESSING:
636*cc02d7e2SAndroid Build Coastguard Worker // Server cancelled while writing messages. Client must have read less
637*cc02d7e2SAndroid Build Coastguard Worker // than or equal to the expected number of messages
638*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_read, kServerDefaultResponseStreamsToSend);
639*cc02d7e2SAndroid Build Coastguard Worker break;
640*cc02d7e2SAndroid Build Coastguard Worker
641*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_AFTER_PROCESSING:
642*cc02d7e2SAndroid Build Coastguard Worker // Even though the Server cancelled after writing all messages, the RPC
643*cc02d7e2SAndroid Build Coastguard Worker // may be cancelled before the Client got a chance to read all the
644*cc02d7e2SAndroid Build Coastguard Worker // messages.
645*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_read, kServerDefaultResponseStreamsToSend);
646*cc02d7e2SAndroid Build Coastguard Worker break;
647*cc02d7e2SAndroid Build Coastguard Worker
648*cc02d7e2SAndroid Build Coastguard Worker default: {
649*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Invalid server_try_cancel value: %d",
650*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel);
651*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(server_try_cancel > DO_NOT_CANCEL &&
652*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel <= CANCEL_AFTER_PROCESSING);
653*cc02d7e2SAndroid Build Coastguard Worker break;
654*cc02d7e2SAndroid Build Coastguard Worker }
655*cc02d7e2SAndroid Build Coastguard Worker }
656*cc02d7e2SAndroid Build Coastguard Worker
657*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
658*cc02d7e2SAndroid Build Coastguard Worker // Make sure that the server interceptors were notified
659*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
660*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
661*cc02d7e2SAndroid Build Coastguard Worker }
662*cc02d7e2SAndroid Build Coastguard Worker }
663*cc02d7e2SAndroid Build Coastguard Worker
664*cc02d7e2SAndroid Build Coastguard Worker // Helper for testing bidirectional-streaming RPCs which are cancelled on the
665*cc02d7e2SAndroid Build Coastguard Worker // server. Depending on the value of server_try_cancel parameter, this will
666*cc02d7e2SAndroid Build Coastguard Worker // test one of the following three scenarios:
667*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
668*cc02d7e2SAndroid Build Coastguard Worker // writing any messages from/to the client
669*cc02d7e2SAndroid Build Coastguard Worker //
670*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading/
671*cc02d7e2SAndroid Build Coastguard Worker // writing messages from/to the client
672*cc02d7e2SAndroid Build Coastguard Worker //
673*cc02d7e2SAndroid Build Coastguard Worker // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading/writing
674*cc02d7e2SAndroid Build Coastguard Worker // all the messages from/to the client
675*cc02d7e2SAndroid Build Coastguard Worker //
676*cc02d7e2SAndroid Build Coastguard Worker // NOTE: Do not call this function with server_try_cancel == DO_NOT_CANCEL.
TestBidiStreamServerCancel(ServerTryCancelRequestPhase server_try_cancel,int num_messages)677*cc02d7e2SAndroid Build Coastguard Worker void TestBidiStreamServerCancel(ServerTryCancelRequestPhase server_try_cancel,
678*cc02d7e2SAndroid Build Coastguard Worker int num_messages) {
679*cc02d7e2SAndroid Build Coastguard Worker RestartServer(std::shared_ptr<AuthMetadataProcessor>());
680*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
681*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
682*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
683*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
684*cc02d7e2SAndroid Build Coastguard Worker
685*cc02d7e2SAndroid Build Coastguard Worker // Send server_try_cancel in the client metadata
686*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerTryCancelRequest,
687*cc02d7e2SAndroid Build Coastguard Worker std::to_string(server_try_cancel));
688*cc02d7e2SAndroid Build Coastguard Worker
689*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
690*cc02d7e2SAndroid Build Coastguard Worker
691*cc02d7e2SAndroid Build Coastguard Worker int num_msgs_read = 0;
692*cc02d7e2SAndroid Build Coastguard Worker int num_msgs_sent = 0;
693*cc02d7e2SAndroid Build Coastguard Worker while (num_msgs_sent < num_messages) {
694*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello " + std::to_string(num_msgs_sent));
695*cc02d7e2SAndroid Build Coastguard Worker if (!stream->Write(request)) {
696*cc02d7e2SAndroid Build Coastguard Worker break;
697*cc02d7e2SAndroid Build Coastguard Worker }
698*cc02d7e2SAndroid Build Coastguard Worker num_msgs_sent++;
699*cc02d7e2SAndroid Build Coastguard Worker
700*cc02d7e2SAndroid Build Coastguard Worker if (!stream->Read(&response)) {
701*cc02d7e2SAndroid Build Coastguard Worker break;
702*cc02d7e2SAndroid Build Coastguard Worker }
703*cc02d7e2SAndroid Build Coastguard Worker num_msgs_read++;
704*cc02d7e2SAndroid Build Coastguard Worker
705*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
706*cc02d7e2SAndroid Build Coastguard Worker }
707*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Sent %d messages", num_msgs_sent);
708*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Read %d messages", num_msgs_read);
709*cc02d7e2SAndroid Build Coastguard Worker
710*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
711*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
712*cc02d7e2SAndroid Build Coastguard Worker
713*cc02d7e2SAndroid Build Coastguard Worker // Depending on the value of server_try_cancel, the RPC might have been
714*cc02d7e2SAndroid Build Coastguard Worker // cancelled by the server at different stages. The following validates our
715*cc02d7e2SAndroid Build Coastguard Worker // expectations of number of messages read in various cancellation
716*cc02d7e2SAndroid Build Coastguard Worker // scenarios:
717*cc02d7e2SAndroid Build Coastguard Worker switch (server_try_cancel) {
718*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_BEFORE_PROCESSING:
719*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(num_msgs_read, 0);
720*cc02d7e2SAndroid Build Coastguard Worker break;
721*cc02d7e2SAndroid Build Coastguard Worker
722*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_DURING_PROCESSING:
723*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_sent, num_messages);
724*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_read, num_msgs_sent);
725*cc02d7e2SAndroid Build Coastguard Worker break;
726*cc02d7e2SAndroid Build Coastguard Worker
727*cc02d7e2SAndroid Build Coastguard Worker case CANCEL_AFTER_PROCESSING:
728*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(num_msgs_sent, num_messages);
729*cc02d7e2SAndroid Build Coastguard Worker
730*cc02d7e2SAndroid Build Coastguard Worker // The Server cancelled after reading the last message and after writing
731*cc02d7e2SAndroid Build Coastguard Worker // the message to the client. However, the RPC cancellation might have
732*cc02d7e2SAndroid Build Coastguard Worker // taken effect before the client actually read the response.
733*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(num_msgs_read, num_msgs_sent);
734*cc02d7e2SAndroid Build Coastguard Worker break;
735*cc02d7e2SAndroid Build Coastguard Worker
736*cc02d7e2SAndroid Build Coastguard Worker default:
737*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Invalid server_try_cancel value: %d",
738*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel);
739*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(server_try_cancel > DO_NOT_CANCEL &&
740*cc02d7e2SAndroid Build Coastguard Worker server_try_cancel <= CANCEL_AFTER_PROCESSING);
741*cc02d7e2SAndroid Build Coastguard Worker break;
742*cc02d7e2SAndroid Build Coastguard Worker }
743*cc02d7e2SAndroid Build Coastguard Worker
744*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
745*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
746*cc02d7e2SAndroid Build Coastguard Worker // Make sure that the server interceptors were notified
747*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
748*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
749*cc02d7e2SAndroid Build Coastguard Worker }
750*cc02d7e2SAndroid Build Coastguard Worker }
751*cc02d7e2SAndroid Build Coastguard Worker };
752*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endServerTryCancelTest,RequestEchoServerCancel)753*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, RequestEchoServerCancel) {
754*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
755*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
756*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
757*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
758*cc02d7e2SAndroid Build Coastguard Worker
759*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerTryCancelRequest,
760*cc02d7e2SAndroid Build Coastguard Worker std::to_string(CANCEL_BEFORE_PROCESSING));
761*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
762*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
763*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
764*cc02d7e2SAndroid Build Coastguard Worker }
765*cc02d7e2SAndroid Build Coastguard Worker
766*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel before doing reading the request
TEST_P(End2endServerTryCancelTest,RequestStreamServerCancelBeforeReads)767*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, RequestStreamServerCancelBeforeReads) {
768*cc02d7e2SAndroid Build Coastguard Worker TestRequestStreamServerCancel(CANCEL_BEFORE_PROCESSING, 1);
769*cc02d7e2SAndroid Build Coastguard Worker }
770*cc02d7e2SAndroid Build Coastguard Worker
771*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel while reading a request from the stream in parallel
TEST_P(End2endServerTryCancelTest,RequestStreamServerCancelDuringRead)772*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, RequestStreamServerCancelDuringRead) {
773*cc02d7e2SAndroid Build Coastguard Worker TestRequestStreamServerCancel(CANCEL_DURING_PROCESSING, 10);
774*cc02d7e2SAndroid Build Coastguard Worker }
775*cc02d7e2SAndroid Build Coastguard Worker
776*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel after reading all the requests but before returning to the
777*cc02d7e2SAndroid Build Coastguard Worker // client
TEST_P(End2endServerTryCancelTest,RequestStreamServerCancelAfterReads)778*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, RequestStreamServerCancelAfterReads) {
779*cc02d7e2SAndroid Build Coastguard Worker TestRequestStreamServerCancel(CANCEL_AFTER_PROCESSING, 4);
780*cc02d7e2SAndroid Build Coastguard Worker }
781*cc02d7e2SAndroid Build Coastguard Worker
782*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel before sending any response messages
TEST_P(End2endServerTryCancelTest,ResponseStreamServerCancelBefore)783*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, ResponseStreamServerCancelBefore) {
784*cc02d7e2SAndroid Build Coastguard Worker TestResponseStreamServerCancel(CANCEL_BEFORE_PROCESSING);
785*cc02d7e2SAndroid Build Coastguard Worker }
786*cc02d7e2SAndroid Build Coastguard Worker
787*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel while writing a response to the stream in parallel
TEST_P(End2endServerTryCancelTest,ResponseStreamServerCancelDuring)788*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, ResponseStreamServerCancelDuring) {
789*cc02d7e2SAndroid Build Coastguard Worker TestResponseStreamServerCancel(CANCEL_DURING_PROCESSING);
790*cc02d7e2SAndroid Build Coastguard Worker }
791*cc02d7e2SAndroid Build Coastguard Worker
792*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel after writing all the respones to the stream but before
793*cc02d7e2SAndroid Build Coastguard Worker // returning to the client
TEST_P(End2endServerTryCancelTest,ResponseStreamServerCancelAfter)794*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, ResponseStreamServerCancelAfter) {
795*cc02d7e2SAndroid Build Coastguard Worker TestResponseStreamServerCancel(CANCEL_AFTER_PROCESSING);
796*cc02d7e2SAndroid Build Coastguard Worker }
797*cc02d7e2SAndroid Build Coastguard Worker
798*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel before reading/writing any requests/responses on the stream
TEST_P(End2endServerTryCancelTest,BidiStreamServerCancelBefore)799*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, BidiStreamServerCancelBefore) {
800*cc02d7e2SAndroid Build Coastguard Worker TestBidiStreamServerCancel(CANCEL_BEFORE_PROCESSING, 2);
801*cc02d7e2SAndroid Build Coastguard Worker }
802*cc02d7e2SAndroid Build Coastguard Worker
803*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel while reading/writing requests/responses on the stream in
804*cc02d7e2SAndroid Build Coastguard Worker // parallel
TEST_P(End2endServerTryCancelTest,BidiStreamServerCancelDuring)805*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, BidiStreamServerCancelDuring) {
806*cc02d7e2SAndroid Build Coastguard Worker TestBidiStreamServerCancel(CANCEL_DURING_PROCESSING, 10);
807*cc02d7e2SAndroid Build Coastguard Worker }
808*cc02d7e2SAndroid Build Coastguard Worker
809*cc02d7e2SAndroid Build Coastguard Worker // Server to cancel after reading/writing all requests/responses on the stream
810*cc02d7e2SAndroid Build Coastguard Worker // but before returning to the client
TEST_P(End2endServerTryCancelTest,BidiStreamServerCancelAfter)811*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endServerTryCancelTest, BidiStreamServerCancelAfter) {
812*cc02d7e2SAndroid Build Coastguard Worker TestBidiStreamServerCancel(CANCEL_AFTER_PROCESSING, 5);
813*cc02d7e2SAndroid Build Coastguard Worker }
814*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,SimpleRpcWithCustomUserAgentPrefix)815*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, SimpleRpcWithCustomUserAgentPrefix) {
816*cc02d7e2SAndroid Build Coastguard Worker // User-Agent is an HTTP header for HTTP transports only
817*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().inproc()) {
818*cc02d7e2SAndroid Build Coastguard Worker return;
819*cc02d7e2SAndroid Build Coastguard Worker }
820*cc02d7e2SAndroid Build Coastguard Worker user_agent_prefix_ = "custom_prefix";
821*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
822*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
823*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
824*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello hello hello hello");
825*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
826*cc02d7e2SAndroid Build Coastguard Worker
827*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
828*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
829*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
830*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
831*cc02d7e2SAndroid Build Coastguard Worker const auto& trailing_metadata = context.GetServerTrailingMetadata();
832*cc02d7e2SAndroid Build Coastguard Worker auto iter = trailing_metadata.find("user-agent");
833*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(iter != trailing_metadata.end());
834*cc02d7e2SAndroid Build Coastguard Worker std::string expected_prefix = user_agent_prefix_ + " grpc-c++/";
835*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(iter->second.starts_with(expected_prefix)) << iter->second;
836*cc02d7e2SAndroid Build Coastguard Worker }
837*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,MultipleRpcsWithVariedBinaryMetadataValue)838*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, MultipleRpcsWithVariedBinaryMetadataValue) {
839*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
840*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::thread> threads;
841*cc02d7e2SAndroid Build Coastguard Worker threads.reserve(10);
842*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
843*cc02d7e2SAndroid Build Coastguard Worker threads.emplace_back(SendRpc, stub_.get(), 10, true);
844*cc02d7e2SAndroid Build Coastguard Worker }
845*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
846*cc02d7e2SAndroid Build Coastguard Worker threads[i].join();
847*cc02d7e2SAndroid Build Coastguard Worker }
848*cc02d7e2SAndroid Build Coastguard Worker }
849*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,MultipleRpcs)850*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, MultipleRpcs) {
851*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
852*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::thread> threads;
853*cc02d7e2SAndroid Build Coastguard Worker threads.reserve(10);
854*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
855*cc02d7e2SAndroid Build Coastguard Worker threads.emplace_back(SendRpc, stub_.get(), 10, false);
856*cc02d7e2SAndroid Build Coastguard Worker }
857*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
858*cc02d7e2SAndroid Build Coastguard Worker threads[i].join();
859*cc02d7e2SAndroid Build Coastguard Worker }
860*cc02d7e2SAndroid Build Coastguard Worker }
861*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ManyStubs)862*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ManyStubs) {
863*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
864*cc02d7e2SAndroid Build Coastguard Worker ChannelTestPeer peer(channel_.get());
865*cc02d7e2SAndroid Build Coastguard Worker int registered_calls_pre = peer.registered_calls();
866*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 1000; ++i) {
867*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::EchoTestService::NewStub(channel_);
868*cc02d7e2SAndroid Build Coastguard Worker }
869*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(peer.registered_calls(), registered_calls_pre);
870*cc02d7e2SAndroid Build Coastguard Worker }
871*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,EmptyBinaryMetadata)872*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, EmptyBinaryMetadata) {
873*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
874*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
875*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
876*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello hello hello hello");
877*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
878*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata("custom-bin", "");
879*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
880*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
881*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
882*cc02d7e2SAndroid Build Coastguard Worker }
883*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,AuthoritySeenOnServerSide)884*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, AuthoritySeenOnServerSide) {
885*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
886*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
887*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_host_from_authority_header(true);
888*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
889*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Live long and prosper.");
890*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
891*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
892*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
893*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().credentials_type() == kTlsCredentialsType) {
894*cc02d7e2SAndroid Build Coastguard Worker // SSL creds overrides the authority.
895*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("foo.test.google.fr", response.param().host());
896*cc02d7e2SAndroid Build Coastguard Worker } else if (GetParam().inproc()) {
897*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("inproc", response.param().host());
898*cc02d7e2SAndroid Build Coastguard Worker } else {
899*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(server_address_.str(), response.param().host());
900*cc02d7e2SAndroid Build Coastguard Worker }
901*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
902*cc02d7e2SAndroid Build Coastguard Worker }
903*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ReconnectChannel)904*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ReconnectChannel) {
905*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().inproc()) {
906*cc02d7e2SAndroid Build Coastguard Worker return;
907*cc02d7e2SAndroid Build Coastguard Worker }
908*cc02d7e2SAndroid Build Coastguard Worker int poller_slowdown_factor = 1;
909*cc02d7e2SAndroid Build Coastguard Worker // It needs 2 pollset_works to reconnect the channel with polling engine
910*cc02d7e2SAndroid Build Coastguard Worker // "poll"
911*cc02d7e2SAndroid Build Coastguard Worker #ifdef GRPC_POSIX_SOCKET_EV
912*cc02d7e2SAndroid Build Coastguard Worker if (grpc_core::ConfigVars::Get().PollStrategy() == "poll") {
913*cc02d7e2SAndroid Build Coastguard Worker poller_slowdown_factor = 2;
914*cc02d7e2SAndroid Build Coastguard Worker }
915*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPC_POSIX_SOCKET_EV
916*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
917*cc02d7e2SAndroid Build Coastguard Worker SendRpc(stub_.get(), 1, false);
918*cc02d7e2SAndroid Build Coastguard Worker RestartServer(std::shared_ptr<AuthMetadataProcessor>());
919*cc02d7e2SAndroid Build Coastguard Worker // It needs more than GRPC_CLIENT_CHANNEL_BACKUP_POLL_INTERVAL_MS time to
920*cc02d7e2SAndroid Build Coastguard Worker // reconnect the channel. Make it a factor of 5x
921*cc02d7e2SAndroid Build Coastguard Worker gpr_sleep_until(
922*cc02d7e2SAndroid Build Coastguard Worker gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
923*cc02d7e2SAndroid Build Coastguard Worker gpr_time_from_millis(kClientChannelBackupPollIntervalMs * 5 *
924*cc02d7e2SAndroid Build Coastguard Worker poller_slowdown_factor *
925*cc02d7e2SAndroid Build Coastguard Worker grpc_test_slowdown_factor(),
926*cc02d7e2SAndroid Build Coastguard Worker GPR_TIMESPAN)));
927*cc02d7e2SAndroid Build Coastguard Worker SendRpc(stub_.get(), 1, false);
928*cc02d7e2SAndroid Build Coastguard Worker }
929*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RequestStreamOneRequest)930*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RequestStreamOneRequest) {
931*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
932*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
933*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
934*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
935*cc02d7e2SAndroid Build Coastguard Worker
936*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
937*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
938*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
939*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
940*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
941*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
942*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
943*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(context.debug_error_string().empty());
944*cc02d7e2SAndroid Build Coastguard Worker }
945*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RequestStreamOneRequestWithCoalescingApi)946*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RequestStreamOneRequestWithCoalescingApi) {
947*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
948*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
949*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
950*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
951*cc02d7e2SAndroid Build Coastguard Worker
952*cc02d7e2SAndroid Build Coastguard Worker context.set_initial_metadata_corked(true);
953*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
954*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
955*cc02d7e2SAndroid Build Coastguard Worker stream->WriteLast(request, WriteOptions());
956*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
957*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
958*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
959*cc02d7e2SAndroid Build Coastguard Worker }
960*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RequestStreamTwoRequests)961*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RequestStreamTwoRequests) {
962*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
963*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
964*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
965*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
966*cc02d7e2SAndroid Build Coastguard Worker
967*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
968*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
969*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
970*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
971*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
972*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
973*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), "hellohello");
974*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
975*cc02d7e2SAndroid Build Coastguard Worker }
976*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RequestStreamTwoRequestsWithWriteThrough)977*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RequestStreamTwoRequestsWithWriteThrough) {
978*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
979*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
980*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
981*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
982*cc02d7e2SAndroid Build Coastguard Worker
983*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
984*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
985*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request, WriteOptions().set_write_through()));
986*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request, WriteOptions().set_write_through()));
987*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
988*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
989*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), "hellohello");
990*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
991*cc02d7e2SAndroid Build Coastguard Worker }
992*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RequestStreamTwoRequestsWithCoalescingApi)993*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RequestStreamTwoRequestsWithCoalescingApi) {
994*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
995*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
996*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
997*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
998*cc02d7e2SAndroid Build Coastguard Worker
999*cc02d7e2SAndroid Build Coastguard Worker context.set_initial_metadata_corked(true);
1000*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
1001*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1002*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1003*cc02d7e2SAndroid Build Coastguard Worker stream->WriteLast(request, WriteOptions());
1004*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1005*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), "hellohello");
1006*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1007*cc02d7e2SAndroid Build Coastguard Worker }
1008*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ResponseStream)1009*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ResponseStream) {
1010*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1011*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1012*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1013*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1014*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1015*cc02d7e2SAndroid Build Coastguard Worker
1016*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->ResponseStream(&context, request);
1017*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < kServerDefaultResponseStreamsToSend; ++i) {
1018*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1019*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + std::to_string(i));
1020*cc02d7e2SAndroid Build Coastguard Worker }
1021*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1022*cc02d7e2SAndroid Build Coastguard Worker
1023*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1024*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1025*cc02d7e2SAndroid Build Coastguard Worker }
1026*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ResponseStreamWithCoalescingApi)1027*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ResponseStreamWithCoalescingApi) {
1028*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1029*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1030*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1031*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1032*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1033*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerUseCoalescingApi, "1");
1034*cc02d7e2SAndroid Build Coastguard Worker
1035*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->ResponseStream(&context, request);
1036*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < kServerDefaultResponseStreamsToSend; ++i) {
1037*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1038*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + std::to_string(i));
1039*cc02d7e2SAndroid Build Coastguard Worker }
1040*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1041*cc02d7e2SAndroid Build Coastguard Worker
1042*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1043*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1044*cc02d7e2SAndroid Build Coastguard Worker }
1045*cc02d7e2SAndroid Build Coastguard Worker
1046*cc02d7e2SAndroid Build Coastguard Worker // This was added to prevent regression from issue:
1047*cc02d7e2SAndroid Build Coastguard Worker // https://github.com/grpc/grpc/issues/11546
TEST_P(End2endTest,ResponseStreamWithEverythingCoalesced)1048*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ResponseStreamWithEverythingCoalesced) {
1049*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1050*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1051*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1052*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1053*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1054*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerUseCoalescingApi, "1");
1055*cc02d7e2SAndroid Build Coastguard Worker // We will only send one message, forcing everything (init metadata, message,
1056*cc02d7e2SAndroid Build Coastguard Worker // trailing) to be coalesced together.
1057*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerResponseStreamsToSend, "1");
1058*cc02d7e2SAndroid Build Coastguard Worker
1059*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->ResponseStream(&context, request);
1060*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1061*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + "0");
1062*cc02d7e2SAndroid Build Coastguard Worker
1063*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1064*cc02d7e2SAndroid Build Coastguard Worker
1065*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1066*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1067*cc02d7e2SAndroid Build Coastguard Worker }
1068*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,BidiStream)1069*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, BidiStream) {
1070*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1071*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1072*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1073*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1074*cc02d7e2SAndroid Build Coastguard Worker std::string msg("hello");
1075*cc02d7e2SAndroid Build Coastguard Worker
1076*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
1077*cc02d7e2SAndroid Build Coastguard Worker
1078*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < kServerDefaultResponseStreamsToSend; ++i) {
1079*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + std::to_string(i));
1080*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1081*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1082*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1083*cc02d7e2SAndroid Build Coastguard Worker }
1084*cc02d7e2SAndroid Build Coastguard Worker
1085*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
1086*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1087*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1088*cc02d7e2SAndroid Build Coastguard Worker
1089*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1090*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1091*cc02d7e2SAndroid Build Coastguard Worker }
1092*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,BidiStreamWithCoalescingApi)1093*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, BidiStreamWithCoalescingApi) {
1094*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1095*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1096*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1097*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1098*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerFinishAfterNReads, "3");
1099*cc02d7e2SAndroid Build Coastguard Worker context.set_initial_metadata_corked(true);
1100*cc02d7e2SAndroid Build Coastguard Worker std::string msg("hello");
1101*cc02d7e2SAndroid Build Coastguard Worker
1102*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
1103*cc02d7e2SAndroid Build Coastguard Worker
1104*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "0");
1105*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1106*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1107*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1108*cc02d7e2SAndroid Build Coastguard Worker
1109*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "1");
1110*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1111*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1112*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1113*cc02d7e2SAndroid Build Coastguard Worker
1114*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "2");
1115*cc02d7e2SAndroid Build Coastguard Worker stream->WriteLast(request, WriteOptions());
1116*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1117*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1118*cc02d7e2SAndroid Build Coastguard Worker
1119*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1120*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1121*cc02d7e2SAndroid Build Coastguard Worker
1122*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1123*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1124*cc02d7e2SAndroid Build Coastguard Worker }
1125*cc02d7e2SAndroid Build Coastguard Worker
1126*cc02d7e2SAndroid Build Coastguard Worker // This was added to prevent regression from issue:
1127*cc02d7e2SAndroid Build Coastguard Worker // https://github.com/grpc/grpc/issues/11546
TEST_P(End2endTest,BidiStreamWithEverythingCoalesced)1128*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, BidiStreamWithEverythingCoalesced) {
1129*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1130*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1131*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1132*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1133*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kServerFinishAfterNReads, "1");
1134*cc02d7e2SAndroid Build Coastguard Worker context.set_initial_metadata_corked(true);
1135*cc02d7e2SAndroid Build Coastguard Worker std::string msg("hello");
1136*cc02d7e2SAndroid Build Coastguard Worker
1137*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
1138*cc02d7e2SAndroid Build Coastguard Worker
1139*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "0");
1140*cc02d7e2SAndroid Build Coastguard Worker stream->WriteLast(request, WriteOptions());
1141*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1142*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1143*cc02d7e2SAndroid Build Coastguard Worker
1144*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1145*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1146*cc02d7e2SAndroid Build Coastguard Worker
1147*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1148*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1149*cc02d7e2SAndroid Build Coastguard Worker }
1150*cc02d7e2SAndroid Build Coastguard Worker
1151*cc02d7e2SAndroid Build Coastguard Worker // Talk to the two services with the same name but different package names.
1152*cc02d7e2SAndroid Build Coastguard Worker // The two stubs are created on the same channel.
TEST_P(End2endTest,DiffPackageServices)1153*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, DiffPackageServices) {
1154*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1155*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1156*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1157*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1158*cc02d7e2SAndroid Build Coastguard Worker
1159*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1160*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1161*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1162*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1163*cc02d7e2SAndroid Build Coastguard Worker
1164*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::testing::duplicate::EchoTestService::Stub> dup_pkg_stub(
1165*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::duplicate::EchoTestService::NewStub(channel_));
1166*cc02d7e2SAndroid Build Coastguard Worker ClientContext context2;
1167*cc02d7e2SAndroid Build Coastguard Worker s = dup_pkg_stub->Echo(&context2, request, &response);
1168*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("no package", response.message());
1169*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1170*cc02d7e2SAndroid Build Coastguard Worker }
1171*cc02d7e2SAndroid Build Coastguard Worker
1172*cc02d7e2SAndroid Build Coastguard Worker template <class ServiceType>
CancelRpc(ClientContext * context,int delay_us,ServiceType * service)1173*cc02d7e2SAndroid Build Coastguard Worker void CancelRpc(ClientContext* context, int delay_us, ServiceType* service) {
1174*cc02d7e2SAndroid Build Coastguard Worker gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
1175*cc02d7e2SAndroid Build Coastguard Worker gpr_time_from_micros(delay_us, GPR_TIMESPAN)));
1176*cc02d7e2SAndroid Build Coastguard Worker while (!service->signal_client()) {
1177*cc02d7e2SAndroid Build Coastguard Worker }
1178*cc02d7e2SAndroid Build Coastguard Worker context->TryCancel();
1179*cc02d7e2SAndroid Build Coastguard Worker }
1180*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,CancelRpcBeforeStart)1181*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, CancelRpcBeforeStart) {
1182*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1183*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1184*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1185*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1186*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1187*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
1188*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1189*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("", response.message());
1190*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
1191*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
1192*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
1193*cc02d7e2SAndroid Build Coastguard Worker }
1194*cc02d7e2SAndroid Build Coastguard Worker }
1195*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,CancelRpcAfterStart)1196*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, CancelRpcAfterStart) {
1197*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
1198*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1199*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1200*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1201*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1202*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1203*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_server_notify_client_when_started(true);
1204*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_skip_cancelled_check(true);
1205*cc02d7e2SAndroid Build Coastguard Worker Status s;
1206*cc02d7e2SAndroid Build Coastguard Worker std::thread echo_thread([this, &s, &context, &request, &response] {
1207*cc02d7e2SAndroid Build Coastguard Worker s = stub_->Echo(&context, request, &response);
1208*cc02d7e2SAndroid Build Coastguard Worker });
1209*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().callback_server()) {
1210*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(service_.ClientWaitUntilNRpcsStarted(1), 1);
1211*cc02d7e2SAndroid Build Coastguard Worker } else {
1212*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(callback_service_.ClientWaitUntilNRpcsStarted(1), 1);
1213*cc02d7e2SAndroid Build Coastguard Worker }
1214*cc02d7e2SAndroid Build Coastguard Worker
1215*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
1216*cc02d7e2SAndroid Build Coastguard Worker
1217*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().callback_server()) {
1218*cc02d7e2SAndroid Build Coastguard Worker service_.SignalServerToContinue();
1219*cc02d7e2SAndroid Build Coastguard Worker } else {
1220*cc02d7e2SAndroid Build Coastguard Worker callback_service_.SignalServerToContinue();
1221*cc02d7e2SAndroid Build Coastguard Worker }
1222*cc02d7e2SAndroid Build Coastguard Worker
1223*cc02d7e2SAndroid Build Coastguard Worker echo_thread.join();
1224*cc02d7e2SAndroid Build Coastguard Worker // TODO(ctiller): improve test to not be flaky
1225*cc02d7e2SAndroid Build Coastguard Worker //
1226*cc02d7e2SAndroid Build Coastguard Worker // TryCancel is best effort, and it can happen that the cancellation is not
1227*cc02d7e2SAndroid Build Coastguard Worker // acted upon before the server wakes up, sends a response, and the client
1228*cc02d7e2SAndroid Build Coastguard Worker // reads that.
1229*cc02d7e2SAndroid Build Coastguard Worker // For this reason, we try a few times here to see the cancellation result.
1230*cc02d7e2SAndroid Build Coastguard Worker if (s.ok()) continue;
1231*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("", response.message());
1232*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
1233*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
1234*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
1235*cc02d7e2SAndroid Build Coastguard Worker }
1236*cc02d7e2SAndroid Build Coastguard Worker return;
1237*cc02d7e2SAndroid Build Coastguard Worker }
1238*cc02d7e2SAndroid Build Coastguard Worker GTEST_FAIL() << "Failed to get cancellation";
1239*cc02d7e2SAndroid Build Coastguard Worker }
1240*cc02d7e2SAndroid Build Coastguard Worker
1241*cc02d7e2SAndroid Build Coastguard Worker // Client cancels request stream after sending two messages
TEST_P(End2endTest,ClientCancelsRequestStream)1242*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ClientCancelsRequestStream) {
1243*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1244*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1245*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1246*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1247*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1248*cc02d7e2SAndroid Build Coastguard Worker
1249*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->RequestStream(&context, &response);
1250*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1251*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1252*cc02d7e2SAndroid Build Coastguard Worker
1253*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
1254*cc02d7e2SAndroid Build Coastguard Worker
1255*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1256*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
1257*cc02d7e2SAndroid Build Coastguard Worker
1258*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), "");
1259*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
1260*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
1261*cc02d7e2SAndroid Build Coastguard Worker }
1262*cc02d7e2SAndroid Build Coastguard Worker }
1263*cc02d7e2SAndroid Build Coastguard Worker
1264*cc02d7e2SAndroid Build Coastguard Worker // Client cancels server stream after sending some messages
TEST_P(End2endTest,ClientCancelsResponseStream)1265*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ClientCancelsResponseStream) {
1266*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1267*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1268*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1269*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1270*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1271*cc02d7e2SAndroid Build Coastguard Worker
1272*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->ResponseStream(&context, request);
1273*cc02d7e2SAndroid Build Coastguard Worker
1274*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1275*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + "0");
1276*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1277*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + "1");
1278*cc02d7e2SAndroid Build Coastguard Worker
1279*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
1280*cc02d7e2SAndroid Build Coastguard Worker
1281*cc02d7e2SAndroid Build Coastguard Worker // The cancellation races with responses, so there might be zero or
1282*cc02d7e2SAndroid Build Coastguard Worker // one responses pending, read till failure
1283*cc02d7e2SAndroid Build Coastguard Worker
1284*cc02d7e2SAndroid Build Coastguard Worker if (stream->Read(&response)) {
1285*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message() + "2");
1286*cc02d7e2SAndroid Build Coastguard Worker // Since we have cancelled, we expect the next attempt to read to fail
1287*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1288*cc02d7e2SAndroid Build Coastguard Worker }
1289*cc02d7e2SAndroid Build Coastguard Worker
1290*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1291*cc02d7e2SAndroid Build Coastguard Worker // The final status could be either of CANCELLED or OK depending on
1292*cc02d7e2SAndroid Build Coastguard Worker // who won the race.
1293*cc02d7e2SAndroid Build Coastguard Worker EXPECT_GE(grpc::StatusCode::CANCELLED, s.error_code());
1294*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
1295*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
1296*cc02d7e2SAndroid Build Coastguard Worker }
1297*cc02d7e2SAndroid Build Coastguard Worker }
1298*cc02d7e2SAndroid Build Coastguard Worker
1299*cc02d7e2SAndroid Build Coastguard Worker // Client cancels bidi stream after sending some messages
TEST_P(End2endTest,ClientCancelsBidi)1300*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ClientCancelsBidi) {
1301*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1302*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1303*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1304*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1305*cc02d7e2SAndroid Build Coastguard Worker std::string msg("hello");
1306*cc02d7e2SAndroid Build Coastguard Worker
1307*cc02d7e2SAndroid Build Coastguard Worker // Send server_try_cancel value in the client metadata
1308*cc02d7e2SAndroid Build Coastguard Worker context.AddMetadata(kClientTryCancelRequest, std::to_string(1));
1309*cc02d7e2SAndroid Build Coastguard Worker
1310*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
1311*cc02d7e2SAndroid Build Coastguard Worker
1312*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "0");
1313*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1314*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Read(&response));
1315*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1316*cc02d7e2SAndroid Build Coastguard Worker
1317*cc02d7e2SAndroid Build Coastguard Worker request.set_message(msg + "1");
1318*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(stream->Write(request));
1319*cc02d7e2SAndroid Build Coastguard Worker
1320*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
1321*cc02d7e2SAndroid Build Coastguard Worker
1322*cc02d7e2SAndroid Build Coastguard Worker // The cancellation races with responses, so there might be zero or
1323*cc02d7e2SAndroid Build Coastguard Worker // one responses pending, read till failure
1324*cc02d7e2SAndroid Build Coastguard Worker
1325*cc02d7e2SAndroid Build Coastguard Worker if (stream->Read(&response)) {
1326*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1327*cc02d7e2SAndroid Build Coastguard Worker // Since we have cancelled, we expect the next attempt to read to fail
1328*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(stream->Read(&response));
1329*cc02d7e2SAndroid Build Coastguard Worker }
1330*cc02d7e2SAndroid Build Coastguard Worker
1331*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1332*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
1333*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().use_interceptors()) {
1334*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(20, PhonyInterceptor::GetNumTimesCancel());
1335*cc02d7e2SAndroid Build Coastguard Worker }
1336*cc02d7e2SAndroid Build Coastguard Worker }
1337*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,RpcMaxMessageSize)1338*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, RpcMaxMessageSize) {
1339*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1340*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1341*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1342*cc02d7e2SAndroid Build Coastguard Worker request.set_message(string(kMaxMessageSize_ * 2, 'a'));
1343*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_server_die(true);
1344*cc02d7e2SAndroid Build Coastguard Worker
1345*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1346*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1347*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1348*cc02d7e2SAndroid Build Coastguard Worker }
1349*cc02d7e2SAndroid Build Coastguard Worker
ReaderThreadFunc(ClientReaderWriter<EchoRequest,EchoResponse> * stream,gpr_event * ev)1350*cc02d7e2SAndroid Build Coastguard Worker void ReaderThreadFunc(ClientReaderWriter<EchoRequest, EchoResponse>* stream,
1351*cc02d7e2SAndroid Build Coastguard Worker gpr_event* ev) {
1352*cc02d7e2SAndroid Build Coastguard Worker EchoResponse resp;
1353*cc02d7e2SAndroid Build Coastguard Worker gpr_event_set(ev, reinterpret_cast<void*>(1));
1354*cc02d7e2SAndroid Build Coastguard Worker while (stream->Read(&resp)) {
1355*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Read message");
1356*cc02d7e2SAndroid Build Coastguard Worker }
1357*cc02d7e2SAndroid Build Coastguard Worker }
1358*cc02d7e2SAndroid Build Coastguard Worker
1359*cc02d7e2SAndroid Build Coastguard Worker // Run a Read and a WritesDone simultaneously.
TEST_P(End2endTest,SimultaneousReadWritesDone)1360*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, SimultaneousReadWritesDone) {
1361*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1362*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1363*cc02d7e2SAndroid Build Coastguard Worker gpr_event ev;
1364*cc02d7e2SAndroid Build Coastguard Worker gpr_event_init(&ev);
1365*cc02d7e2SAndroid Build Coastguard Worker auto stream = stub_->BidiStream(&context);
1366*cc02d7e2SAndroid Build Coastguard Worker std::thread reader_thread(ReaderThreadFunc, stream.get(), &ev);
1367*cc02d7e2SAndroid Build Coastguard Worker gpr_event_wait(&ev, gpr_inf_future(GPR_CLOCK_REALTIME));
1368*cc02d7e2SAndroid Build Coastguard Worker stream->WritesDone();
1369*cc02d7e2SAndroid Build Coastguard Worker reader_thread.join();
1370*cc02d7e2SAndroid Build Coastguard Worker Status s = stream->Finish();
1371*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1372*cc02d7e2SAndroid Build Coastguard Worker }
1373*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ChannelState)1374*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ChannelState) {
1375*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().inproc()) {
1376*cc02d7e2SAndroid Build Coastguard Worker return;
1377*cc02d7e2SAndroid Build Coastguard Worker }
1378*cc02d7e2SAndroid Build Coastguard Worker
1379*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1380*cc02d7e2SAndroid Build Coastguard Worker // Start IDLE
1381*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(false));
1382*cc02d7e2SAndroid Build Coastguard Worker
1383*cc02d7e2SAndroid Build Coastguard Worker // Did not ask to connect, no state change.
1384*cc02d7e2SAndroid Build Coastguard Worker CompletionQueue cq;
1385*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
1386*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::milliseconds(10);
1387*cc02d7e2SAndroid Build Coastguard Worker channel_->NotifyOnStateChange(GRPC_CHANNEL_IDLE, deadline, &cq, nullptr);
1388*cc02d7e2SAndroid Build Coastguard Worker void* tag;
1389*cc02d7e2SAndroid Build Coastguard Worker bool ok = true;
1390*cc02d7e2SAndroid Build Coastguard Worker cq.Next(&tag, &ok);
1391*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(ok);
1392*cc02d7e2SAndroid Build Coastguard Worker
1393*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(true));
1394*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(channel_->WaitForStateChange(GRPC_CHANNEL_IDLE,
1395*cc02d7e2SAndroid Build Coastguard Worker gpr_inf_future(GPR_CLOCK_REALTIME)));
1396*cc02d7e2SAndroid Build Coastguard Worker auto state = channel_->GetState(false);
1397*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(state == GRPC_CHANNEL_CONNECTING || state == GRPC_CHANNEL_READY);
1398*cc02d7e2SAndroid Build Coastguard Worker }
1399*cc02d7e2SAndroid Build Coastguard Worker
1400*cc02d7e2SAndroid Build Coastguard Worker // Takes 10s.
TEST_P(End2endTest,ChannelStateTimeout)1401*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ChannelStateTimeout) {
1402*cc02d7e2SAndroid Build Coastguard Worker if ((GetParam().credentials_type() != kInsecureCredentialsType) ||
1403*cc02d7e2SAndroid Build Coastguard Worker GetParam().inproc()) {
1404*cc02d7e2SAndroid Build Coastguard Worker return;
1405*cc02d7e2SAndroid Build Coastguard Worker }
1406*cc02d7e2SAndroid Build Coastguard Worker int port = grpc_pick_unused_port_or_die();
1407*cc02d7e2SAndroid Build Coastguard Worker std::ostringstream server_address;
1408*cc02d7e2SAndroid Build Coastguard Worker server_address << "localhost:" << port;
1409*cc02d7e2SAndroid Build Coastguard Worker // Channel to non-existing server
1410*cc02d7e2SAndroid Build Coastguard Worker auto channel =
1411*cc02d7e2SAndroid Build Coastguard Worker grpc::CreateChannel(server_address.str(), InsecureChannelCredentials());
1412*cc02d7e2SAndroid Build Coastguard Worker // Start IDLE
1413*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(GRPC_CHANNEL_IDLE, channel->GetState(true));
1414*cc02d7e2SAndroid Build Coastguard Worker
1415*cc02d7e2SAndroid Build Coastguard Worker auto state = GRPC_CHANNEL_IDLE;
1416*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
1417*cc02d7e2SAndroid Build Coastguard Worker channel->WaitForStateChange(
1418*cc02d7e2SAndroid Build Coastguard Worker state, std::chrono::system_clock::now() + std::chrono::seconds(1));
1419*cc02d7e2SAndroid Build Coastguard Worker state = channel->GetState(false);
1420*cc02d7e2SAndroid Build Coastguard Worker }
1421*cc02d7e2SAndroid Build Coastguard Worker }
1422*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ChannelStateOnLameChannel)1423*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ChannelStateOnLameChannel) {
1424*cc02d7e2SAndroid Build Coastguard Worker if ((GetParam().credentials_type() != kInsecureCredentialsType) ||
1425*cc02d7e2SAndroid Build Coastguard Worker GetParam().inproc()) {
1426*cc02d7e2SAndroid Build Coastguard Worker return;
1427*cc02d7e2SAndroid Build Coastguard Worker }
1428*cc02d7e2SAndroid Build Coastguard Worker // Channel using invalid target URI. This creates a lame channel.
1429*cc02d7e2SAndroid Build Coastguard Worker auto channel = grpc::CreateChannel("dns:///", InsecureChannelCredentials());
1430*cc02d7e2SAndroid Build Coastguard Worker // Channel should immediately report TRANSIENT_FAILURE.
1431*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(GRPC_CHANNEL_TRANSIENT_FAILURE, channel->GetState(true));
1432*cc02d7e2SAndroid Build Coastguard Worker // And state will never change.
1433*cc02d7e2SAndroid Build Coastguard Worker auto state = GRPC_CHANNEL_TRANSIENT_FAILURE;
1434*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
1435*cc02d7e2SAndroid Build Coastguard Worker channel->WaitForStateChange(
1436*cc02d7e2SAndroid Build Coastguard Worker state, std::chrono::system_clock::now() + std::chrono::seconds(1));
1437*cc02d7e2SAndroid Build Coastguard Worker state = channel->GetState(false);
1438*cc02d7e2SAndroid Build Coastguard Worker }
1439*cc02d7e2SAndroid Build Coastguard Worker }
1440*cc02d7e2SAndroid Build Coastguard Worker
1441*cc02d7e2SAndroid Build Coastguard Worker // Talking to a non-existing service.
TEST_P(End2endTest,NonExistingService)1442*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, NonExistingService) {
1443*cc02d7e2SAndroid Build Coastguard Worker ResetChannel();
1444*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::testing::UnimplementedEchoService::Stub> stub;
1445*cc02d7e2SAndroid Build Coastguard Worker stub = grpc::testing::UnimplementedEchoService::NewStub(channel_);
1446*cc02d7e2SAndroid Build Coastguard Worker
1447*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1448*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1449*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1450*cc02d7e2SAndroid Build Coastguard Worker
1451*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1452*cc02d7e2SAndroid Build Coastguard Worker Status s = stub->Unimplemented(&context, request, &response);
1453*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(StatusCode::UNIMPLEMENTED, s.error_code());
1454*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("", s.error_message());
1455*cc02d7e2SAndroid Build Coastguard Worker }
1456*cc02d7e2SAndroid Build Coastguard Worker
1457*cc02d7e2SAndroid Build Coastguard Worker // Ask the server to send back a serialized proto in trailer.
1458*cc02d7e2SAndroid Build Coastguard Worker // This is an example of setting error details.
TEST_P(End2endTest,BinaryTrailerTest)1459*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, BinaryTrailerTest) {
1460*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1461*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1462*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1463*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1464*cc02d7e2SAndroid Build Coastguard Worker
1465*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1466*cc02d7e2SAndroid Build Coastguard Worker DebugInfo* info = request.mutable_param()->mutable_debug_info();
1467*cc02d7e2SAndroid Build Coastguard Worker info->add_stack_entries("stack_entry_1");
1468*cc02d7e2SAndroid Build Coastguard Worker info->add_stack_entries("stack_entry_2");
1469*cc02d7e2SAndroid Build Coastguard Worker info->add_stack_entries("stack_entry_3");
1470*cc02d7e2SAndroid Build Coastguard Worker info->set_detail("detailed debug info");
1471*cc02d7e2SAndroid Build Coastguard Worker std::string expected_string = info->SerializeAsString();
1472*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1473*cc02d7e2SAndroid Build Coastguard Worker
1474*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1475*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1476*cc02d7e2SAndroid Build Coastguard Worker auto trailers = context.GetServerTrailingMetadata();
1477*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(1u, trailers.count(kDebugInfoTrailerKey));
1478*cc02d7e2SAndroid Build Coastguard Worker auto iter = trailers.find(kDebugInfoTrailerKey);
1479*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(expected_string, iter->second);
1480*cc02d7e2SAndroid Build Coastguard Worker // Parse the returned trailer into a DebugInfo proto.
1481*cc02d7e2SAndroid Build Coastguard Worker DebugInfo returned_info;
1482*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(returned_info.ParseFromString(ToString(iter->second)));
1483*cc02d7e2SAndroid Build Coastguard Worker }
1484*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(End2endTest,ExpectErrorTest)1485*cc02d7e2SAndroid Build Coastguard Worker TEST_P(End2endTest, ExpectErrorTest) {
1486*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1487*cc02d7e2SAndroid Build Coastguard Worker
1488*cc02d7e2SAndroid Build Coastguard Worker std::vector<ErrorStatus> expected_status;
1489*cc02d7e2SAndroid Build Coastguard Worker expected_status.emplace_back();
1490*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_code(13); // INTERNAL
1491*cc02d7e2SAndroid Build Coastguard Worker // No Error message or details
1492*cc02d7e2SAndroid Build Coastguard Worker
1493*cc02d7e2SAndroid Build Coastguard Worker expected_status.emplace_back();
1494*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_code(13); // INTERNAL
1495*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_error_message("text error message");
1496*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_binary_error_details("text error details");
1497*cc02d7e2SAndroid Build Coastguard Worker
1498*cc02d7e2SAndroid Build Coastguard Worker expected_status.emplace_back();
1499*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_code(13); // INTERNAL
1500*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_error_message("text error message");
1501*cc02d7e2SAndroid Build Coastguard Worker expected_status.back().set_binary_error_details(
1502*cc02d7e2SAndroid Build Coastguard Worker "\x0\x1\x2\x3\x4\x5\x6\x8\x9\xA\xB");
1503*cc02d7e2SAndroid Build Coastguard Worker
1504*cc02d7e2SAndroid Build Coastguard Worker for (auto iter = expected_status.begin(); iter != expected_status.end();
1505*cc02d7e2SAndroid Build Coastguard Worker ++iter) {
1506*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1507*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1508*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1509*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1510*cc02d7e2SAndroid Build Coastguard Worker auto* error = request.mutable_param()->mutable_expected_error();
1511*cc02d7e2SAndroid Build Coastguard Worker error->set_code(iter->code());
1512*cc02d7e2SAndroid Build Coastguard Worker error->set_error_message(iter->error_message());
1513*cc02d7e2SAndroid Build Coastguard Worker error->set_binary_error_details(iter->binary_error_details());
1514*cc02d7e2SAndroid Build Coastguard Worker
1515*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1516*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1517*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(iter->code(), s.error_code());
1518*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(iter->error_message(), s.error_message());
1519*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(iter->binary_error_details(), s.error_details());
1520*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(absl::StrContains(context.debug_error_string(), "created"));
1521*cc02d7e2SAndroid Build Coastguard Worker #ifndef NDEBUG
1522*cc02d7e2SAndroid Build Coastguard Worker // grpc_core::StatusIntProperty::kFileLine is for debug only
1523*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(absl::StrContains(context.debug_error_string(), "file"));
1524*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(absl::StrContains(context.debug_error_string(), "line"));
1525*cc02d7e2SAndroid Build Coastguard Worker #endif
1526*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(absl::StrContains(context.debug_error_string(), "status"));
1527*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(absl::StrContains(context.debug_error_string(), "13"));
1528*cc02d7e2SAndroid Build Coastguard Worker }
1529*cc02d7e2SAndroid Build Coastguard Worker }
1530*cc02d7e2SAndroid Build Coastguard Worker
1531*cc02d7e2SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////
1532*cc02d7e2SAndroid Build Coastguard Worker // Test with and without a proxy.
1533*cc02d7e2SAndroid Build Coastguard Worker class ProxyEnd2endTest : public End2endTest {
1534*cc02d7e2SAndroid Build Coastguard Worker protected:
1535*cc02d7e2SAndroid Build Coastguard Worker };
1536*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ProxyEnd2endTest,SimpleRpc)1537*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, SimpleRpc) {
1538*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1539*cc02d7e2SAndroid Build Coastguard Worker SendRpc(stub_.get(), 1, false);
1540*cc02d7e2SAndroid Build Coastguard Worker }
1541*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ProxyEnd2endTest,SimpleRpcWithEmptyMessages)1542*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, SimpleRpcWithEmptyMessages) {
1543*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1544*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1545*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1546*cc02d7e2SAndroid Build Coastguard Worker
1547*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1548*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1549*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1550*cc02d7e2SAndroid Build Coastguard Worker }
1551*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ProxyEnd2endTest,MultipleRpcs)1552*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, MultipleRpcs) {
1553*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1554*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::thread> threads;
1555*cc02d7e2SAndroid Build Coastguard Worker threads.reserve(10);
1556*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
1557*cc02d7e2SAndroid Build Coastguard Worker threads.emplace_back(SendRpc, stub_.get(), 10, false);
1558*cc02d7e2SAndroid Build Coastguard Worker }
1559*cc02d7e2SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
1560*cc02d7e2SAndroid Build Coastguard Worker threads[i].join();
1561*cc02d7e2SAndroid Build Coastguard Worker }
1562*cc02d7e2SAndroid Build Coastguard Worker }
1563*cc02d7e2SAndroid Build Coastguard Worker
1564*cc02d7e2SAndroid Build Coastguard Worker // Set a 10us deadline and make sure proper error is returned.
TEST_P(ProxyEnd2endTest,RpcDeadlineExpires)1565*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, RpcDeadlineExpires) {
1566*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1567*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1568*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1569*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1570*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_skip_cancelled_check(true);
1571*cc02d7e2SAndroid Build Coastguard Worker // Let server sleep for 4 secs first to guarantee expiry.
1572*cc02d7e2SAndroid Build Coastguard Worker // 4 secs might seem a bit extreme but the timer manager would have been just
1573*cc02d7e2SAndroid Build Coastguard Worker // initialized (when ResetStub() was called) and there are some warmup costs
1574*cc02d7e2SAndroid Build Coastguard Worker // i.e the timer thread many not have even started. There might also be other
1575*cc02d7e2SAndroid Build Coastguard Worker // delays in the timer manager thread (in acquiring locks, timer data
1576*cc02d7e2SAndroid Build Coastguard Worker // structure manipulations, starting backup timer threads) that add to the
1577*cc02d7e2SAndroid Build Coastguard Worker // delays. 4 secs might be still not enough in some cases but this
1578*cc02d7e2SAndroid Build Coastguard Worker // significantly reduces the test flakes
1579*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_server_sleep_us(4 * 1000 * 1000);
1580*cc02d7e2SAndroid Build Coastguard Worker
1581*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1582*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
1583*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::milliseconds(1);
1584*cc02d7e2SAndroid Build Coastguard Worker context.set_deadline(deadline);
1585*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1586*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, s.error_code());
1587*cc02d7e2SAndroid Build Coastguard Worker }
1588*cc02d7e2SAndroid Build Coastguard Worker
1589*cc02d7e2SAndroid Build Coastguard Worker // Set a long but finite deadline.
TEST_P(ProxyEnd2endTest,RpcLongDeadline)1590*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, RpcLongDeadline) {
1591*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1592*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1593*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1594*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1595*cc02d7e2SAndroid Build Coastguard Worker
1596*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1597*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
1598*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::hours(1);
1599*cc02d7e2SAndroid Build Coastguard Worker context.set_deadline(deadline);
1600*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1601*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1602*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1603*cc02d7e2SAndroid Build Coastguard Worker }
1604*cc02d7e2SAndroid Build Coastguard Worker
1605*cc02d7e2SAndroid Build Coastguard Worker // Ask server to echo back the deadline it sees.
TEST_P(ProxyEnd2endTest,EchoDeadline)1606*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, EchoDeadline) {
1607*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1608*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1609*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1610*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1611*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_deadline(true);
1612*cc02d7e2SAndroid Build Coastguard Worker
1613*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1614*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
1615*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::seconds(100);
1616*cc02d7e2SAndroid Build Coastguard Worker context.set_deadline(deadline);
1617*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1618*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1619*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1620*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec sent_deadline;
1621*cc02d7e2SAndroid Build Coastguard Worker Timepoint2Timespec(deadline, &sent_deadline);
1622*cc02d7e2SAndroid Build Coastguard Worker // We want to allow some reasonable error given:
1623*cc02d7e2SAndroid Build Coastguard Worker // - request_deadline() only has 1sec resolution so the best we can do is +-1
1624*cc02d7e2SAndroid Build Coastguard Worker // - if sent_deadline.tv_nsec is very close to the next second's boundary we
1625*cc02d7e2SAndroid Build Coastguard Worker // can end up being off by 2 in one direction.
1626*cc02d7e2SAndroid Build Coastguard Worker EXPECT_LE(response.param().request_deadline() - sent_deadline.tv_sec, 2);
1627*cc02d7e2SAndroid Build Coastguard Worker EXPECT_GE(response.param().request_deadline() - sent_deadline.tv_sec, -1);
1628*cc02d7e2SAndroid Build Coastguard Worker }
1629*cc02d7e2SAndroid Build Coastguard Worker
1630*cc02d7e2SAndroid Build Coastguard Worker // Ask server to echo back the deadline it sees. The rpc has no deadline.
TEST_P(ProxyEnd2endTest,EchoDeadlineForNoDeadlineRpc)1631*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, EchoDeadlineForNoDeadlineRpc) {
1632*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1633*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1634*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1635*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1636*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_deadline(true);
1637*cc02d7e2SAndroid Build Coastguard Worker
1638*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1639*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1640*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1641*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1642*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.param().request_deadline(),
1643*cc02d7e2SAndroid Build Coastguard Worker gpr_inf_future(GPR_CLOCK_REALTIME).tv_sec);
1644*cc02d7e2SAndroid Build Coastguard Worker }
1645*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ProxyEnd2endTest,UnimplementedRpc)1646*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, UnimplementedRpc) {
1647*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1648*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1649*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1650*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1651*cc02d7e2SAndroid Build Coastguard Worker
1652*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1653*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Unimplemented(&context, request, &response);
1654*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1655*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), grpc::StatusCode::UNIMPLEMENTED);
1656*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_message(), "");
1657*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), "");
1658*cc02d7e2SAndroid Build Coastguard Worker }
1659*cc02d7e2SAndroid Build Coastguard Worker
1660*cc02d7e2SAndroid Build Coastguard Worker // Client cancels rpc after 10ms
TEST_P(ProxyEnd2endTest,ClientCancelsRpc)1661*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, ClientCancelsRpc) {
1662*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1663*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1664*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1665*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1666*cc02d7e2SAndroid Build Coastguard Worker const int kCancelDelayUs = 10 * 1000;
1667*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_client_cancel_after_us(kCancelDelayUs);
1668*cc02d7e2SAndroid Build Coastguard Worker
1669*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1670*cc02d7e2SAndroid Build Coastguard Worker std::thread cancel_thread;
1671*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().callback_server()) {
1672*cc02d7e2SAndroid Build Coastguard Worker cancel_thread = std::thread(
1673*cc02d7e2SAndroid Build Coastguard Worker [&context, this](int delay) { CancelRpc(&context, delay, &service_); },
1674*cc02d7e2SAndroid Build Coastguard Worker kCancelDelayUs);
1675*cc02d7e2SAndroid Build Coastguard Worker // Note: the unusual pattern above (and below) is caused by a conflict
1676*cc02d7e2SAndroid Build Coastguard Worker // between two sets of compiler expectations. clang allows const to be
1677*cc02d7e2SAndroid Build Coastguard Worker // captured without mention, so there is no need to capture kCancelDelayUs
1678*cc02d7e2SAndroid Build Coastguard Worker // (and indeed clang-tidy complains if you do so). OTOH, a Windows compiler
1679*cc02d7e2SAndroid Build Coastguard Worker // in our tests requires an explicit capture even for const. We square this
1680*cc02d7e2SAndroid Build Coastguard Worker // circle by passing the const value in as an argument to the lambda.
1681*cc02d7e2SAndroid Build Coastguard Worker } else {
1682*cc02d7e2SAndroid Build Coastguard Worker cancel_thread = std::thread(
1683*cc02d7e2SAndroid Build Coastguard Worker [&context, this](int delay) {
1684*cc02d7e2SAndroid Build Coastguard Worker CancelRpc(&context, delay, &callback_service_);
1685*cc02d7e2SAndroid Build Coastguard Worker },
1686*cc02d7e2SAndroid Build Coastguard Worker kCancelDelayUs);
1687*cc02d7e2SAndroid Build Coastguard Worker }
1688*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1689*cc02d7e2SAndroid Build Coastguard Worker cancel_thread.join();
1690*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(StatusCode::CANCELLED, s.error_code());
1691*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_message(), "CANCELLED");
1692*cc02d7e2SAndroid Build Coastguard Worker }
1693*cc02d7e2SAndroid Build Coastguard Worker
1694*cc02d7e2SAndroid Build Coastguard Worker // Server cancels rpc after 1ms
TEST_P(ProxyEnd2endTest,ServerCancelsRpc)1695*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, ServerCancelsRpc) {
1696*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1697*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1698*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1699*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1700*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_server_cancel_after_us(1000);
1701*cc02d7e2SAndroid Build Coastguard Worker
1702*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1703*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1704*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(StatusCode::CANCELLED, s.error_code());
1705*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.error_message().empty());
1706*cc02d7e2SAndroid Build Coastguard Worker }
1707*cc02d7e2SAndroid Build Coastguard Worker
1708*cc02d7e2SAndroid Build Coastguard Worker // Make the response larger than the flow control window.
TEST_P(ProxyEnd2endTest,HugeResponse)1709*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, HugeResponse) {
1710*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1711*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1712*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1713*cc02d7e2SAndroid Build Coastguard Worker request.set_message("huge response");
1714*cc02d7e2SAndroid Build Coastguard Worker const size_t kResponseSize = 1024 * (1024 + 10);
1715*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_response_message_length(kResponseSize);
1716*cc02d7e2SAndroid Build Coastguard Worker
1717*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1718*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
1719*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::seconds(20);
1720*cc02d7e2SAndroid Build Coastguard Worker context.set_deadline(deadline);
1721*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1722*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(kResponseSize, response.message().size());
1723*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1724*cc02d7e2SAndroid Build Coastguard Worker }
1725*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ProxyEnd2endTest,Peer)1726*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ProxyEnd2endTest, Peer) {
1727*cc02d7e2SAndroid Build Coastguard Worker // Peer is not meaningful for inproc
1728*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().inproc()) {
1729*cc02d7e2SAndroid Build Coastguard Worker return;
1730*cc02d7e2SAndroid Build Coastguard Worker }
1731*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1732*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1733*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1734*cc02d7e2SAndroid Build Coastguard Worker request.set_message("hello");
1735*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_peer(true);
1736*cc02d7e2SAndroid Build Coastguard Worker
1737*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1738*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1739*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1740*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1741*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(CheckIsLocalhost(response.param().peer()));
1742*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(CheckIsLocalhost(context.peer()));
1743*cc02d7e2SAndroid Build Coastguard Worker }
1744*cc02d7e2SAndroid Build Coastguard Worker
1745*cc02d7e2SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////////
1746*cc02d7e2SAndroid Build Coastguard Worker class SecureEnd2endTest : public End2endTest {
1747*cc02d7e2SAndroid Build Coastguard Worker protected:
SecureEnd2endTest()1748*cc02d7e2SAndroid Build Coastguard Worker SecureEnd2endTest() {
1749*cc02d7e2SAndroid Build Coastguard Worker GPR_ASSERT(!GetParam().use_proxy());
1750*cc02d7e2SAndroid Build Coastguard Worker GPR_ASSERT(GetParam().credentials_type() != kInsecureCredentialsType);
1751*cc02d7e2SAndroid Build Coastguard Worker }
1752*cc02d7e2SAndroid Build Coastguard Worker };
1753*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,SimpleRpcWithHost)1754*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, SimpleRpcWithHost) {
1755*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1756*cc02d7e2SAndroid Build Coastguard Worker
1757*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1758*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1759*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1760*cc02d7e2SAndroid Build Coastguard Worker
1761*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1762*cc02d7e2SAndroid Build Coastguard Worker context.set_authority("foo.test.youtube.com");
1763*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1764*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
1765*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(response.has_param());
1766*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("special", response.param().host());
1767*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1768*cc02d7e2SAndroid Build Coastguard Worker }
1769*cc02d7e2SAndroid Build Coastguard Worker
MetadataContains(const std::multimap<grpc::string_ref,grpc::string_ref> & metadata,const std::string & key,const std::string & value)1770*cc02d7e2SAndroid Build Coastguard Worker bool MetadataContains(
1771*cc02d7e2SAndroid Build Coastguard Worker const std::multimap<grpc::string_ref, grpc::string_ref>& metadata,
1772*cc02d7e2SAndroid Build Coastguard Worker const std::string& key, const std::string& value) {
1773*cc02d7e2SAndroid Build Coastguard Worker int count = 0;
1774*cc02d7e2SAndroid Build Coastguard Worker
1775*cc02d7e2SAndroid Build Coastguard Worker for (std::multimap<grpc::string_ref, grpc::string_ref>::const_iterator iter =
1776*cc02d7e2SAndroid Build Coastguard Worker metadata.begin();
1777*cc02d7e2SAndroid Build Coastguard Worker iter != metadata.end(); ++iter) {
1778*cc02d7e2SAndroid Build Coastguard Worker if (ToString(iter->first) == key && ToString(iter->second) == value) {
1779*cc02d7e2SAndroid Build Coastguard Worker count++;
1780*cc02d7e2SAndroid Build Coastguard Worker }
1781*cc02d7e2SAndroid Build Coastguard Worker }
1782*cc02d7e2SAndroid Build Coastguard Worker return count == 1;
1783*cc02d7e2SAndroid Build Coastguard Worker }
1784*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,BlockingAuthMetadataPluginAndProcessorSuccess)1785*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorSuccess) {
1786*cc02d7e2SAndroid Build Coastguard Worker auto* processor = new TestAuthMetadataProcessor(true);
1787*cc02d7e2SAndroid Build Coastguard Worker StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
1788*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1789*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1790*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1791*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1792*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(processor->GetCompatibleClientCreds());
1793*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1794*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1795*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_expected_client_identity(
1796*cc02d7e2SAndroid Build Coastguard Worker TestAuthMetadataProcessor::kGoodGuy);
1797*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_expected_transport_security_type(
1798*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type());
1799*cc02d7e2SAndroid Build Coastguard Worker
1800*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1801*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
1802*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1803*cc02d7e2SAndroid Build Coastguard Worker
1804*cc02d7e2SAndroid Build Coastguard Worker // Metadata should have been consumed by the processor.
1805*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(MetadataContains(
1806*cc02d7e2SAndroid Build Coastguard Worker context.GetServerTrailingMetadata(), GRPC_AUTHORIZATION_METADATA_KEY,
1807*cc02d7e2SAndroid Build Coastguard Worker std::string("Bearer ") + TestAuthMetadataProcessor::kGoodGuy));
1808*cc02d7e2SAndroid Build Coastguard Worker }
1809*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,BlockingAuthMetadataPluginAndProcessorFailure)1810*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginAndProcessorFailure) {
1811*cc02d7e2SAndroid Build Coastguard Worker auto* processor = new TestAuthMetadataProcessor(true);
1812*cc02d7e2SAndroid Build Coastguard Worker StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
1813*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1814*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1815*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1816*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1817*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(processor->GetIncompatibleClientCreds());
1818*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1819*cc02d7e2SAndroid Build Coastguard Worker
1820*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1821*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1822*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAUTHENTICATED);
1823*cc02d7e2SAndroid Build Coastguard Worker }
1824*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,SetPerCallCredentials)1825*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, SetPerCallCredentials) {
1826*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1827*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1828*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1829*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1830*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> creds =
1831*cc02d7e2SAndroid Build Coastguard Worker GoogleIAMCredentials(kFakeToken, kFakeSelector);
1832*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(creds);
1833*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1834*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1835*cc02d7e2SAndroid Build Coastguard Worker
1836*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1837*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
1838*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1839*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1840*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
1841*cc02d7e2SAndroid Build Coastguard Worker kFakeToken));
1842*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1843*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
1844*cc02d7e2SAndroid Build Coastguard Worker kFakeSelector));
1845*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1846*cc02d7e2SAndroid Build Coastguard Worker kExpectedFakeCredsDebugString);
1847*cc02d7e2SAndroid Build Coastguard Worker }
1848*cc02d7e2SAndroid Build Coastguard Worker
1849*cc02d7e2SAndroid Build Coastguard Worker class CredentialsInterceptor : public experimental::Interceptor {
1850*cc02d7e2SAndroid Build Coastguard Worker public:
CredentialsInterceptor(experimental::ClientRpcInfo * info)1851*cc02d7e2SAndroid Build Coastguard Worker explicit CredentialsInterceptor(experimental::ClientRpcInfo* info)
1852*cc02d7e2SAndroid Build Coastguard Worker : info_(info) {}
1853*cc02d7e2SAndroid Build Coastguard Worker
Intercept(experimental::InterceptorBatchMethods * methods)1854*cc02d7e2SAndroid Build Coastguard Worker void Intercept(experimental::InterceptorBatchMethods* methods) override {
1855*cc02d7e2SAndroid Build Coastguard Worker if (methods->QueryInterceptionHookPoint(
1856*cc02d7e2SAndroid Build Coastguard Worker experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
1857*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> creds =
1858*cc02d7e2SAndroid Build Coastguard Worker GoogleIAMCredentials(kFakeToken, kFakeSelector);
1859*cc02d7e2SAndroid Build Coastguard Worker info_->client_context()->set_credentials(creds);
1860*cc02d7e2SAndroid Build Coastguard Worker }
1861*cc02d7e2SAndroid Build Coastguard Worker methods->Proceed();
1862*cc02d7e2SAndroid Build Coastguard Worker }
1863*cc02d7e2SAndroid Build Coastguard Worker
1864*cc02d7e2SAndroid Build Coastguard Worker private:
1865*cc02d7e2SAndroid Build Coastguard Worker experimental::ClientRpcInfo* info_ = nullptr;
1866*cc02d7e2SAndroid Build Coastguard Worker };
1867*cc02d7e2SAndroid Build Coastguard Worker
1868*cc02d7e2SAndroid Build Coastguard Worker class CredentialsInterceptorFactory
1869*cc02d7e2SAndroid Build Coastguard Worker : public experimental::ClientInterceptorFactoryInterface {
CreateClientInterceptor(experimental::ClientRpcInfo * info)1870*cc02d7e2SAndroid Build Coastguard Worker CredentialsInterceptor* CreateClientInterceptor(
1871*cc02d7e2SAndroid Build Coastguard Worker experimental::ClientRpcInfo* info) override {
1872*cc02d7e2SAndroid Build Coastguard Worker return new CredentialsInterceptor(info);
1873*cc02d7e2SAndroid Build Coastguard Worker }
1874*cc02d7e2SAndroid Build Coastguard Worker };
1875*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,CallCredentialsInterception)1876*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, CallCredentialsInterception) {
1877*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().use_interceptors()) {
1878*cc02d7e2SAndroid Build Coastguard Worker return;
1879*cc02d7e2SAndroid Build Coastguard Worker }
1880*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
1881*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators;
1882*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators.push_back(
1883*cc02d7e2SAndroid Build Coastguard Worker std::make_unique<CredentialsInterceptorFactory>());
1884*cc02d7e2SAndroid Build Coastguard Worker ResetStub(std::move(interceptor_creators));
1885*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1886*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1887*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1888*cc02d7e2SAndroid Build Coastguard Worker
1889*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1890*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1891*cc02d7e2SAndroid Build Coastguard Worker
1892*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1893*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
1894*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1895*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1896*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
1897*cc02d7e2SAndroid Build Coastguard Worker kFakeToken));
1898*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1899*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
1900*cc02d7e2SAndroid Build Coastguard Worker kFakeSelector));
1901*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1902*cc02d7e2SAndroid Build Coastguard Worker kExpectedFakeCredsDebugString);
1903*cc02d7e2SAndroid Build Coastguard Worker }
1904*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,CallCredentialsInterceptionWithSetCredentials)1905*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, CallCredentialsInterceptionWithSetCredentials) {
1906*cc02d7e2SAndroid Build Coastguard Worker if (!GetParam().use_interceptors()) {
1907*cc02d7e2SAndroid Build Coastguard Worker return;
1908*cc02d7e2SAndroid Build Coastguard Worker }
1909*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
1910*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators;
1911*cc02d7e2SAndroid Build Coastguard Worker interceptor_creators.push_back(
1912*cc02d7e2SAndroid Build Coastguard Worker std::make_unique<CredentialsInterceptorFactory>());
1913*cc02d7e2SAndroid Build Coastguard Worker ResetStub(std::move(interceptor_creators));
1914*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1915*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1916*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1917*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> creds1 =
1918*cc02d7e2SAndroid Build Coastguard Worker GoogleIAMCredentials(kWrongToken, kWrongSelector);
1919*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(creds1);
1920*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials(), creds1);
1921*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1922*cc02d7e2SAndroid Build Coastguard Worker kExpectedWrongCredsDebugString);
1923*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1924*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1925*cc02d7e2SAndroid Build Coastguard Worker
1926*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1927*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
1928*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1929*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1930*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
1931*cc02d7e2SAndroid Build Coastguard Worker kFakeToken));
1932*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1933*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
1934*cc02d7e2SAndroid Build Coastguard Worker kFakeSelector));
1935*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1936*cc02d7e2SAndroid Build Coastguard Worker kExpectedFakeCredsDebugString);
1937*cc02d7e2SAndroid Build Coastguard Worker }
1938*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,OverridePerCallCredentials)1939*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, OverridePerCallCredentials) {
1940*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1941*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1942*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1943*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1944*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> creds1 =
1945*cc02d7e2SAndroid Build Coastguard Worker GoogleIAMCredentials(kFakeToken1, kFakeSelector1);
1946*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(creds1);
1947*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials(), creds1);
1948*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1949*cc02d7e2SAndroid Build Coastguard Worker kExpectedFakeCreds1DebugString);
1950*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<CallCredentials> creds2 =
1951*cc02d7e2SAndroid Build Coastguard Worker GoogleIAMCredentials(kFakeToken2, kFakeSelector2);
1952*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(creds2);
1953*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials(), creds2);
1954*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1955*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
1956*cc02d7e2SAndroid Build Coastguard Worker
1957*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1958*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1959*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
1960*cc02d7e2SAndroid Build Coastguard Worker kFakeToken2));
1961*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
1962*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
1963*cc02d7e2SAndroid Build Coastguard Worker kFakeSelector2));
1964*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(),
1965*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
1966*cc02d7e2SAndroid Build Coastguard Worker kFakeToken1));
1967*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(),
1968*cc02d7e2SAndroid Build Coastguard Worker GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
1969*cc02d7e2SAndroid Build Coastguard Worker kFakeSelector1));
1970*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1971*cc02d7e2SAndroid Build Coastguard Worker kExpectedFakeCreds2DebugString);
1972*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
1973*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
1974*cc02d7e2SAndroid Build Coastguard Worker }
1975*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,AuthMetadataPluginKeyFailure)1976*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, AuthMetadataPluginKeyFailure) {
1977*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1978*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1979*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
1980*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
1981*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
1982*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
1983*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
1984*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kBadMetadataKey,
1985*cc02d7e2SAndroid Build Coastguard Worker "Does not matter, will fail the key is invalid.", false, true,
1986*cc02d7e2SAndroid Build Coastguard Worker 0))));
1987*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
1988*cc02d7e2SAndroid Build Coastguard Worker
1989*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
1990*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
1991*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAVAILABLE);
1992*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
1993*cc02d7e2SAndroid Build Coastguard Worker kExpectedAuthMetadataPluginKeyFailureCredsDebugString);
1994*cc02d7e2SAndroid Build Coastguard Worker }
1995*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,AuthMetadataPluginValueFailure)1996*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, AuthMetadataPluginValueFailure) {
1997*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
1998*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
1999*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2000*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2001*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
2002*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2003*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
2004*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kGoodMetadataKey,
2005*cc02d7e2SAndroid Build Coastguard Worker "With illegal \n value.", false, true, 0))));
2006*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2007*cc02d7e2SAndroid Build Coastguard Worker
2008*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2009*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
2010*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAVAILABLE);
2011*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2012*cc02d7e2SAndroid Build Coastguard Worker kExpectedAuthMetadataPluginValueFailureCredsDebugString);
2013*cc02d7e2SAndroid Build Coastguard Worker }
2014*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,AuthMetadataPluginWithDeadline)2015*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, AuthMetadataPluginWithDeadline) {
2016*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2017*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2018*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_skip_cancelled_check(true);
2019*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2020*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2021*cc02d7e2SAndroid Build Coastguard Worker const int delay = 100;
2022*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::time_point deadline =
2023*cc02d7e2SAndroid Build Coastguard Worker std::chrono::system_clock::now() + std::chrono::milliseconds(delay);
2024*cc02d7e2SAndroid Build Coastguard Worker context.set_deadline(deadline);
2025*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
2026*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2027*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin("meta_key", "Does not matter", true,
2028*cc02d7e2SAndroid Build Coastguard Worker true, delay))));
2029*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2030*cc02d7e2SAndroid Build Coastguard Worker
2031*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2032*cc02d7e2SAndroid Build Coastguard Worker if (!s.ok()) {
2033*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.error_code() == StatusCode::DEADLINE_EXCEEDED ||
2034*cc02d7e2SAndroid Build Coastguard Worker s.error_code() == StatusCode::UNAVAILABLE);
2035*cc02d7e2SAndroid Build Coastguard Worker }
2036*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2037*cc02d7e2SAndroid Build Coastguard Worker kExpectedAuthMetadataPluginWithDeadlineCredsDebugString);
2038*cc02d7e2SAndroid Build Coastguard Worker }
2039*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,AuthMetadataPluginWithCancel)2040*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, AuthMetadataPluginWithCancel) {
2041*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2042*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2043*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_skip_cancelled_check(true);
2044*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2045*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2046*cc02d7e2SAndroid Build Coastguard Worker const int delay = 100;
2047*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
2048*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2049*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin("meta_key", "Does not matter", true,
2050*cc02d7e2SAndroid Build Coastguard Worker true, delay))));
2051*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2052*cc02d7e2SAndroid Build Coastguard Worker
2053*cc02d7e2SAndroid Build Coastguard Worker std::thread cancel_thread([&] {
2054*cc02d7e2SAndroid Build Coastguard Worker gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
2055*cc02d7e2SAndroid Build Coastguard Worker gpr_time_from_millis(delay, GPR_TIMESPAN)));
2056*cc02d7e2SAndroid Build Coastguard Worker context.TryCancel();
2057*cc02d7e2SAndroid Build Coastguard Worker });
2058*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2059*cc02d7e2SAndroid Build Coastguard Worker if (!s.ok()) {
2060*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.error_code() == StatusCode::CANCELLED ||
2061*cc02d7e2SAndroid Build Coastguard Worker s.error_code() == StatusCode::UNAVAILABLE);
2062*cc02d7e2SAndroid Build Coastguard Worker }
2063*cc02d7e2SAndroid Build Coastguard Worker cancel_thread.join();
2064*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2065*cc02d7e2SAndroid Build Coastguard Worker kExpectedAuthMetadataPluginWithDeadlineCredsDebugString);
2066*cc02d7e2SAndroid Build Coastguard Worker }
2067*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,NonBlockingAuthMetadataPluginFailure)2068*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginFailure) {
2069*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2070*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2071*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2072*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2073*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
2074*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2075*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
2076*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kGoodMetadataKey,
2077*cc02d7e2SAndroid Build Coastguard Worker "Does not matter, will fail anyway (see 3rd param)", false, false,
2078*cc02d7e2SAndroid Build Coastguard Worker 0))));
2079*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2080*cc02d7e2SAndroid Build Coastguard Worker
2081*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2082*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
2083*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAVAILABLE);
2084*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_message(),
2085*cc02d7e2SAndroid Build Coastguard Worker std::string("Getting metadata from plugin failed with error: ") +
2086*cc02d7e2SAndroid Build Coastguard Worker kTestCredsPluginErrorMsg);
2087*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2088*cc02d7e2SAndroid Build Coastguard Worker kExpectedNonBlockingAuthMetadataPluginFailureCredsDebugString);
2089*cc02d7e2SAndroid Build Coastguard Worker }
2090*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,NonBlockingAuthMetadataPluginAndProcessorSuccess)2091*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorSuccess) {
2092*cc02d7e2SAndroid Build Coastguard Worker auto* processor = new TestAuthMetadataProcessor(false);
2093*cc02d7e2SAndroid Build Coastguard Worker StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
2094*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2095*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2096*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2097*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2098*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(processor->GetCompatibleClientCreds());
2099*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2100*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
2101*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_expected_client_identity(
2102*cc02d7e2SAndroid Build Coastguard Worker TestAuthMetadataProcessor::kGoodGuy);
2103*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_expected_transport_security_type(
2104*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type());
2105*cc02d7e2SAndroid Build Coastguard Worker
2106*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2107*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request.message(), response.message());
2108*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
2109*cc02d7e2SAndroid Build Coastguard Worker
2110*cc02d7e2SAndroid Build Coastguard Worker // Metadata should have been consumed by the processor.
2111*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(MetadataContains(
2112*cc02d7e2SAndroid Build Coastguard Worker context.GetServerTrailingMetadata(), GRPC_AUTHORIZATION_METADATA_KEY,
2113*cc02d7e2SAndroid Build Coastguard Worker std::string("Bearer ") + TestAuthMetadataProcessor::kGoodGuy));
2114*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(
2115*cc02d7e2SAndroid Build Coastguard Worker context.credentials()->DebugString(),
2116*cc02d7e2SAndroid Build Coastguard Worker kExpectedNonBlockingAuthMetadataPluginAndProcessorSuccessCredsDebugString);
2117*cc02d7e2SAndroid Build Coastguard Worker }
2118*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,NonBlockingAuthMetadataPluginAndProcessorFailure)2119*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, NonBlockingAuthMetadataPluginAndProcessorFailure) {
2120*cc02d7e2SAndroid Build Coastguard Worker auto* processor = new TestAuthMetadataProcessor(false);
2121*cc02d7e2SAndroid Build Coastguard Worker StartServer(std::shared_ptr<AuthMetadataProcessor>(processor));
2122*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2123*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2124*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2125*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2126*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(processor->GetIncompatibleClientCreds());
2127*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2128*cc02d7e2SAndroid Build Coastguard Worker
2129*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2130*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
2131*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAUTHENTICATED);
2132*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(
2133*cc02d7e2SAndroid Build Coastguard Worker context.credentials()->DebugString(),
2134*cc02d7e2SAndroid Build Coastguard Worker kExpectedNonBlockingAuthMetadataPluginAndProcessorFailureCredsDebugString);
2135*cc02d7e2SAndroid Build Coastguard Worker }
2136*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,BlockingAuthMetadataPluginFailure)2137*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, BlockingAuthMetadataPluginFailure) {
2138*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2139*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2140*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2141*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2142*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::MetadataCredentialsFromPlugin(
2143*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2144*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(
2145*cc02d7e2SAndroid Build Coastguard Worker TestMetadataCredentialsPlugin::kGoodMetadataKey,
2146*cc02d7e2SAndroid Build Coastguard Worker "Does not matter, will fail anyway (see 3rd param)", true, false,
2147*cc02d7e2SAndroid Build Coastguard Worker 0))));
2148*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2149*cc02d7e2SAndroid Build Coastguard Worker
2150*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2151*cc02d7e2SAndroid Build Coastguard Worker EXPECT_FALSE(s.ok());
2152*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_code(), StatusCode::UNAVAILABLE);
2153*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(s.error_message(),
2154*cc02d7e2SAndroid Build Coastguard Worker std::string("Getting metadata from plugin failed with error: ") +
2155*cc02d7e2SAndroid Build Coastguard Worker kTestCredsPluginErrorMsg);
2156*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2157*cc02d7e2SAndroid Build Coastguard Worker kExpectedBlockingAuthMetadataPluginFailureCredsDebugString);
2158*cc02d7e2SAndroid Build Coastguard Worker }
2159*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,CompositeCallCreds)2160*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, CompositeCallCreds) {
2161*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2162*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2163*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2164*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2165*cc02d7e2SAndroid Build Coastguard Worker const char kMetadataKey1[] = "call-creds-key1";
2166*cc02d7e2SAndroid Build Coastguard Worker const char kMetadataKey2[] = "call-creds-key2";
2167*cc02d7e2SAndroid Build Coastguard Worker const char kMetadataVal1[] = "call-creds-val1";
2168*cc02d7e2SAndroid Build Coastguard Worker const char kMetadataVal2[] = "call-creds-val2";
2169*cc02d7e2SAndroid Build Coastguard Worker
2170*cc02d7e2SAndroid Build Coastguard Worker context.set_credentials(grpc::CompositeCallCredentials(
2171*cc02d7e2SAndroid Build Coastguard Worker grpc::MetadataCredentialsFromPlugin(
2172*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2173*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(kMetadataKey1, kMetadataVal1,
2174*cc02d7e2SAndroid Build Coastguard Worker true, true, 0))),
2175*cc02d7e2SAndroid Build Coastguard Worker grpc::MetadataCredentialsFromPlugin(
2176*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<MetadataCredentialsPlugin>(
2177*cc02d7e2SAndroid Build Coastguard Worker new TestMetadataCredentialsPlugin(kMetadataKey2, kMetadataVal2,
2178*cc02d7e2SAndroid Build Coastguard Worker true, true, 0)))));
2179*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2180*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_echo_metadata(true);
2181*cc02d7e2SAndroid Build Coastguard Worker
2182*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2183*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
2184*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
2185*cc02d7e2SAndroid Build Coastguard Worker kMetadataKey1, kMetadataVal1));
2186*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
2187*cc02d7e2SAndroid Build Coastguard Worker kMetadataKey2, kMetadataVal2));
2188*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(context.credentials()->DebugString(),
2189*cc02d7e2SAndroid Build Coastguard Worker kExpectedCompositeCallCredsDebugString);
2190*cc02d7e2SAndroid Build Coastguard Worker }
2191*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(SecureEnd2endTest,ClientAuthContext)2192*cc02d7e2SAndroid Build Coastguard Worker TEST_P(SecureEnd2endTest, ClientAuthContext) {
2193*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2194*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2195*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2196*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2197*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_check_auth_context(
2198*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type() == kTlsCredentialsType);
2199*cc02d7e2SAndroid Build Coastguard Worker request.mutable_param()->set_expected_transport_security_type(
2200*cc02d7e2SAndroid Build Coastguard Worker GetParam().credentials_type());
2201*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2202*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2203*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
2204*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
2205*cc02d7e2SAndroid Build Coastguard Worker
2206*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<const AuthContext> auth_ctx = context.auth_context();
2207*cc02d7e2SAndroid Build Coastguard Worker std::vector<grpc::string_ref> tst =
2208*cc02d7e2SAndroid Build Coastguard Worker auth_ctx->FindPropertyValues("transport_security_type");
2209*cc02d7e2SAndroid Build Coastguard Worker ASSERT_EQ(1u, tst.size());
2210*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(GetParam().credentials_type(), ToString(tst[0]));
2211*cc02d7e2SAndroid Build Coastguard Worker if (GetParam().credentials_type() == kTlsCredentialsType) {
2212*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("x509_subject_alternative_name",
2213*cc02d7e2SAndroid Build Coastguard Worker auth_ctx->GetPeerIdentityPropertyName());
2214*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(4u, auth_ctx->GetPeerIdentity().size());
2215*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("*.test.google.fr", ToString(auth_ctx->GetPeerIdentity()[0]));
2216*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("waterzooi.test.google.be",
2217*cc02d7e2SAndroid Build Coastguard Worker ToString(auth_ctx->GetPeerIdentity()[1]));
2218*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("*.test.youtube.com", ToString(auth_ctx->GetPeerIdentity()[2]));
2219*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ("192.168.1.3", ToString(auth_ctx->GetPeerIdentity()[3]));
2220*cc02d7e2SAndroid Build Coastguard Worker }
2221*cc02d7e2SAndroid Build Coastguard Worker }
2222*cc02d7e2SAndroid Build Coastguard Worker
2223*cc02d7e2SAndroid Build Coastguard Worker class ResourceQuotaEnd2endTest : public End2endTest {
2224*cc02d7e2SAndroid Build Coastguard Worker public:
ResourceQuotaEnd2endTest()2225*cc02d7e2SAndroid Build Coastguard Worker ResourceQuotaEnd2endTest()
2226*cc02d7e2SAndroid Build Coastguard Worker : server_resource_quota_("server_resource_quota") {}
2227*cc02d7e2SAndroid Build Coastguard Worker
ConfigureServerBuilder(ServerBuilder * builder)2228*cc02d7e2SAndroid Build Coastguard Worker void ConfigureServerBuilder(ServerBuilder* builder) override {
2229*cc02d7e2SAndroid Build Coastguard Worker builder->SetResourceQuota(server_resource_quota_);
2230*cc02d7e2SAndroid Build Coastguard Worker }
2231*cc02d7e2SAndroid Build Coastguard Worker
2232*cc02d7e2SAndroid Build Coastguard Worker private:
2233*cc02d7e2SAndroid Build Coastguard Worker ResourceQuota server_resource_quota_;
2234*cc02d7e2SAndroid Build Coastguard Worker };
2235*cc02d7e2SAndroid Build Coastguard Worker
TEST_P(ResourceQuotaEnd2endTest,SimpleRequest)2236*cc02d7e2SAndroid Build Coastguard Worker TEST_P(ResourceQuotaEnd2endTest, SimpleRequest) {
2237*cc02d7e2SAndroid Build Coastguard Worker ResetStub();
2238*cc02d7e2SAndroid Build Coastguard Worker
2239*cc02d7e2SAndroid Build Coastguard Worker EchoRequest request;
2240*cc02d7e2SAndroid Build Coastguard Worker EchoResponse response;
2241*cc02d7e2SAndroid Build Coastguard Worker request.set_message("Hello");
2242*cc02d7e2SAndroid Build Coastguard Worker
2243*cc02d7e2SAndroid Build Coastguard Worker ClientContext context;
2244*cc02d7e2SAndroid Build Coastguard Worker Status s = stub_->Echo(&context, request, &response);
2245*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(response.message(), request.message());
2246*cc02d7e2SAndroid Build Coastguard Worker EXPECT_TRUE(s.ok());
2247*cc02d7e2SAndroid Build Coastguard Worker }
2248*cc02d7e2SAndroid Build Coastguard Worker
2249*cc02d7e2SAndroid Build Coastguard Worker // TODO(vjpai): refactor arguments into a struct if it makes sense
CreateTestScenarios(bool use_proxy,bool test_insecure,bool test_secure,bool test_inproc,bool test_callback_server)2250*cc02d7e2SAndroid Build Coastguard Worker std::vector<TestScenario> CreateTestScenarios(bool use_proxy,
2251*cc02d7e2SAndroid Build Coastguard Worker bool test_insecure,
2252*cc02d7e2SAndroid Build Coastguard Worker bool test_secure,
2253*cc02d7e2SAndroid Build Coastguard Worker bool test_inproc,
2254*cc02d7e2SAndroid Build Coastguard Worker bool test_callback_server) {
2255*cc02d7e2SAndroid Build Coastguard Worker std::vector<TestScenario> scenarios;
2256*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> credentials_types;
2257*cc02d7e2SAndroid Build Coastguard Worker
2258*cc02d7e2SAndroid Build Coastguard Worker grpc_core::ConfigVars::Overrides overrides;
2259*cc02d7e2SAndroid Build Coastguard Worker overrides.client_channel_backup_poll_interval_ms =
2260*cc02d7e2SAndroid Build Coastguard Worker kClientChannelBackupPollIntervalMs;
2261*cc02d7e2SAndroid Build Coastguard Worker grpc_core::ConfigVars::SetOverrides(overrides);
2262*cc02d7e2SAndroid Build Coastguard Worker #if TARGET_OS_IPHONE
2263*cc02d7e2SAndroid Build Coastguard Worker // Workaround Apple CFStream bug
2264*cc02d7e2SAndroid Build Coastguard Worker grpc_core::SetEnv("grpc_cfstream", "0");
2265*cc02d7e2SAndroid Build Coastguard Worker #endif
2266*cc02d7e2SAndroid Build Coastguard Worker
2267*cc02d7e2SAndroid Build Coastguard Worker if (test_secure) {
2268*cc02d7e2SAndroid Build Coastguard Worker credentials_types =
2269*cc02d7e2SAndroid Build Coastguard Worker GetCredentialsProvider()->GetSecureCredentialsTypeList();
2270*cc02d7e2SAndroid Build Coastguard Worker }
2271*cc02d7e2SAndroid Build Coastguard Worker auto insec_ok = [] {
2272*cc02d7e2SAndroid Build Coastguard Worker // Only allow insecure credentials type when it is registered with the
2273*cc02d7e2SAndroid Build Coastguard Worker // provider. User may create providers that do not have insecure.
2274*cc02d7e2SAndroid Build Coastguard Worker return GetCredentialsProvider()->GetChannelCredentials(
2275*cc02d7e2SAndroid Build Coastguard Worker kInsecureCredentialsType, nullptr) != nullptr;
2276*cc02d7e2SAndroid Build Coastguard Worker };
2277*cc02d7e2SAndroid Build Coastguard Worker if (test_insecure && insec_ok()) {
2278*cc02d7e2SAndroid Build Coastguard Worker credentials_types.push_back(kInsecureCredentialsType);
2279*cc02d7e2SAndroid Build Coastguard Worker }
2280*cc02d7e2SAndroid Build Coastguard Worker
2281*cc02d7e2SAndroid Build Coastguard Worker // Test callback with inproc or if the event-engine allows it
2282*cc02d7e2SAndroid Build Coastguard Worker GPR_ASSERT(!credentials_types.empty());
2283*cc02d7e2SAndroid Build Coastguard Worker for (const auto& cred : credentials_types) {
2284*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(false, false, false, cred, false);
2285*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(true, false, false, cred, false);
2286*cc02d7e2SAndroid Build Coastguard Worker if (test_callback_server) {
2287*cc02d7e2SAndroid Build Coastguard Worker // Note that these scenarios will be dynamically disabled if the event
2288*cc02d7e2SAndroid Build Coastguard Worker // engine doesn't run in the background
2289*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(false, false, false, cred, true);
2290*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(true, false, false, cred, true);
2291*cc02d7e2SAndroid Build Coastguard Worker }
2292*cc02d7e2SAndroid Build Coastguard Worker if (use_proxy) {
2293*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(false, true, false, cred, false);
2294*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(true, true, false, cred, false);
2295*cc02d7e2SAndroid Build Coastguard Worker }
2296*cc02d7e2SAndroid Build Coastguard Worker }
2297*cc02d7e2SAndroid Build Coastguard Worker if (test_inproc && insec_ok()) {
2298*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(false, false, true, kInsecureCredentialsType, false);
2299*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(true, false, true, kInsecureCredentialsType, false);
2300*cc02d7e2SAndroid Build Coastguard Worker if (test_callback_server) {
2301*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(false, false, true, kInsecureCredentialsType,
2302*cc02d7e2SAndroid Build Coastguard Worker true);
2303*cc02d7e2SAndroid Build Coastguard Worker scenarios.emplace_back(true, false, true, kInsecureCredentialsType, true);
2304*cc02d7e2SAndroid Build Coastguard Worker }
2305*cc02d7e2SAndroid Build Coastguard Worker }
2306*cc02d7e2SAndroid Build Coastguard Worker return scenarios;
2307*cc02d7e2SAndroid Build Coastguard Worker }
2308*cc02d7e2SAndroid Build Coastguard Worker
2309*cc02d7e2SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2310*cc02d7e2SAndroid Build Coastguard Worker End2end, End2endTest,
2311*cc02d7e2SAndroid Build Coastguard Worker ::testing::ValuesIn(CreateTestScenarios(false, true, true, true, true)),
2312*cc02d7e2SAndroid Build Coastguard Worker &TestScenario::Name);
2313*cc02d7e2SAndroid Build Coastguard Worker
2314*cc02d7e2SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2315*cc02d7e2SAndroid Build Coastguard Worker End2endServerTryCancel, End2endServerTryCancelTest,
2316*cc02d7e2SAndroid Build Coastguard Worker ::testing::ValuesIn(CreateTestScenarios(false, true, true, true, true)),
2317*cc02d7e2SAndroid Build Coastguard Worker &TestScenario::Name);
2318*cc02d7e2SAndroid Build Coastguard Worker
2319*cc02d7e2SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2320*cc02d7e2SAndroid Build Coastguard Worker ProxyEnd2end, ProxyEnd2endTest,
2321*cc02d7e2SAndroid Build Coastguard Worker ::testing::ValuesIn(CreateTestScenarios(true, true, true, true, true)),
2322*cc02d7e2SAndroid Build Coastguard Worker &TestScenario::Name);
2323*cc02d7e2SAndroid Build Coastguard Worker
2324*cc02d7e2SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2325*cc02d7e2SAndroid Build Coastguard Worker SecureEnd2end, SecureEnd2endTest,
2326*cc02d7e2SAndroid Build Coastguard Worker ::testing::ValuesIn(CreateTestScenarios(false, false, true, false, true)),
2327*cc02d7e2SAndroid Build Coastguard Worker &TestScenario::Name);
2328*cc02d7e2SAndroid Build Coastguard Worker
2329*cc02d7e2SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
2330*cc02d7e2SAndroid Build Coastguard Worker ResourceQuotaEnd2end, ResourceQuotaEnd2endTest,
2331*cc02d7e2SAndroid Build Coastguard Worker ::testing::ValuesIn(CreateTestScenarios(false, true, true, true, true)),
2332*cc02d7e2SAndroid Build Coastguard Worker &TestScenario::Name);
2333*cc02d7e2SAndroid Build Coastguard Worker
2334*cc02d7e2SAndroid Build Coastguard Worker } // namespace
2335*cc02d7e2SAndroid Build Coastguard Worker } // namespace testing
2336*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc
2337*cc02d7e2SAndroid Build Coastguard Worker
main(int argc,char ** argv)2338*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
2339*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::TestEnvironment env(&argc, argv);
2340*cc02d7e2SAndroid Build Coastguard Worker ::testing::InitGoogleTest(&argc, argv);
2341*cc02d7e2SAndroid Build Coastguard Worker int ret = RUN_ALL_TESTS();
2342*cc02d7e2SAndroid Build Coastguard Worker return ret;
2343*cc02d7e2SAndroid Build Coastguard Worker }
2344