|  | @@ -18,6 +18,8 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <regex>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#include "absl/strings/str_cat.h"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #include <gtest/gtest.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <grpc/grpc.h>
 | 
	
	
		
			
				|  | @@ -127,10 +129,10 @@ class ErrorParser : public ServiceConfig::Parser {
 | 
	
		
			
				|  |  |    static const char* GlobalError() { return "ErrorParser : globalError"; }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void VerifyRegexMatch(grpc_error* error, const std::regex& e) {
 | 
	
		
			
				|  |  | +void VerifyRegexMatch(grpc_error* error, const std::regex& regex) {
 | 
	
		
			
				|  |  |    std::smatch match;
 | 
	
		
			
				|  |  | -  std::string s(grpc_error_string(error));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(std::regex_search(s, match, e));
 | 
	
		
			
				|  |  | +  std::string error_str = grpc_error_string(error);
 | 
	
		
			
				|  |  | +  EXPECT_TRUE(std::regex_search(error_str, match, regex)) << error_str;
 | 
	
		
			
				|  |  |    GRPC_ERROR_UNREF(error);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -139,10 +141,10 @@ class ServiceConfigTest : public ::testing::Test {
 | 
	
		
			
				|  |  |    void SetUp() override {
 | 
	
		
			
				|  |  |      ServiceConfig::Shutdown();
 | 
	
		
			
				|  |  |      ServiceConfig::Init();
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(
 | 
	
		
			
				|  |  | -        ServiceConfig::RegisterParser(absl::make_unique<TestParser1>()) == 0);
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(
 | 
	
		
			
				|  |  | -        ServiceConfig::RegisterParser(absl::make_unique<TestParser2>()) == 1);
 | 
	
		
			
				|  |  | +    EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique<TestParser1>()),
 | 
	
		
			
				|  |  | +              0);
 | 
	
		
			
				|  |  | +    EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique<TestParser2>()),
 | 
	
		
			
				|  |  | +              1);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -150,46 +152,128 @@ TEST_F(ServiceConfigTest, ErrorCheck1) {
 | 
	
		
			
				|  |  |    const char* test_json = "";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string("JSON parse error"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(std::string("JSON parse error"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, BasicTest1) {
 | 
	
		
			
				|  |  |    const char* test_json = "{}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, SkipMethodConfigWithNoNameOrEmptyName) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"method_param\":1},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[], \"method_param\":1},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\"}], \"method_param\":2}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  | +  grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  | +  const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  | +      grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  | +  auto parsed_config = ((*vector_ptr)[1]).get();
 | 
	
		
			
				|  |  | +  EXPECT_EQ(static_cast<TestParsedConfig1*>(parsed_config)->value(), 2);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNames) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\"}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\"}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  | +  grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple method configs with same name"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -TEST_F(ServiceConfigTest, ErrorNoNames) {
 | 
	
		
			
				|  |  | -  const char* test_json = "{\"methodConfig\": [{\"blah\":1}]}";
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithNullMethod) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\",\"method\":null}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\"}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing error)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Method Params)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(methodConfig)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(No names specified)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple method configs with same name"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -TEST_F(ServiceConfigTest, ErrorNoNamesWithMultipleMethodConfigs) {
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithEmptyMethod) {
 | 
	
		
			
				|  |  |    const char* test_json =
 | 
	
		
			
				|  |  | -      "{\"methodConfig\": [{}, {\"name\":[{\"service\":\"TestServ\"}]}]}";
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\",\"method\":\"\"}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"TestServ\"}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing error)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Method Params)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(methodConfig)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(No names specified)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple method configs with same name"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigs) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  | +  grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple default method configs"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithNullService) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":null}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  | +  grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple default method configs"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithEmptyService) {
 | 
	
		
			
				|  |  | +  const char* test_json =
 | 
	
		
			
				|  |  | +      "{\"methodConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"name\":[{\"service\":\"\"}]},"
 | 
	
		
			
				|  |  | +      "  {\"name\":[{}]}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  | +  grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      std::string("Service config parsing error.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*Method Params.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*methodConfig.*referenced_errors"
 | 
	
		
			
				|  |  | +                  ".*multiple default method configs"));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, ValidMethodConfig) {
 | 
	
	
		
			
				|  | @@ -197,56 +281,52 @@ TEST_F(ServiceConfigTest, ValidMethodConfig) {
 | 
	
		
			
				|  |  |        "{\"methodConfig\": [{\"name\":[{\"service\":\"TestServ\"}]}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser1BasicTest1) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"global_param\":5}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(
 | 
	
		
			
				|  |  | -      (static_cast<TestParsedConfig1*>(svc_cfg->GetGlobalParsedConfig(0)))
 | 
	
		
			
				|  |  | -          ->value() == 5);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  | -                  grpc_slice_from_static_string("/TestServ/TestMethod")) ==
 | 
	
		
			
				|  |  | -              nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  | +  EXPECT_EQ((static_cast<TestParsedConfig1*>(svc_cfg->GetGlobalParsedConfig(0)))
 | 
	
		
			
				|  |  | +                ->value(),
 | 
	
		
			
				|  |  | +            5);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  | +                grpc_slice_from_static_string("/TestServ/TestMethod")),
 | 
	
		
			
				|  |  | +            nullptr);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser1BasicTest2) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"global_param\":1000}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(
 | 
	
		
			
				|  |  | -      (static_cast<TestParsedConfig1*>(svc_cfg->GetGlobalParsedConfig(0)))
 | 
	
		
			
				|  |  | -          ->value() == 1000);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  | +  EXPECT_EQ((static_cast<TestParsedConfig1*>(svc_cfg->GetGlobalParsedConfig(0)))
 | 
	
		
			
				|  |  | +                ->value(),
 | 
	
		
			
				|  |  | +            1000);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser1ErrorInvalidType) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"global_param\":\"5\"}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)(.*)") +
 | 
	
		
			
				|  |  | -               TestParser1::InvalidTypeErrorMessage());
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      absl::StrCat("Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +                   "Global Params.*referenced_errors.*",
 | 
	
		
			
				|  |  | +                   TestParser1::InvalidTypeErrorMessage()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser1ErrorInvalidValue) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"global_param\":-5}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)(.*)") +
 | 
	
		
			
				|  |  | -               TestParser1::InvalidValueErrorMessage());
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      absl::StrCat("Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +                   "Global Params.*referenced_errors.*",
 | 
	
		
			
				|  |  | +                   TestParser1::InvalidValueErrorMessage()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser2BasicTest) {
 | 
	
	
		
			
				|  | @@ -255,12 +335,12 @@ TEST_F(ServiceConfigTest, Parser2BasicTest) {
 | 
	
		
			
				|  |  |        "\"method_param\":5}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  |        grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(vector_ptr != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  |    auto parsed_config = ((*vector_ptr)[1]).get();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(static_cast<TestParsedConfig1*>(parsed_config)->value() == 5);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(static_cast<TestParsedConfig1*>(parsed_config)->value(), 5);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser2ErrorInvalidType) {
 | 
	
	
		
			
				|  | @@ -269,14 +349,12 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidType) {
 | 
	
		
			
				|  |  |        "\"method_param\":\"5\"}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors\":\\[)(.*)(Method "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)(.*)(methodConfig)("
 | 
	
		
			
				|  |  | -                           ".*)(referenced_errors)(.*)") +
 | 
	
		
			
				|  |  | -               TestParser2::InvalidTypeErrorMessage());
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*"
 | 
	
		
			
				|  |  | +                   "Method Params.*referenced_errors.*methodConfig.*"
 | 
	
		
			
				|  |  | +                   "referenced_errors.*",
 | 
	
		
			
				|  |  | +                   TestParser2::InvalidTypeErrorMessage()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) {
 | 
	
	
		
			
				|  | @@ -285,14 +363,12 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) {
 | 
	
		
			
				|  |  |        "\"method_param\":-5}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors\":\\[)(.*)(Method "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)()(.*)(methodConfig)("
 | 
	
		
			
				|  |  | -                           ".*)(referenced_errors)(.*)") +
 | 
	
		
			
				|  |  | -               TestParser2::InvalidValueErrorMessage());
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*"
 | 
	
		
			
				|  |  | +                   "Method Params.*referenced_errors.*methodConfig.*"
 | 
	
		
			
				|  |  | +                   "referenced_errors.*",
 | 
	
		
			
				|  |  | +                   TestParser2::InvalidValueErrorMessage()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Test parsing with ErrorParsers which always add errors
 | 
	
	
		
			
				|  | @@ -301,10 +377,10 @@ class ErroredParsersScopingTest : public ::testing::Test {
 | 
	
		
			
				|  |  |    void SetUp() override {
 | 
	
		
			
				|  |  |      ServiceConfig::Shutdown();
 | 
	
		
			
				|  |  |      ServiceConfig::Init();
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(
 | 
	
		
			
				|  |  | -        ServiceConfig::RegisterParser(absl::make_unique<ErrorParser>()) == 0);
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(
 | 
	
		
			
				|  |  | -        ServiceConfig::RegisterParser(absl::make_unique<ErrorParser>()) == 1);
 | 
	
		
			
				|  |  | +    EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique<ErrorParser>()),
 | 
	
		
			
				|  |  | +              0);
 | 
	
		
			
				|  |  | +    EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique<ErrorParser>()),
 | 
	
		
			
				|  |  | +              1);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -312,33 +388,24 @@ TEST_F(ErroredParsersScopingTest, GlobalParams) {
 | 
	
		
			
				|  |  |    const char* test_json = "{}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors\":\\[)(.*)(Global "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)()(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::GlobalError() + std::string("(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::GlobalError());
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(absl::StrCat(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors\":\\[.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*",
 | 
	
		
			
				|  |  | +      ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ErroredParsersScopingTest, MethodParams) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"methodConfig\": [{}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  std::regex e(std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                           "error)(.*)(referenced_errors\":\\[)(.*)(Global "
 | 
	
		
			
				|  |  | -                           "Params)(.*)(referenced_errors)()(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::GlobalError() + std::string("(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::GlobalError() +
 | 
	
		
			
				|  |  | -               std::string("(.*)(Method Params)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                           "(.*)(methodConfig)(.*)(referenced_errors)(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::MethodError() + std::string("(.*)") +
 | 
	
		
			
				|  |  | -               ErrorParser::MethodError() +
 | 
	
		
			
				|  |  | -               std::string("(.*)(No names specified)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(absl::StrCat(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors\":\\[.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*",
 | 
	
		
			
				|  |  | +      ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError(),
 | 
	
		
			
				|  |  | +      ".*Method Params.*referenced_errors.*methodConfig.*referenced_errors.*",
 | 
	
		
			
				|  |  | +      ErrorParser::MethodError(), ".*", ErrorParser::MethodError()));
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class ClientChannelParserTest : public ::testing::Test {
 | 
	
	
		
			
				|  | @@ -346,9 +413,9 @@ class ClientChannelParserTest : public ::testing::Test {
 | 
	
		
			
				|  |  |    void SetUp() override {
 | 
	
		
			
				|  |  |      ServiceConfig::Shutdown();
 | 
	
		
			
				|  |  |      ServiceConfig::Init();
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(
 | 
	
		
			
				|  |  | +    EXPECT_EQ(
 | 
	
		
			
				|  |  |          ServiceConfig::RegisterParser(
 | 
	
		
			
				|  |  | -            absl::make_unique<internal::ClientChannelServiceConfigParser>()) ==
 | 
	
		
			
				|  |  | +            absl::make_unique<internal::ClientChannelServiceConfigParser>()),
 | 
	
		
			
				|  |  |          0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
	
		
			
				|  | @@ -357,12 +424,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigPickFirst) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingConfig\": [{\"pick_first\":{}}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  |    auto lb_config = parsed_config->parsed_lb_config();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_config->name(), "pick_first") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_STREQ(lb_config->name(), "pick_first");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigRoundRobin) {
 | 
	
	
		
			
				|  | @@ -370,12 +437,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigRoundRobin) {
 | 
	
		
			
				|  |  |        "{\"loadBalancingConfig\": [{\"round_robin\":{}}, {}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    auto parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  |    auto lb_config = parsed_config->parsed_lb_config();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_config->name(), "round_robin") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_STREQ(lb_config->name(), "round_robin");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigGrpclb) {
 | 
	
	
		
			
				|  | @@ -384,12 +451,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigGrpclb) {
 | 
	
		
			
				|  |  |        "[{\"grpclb\":{\"childPolicy\":[{\"pick_first\":{}}]}}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  |    auto lb_config = parsed_config->parsed_lb_config();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_config->name(), "grpclb") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_STREQ(lb_config->name(), "grpclb");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) {
 | 
	
	
		
			
				|  | @@ -402,105 +469,91 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  |    auto lb_config = parsed_config->parsed_lb_config();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_config->name(), "xds_experimental") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_STREQ(lb_config->name(), "xds_experimental");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, UnknownLoadBalancingConfig) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingConfig\": [{\"unknown\":{}}]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing error)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Global Params)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Client channel global parser)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(field:loadBalancingConfig)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(No known policy)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:loadBalancingConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "No known policy");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidGrpclbLoadBalancingConfig) {
 | 
	
		
			
				|  |  |    const char* test_json =
 | 
	
		
			
				|  |  | -      "{\"loadBalancingConfig\": "
 | 
	
		
			
				|  |  | -      "[{\"grpclb\":{\"childPolicy\":[{\"unknown\":{}}]}}]}";
 | 
	
		
			
				|  |  | +      "{\"loadBalancingConfig\": ["
 | 
	
		
			
				|  |  | +      "  {\"grpclb\":{\"childPolicy\":1}},"
 | 
	
		
			
				|  |  | +      "  {\"round_robin\":{}}"
 | 
	
		
			
				|  |  | +      "]}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing error)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Global Params)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(Client channel global parser)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(field:loadBalancingConfig)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(GrpcLb Parser)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(field:childPolicy)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(No known policy)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:loadBalancingConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "GrpcLb Parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:childPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "type should be array");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidLoadBalancingPolicy) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingPolicy\":\"pick_first\"}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  | -  const auto* lb_policy = parsed_config->parsed_deprecated_lb_policy();
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(lb_policy != nullptr);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_policy, "pick_first") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(parsed_config->parsed_deprecated_lb_policy(), "pick_first");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidLoadBalancingPolicyAllCaps) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingPolicy\":\"PICK_FIRST\"}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  | -  const auto* lb_policy = parsed_config->parsed_deprecated_lb_policy();
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(lb_policy != nullptr);
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(strcmp(lb_policy, "pick_first") == 0);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(parsed_config->parsed_deprecated_lb_policy(), "pick_first");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, UnknownLoadBalancingPolicy) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingPolicy\":\"unknown\"}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(Client channel global "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:"
 | 
	
		
			
				|  |  | -                  "loadBalancingPolicy error:Unknown lb policy)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:loadBalancingPolicy error:Unknown lb policy");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, LoadBalancingPolicyXdsNotAllowed) {
 | 
	
		
			
				|  |  |    const char* test_json = "{\"loadBalancingPolicy\":\"xds_experimental\"}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(Client channel global "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:"
 | 
	
		
			
				|  |  | -                  "loadBalancingPolicy error:xds_experimental requires a "
 | 
	
		
			
				|  |  | -                  "config. Please use loadBalancingConfig instead.)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:loadBalancingPolicy error:xds_experimental requires "
 | 
	
		
			
				|  |  | +      "a config. Please use loadBalancingConfig instead.");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidRetryThrottling) {
 | 
	
	
		
			
				|  | @@ -513,8 +566,7 @@ TEST_F(ClientChannelParserTest, ValidRetryThrottling) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
	
		
			
				|  | @@ -532,16 +584,13 @@ TEST_F(ClientChannelParserTest, RetryThrottlingMissingFields) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(Client channel global "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:retryThrottling "
 | 
	
		
			
				|  |  | -                  "field:maxTokens error:Not found)(.*)(field:retryThrottling "
 | 
	
		
			
				|  |  | -                  "field:tokenRatio error:Not found)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:retryThrottling field:maxTokens error:Not found.*"
 | 
	
		
			
				|  |  | +      "field:retryThrottling field:tokenRatio error:Not found");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) {
 | 
	
	
		
			
				|  | @@ -554,15 +603,13 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(Client channel global "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:retryThrottling "
 | 
	
		
			
				|  |  | -                  "field:maxTokens error:should be greater than zero)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:retryThrottling field:maxTokens error:should "
 | 
	
		
			
				|  |  | +      "be greater than zero");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) {
 | 
	
	
		
			
				|  | @@ -575,15 +622,13 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Global "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(Client channel global "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:retryThrottling "
 | 
	
		
			
				|  |  | -                  "field:tokenRatio error:Failed parsing)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Global Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel global parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:retryThrottling field:tokenRatio "
 | 
	
		
			
				|  |  | +      "error:Failed parsing");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidTimeout) {
 | 
	
	
		
			
				|  | @@ -598,10 +643,10 @@ TEST_F(ClientChannelParserTest, ValidTimeout) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  |        grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(vector_ptr != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  |    auto parsed_config = ((*vector_ptr)[0]).get();
 | 
	
		
			
				|  |  |    EXPECT_EQ((static_cast<grpc_core::internal::ClientChannelMethodParsedConfig*>(
 | 
	
		
			
				|  |  |                   parsed_config))
 | 
	
	
		
			
				|  | @@ -621,16 +666,13 @@ TEST_F(ClientChannelParserTest, InvalidTimeout) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)("
 | 
	
		
			
				|  |  | -                  "referenced_errors)(.*)(Client channel "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:timeout "
 | 
	
		
			
				|  |  | -                  "error:Failed parsing)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:timeout error:Failed parsing");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidWaitForReady) {
 | 
	
	
		
			
				|  | @@ -645,12 +687,12 @@ TEST_F(ClientChannelParserTest, ValidWaitForReady) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  |        grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(vector_ptr != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  |    auto parsed_config = ((*vector_ptr)[0]).get();
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(
 | 
	
		
			
				|  |  | +  ASSERT_TRUE(
 | 
	
		
			
				|  |  |        (static_cast<grpc_core::internal::ClientChannelMethodParsedConfig*>(
 | 
	
		
			
				|  |  |             parsed_config))
 | 
	
		
			
				|  |  |            ->wait_for_ready()
 | 
	
	
		
			
				|  | @@ -674,16 +716,13 @@ TEST_F(ClientChannelParserTest, InvalidWaitForReady) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)("
 | 
	
		
			
				|  |  | -                  "referenced_errors)(.*)(Client channel "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:waitForReady "
 | 
	
		
			
				|  |  | -                  "error:Type should be true/false)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:waitForReady error:Type should be true/false");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidRetryPolicy) {
 | 
	
	
		
			
				|  | @@ -704,15 +743,14 @@ TEST_F(ClientChannelParserTest, ValidRetryPolicy) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  |        grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(vector_ptr != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelMethodParsedConfig*>(
 | 
	
		
			
				|  |  |            ((*vector_ptr)[0]).get());
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(parsed_config->retry_policy() != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(parsed_config->retry_policy(), nullptr);
 | 
	
		
			
				|  |  |    EXPECT_EQ(parsed_config->retry_policy()->max_attempts, 3);
 | 
	
		
			
				|  |  |    EXPECT_EQ(parsed_config->retry_policy()->initial_backoff, 1000);
 | 
	
		
			
				|  |  |    EXPECT_EQ(parsed_config->retry_policy()->max_backoff, 120000);
 | 
	
	
		
			
				|  | @@ -739,16 +777,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxAttempts) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string(
 | 
	
		
			
				|  |  | -      "(Service config parsing "
 | 
	
		
			
				|  |  | -      "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -      "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)("
 | 
	
		
			
				|  |  | -      ".*)(Client channel "
 | 
	
		
			
				|  |  | -      "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(."
 | 
	
		
			
				|  |  | -      "*)(field:maxAttempts error:should be at least 2)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "retryPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:maxAttempts error:should be at least 2");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) {
 | 
	
	
		
			
				|  | @@ -769,16 +805,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string(
 | 
	
		
			
				|  |  | -      "(Service config parsing "
 | 
	
		
			
				|  |  | -      "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -      "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)("
 | 
	
		
			
				|  |  | -      ".*)(Client channel "
 | 
	
		
			
				|  |  | -      "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(."
 | 
	
		
			
				|  |  | -      "*)(field:initialBackoff error:Failed to parse)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "retryPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:initialBackoff error:Failed to parse");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) {
 | 
	
	
		
			
				|  | @@ -799,16 +833,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string(
 | 
	
		
			
				|  |  | -      "(Service config parsing "
 | 
	
		
			
				|  |  | -      "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -      "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)("
 | 
	
		
			
				|  |  | -      ".*)(Client channel "
 | 
	
		
			
				|  |  | -      "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(."
 | 
	
		
			
				|  |  | -      "*)(field:maxBackoff error:failed to parse)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "retryPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:maxBackoff error:failed to parse");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) {
 | 
	
	
		
			
				|  | @@ -829,16 +861,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string(
 | 
	
		
			
				|  |  | -      "(Service config parsing "
 | 
	
		
			
				|  |  | -      "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -      "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)("
 | 
	
		
			
				|  |  | -      ".*)(Client channel "
 | 
	
		
			
				|  |  | -      "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(."
 | 
	
		
			
				|  |  | -      "*)(field:backoffMultiplier error:should be of type number)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "retryPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:backoffMultiplier error:should be of type number");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) {
 | 
	
	
		
			
				|  | @@ -859,16 +889,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(std::string(
 | 
	
		
			
				|  |  | -      "(Service config parsing "
 | 
	
		
			
				|  |  | -      "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -      "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)("
 | 
	
		
			
				|  |  | -      ".*)(Client channel "
 | 
	
		
			
				|  |  | -      "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(."
 | 
	
		
			
				|  |  | -      "*)(field:retryableStatusCodes error:should be non-empty)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Client channel parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "retryPolicy.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:retryableStatusCodes error:should be non-empty");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, ValidHealthCheck) {
 | 
	
	
		
			
				|  | @@ -880,14 +908,13 @@ TEST_F(ClientChannelParserTest, ValidHealthCheck) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* parsed_config =
 | 
	
		
			
				|  |  |        static_cast<grpc_core::internal::ClientChannelGlobalParsedConfig*>(
 | 
	
		
			
				|  |  |            svc_cfg->GetGlobalParsedConfig(0));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(parsed_config != nullptr);
 | 
	
		
			
				|  |  | -  EXPECT_EQ(strcmp(parsed_config->health_check_service_name(),
 | 
	
		
			
				|  |  | -                   "health_check_service_name"),
 | 
	
		
			
				|  |  | -            0);
 | 
	
		
			
				|  |  | +  ASSERT_NE(parsed_config, nullptr);
 | 
	
		
			
				|  |  | +  EXPECT_STREQ(parsed_config->health_check_service_name(),
 | 
	
		
			
				|  |  | +               "health_check_service_name");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) {
 | 
	
	
		
			
				|  | @@ -902,12 +929,10 @@ TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(JSON parsing failed)(.*)(referenced_errors)"
 | 
	
		
			
				|  |  | -                  "(.*)(duplicate key \"healthCheckConfig\" at index 104)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "JSON parsing failed.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "duplicate key \"healthCheckConfig\" at index 104");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class MessageSizeParserTest : public ::testing::Test {
 | 
	
	
		
			
				|  | @@ -915,8 +940,9 @@ class MessageSizeParserTest : public ::testing::Test {
 | 
	
		
			
				|  |  |    void SetUp() override {
 | 
	
		
			
				|  |  |      ServiceConfig::Shutdown();
 | 
	
		
			
				|  |  |      ServiceConfig::Init();
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(ServiceConfig::RegisterParser(
 | 
	
		
			
				|  |  | -                    absl::make_unique<MessageSizeParser>()) == 0);
 | 
	
		
			
				|  |  | +    EXPECT_EQ(
 | 
	
		
			
				|  |  | +        ServiceConfig::RegisterParser(absl::make_unique<MessageSizeParser>()),
 | 
	
		
			
				|  |  | +        0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -933,14 +959,13 @@ TEST_F(MessageSizeParserTest, Valid) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error == GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | +  ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error);
 | 
	
		
			
				|  |  |    const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector(
 | 
	
		
			
				|  |  |        grpc_slice_from_static_string("/TestServ/TestMethod"));
 | 
	
		
			
				|  |  | -  EXPECT_TRUE(vector_ptr != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(vector_ptr, nullptr);
 | 
	
		
			
				|  |  |    auto parsed_config =
 | 
	
		
			
				|  |  |        static_cast<MessageSizeParsedConfig*>(((*vector_ptr)[0]).get());
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(parsed_config != nullptr);
 | 
	
		
			
				|  |  | +  ASSERT_NE(parsed_config, nullptr);
 | 
	
		
			
				|  |  |    EXPECT_EQ(parsed_config->limits().max_send_size, 1024);
 | 
	
		
			
				|  |  |    EXPECT_EQ(parsed_config->limits().max_recv_size, 1024);
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -957,16 +982,13 @@ TEST_F(MessageSizeParserTest, InvalidMaxRequestMessageBytes) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)("
 | 
	
		
			
				|  |  | -                  "referenced_errors)(.*)(Message size "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:"
 | 
	
		
			
				|  |  | -                  "maxRequestMessageBytes error:should be non-negative)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Message size parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:maxRequestMessageBytes error:should be non-negative");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) {
 | 
	
	
		
			
				|  | @@ -981,16 +1003,14 @@ TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) {
 | 
	
		
			
				|  |  |        "}";
 | 
	
		
			
				|  |  |    grpc_error* error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    auto svc_cfg = ServiceConfig::Create(test_json, &error);
 | 
	
		
			
				|  |  | -  gpr_log(GPR_ERROR, "%s", grpc_error_string(error));
 | 
	
		
			
				|  |  | -  ASSERT_TRUE(error != GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  std::regex e(
 | 
	
		
			
				|  |  | -      std::string("(Service config parsing "
 | 
	
		
			
				|  |  | -                  "error)(.*)(referenced_errors)(.*)(Method "
 | 
	
		
			
				|  |  | -                  "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)("
 | 
	
		
			
				|  |  | -                  "referenced_errors)(.*)(Message size "
 | 
	
		
			
				|  |  | -                  "parser)(.*)(referenced_errors)(.*)(field:"
 | 
	
		
			
				|  |  | -                  "maxResponseMessageBytes error:should be of type number)"));
 | 
	
		
			
				|  |  | -  VerifyRegexMatch(error, e);
 | 
	
		
			
				|  |  | +  std::regex regex(
 | 
	
		
			
				|  |  | +      "Service config parsing error.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Method Params.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "methodConfig.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "Message size parser.*referenced_errors.*"
 | 
	
		
			
				|  |  | +      "field:maxResponseMessageBytes error:should be of type "
 | 
	
		
			
				|  |  | +      "number");
 | 
	
		
			
				|  |  | +  VerifyRegexMatch(error, regex);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }  // namespace testing
 |