28 #include <gmock/gmock.h>
29 #include <gtest/gtest.h>
31 #include "absl/strings/str_format.h"
32 #include "absl/strings/str_join.h"
33 #include "absl/types/optional.h"
55 #include "src/proto/grpc/lookup/v1/rls.grpc.pb.h"
56 #include "src/proto/grpc/lookup/v1/rls.pb.h"
57 #include "src/proto/grpc/testing/echo.grpc.pb.h"
67 using ::grpc::lookup::v1::RouteLookupRequest;
73 const char* kServerName =
"test.google.fr";
74 const char* kRequestMessage =
"Live long and prosper.";
76 const char* kCallCredsMdKey =
"call_cred_name";
77 const char* kCallCredsMdValue =
"call_cred_value";
80 const char* kTestValue =
"test_value";
81 const char* kHostKey =
"host_key";
82 const char* kServiceKey =
"service_key";
83 const char* kServiceValue =
"grpc.testing.EchoTestService";
84 const char* kMethodKey =
"method_key";
85 const char* kMethodValue =
"Echo";
86 const char* kConstantKey =
"constant_key";
87 const char* kConstantValue =
"constant_value";
89 using BackendService = CountedService<TestServiceImpl>;
93 class MyTestServiceImpl :
public BackendService {
101 IncreaseRequestCount();
102 auto client_metadata =
context->client_metadata();
103 auto range = client_metadata.equal_range(
"X-Google-RLS-Data");
107 rls_header_data_.insert(
111 IncreaseResponseCount();
115 std::set<std::string> rls_data() {
129 class FakeResolverResponseGeneratorWrapper {
131 FakeResolverResponseGeneratorWrapper()
133 grpc_core::FakeResolverResponseGenerator>()) {}
152 <<
"JSON: " << service_config_json
164 static void SetUpTestSuite() {
165 gpr_setenv(
"GRPC_EXPERIMENTAL_ENABLE_RLS_LB_POLICY",
"true");
171 static void TearDownTestSuite() {
176 void SetUp()
override {
177 bool localhost_resolves_to_ipv4 =
false;
178 bool localhost_resolves_to_ipv6 =
false;
180 &localhost_resolves_to_ipv6);
181 ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
182 rls_server_ = absl::make_unique<ServerThread<RlsServiceImpl>>(
190 absl::make_unique<FakeResolverResponseGeneratorWrapper>();
194 void TearDown()
override {
199 void ResetStub(
const char* expected_authority = kServerName) {
200 ChannelArguments
args;
207 kCallCredsMdKey, kCallCredsMdValue);
208 auto creds = std::make_shared<SecureChannelCredentials>(
212 channel_creds->
Unref();
218 void ShutdownBackends() {
224 void StartBackends(
size_t num_servers) {
226 for (
size_t i = 0;
i < num_servers; ++
i) {
241 std::vector<std::pair<std::string, std::string>>
metadata;
245 RpcOptions& set_timeout_ms(
int rpc_timeout_ms) {
250 RpcOptions& set_wait_for_ready(
bool rpc_wait_for_ready) {
255 RpcOptions& set_metadata(
256 std::vector<std::pair<std::string, std::string>> rpc_metadata) {
262 void SetupRpc(ClientContext*
context)
const {
276 EchoResponse local_response;
279 rpc_options.SetupRpc(&
context);
281 request.set_message(kRequestMessage);
286 const RpcOptions& rpc_options = RpcOptions()) {
290 <<
": RPC failed: " <<
status.error_code() <<
": "
291 <<
status.error_message();
293 << location.
file() <<
":" << location.
line();
299 const RpcOptions& rpc_options = RpcOptions()) {
303 << location.
file() <<
":" << location.
line();
305 << location.
file() <<
":" << location.
line();
308 class ServiceConfigBuilder {
310 explicit ServiceConfigBuilder(
int rls_server_port)
313 ServiceConfigBuilder& set_lookup_service_timeout(
334 ServiceConfigBuilder& set_cache_size_bytes(
int64_t size) {
346 std::vector<std::string> route_lookup_config_parts;
350 route_lookup_config_parts.push_back(
361 route_lookup_config_parts.push_back(
369 route_lookup_config_parts.push_back(
374 std::vector<std::string> rls_config_parts;
375 if (!route_lookup_config_parts.empty()) {
377 " \"routeLookupConfig\":{",
380 rls_config_parts.push_back(
381 " \"childPolicy\":[{"
382 " \"fixed_address_lb\":{}\n"
384 " \"childPolicyConfigTargetFieldName\":\"address\"\n");
388 " \"loadBalancingConfig\":[{"
389 " \"rls_experimental\":{",
406 ServiceConfigBuilder MakeServiceConfigBuilder() {
414 template <
typename T>
415 struct ServerThread {
416 template <
typename...
Args>
432 thread_ = absl::make_unique<std::thread>(
433 std::bind(&ServerThread::Serve,
this, &
mu, &
cond));
443 auto creds = std::make_shared<SecureServerCredentials>(
471 std::vector<std::unique_ptr<ServerThread<MyTestServiceImpl>>>
backends_;
473 std::unique_ptr<FakeResolverResponseGeneratorWrapper>
476 std::unique_ptr<grpc::testing::EchoTestService::Stub>
stub_;
479 TEST_F(RlsEnd2endTest, Basic) {
482 MakeServiceConfigBuilder()
484 " \"service\":\"%s\","
495 kServiceValue, kMethodValue,
kTestKey))
501 RpcOptions().set_metadata({{
"key1", kTestValue}}));
509 TEST_F(RlsEnd2endTest, DuplicateHeadersAreMerged) {
510 const char* kTestValue2 =
"test_value_2";
513 MakeServiceConfigBuilder()
515 " \"service\":\"%s\","
526 kServiceValue, kMethodValue,
kTestKey))
534 RpcOptions().set_metadata({{
"key1", kTestValue}, {
"key1", kTestValue2}}));
540 TEST_F(RlsEnd2endTest, SecondHeaderUsed) {
543 MakeServiceConfigBuilder()
545 " \"service\":\"%s\","
552 " \"key1\", \"key2\""
556 kServiceValue, kMethodValue,
kTestKey))
562 RpcOptions().set_metadata({{
"key2", kTestValue}}));
568 TEST_F(RlsEnd2endTest, MultipleHeaderKeys) {
569 const char* kTestKey2 =
"test_key_2";
570 const char* kTestValue2 =
"test_value_2";
572 SetNextResolution(MakeServiceConfigBuilder()
575 " \"service\":\"%s\","
592 kServiceValue, kMethodValue,
kTestKey, kTestKey2))
597 {kTestKey2, kTestValue2},
602 RpcOptions().set_metadata({{
"key1", kTestValue}, {
"key2", kTestValue2}}));
610 TEST_F(RlsEnd2endTest, NoHeaderMatch) {
613 MakeServiceConfigBuilder()
615 " \"service\":\"%s\","
626 kServiceValue, kMethodValue,
kTestKey))
638 TEST_F(RlsEnd2endTest, WildcardMethod) {
640 SetNextResolution(MakeServiceConfigBuilder()
642 " \"service\":\"%s\""
658 RpcOptions().set_metadata({{
"key1", kTestValue}}));
664 TEST_F(RlsEnd2endTest, NoKeyBuilderForMethod) {
667 MakeServiceConfigBuilder()
669 " \"service\":\"%s\","
670 " \"method\":\"some_other_method\""
691 TEST_F(RlsEnd2endTest, HeaderData) {
692 const char* kHeaderData =
"header_data";
695 MakeServiceConfigBuilder()
697 " \"service\":\"%s\","
708 kServiceValue, kMethodValue,
kTestKey))
715 RpcOptions().set_metadata({{
"key1", kTestValue}}));
723 TEST_F(RlsEnd2endTest, ExtraKeysAndConstantKeys) {
726 MakeServiceConfigBuilder()
728 " \"service\":\"%s\","
735 " \"key1\",\"key2\",\"key3\""
741 " \"service\":\"%s\","
747 kServiceValue, kMethodValue,
kTestKey,
748 kHostKey, kServiceKey, kMethodKey,
749 kConstantKey, kConstantValue))
754 {kHostKey, kServerName},
755 {kServiceKey, kServiceValue},
756 {kMethodKey, kMethodValue},
757 {kConstantKey, kConstantValue},
761 RpcOptions().set_metadata({{
"key1", kTestValue}}));
767 TEST_F(RlsEnd2endTest, TwoCacheEntriesWithSameTarget) {
768 const char* kTestValue2 =
"test_value2";
771 MakeServiceConfigBuilder()
773 " \"service\":\"%s\","
784 kServiceValue, kMethodValue,
kTestKey))
793 RpcOptions().set_metadata({{
"key1", kTestValue}}));
798 RpcOptions().set_metadata({{
"key1", kTestValue2}}));
804 TEST_F(RlsEnd2endTest, FailedRlsRequestWithoutDefaultTarget) {
807 MakeServiceConfigBuilder()
809 " \"service\":\"%s\","
820 kServiceValue, kMethodValue,
kTestKey))
831 const char* kTestValue2 =
"test_value_2";
832 const char* kTestValue3 =
"test_value_3";
840 RpcOptions().set_metadata({{
"key1", kTestValue2}}));
842 RpcOptions().set_metadata({{
"key1", kTestValue3}}));
847 "RLS request failed: INTERNAL: no response entry",
848 RpcOptions().set_metadata({{
"key1", kTestValue}}));
864 RpcOptions().set_metadata({{
"key1", kTestValue}}));
870 TEST_F(RlsEnd2endTest, FailedRlsRequestWithDefaultTarget) {
873 MakeServiceConfigBuilder()
875 " \"service\":\"%s\","
886 kServiceValue, kMethodValue,
kTestKey))
892 RpcOptions().set_metadata({{
"key1", kTestValue}}));
906 TEST_F(RlsEnd2endTest, RlsRequestTimeout) {
909 MakeServiceConfigBuilder()
911 " \"service\":\"%s\","
922 kServiceValue, kMethodValue,
kTestKey))
932 CheckRpcSendOk(
DEBUG_LOCATION, RpcOptions().set_timeout_ms(4000).set_metadata(
933 {{
"key1", kTestValue}}));
939 TEST_F(RlsEnd2endTest, UpdateConfig) {
941 auto service_config_builder =
942 MakeServiceConfigBuilder()
944 " \"service\":\"%s\","
955 kServiceValue, kMethodValue,
kTestKey))
957 SetNextResolution(service_config_builder.Build());
961 RpcOptions().set_metadata({{
"key1", kTestValue}}));
975 service_config_builder.set_default_target(
977 SetNextResolution(service_config_builder.Build());
982 RpcOptions().set_metadata({{
"key1", kTestValue}}));
989 TEST_F(RlsEnd2endTest, CachedResponse) {
992 MakeServiceConfigBuilder()
994 " \"service\":\"%s\","
1005 kServiceValue, kMethodValue,
kTestKey))
1012 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1014 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1021 TEST_F(RlsEnd2endTest, StaleCacheEntry) {
1024 MakeServiceConfigBuilder()
1026 " \"service\":\"%s\","
1027 " \"method\":\"%s\""
1037 kServiceValue, kMethodValue,
kTestKey))
1046 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1055 RouteLookupRequest::REASON_STALE),
1062 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1070 TEST_F(RlsEnd2endTest, StaleCacheEntryWithHeaderData) {
1071 const char* kHeaderData =
"header_data";
1074 MakeServiceConfigBuilder()
1076 " \"service\":\"%s\","
1077 " \"method\":\"%s\""
1087 kServiceValue, kMethodValue,
kTestKey))
1097 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1106 RouteLookupRequest::REASON_STALE, kHeaderData),
1114 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1122 TEST_F(RlsEnd2endTest, ExpiredCacheEntry) {
1125 MakeServiceConfigBuilder()
1127 " \"service\":\"%s\","
1128 " \"method\":\"%s\""
1138 kServiceValue, kMethodValue,
kTestKey))
1147 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1159 "RLS request failed: INTERNAL: no response entry",
1160 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1166 TEST_F(RlsEnd2endTest, CacheSizeLimit) {
1167 const char* kTestValue2 =
"test_value_2";
1170 MakeServiceConfigBuilder()
1172 " \"service\":\"%s\","
1173 " \"method\":\"%s\""
1183 kServiceValue, kMethodValue,
1185 .set_cache_size_bytes(1)
1197 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1205 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1216 RpcOptions().set_metadata({{
"key1", kTestValue2}}));
1224 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1231 RpcOptions().set_metadata({{
"key1", kTestValue2}}));
1238 TEST_F(RlsEnd2endTest, MultipleTargets) {
1241 MakeServiceConfigBuilder()
1243 " \"service\":\"%s\","
1244 " \"method\":\"%s\""
1254 kServiceValue, kMethodValue,
kTestKey))
1263 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1269 TEST_F(RlsEnd2endTest, MultipleTargetsFirstInTransientFailure) {
1272 MakeServiceConfigBuilder()
1274 " \"service\":\"%s\","
1275 " \"method\":\"%s\""
1285 kServiceValue, kMethodValue,
kTestKey))
1293 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1299 TEST_F(RlsEnd2endTest, ConnectivityStateReady) {
1302 MakeServiceConfigBuilder()
1304 " \"service\":\"%s\","
1305 " \"method\":\"%s\""
1315 kServiceValue, kMethodValue,
kTestKey))
1324 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1331 TEST_F(RlsEnd2endTest, ConnectivityStateIdle) {
1333 MakeServiceConfigBuilder()
1335 " \"service\":\"%s\","
1336 " \"method\":\"%s\""
1346 kServiceValue, kMethodValue,
kTestKey))
1351 "RLS request failed: INTERNAL: no response entry");
1356 TEST_F(RlsEnd2endTest, ConnectivityStateTransientFailure) {
1358 MakeServiceConfigBuilder()
1360 " \"service\":\"%s\","
1361 " \"method\":\"%s\""
1371 kServiceValue, kMethodValue,
kTestKey))
1376 CheckRpcSendFailure(
1378 "empty address list: no address in fixed_address_lb policy",
1379 RpcOptions().set_metadata({{
"key1", kTestValue}}));
1386 TEST_F(RlsEnd2endTest, RlsAuthorityDeathTest) {
1388 ResetStub(
"incorrect_authority");
1390 MakeServiceConfigBuilder()
1392 " \"service\":\"%s\","
1393 " \"method\":\"%s\""
1403 kServiceValue, kMethodValue,
kTestKey))
1410 RpcOptions().set_metadata({{
"key1", kTestValue}}));