17 #include <gmock/gmock.h>
18 #include <gtest/gtest.h>
27 #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
28 #define CHILD_ERROR_TAG ".*children.*"
30 #define CHILD_ERROR_TAG ".*referenced_errors.*"
38 static void SetUpTestSuite() {
grpc_init(); }
43 TEST_F(RlsConfigParsingTest, ValidConfig) {
44 const char* service_config_json =
46 " \"loadBalancingConfig\":[{\n"
47 " \"rls_experimental\":{\n"
48 " \"routeLookupConfig\":{\n"
49 " \"lookupService\":\"rls.example.com:80\",\n"
50 " \"cacheSizeBytes\":1,\n"
51 " \"grpcKeybuilders\":[\n"
54 " {\"service\":\"foo\"}\n"
59 " \"routeLookupChannelServiceConfig\": {\n"
60 " \"loadBalancingPolicy\": \"ROUND_ROBIN\"\n"
62 " \"childPolicy\":[\n"
63 " {\"unknown\":{}},\n"
66 " \"childPolicyConfigTargetFieldName\":\"target\"\n"
72 nullptr, service_config_json, &
error);
81 TEST_F(RlsConfigParsingTest, TopLevelRequiredFieldsMissing) {
82 const char* service_config_json =
84 " \"loadBalancingConfig\":[{\n"
85 " \"rls_experimental\":{\n"
91 nullptr, service_config_json, &
error);
96 "field:routeLookupConfig error:does not exist.*"
97 "field:childPolicyConfigTargetFieldName error:does not exist.*"
98 "field:childPolicy error:does not exist"));
102 TEST_F(RlsConfigParsingTest, TopLevelFieldsWrongTypes) {
103 const char* service_config_json =
105 " \"loadBalancingConfig\":[{\n"
106 " \"rls_experimental\":{\n"
107 " \"routeLookupConfig\":1,\n"
108 " \"routeLookupChannelServiceConfig\": 1,\n"
109 " \"childPolicy\":1,\n"
110 " \"childPolicyConfigTargetFieldName\":1\n"
116 nullptr, service_config_json, &
error);
121 "field:routeLookupConfig error:type should be OBJECT.*"
122 "field:routeLookupChannelServiceConfig error:type should be OBJECT.*"
123 "field:childPolicyConfigTargetFieldName error:type should be STRING.*"
124 "field:childPolicy error:type should be ARRAY"));
128 TEST_F(RlsConfigParsingTest, TopLevelFieldsInvalidValues) {
129 const char* service_config_json =
131 " \"loadBalancingConfig\":[{\n"
132 " \"rls_experimental\":{\n"
133 " \"childPolicy\":[\n"
134 " {\"unknown\":{}}\n"
136 " \"childPolicyConfigTargetFieldName\":\"\"\n"
142 nullptr, service_config_json, &
error);
147 "field:childPolicyConfigTargetFieldName error:must be non-empty.*"
149 "No known policies in list: unknown"));
153 TEST_F(RlsConfigParsingTest, InvalidChildPolicyConfig) {
154 const char* service_config_json =
156 " \"loadBalancingConfig\":[{\n"
157 " \"rls_experimental\":{\n"
158 " \"childPolicy\":[\n"
159 " {\"grpclb\":{\"childPolicy\":1}}\n"
161 " \"childPolicyConfigTargetFieldName\":\"serviceName\"\n"
167 nullptr, service_config_json, &
error);
177 TEST_F(RlsConfigParsingTest, InvalidRlsChannelServiceConfig) {
178 const char* service_config_json =
180 " \"loadBalancingConfig\":[{\n"
181 " \"rls_experimental\":{\n"
182 " \"routeLookupChannelServiceConfig\": {\n"
183 " \"loadBalancingPolicy\": \"unknown\"\n"
185 " \"childPolicy\":[\n"
188 " \"childPolicyConfigTargetFieldName\":\"serviceName\"\n"
194 nullptr, service_config_json, &
error);
202 "field:loadBalancingPolicy error:Unknown lb policy"));
210 TEST_F(RlsConfigParsingTest, RouteLookupConfigRequiredFieldsMissing) {
211 const char* service_config_json =
213 " \"loadBalancingConfig\":[{\n"
214 " \"rls_experimental\":{\n"
215 " \"routeLookupConfig\":{\n"
222 nullptr, service_config_json, &
error);
227 "field:grpcKeybuilders error:does not exist.*"
228 "field:lookupService error:does not exist"));
232 TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsWrongTypes) {
233 const char* service_config_json =
235 " \"loadBalancingConfig\":[{\n"
236 " \"rls_experimental\":{\n"
237 " \"routeLookupConfig\":{\n"
238 " \"grpcKeybuilders\":1,\n"
240 " \"lookupService\":1,\n"
241 " \"lookupServiceTimeout\":{},\n"
243 " \"staleAge\":{},\n"
244 " \"cacheSizeBytes\":\"xxx\",\n"
245 " \"defaultTarget\":1\n"
252 nullptr, service_config_json, &
error);
257 "field:grpcKeybuilders error:type should be ARRAY.*"
258 "field:lookupService error:type should be STRING.*"
259 "field:maxAge error:type should be STRING.*"
260 "field:staleAge error:type should be STRING.*"
261 "field:cacheSizeBytes error:failed to parse.*"
262 "field:defaultTarget error:type should be STRING"));
266 TEST_F(RlsConfigParsingTest, RouteLookupConfigFieldsInvalidValues) {
267 const char* service_config_json =
269 " \"loadBalancingConfig\":[{\n"
270 " \"rls_experimental\":{\n"
271 " \"routeLookupConfig\":{\n"
272 " \"lookupService\":\"\",\n"
273 " \"cacheSizeBytes\":0\n"
280 nullptr, service_config_json, &
error);
285 "field:lookupService error:must be valid gRPC target URI.*"
286 "field:cacheSizeBytes error:must be greater than 0"));
294 TEST_F(RlsConfigParsingTest, GrpcKeybuilderRequiredFieldsMissing) {
295 const char* service_config_json =
297 " \"loadBalancingConfig\":[{\n"
298 " \"rls_experimental\":{\n"
299 " \"routeLookupConfig\":{\n"
300 " \"grpcKeybuilders\":[\n"
310 nullptr, service_config_json, &
error);
317 "field:names error:does not exist"));
321 TEST_F(RlsConfigParsingTest, GrpcKeybuilderWrongFieldTypes) {
322 const char* service_config_json =
324 " \"loadBalancingConfig\":[{\n"
325 " \"rls_experimental\":{\n"
326 " \"routeLookupConfig\":{\n"
327 " \"grpcKeybuilders\":[\n"
331 " \"extraKeys\":1,\n"
332 " \"constantKeys\":1\n"
341 nullptr, service_config_json, &
error);
348 "field:names error:type should be ARRAY.*"
349 "field:headers error:type should be ARRAY.*"
350 "field:extraKeys error:type should be OBJECT.*"
351 "field:constantKeys error:type should be OBJECT"));
355 TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidValues) {
356 const char* service_config_json =
358 " \"loadBalancingConfig\":[{\n"
359 " \"rls_experimental\":{\n"
360 " \"routeLookupConfig\":{\n"
361 " \"grpcKeybuilders\":[\n"
369 " \"constantKeys\":{\n"
380 nullptr, service_config_json, &
error);
388 "field:host error:type should be STRING.*"
389 "field:service error:type should be STRING.*"
390 "field:method error:type should be STRING.*"
392 "field:key error:type should be STRING"));
396 TEST_F(RlsConfigParsingTest, GrpcKeybuilderInvalidHeaders) {
397 const char* service_config_json =
399 " \"loadBalancingConfig\":[{\n"
400 " \"rls_experimental\":{\n"
401 " \"routeLookupConfig\":{\n"
402 " \"grpcKeybuilders\":[\n"
415 " \"names\":[1, \"\"]\n"
421 " \"constantKeys\":{\n"
432 nullptr, service_config_json, &
error);
439 "field:headers index:0 error:type should be OBJECT.*"
441 "field:key error:type should be STRING.*"
442 "field:names error:type should be ARRAY.*"
444 "field:key error:does not exist.*"
445 "field:names error:list is empty.*"
447 "field:key error:must be non-empty.*"
448 "field:names index:0 error:type should be STRING.*"
449 "field:names index:1 error:header name must be non-empty.*"
451 "field:host error:must be non-empty.*"
456 TEST_F(RlsConfigParsingTest, GrpcKeybuilderNameWrongFieldTypes) {
457 const char* service_config_json =
459 " \"loadBalancingConfig\":[{\n"
460 " \"rls_experimental\":{\n"
461 " \"routeLookupConfig\":{\n"
462 " \"grpcKeybuilders\":[\n"
479 nullptr, service_config_json, &
error);
486 "field:names index:0 error:type should be OBJECT.*"
488 "field:service error:type should be STRING.*"
489 "field:method error:type should be STRING"));
493 TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInSameKeyBuilder) {
494 const char* service_config_json =
496 " \"loadBalancingConfig\":[{\n"
497 " \"rls_experimental\":{\n"
498 " \"routeLookupConfig\":{\n"
499 " \"grpcKeybuilders\":[\n"
503 " \"service\":\"foo\",\n"
504 " \"method\":\"bar\"\n"
507 " \"service\":\"foo\",\n"
508 " \"method\":\"bar\"\n"
519 nullptr, service_config_json, &
error);
526 "field:names error:duplicate entry for /foo/bar"));
530 TEST_F(RlsConfigParsingTest, DuplicateMethodNamesInDifferentKeyBuilders) {
531 const char* service_config_json =
533 " \"loadBalancingConfig\":[{\n"
534 " \"rls_experimental\":{\n"
535 " \"routeLookupConfig\":{\n"
536 " \"grpcKeybuilders\":[\n"
540 " \"service\":\"foo\",\n"
541 " \"method\":\"bar\"\n"
548 " \"service\":\"foo\",\n"
549 " \"method\":\"bar\"\n"
560 nullptr, service_config_json, &
error);
567 "field:names error:duplicate entry for /foo/bar"));
574 int main(
int argc,
char** argv) {