Imported Upstream version 1.28.0
[platform/upstream/grpc.git] / test / cpp / end2end / service_config_end2end_test.cc
1 /*
2  *
3  * Copyright 2016 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18
19 #include <algorithm>
20 #include <memory>
21 #include <mutex>
22 #include <random>
23 #include <set>
24 #include <thread>
25
26 #include <grpc/grpc.h>
27 #include <grpc/support/alloc.h>
28 #include <grpc/support/atm.h>
29 #include <grpc/support/log.h>
30 #include <grpc/support/string_util.h>
31 #include <grpc/support/time.h>
32 #include <grpcpp/channel.h>
33 #include <grpcpp/client_context.h>
34 #include <grpcpp/create_channel.h>
35 #include <grpcpp/health_check_service_interface.h>
36 #include <grpcpp/impl/codegen/sync.h>
37 #include <grpcpp/server.h>
38 #include <grpcpp/server_builder.h>
39 #include <grpcpp/support/validate_service_config.h>
40
41 #include "src/core/ext/filters/client_channel/backup_poller.h"
42 #include "src/core/ext/filters/client_channel/global_subchannel_pool.h"
43 #include "src/core/ext/filters/client_channel/parse_address.h"
44 #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
45 #include "src/core/ext/filters/client_channel/server_address.h"
46 #include "src/core/lib/backoff/backoff.h"
47 #include "src/core/lib/channel/channel_args.h"
48 #include "src/core/lib/gprpp/debug_location.h"
49 #include "src/core/lib/gprpp/ref_counted_ptr.h"
50 #include "src/core/lib/iomgr/tcp_client.h"
51 #include "src/core/lib/security/credentials/fake/fake_credentials.h"
52 #include "src/cpp/client/secure_credentials.h"
53 #include "src/cpp/server/secure_server_credentials.h"
54
55 #include "src/proto/grpc/testing/echo.grpc.pb.h"
56 #include "test/core/util/port.h"
57 #include "test/core/util/test_config.h"
58 #include "test/cpp/end2end/test_service_impl.h"
59
60 #include <gmock/gmock.h>
61 #include <gtest/gtest.h>
62
63 using grpc::testing::EchoRequest;
64 using grpc::testing::EchoResponse;
65 using std::chrono::system_clock;
66
67 namespace grpc {
68 namespace testing {
69 namespace {
70
71 // Subclass of TestServiceImpl that increments a request counter for
72 // every call to the Echo RPC.
73 class MyTestServiceImpl : public TestServiceImpl {
74  public:
75   MyTestServiceImpl() : request_count_(0) {}
76
77   Status Echo(ServerContext* context, const EchoRequest* request,
78               EchoResponse* response) override {
79     {
80       grpc::internal::MutexLock lock(&mu_);
81       ++request_count_;
82     }
83     AddClient(context->peer());
84     return TestServiceImpl::Echo(context, request, response);
85   }
86
87   int request_count() {
88     grpc::internal::MutexLock lock(&mu_);
89     return request_count_;
90   }
91
92   void ResetCounters() {
93     grpc::internal::MutexLock lock(&mu_);
94     request_count_ = 0;
95   }
96
97   std::set<grpc::string> clients() {
98     grpc::internal::MutexLock lock(&clients_mu_);
99     return clients_;
100   }
101
102  private:
103   void AddClient(const grpc::string& client) {
104     grpc::internal::MutexLock lock(&clients_mu_);
105     clients_.insert(client);
106   }
107
108   grpc::internal::Mutex mu_;
109   int request_count_;
110   grpc::internal::Mutex clients_mu_;
111   std::set<grpc::string> clients_;
112 };
113
114 class ServiceConfigEnd2endTest : public ::testing::Test {
115  protected:
116   ServiceConfigEnd2endTest()
117       : server_host_("localhost"),
118         kRequestMessage_("Live long and prosper."),
119         creds_(new SecureChannelCredentials(
120             grpc_fake_transport_security_credentials_create())) {}
121
122   static void SetUpTestCase() {
123     // Make the backup poller poll very frequently in order to pick up
124     // updates from all the subchannels's FDs.
125     GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);
126   }
127
128   void SetUp() override {
129     grpc_init();
130     response_generator_ =
131         grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
132   }
133
134   void TearDown() override {
135     for (size_t i = 0; i < servers_.size(); ++i) {
136       servers_[i]->Shutdown();
137     }
138     // Explicitly destroy all the members so that we can make sure grpc_shutdown
139     // has finished by the end of this function, and thus all the registered
140     // LB policy factories are removed.
141     stub_.reset();
142     servers_.clear();
143     creds_.reset();
144     grpc_shutdown_blocking();
145   }
146
147   void CreateServers(size_t num_servers,
148                      std::vector<int> ports = std::vector<int>()) {
149     servers_.clear();
150     for (size_t i = 0; i < num_servers; ++i) {
151       int port = 0;
152       if (ports.size() == num_servers) port = ports[i];
153       servers_.emplace_back(new ServerData(port));
154     }
155   }
156
157   void StartServer(size_t index) { servers_[index]->Start(server_host_); }
158
159   void StartServers(size_t num_servers,
160                     std::vector<int> ports = std::vector<int>()) {
161     CreateServers(num_servers, std::move(ports));
162     for (size_t i = 0; i < num_servers; ++i) {
163       StartServer(i);
164     }
165   }
166
167   grpc_core::Resolver::Result BuildFakeResults(const std::vector<int>& ports) {
168     grpc_core::Resolver::Result result;
169     for (const int& port : ports) {
170       char* lb_uri_str;
171       gpr_asprintf(&lb_uri_str, "ipv4:127.0.0.1:%d", port);
172       grpc_uri* lb_uri = grpc_uri_parse(lb_uri_str, true);
173       GPR_ASSERT(lb_uri != nullptr);
174       grpc_resolved_address address;
175       GPR_ASSERT(grpc_parse_uri(lb_uri, &address));
176       result.addresses.emplace_back(address.addr, address.len,
177                                     nullptr /* args */);
178       grpc_uri_destroy(lb_uri);
179       gpr_free(lb_uri_str);
180     }
181     return result;
182   }
183
184   void SetNextResolutionNoServiceConfig(const std::vector<int>& ports) {
185     grpc_core::ExecCtx exec_ctx;
186     grpc_core::Resolver::Result result = BuildFakeResults(ports);
187     response_generator_->SetResponse(result);
188   }
189
190   void SetNextResolutionValidServiceConfig(const std::vector<int>& ports) {
191     grpc_core::ExecCtx exec_ctx;
192     grpc_core::Resolver::Result result = BuildFakeResults(ports);
193     result.service_config =
194         grpc_core::ServiceConfig::Create("{}", &result.service_config_error);
195     response_generator_->SetResponse(result);
196   }
197
198   void SetNextResolutionInvalidServiceConfig(const std::vector<int>& ports) {
199     grpc_core::ExecCtx exec_ctx;
200     grpc_core::Resolver::Result result = BuildFakeResults(ports);
201     result.service_config =
202         grpc_core::ServiceConfig::Create("{", &result.service_config_error);
203     response_generator_->SetResponse(result);
204   }
205
206   void SetNextResolutionWithServiceConfig(const std::vector<int>& ports,
207                                           const char* svc_cfg) {
208     grpc_core::ExecCtx exec_ctx;
209     grpc_core::Resolver::Result result = BuildFakeResults(ports);
210     result.service_config =
211         grpc_core::ServiceConfig::Create(svc_cfg, &result.service_config_error);
212     response_generator_->SetResponse(result);
213   }
214
215   std::vector<int> GetServersPorts(size_t start_index = 0) {
216     std::vector<int> ports;
217     for (size_t i = start_index; i < servers_.size(); ++i) {
218       ports.push_back(servers_[i]->port_);
219     }
220     return ports;
221   }
222
223   std::unique_ptr<grpc::testing::EchoTestService::Stub> BuildStub(
224       const std::shared_ptr<Channel>& channel) {
225     return grpc::testing::EchoTestService::NewStub(channel);
226   }
227
228   std::shared_ptr<Channel> BuildChannel() {
229     ChannelArguments args;
230     args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
231                     response_generator_.get());
232     return ::grpc::CreateCustomChannel("fake:///", creds_, args);
233   }
234
235   std::shared_ptr<Channel> BuildChannelWithDefaultServiceConfig() {
236     ChannelArguments args;
237     EXPECT_THAT(grpc::experimental::ValidateServiceConfigJSON(
238                     ValidDefaultServiceConfig()),
239                 ::testing::StrEq(""));
240     args.SetServiceConfigJSON(ValidDefaultServiceConfig());
241     args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
242                     response_generator_.get());
243     return ::grpc::CreateCustomChannel("fake:///", creds_, args);
244   }
245
246   std::shared_ptr<Channel> BuildChannelWithInvalidDefaultServiceConfig() {
247     ChannelArguments args;
248     EXPECT_THAT(grpc::experimental::ValidateServiceConfigJSON(
249                     InvalidDefaultServiceConfig()),
250                 ::testing::HasSubstr("JSON parse error"));
251     args.SetServiceConfigJSON(InvalidDefaultServiceConfig());
252     args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
253                     response_generator_.get());
254     return ::grpc::CreateCustomChannel("fake:///", creds_, args);
255   }
256
257   bool SendRpc(
258       const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub,
259       EchoResponse* response = nullptr, int timeout_ms = 1000,
260       Status* result = nullptr, bool wait_for_ready = false) {
261     const bool local_response = (response == nullptr);
262     if (local_response) response = new EchoResponse;
263     EchoRequest request;
264     request.set_message(kRequestMessage_);
265     ClientContext context;
266     context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms));
267     if (wait_for_ready) context.set_wait_for_ready(true);
268     Status status = stub->Echo(&context, request, response);
269     if (result != nullptr) *result = status;
270     if (local_response) delete response;
271     return status.ok();
272   }
273
274   void CheckRpcSendOk(
275       const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub,
276       const grpc_core::DebugLocation& location, bool wait_for_ready = false) {
277     EchoResponse response;
278     Status status;
279     const bool success =
280         SendRpc(stub, &response, 2000, &status, wait_for_ready);
281     ASSERT_TRUE(success) << "From " << location.file() << ":" << location.line()
282                          << "\n"
283                          << "Error: " << status.error_message() << " "
284                          << status.error_details();
285     ASSERT_EQ(response.message(), kRequestMessage_)
286         << "From " << location.file() << ":" << location.line();
287     if (!success) abort();
288   }
289
290   void CheckRpcSendFailure(
291       const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub) {
292     const bool success = SendRpc(stub);
293     EXPECT_FALSE(success);
294   }
295
296   struct ServerData {
297     int port_;
298     std::unique_ptr<Server> server_;
299     MyTestServiceImpl service_;
300     std::unique_ptr<std::thread> thread_;
301     bool server_ready_ = false;
302     bool started_ = false;
303
304     explicit ServerData(int port = 0) {
305       port_ = port > 0 ? port : grpc_pick_unused_port_or_die();
306     }
307
308     void Start(const grpc::string& server_host) {
309       gpr_log(GPR_INFO, "starting server on port %d", port_);
310       started_ = true;
311       grpc::internal::Mutex mu;
312       grpc::internal::MutexLock lock(&mu);
313       grpc::internal::CondVar cond;
314       thread_.reset(new std::thread(
315           std::bind(&ServerData::Serve, this, server_host, &mu, &cond)));
316       cond.WaitUntil(&mu, [this] { return server_ready_; });
317       server_ready_ = false;
318       gpr_log(GPR_INFO, "server startup complete");
319     }
320
321     void Serve(const grpc::string& server_host, grpc::internal::Mutex* mu,
322                grpc::internal::CondVar* cond) {
323       std::ostringstream server_address;
324       server_address << server_host << ":" << port_;
325       ServerBuilder builder;
326       std::shared_ptr<ServerCredentials> creds(new SecureServerCredentials(
327           grpc_fake_transport_security_server_credentials_create()));
328       builder.AddListeningPort(server_address.str(), std::move(creds));
329       builder.RegisterService(&service_);
330       server_ = builder.BuildAndStart();
331       grpc::internal::MutexLock lock(mu);
332       server_ready_ = true;
333       cond->Signal();
334     }
335
336     void Shutdown() {
337       if (!started_) return;
338       server_->Shutdown(grpc_timeout_milliseconds_to_deadline(0));
339       thread_->join();
340       started_ = false;
341     }
342
343     void SetServingStatus(const grpc::string& service, bool serving) {
344       server_->GetHealthCheckService()->SetServingStatus(service, serving);
345     }
346   };
347
348   void ResetCounters() {
349     for (const auto& server : servers_) server->service_.ResetCounters();
350   }
351
352   void WaitForServer(
353       const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub,
354       size_t server_idx, const grpc_core::DebugLocation& location,
355       bool ignore_failure = false) {
356     do {
357       if (ignore_failure) {
358         SendRpc(stub);
359       } else {
360         CheckRpcSendOk(stub, location, true);
361       }
362     } while (servers_[server_idx]->service_.request_count() == 0);
363     ResetCounters();
364   }
365
366   bool WaitForChannelNotReady(Channel* channel, int timeout_seconds = 5) {
367     const gpr_timespec deadline =
368         grpc_timeout_seconds_to_deadline(timeout_seconds);
369     grpc_connectivity_state state;
370     while ((state = channel->GetState(false /* try_to_connect */)) ==
371            GRPC_CHANNEL_READY) {
372       if (!channel->WaitForStateChange(state, deadline)) return false;
373     }
374     return true;
375   }
376
377   bool WaitForChannelReady(Channel* channel, int timeout_seconds = 5) {
378     const gpr_timespec deadline =
379         grpc_timeout_seconds_to_deadline(timeout_seconds);
380     grpc_connectivity_state state;
381     while ((state = channel->GetState(true /* try_to_connect */)) !=
382            GRPC_CHANNEL_READY) {
383       if (!channel->WaitForStateChange(state, deadline)) return false;
384     }
385     return true;
386   }
387
388   bool SeenAllServers() {
389     for (const auto& server : servers_) {
390       if (server->service_.request_count() == 0) return false;
391     }
392     return true;
393   }
394
395   // Updates \a connection_order by appending to it the index of the newly
396   // connected server. Must be called after every single RPC.
397   void UpdateConnectionOrder(
398       const std::vector<std::unique_ptr<ServerData>>& servers,
399       std::vector<int>* connection_order) {
400     for (size_t i = 0; i < servers.size(); ++i) {
401       if (servers[i]->service_.request_count() == 1) {
402         // Was the server index known? If not, update connection_order.
403         const auto it =
404             std::find(connection_order->begin(), connection_order->end(), i);
405         if (it == connection_order->end()) {
406           connection_order->push_back(i);
407           return;
408         }
409       }
410     }
411   }
412
413   const char* ValidServiceConfigV1() { return "{\"version\": \"1\"}"; }
414
415   const char* ValidServiceConfigV2() { return "{\"version\": \"2\"}"; }
416
417   const char* ValidDefaultServiceConfig() {
418     return "{\"version\": \"valid_default\"}";
419   }
420
421   const char* InvalidDefaultServiceConfig() {
422     return "{\"version\": \"invalid_default\"";
423   }
424
425   const grpc::string server_host_;
426   std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
427   std::vector<std::unique_ptr<ServerData>> servers_;
428   grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
429       response_generator_;
430   const grpc::string kRequestMessage_;
431   std::shared_ptr<ChannelCredentials> creds_;
432 };
433
434 TEST_F(ServiceConfigEnd2endTest, NoServiceConfigTest) {
435   StartServers(1);
436   auto channel = BuildChannel();
437   auto stub = BuildStub(channel);
438   SetNextResolutionNoServiceConfig(GetServersPorts());
439   CheckRpcSendOk(stub, DEBUG_LOCATION);
440   EXPECT_STREQ("", channel->GetServiceConfigJSON().c_str());
441 }
442
443 TEST_F(ServiceConfigEnd2endTest, NoServiceConfigWithDefaultConfigTest) {
444   StartServers(1);
445   auto channel = BuildChannelWithDefaultServiceConfig();
446   auto stub = BuildStub(channel);
447   SetNextResolutionNoServiceConfig(GetServersPorts());
448   CheckRpcSendOk(stub, DEBUG_LOCATION);
449   EXPECT_STREQ(ValidDefaultServiceConfig(),
450                channel->GetServiceConfigJSON().c_str());
451 }
452
453 TEST_F(ServiceConfigEnd2endTest, InvalidServiceConfigTest) {
454   StartServers(1);
455   auto channel = BuildChannel();
456   auto stub = BuildStub(channel);
457   SetNextResolutionInvalidServiceConfig(GetServersPorts());
458   CheckRpcSendFailure(stub);
459 }
460
461 TEST_F(ServiceConfigEnd2endTest, InvalidServiceConfigWithDefaultConfigTest) {
462   StartServers(1);
463   auto channel = BuildChannelWithDefaultServiceConfig();
464   auto stub = BuildStub(channel);
465   SetNextResolutionInvalidServiceConfig(GetServersPorts());
466   CheckRpcSendOk(stub, DEBUG_LOCATION);
467   EXPECT_STREQ(ValidDefaultServiceConfig(),
468                channel->GetServiceConfigJSON().c_str());
469 }
470
471 TEST_F(ServiceConfigEnd2endTest, ValidServiceConfigUpdatesTest) {
472   StartServers(1);
473   auto channel = BuildChannel();
474   auto stub = BuildStub(channel);
475   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV1());
476   CheckRpcSendOk(stub, DEBUG_LOCATION);
477   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
478   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV2());
479   CheckRpcSendOk(stub, DEBUG_LOCATION);
480   EXPECT_STREQ(ValidServiceConfigV2(), channel->GetServiceConfigJSON().c_str());
481 }
482
483 TEST_F(ServiceConfigEnd2endTest,
484        NoServiceConfigUpdateAfterValidServiceConfigTest) {
485   StartServers(1);
486   auto channel = BuildChannel();
487   auto stub = BuildStub(channel);
488   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV1());
489   CheckRpcSendOk(stub, DEBUG_LOCATION);
490   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
491   SetNextResolutionNoServiceConfig(GetServersPorts());
492   CheckRpcSendOk(stub, DEBUG_LOCATION);
493   EXPECT_STREQ("", channel->GetServiceConfigJSON().c_str());
494 }
495
496 TEST_F(ServiceConfigEnd2endTest,
497        NoServiceConfigUpdateAfterValidServiceConfigWithDefaultConfigTest) {
498   StartServers(1);
499   auto channel = BuildChannelWithDefaultServiceConfig();
500   auto stub = BuildStub(channel);
501   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV1());
502   CheckRpcSendOk(stub, DEBUG_LOCATION);
503   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
504   SetNextResolutionNoServiceConfig(GetServersPorts());
505   CheckRpcSendOk(stub, DEBUG_LOCATION);
506   EXPECT_STREQ(ValidDefaultServiceConfig(),
507                channel->GetServiceConfigJSON().c_str());
508 }
509
510 TEST_F(ServiceConfigEnd2endTest,
511        InvalidServiceConfigUpdateAfterValidServiceConfigTest) {
512   StartServers(1);
513   auto channel = BuildChannel();
514   auto stub = BuildStub(channel);
515   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV1());
516   CheckRpcSendOk(stub, DEBUG_LOCATION);
517   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
518   SetNextResolutionInvalidServiceConfig(GetServersPorts());
519   CheckRpcSendOk(stub, DEBUG_LOCATION);
520   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
521 }
522
523 TEST_F(ServiceConfigEnd2endTest,
524        InvalidServiceConfigUpdateAfterValidServiceConfigWithDefaultConfigTest) {
525   StartServers(1);
526   auto channel = BuildChannelWithDefaultServiceConfig();
527   auto stub = BuildStub(channel);
528   SetNextResolutionWithServiceConfig(GetServersPorts(), ValidServiceConfigV1());
529   CheckRpcSendOk(stub, DEBUG_LOCATION);
530   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
531   SetNextResolutionInvalidServiceConfig(GetServersPorts());
532   CheckRpcSendOk(stub, DEBUG_LOCATION);
533   EXPECT_STREQ(ValidServiceConfigV1(), channel->GetServiceConfigJSON().c_str());
534 }
535
536 TEST_F(ServiceConfigEnd2endTest,
537        ValidServiceConfigAfterInvalidServiceConfigTest) {
538   StartServers(1);
539   auto channel = BuildChannel();
540   auto stub = BuildStub(channel);
541   SetNextResolutionInvalidServiceConfig(GetServersPorts());
542   CheckRpcSendFailure(stub);
543   SetNextResolutionValidServiceConfig(GetServersPorts());
544   CheckRpcSendOk(stub, DEBUG_LOCATION);
545 }
546
547 TEST_F(ServiceConfigEnd2endTest, NoServiceConfigAfterInvalidServiceConfigTest) {
548   StartServers(1);
549   auto channel = BuildChannel();
550   auto stub = BuildStub(channel);
551   SetNextResolutionInvalidServiceConfig(GetServersPorts());
552   CheckRpcSendFailure(stub);
553   SetNextResolutionNoServiceConfig(GetServersPorts());
554   CheckRpcSendOk(stub, DEBUG_LOCATION);
555   EXPECT_STREQ("", channel->GetServiceConfigJSON().c_str());
556 }
557
558 TEST_F(ServiceConfigEnd2endTest,
559        AnotherInvalidServiceConfigAfterInvalidServiceConfigTest) {
560   StartServers(1);
561   auto channel = BuildChannel();
562   auto stub = BuildStub(channel);
563   SetNextResolutionInvalidServiceConfig(GetServersPorts());
564   CheckRpcSendFailure(stub);
565   SetNextResolutionInvalidServiceConfig(GetServersPorts());
566   CheckRpcSendFailure(stub);
567 }
568
569 TEST_F(ServiceConfigEnd2endTest, InvalidDefaultServiceConfigTest) {
570   StartServers(1);
571   auto channel = BuildChannelWithInvalidDefaultServiceConfig();
572   auto stub = BuildStub(channel);
573   // An invalid default service config results in a lame channel which fails all
574   // RPCs
575   CheckRpcSendFailure(stub);
576 }
577
578 TEST_F(ServiceConfigEnd2endTest,
579        InvalidDefaultServiceConfigTestWithValidServiceConfig) {
580   StartServers(1);
581   auto channel = BuildChannelWithInvalidDefaultServiceConfig();
582   auto stub = BuildStub(channel);
583   CheckRpcSendFailure(stub);
584   // An invalid default service config results in a lame channel which fails all
585   // RPCs
586   SetNextResolutionValidServiceConfig(GetServersPorts());
587   CheckRpcSendFailure(stub);
588 }
589
590 TEST_F(ServiceConfigEnd2endTest,
591        InvalidDefaultServiceConfigTestWithInvalidServiceConfig) {
592   StartServers(1);
593   auto channel = BuildChannelWithInvalidDefaultServiceConfig();
594   auto stub = BuildStub(channel);
595   CheckRpcSendFailure(stub);
596   // An invalid default service config results in a lame channel which fails all
597   // RPCs
598   SetNextResolutionInvalidServiceConfig(GetServersPorts());
599   CheckRpcSendFailure(stub);
600 }
601
602 TEST_F(ServiceConfigEnd2endTest,
603        InvalidDefaultServiceConfigTestWithNoServiceConfig) {
604   StartServers(1);
605   auto channel = BuildChannelWithInvalidDefaultServiceConfig();
606   auto stub = BuildStub(channel);
607   CheckRpcSendFailure(stub);
608   // An invalid default service config results in a lame channel which fails all
609   // RPCs
610   SetNextResolutionNoServiceConfig(GetServersPorts());
611   CheckRpcSendFailure(stub);
612 }
613
614 }  // namespace
615 }  // namespace testing
616 }  // namespace grpc
617
618 int main(int argc, char** argv) {
619   ::testing::InitGoogleTest(&argc, argv);
620   grpc::testing::TestEnvironment env(argc, argv);
621   const auto result = RUN_ALL_TESTS();
622   return result;
623 }