xds_end2end_test.cc
Go to the documentation of this file.
1 // Copyright 2017 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 
16 // TODO(roth): Split this file up into a common test framework and a set
17 // of test files that use that framework. Need to figure out the best
18 // way to split up the tests. One option would be to split it up by xDS
19 // resource type; another approach would be to have all of the "core"
20 // xDS functionality in one file and then move specific features to
21 // their own files (e.g., mTLS security, fault injection, circuit
22 // breaking, etc).
23 
24 #include <deque>
25 #include <memory>
26 #include <mutex>
27 #include <numeric>
28 #include <set>
29 #include <sstream>
30 #include <string>
31 #include <thread>
32 #include <vector>
33 
34 #include <gmock/gmock.h>
35 #include <gtest/gtest.h>
36 
37 #include "absl/functional/bind_front.h"
38 #include "absl/memory/memory.h"
39 #include "absl/strings/match.h"
40 #include "absl/strings/str_cat.h"
41 #include "absl/strings/str_format.h"
42 #include "absl/strings/str_join.h"
43 #include "absl/strings/str_replace.h"
44 #include "absl/time/time.h"
45 #include "absl/types/optional.h"
46 
47 #include <grpc/grpc.h>
48 #include <grpc/grpc_security.h>
49 #include <grpc/support/alloc.h>
50 #include <grpc/support/log.h>
51 #include <grpc/support/time.h>
52 #include <grpcpp/channel.h>
53 #include <grpcpp/client_context.h>
54 #include <grpcpp/create_channel.h>
56 #include <grpcpp/server.h>
57 #include <grpcpp/server_builder.h>
59 
72 #include "src/core/lib/gpr/env.h"
86 #include "src/proto/grpc/testing/echo.grpc.pb.h"
87 #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h"
88 #include "src/proto/grpc/testing/xds/cds_for_test.grpc.pb.h"
89 #include "src/proto/grpc/testing/xds/eds_for_test.grpc.pb.h"
90 #include "src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.h"
91 #include "src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h"
92 #include "src/proto/grpc/testing/xds/v3/ads.grpc.pb.h"
93 #include "src/proto/grpc/testing/xds/v3/aggregate_cluster.grpc.pb.h"
94 #include "src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h"
95 #include "src/proto/grpc/testing/xds/v3/discovery.grpc.pb.h"
96 #include "src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.h"
97 #include "src/proto/grpc/testing/xds/v3/fault.grpc.pb.h"
98 #include "src/proto/grpc/testing/xds/v3/http_connection_manager.grpc.pb.h"
99 #include "src/proto/grpc/testing/xds/v3/http_filter_rbac.grpc.pb.h"
100 #include "src/proto/grpc/testing/xds/v3/listener.grpc.pb.h"
101 #include "src/proto/grpc/testing/xds/v3/lrs.grpc.pb.h"
102 #include "src/proto/grpc/testing/xds/v3/route.grpc.pb.h"
103 #include "src/proto/grpc/testing/xds/v3/router.grpc.pb.h"
104 #include "src/proto/grpc/testing/xds/v3/tls.grpc.pb.h"
105 #include "test/core/util/port.h"
111 
112 namespace grpc {
113 namespace testing {
114 namespace {
115 
116 using ::envoy::config::listener::v3::FilterChainMatch;
117 using ::envoy::config::rbac::v3::Policy;
118 using ::envoy::config::rbac::v3::RBAC_Action;
119 using ::envoy::config::rbac::v3::RBAC_Action_ALLOW;
120 using ::envoy::config::rbac::v3::RBAC_Action_DENY;
121 using ::envoy::config::rbac::v3::RBAC_Action_LOG;
122 using ::envoy::extensions::filters::http::rbac::v3::RBAC;
123 using ::envoy::extensions::filters::http::rbac::v3::RBACPerRoute;
124 using ::envoy::extensions::transport_sockets::tls::v3::DownstreamTlsContext;
125 using ::envoy::extensions::transport_sockets::tls::v3::UpstreamTlsContext;
126 using ::envoy::type::matcher::v3::StringMatcher;
127 
128 using ::grpc::experimental::ExternalCertificateVerifier;
129 using ::grpc::experimental::IdentityKeyCertPair;
130 using ::grpc::experimental::StaticDataCertificateProvider;
131 
132 constexpr char kClientCertPath[] = "src/core/tsi/test_creds/client.pem";
133 constexpr char kClientKeyPath[] = "src/core/tsi/test_creds/client.key";
134 constexpr char kBadClientCertPath[] = "src/core/tsi/test_creds/badclient.pem";
135 constexpr char kBadClientKeyPath[] = "src/core/tsi/test_creds/badclient.key";
136 
137 // Based on StaticDataCertificateProvider, but provides alternate certificates
138 // if the certificate name is not empty.
139 class FakeCertificateProvider final : public grpc_tls_certificate_provider {
140  public:
141  struct CertData {
144  };
145 
146  using CertDataMap = std::map<std::string /*cert_name */, CertData>;
147  class CertDataMapWrapper {
148  public:
149  CertDataMap Get() {
150  grpc_core::MutexLock lock(&mu_);
151  return cert_data_map_;
152  }
153 
154  void Set(CertDataMap data) {
155  grpc_core::MutexLock lock(&mu_);
157  }
158 
159  private:
161  CertDataMap cert_data_map_ ABSL_GUARDED_BY(mu_);
162  };
163 
164  explicit FakeCertificateProvider(CertDataMap cert_data_map)
165  : distributor_(
167  cert_data_map_(std::move(cert_data_map)) {
169  bool root_being_watched,
170  bool identity_being_watched) {
171  if (!root_being_watched && !identity_being_watched) return;
172  auto it = cert_data_map_.find(cert_name);
173  if (it == cert_data_map_.end()) {
174  grpc_error_handle error =
175  GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
176  "No certificates available for cert_name \"", cert_name, "\""));
177  distributor_->SetErrorForCert(cert_name, GRPC_ERROR_REF(error),
178  GRPC_ERROR_REF(error));
179  GRPC_ERROR_UNREF(error);
180  } else {
181  absl::optional<std::string> root_certificate;
182  absl::optional<grpc_core::PemKeyCertPairList> pem_key_cert_pairs;
183  if (root_being_watched) {
184  root_certificate = it->second.root_certificate;
185  }
186  if (identity_being_watched) {
187  pem_key_cert_pairs = it->second.identity_key_cert_pairs;
188  }
190  std::move(pem_key_cert_pairs));
191  }
192  });
193  }
194 
195  ~FakeCertificateProvider() override {
197  }
198 
200  const override {
201  return distributor_;
202  }
203 
204  grpc_core::UniqueTypeName type() const override {
205  static grpc_core::UniqueTypeName::Factory kFactory("fake");
206  return kFactory.Create();
207  }
208 
209  private:
210  int CompareImpl(const grpc_tls_certificate_provider* other) const override {
211  // TODO(yashykt): Maybe do something better here.
213  static_cast<const grpc_tls_certificate_provider*>(this), other);
214  }
215 
217  CertDataMap cert_data_map_;
218 };
219 
220 class FakeCertificateProviderFactory
222  public:
224  public:
225  explicit Config(const char* name) : name_(name) {}
226 
227  const char* name() const override { return name_; }
228 
229  std::string ToString() const override { return "{}"; }
230 
231  private:
232  const char* name_;
233  };
234 
235  FakeCertificateProviderFactory(
236  const char* name,
237  FakeCertificateProvider::CertDataMapWrapper* cert_data_map)
238  : name_(name), cert_data_map_(cert_data_map) {
239  GPR_ASSERT(cert_data_map != nullptr);
240  }
241 
242  const char* name() const override { return name_; }
243 
245  CreateCertificateProviderConfig(const grpc_core::Json& /*config_json*/,
246  grpc_error_handle* /*error*/) override {
247  return grpc_core::MakeRefCounted<Config>(name_);
248  }
249 
251  CreateCertificateProvider(
253  /*config*/) override {
254  GPR_ASSERT(cert_data_map_ != nullptr);
255  return grpc_core::MakeRefCounted<FakeCertificateProvider>(
256  cert_data_map_->Get());
257  }
258 
259  private:
260  const char* name_;
261  FakeCertificateProvider::CertDataMapWrapper* cert_data_map_;
262 };
263 
264 // Global variables for each provider.
265 FakeCertificateProvider::CertDataMapWrapper* g_fake1_cert_data_map = nullptr;
266 FakeCertificateProvider::CertDataMapWrapper* g_fake2_cert_data_map = nullptr;
267 
268 class XdsSecurityTest : public XdsEnd2endTest {
269  protected:
270  void SetUp() override {
271  BootstrapBuilder builder = BootstrapBuilder();
272  builder.AddCertificateProviderPlugin("fake_plugin1", "fake1");
273  builder.AddCertificateProviderPlugin("fake_plugin2", "fake2");
274  std::vector<std::string> fields;
275  fields.push_back(absl::StrFormat(" \"certificate_file\": \"%s\"",
276  kClientCertPath));
277  fields.push_back(absl::StrFormat(" \"private_key_file\": \"%s\"",
278  kClientKeyPath));
279  fields.push_back(absl::StrFormat(" \"ca_certificate_file\": \"%s\"",
280  kCaCertPath));
281  builder.AddCertificateProviderPlugin("file_plugin", "file_watcher",
282  absl::StrJoin(fields, ",\n"));
283  InitClient(builder);
284  CreateAndStartBackends(2);
285  root_cert_ = ReadFile(kCaCertPath);
286  bad_root_cert_ = ReadFile(kBadClientCertPath);
287  identity_pair_ = ReadTlsIdentityPair(kClientKeyPath, kClientCertPath);
288  // TODO(yashykt): Use different client certs here instead of reusing
289  // server certs after https://github.com/grpc/grpc/pull/24876 is merged
291  ReadTlsIdentityPair(kServerKeyPath, kServerCertPath);
293  ReadTlsIdentityPair(kBadClientKeyPath, kBadClientCertPath);
294  server_san_exact_.set_exact("*.test.google.fr");
295  server_san_prefix_.set_prefix("waterzooi.test.google");
296  server_san_suffix_.set_suffix("google.fr");
297  server_san_contains_.set_contains("google");
298  server_san_regex_.mutable_safe_regex()->mutable_google_re2();
299  server_san_regex_.mutable_safe_regex()->set_regex(
300  "(foo|waterzooi).test.google.(fr|be)");
301  bad_san_1_.set_exact("192.168.1.4");
302  bad_san_2_.set_exact("foo.test.google.in");
303  authenticated_identity_ = {"testclient"};
304  fallback_authenticated_identity_ = {"*.test.google.fr",
305  "waterzooi.test.google.be",
306  "*.test.youtube.com", "192.168.1.3"};
307  EdsResourceArgs args({
308  {"locality0", CreateEndpointsForBackends(0, 1)},
309  });
310  balancer_->ads_service()->SetEdsResource(BuildEdsResource(args));
311  }
312 
313  // Sends CDS updates with the new security configuration and verifies that
314  // after propagation, this new configuration is used for connections. If \a
315  // identity_instance_name and \a root_instance_name are both empty,
316  // connections are expected to use fallback credentials.
317  void UpdateAndVerifyXdsSecurityConfiguration(
318  absl::string_view root_instance_name,
319  absl::string_view root_certificate_name,
320  absl::string_view identity_instance_name,
321  absl::string_view identity_certificate_name,
322  const std::vector<StringMatcher>& san_matchers,
323  const std::vector<std::string>& expected_authenticated_identity,
324  bool test_expects_failure = false) {
325  // Change the backend and use a unique service name to use so that we know
326  // that the CDS update was applied.
327  std::string service_name = absl::StrCat(
328  "eds_service_name",
330  backend_index_ = (backend_index_ + 1) % 2;
331  EdsResourceArgs args({
332  {"locality0",
333  CreateEndpointsForBackends(backend_index_, backend_index_ + 1)},
334  });
335  balancer_->ads_service()->SetEdsResource(
336  BuildEdsResource(args, service_name.c_str()));
337  auto cluster = default_cluster_;
338  cluster.mutable_eds_cluster_config()->set_service_name(service_name);
339  if (!identity_instance_name.empty() || !root_instance_name.empty()) {
340  auto* transport_socket = cluster.mutable_transport_socket();
341  transport_socket->set_name("envoy.transport_sockets.tls");
342  UpstreamTlsContext upstream_tls_context;
343  if (!identity_instance_name.empty()) {
344  upstream_tls_context.mutable_common_tls_context()
345  ->mutable_tls_certificate_provider_instance()
346  ->set_instance_name(std::string(identity_instance_name));
347  upstream_tls_context.mutable_common_tls_context()
348  ->mutable_tls_certificate_provider_instance()
349  ->set_certificate_name(std::string(identity_certificate_name));
350  }
351  if (!root_instance_name.empty()) {
352  upstream_tls_context.mutable_common_tls_context()
353  ->mutable_validation_context()
354  ->mutable_ca_certificate_provider_instance()
355  ->set_instance_name(std::string(root_instance_name));
356  upstream_tls_context.mutable_common_tls_context()
357  ->mutable_validation_context()
358  ->mutable_ca_certificate_provider_instance()
359  ->set_certificate_name(std::string(root_certificate_name));
360  }
361  if (!san_matchers.empty()) {
362  auto* validation_context =
363  upstream_tls_context.mutable_common_tls_context()
364  ->mutable_validation_context();
365  for (const auto& san_matcher : san_matchers) {
366  *validation_context->add_match_subject_alt_names() = san_matcher;
367  }
368  }
369  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
370  }
371  balancer_->ads_service()->SetCdsResource(cluster);
372  // The updates might take time to have an effect, so use a retry loop.
373  if (test_expects_failure) {
374  SendRpcsUntil(
376  [&](const RpcResult& result) {
377  if (result.status.ok()) {
378  gpr_log(GPR_ERROR,
379  "RPC succeeded. Failure expected. Trying again.");
380  return true;
381  }
382  EXPECT_EQ(result.status.error_code(), StatusCode::UNAVAILABLE);
383  // TODO(yashkt): Change individual test cases to expect the exact
384  // error message here.
385  return false;
386  },
387  /* timeout_ms= */ 20 * 1000);
388  } else {
389  backends_[backend_index_]->backend_service()->ResetCounters();
390  SendRpcsUntil(
392  [&](const RpcResult& result) {
393  // Make sure that we are hitting the correct backend.
394  // TODO(yashykt): Even if we haven't moved to the correct backend
395  // and are still using the previous update, we should still check
396  // for the status and make sure that it fits our expectations.
397  if (backends_[backend_index_]->backend_service()->request_count() ==
398  0) {
399  return true;
400  }
401  EXPECT_TRUE(result.status.ok())
402  << "code=" << result.status.error_code()
403  << " message=" << result.status.error_message();
404  // Check that the identity is as expected.
406  ->backend_service()
407  ->last_peer_identity(),
408  expected_authenticated_identity);
409  return false;
410  },
411  /* timeout_ms= */ 20 * 1000, RpcOptions());
412  }
413  }
414 
420  StringMatcher server_san_exact_;
421  StringMatcher server_san_prefix_;
422  StringMatcher server_san_suffix_;
423  StringMatcher server_san_contains_;
424  StringMatcher server_san_regex_;
425  StringMatcher bad_san_1_;
426  StringMatcher bad_san_2_;
427  std::vector<std::string> authenticated_identity_;
428  std::vector<std::string> fallback_authenticated_identity_;
429  int backend_index_ = 0;
430 };
431 
432 TEST_P(XdsSecurityTest, UnknownTransportSocket) {
433  auto cluster = default_cluster_;
434  auto* transport_socket = cluster.mutable_transport_socket();
435  transport_socket->set_name("unknown_transport_socket");
436  balancer_->ads_service()->SetCdsResource(cluster);
437  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
438  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
439  EXPECT_THAT(response_state->error_message,
441  "Unrecognized transport socket: unknown_transport_socket"));
442 }
443 
444 TEST_P(XdsSecurityTest,
445  TLSConfigurationWithoutValidationContextCertificateProviderInstance) {
446  auto cluster = default_cluster_;
447  auto* transport_socket = cluster.mutable_transport_socket();
448  transport_socket->set_name("envoy.transport_sockets.tls");
449  balancer_->ads_service()->SetCdsResource(cluster);
450  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
451  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
452  EXPECT_THAT(response_state->error_message,
453  ::testing::HasSubstr("TLS configuration provided but no "
454  "ca_certificate_provider_instance found."));
455 }
456 
457 TEST_P(
458  XdsSecurityTest,
459  MatchSubjectAltNamesProvidedWithoutValidationContextCertificateProviderInstance) {
460  auto cluster = default_cluster_;
461  auto* transport_socket = cluster.mutable_transport_socket();
462  transport_socket->set_name("envoy.transport_sockets.tls");
463  UpstreamTlsContext upstream_tls_context;
464  auto* validation_context = upstream_tls_context.mutable_common_tls_context()
465  ->mutable_validation_context();
466  *validation_context->add_match_subject_alt_names() = server_san_exact_;
467  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
468  balancer_->ads_service()->SetCdsResource(cluster);
469  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
470  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
471  EXPECT_THAT(response_state->error_message,
472  ::testing::HasSubstr("TLS configuration provided but no "
473  "ca_certificate_provider_instance found."));
474 }
475 
476 TEST_P(
477  XdsSecurityTest,
478  TlsCertificateProviderInstanceWithoutValidationContextCertificateProviderInstance) {
479  auto cluster = default_cluster_;
480  auto* transport_socket = cluster.mutable_transport_socket();
481  transport_socket->set_name("envoy.transport_sockets.tls");
482  UpstreamTlsContext upstream_tls_context;
483  upstream_tls_context.mutable_common_tls_context()
484  ->mutable_tls_certificate_provider_instance()
485  ->set_instance_name(std::string("fake_plugin1"));
486  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
487  balancer_->ads_service()->SetCdsResource(cluster);
488  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
489  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
490  EXPECT_THAT(response_state->error_message,
491  ::testing::HasSubstr("TLS configuration provided but no "
492  "ca_certificate_provider_instance found."));
493 }
494 
495 TEST_P(XdsSecurityTest, RegexSanMatcherDoesNotAllowIgnoreCase) {
496  auto cluster = default_cluster_;
497  auto* transport_socket = cluster.mutable_transport_socket();
498  transport_socket->set_name("envoy.transport_sockets.tls");
499  UpstreamTlsContext upstream_tls_context;
500  upstream_tls_context.mutable_common_tls_context()
501  ->mutable_validation_context()
502  ->mutable_ca_certificate_provider_instance()
503  ->set_instance_name(std::string("fake_plugin1"));
504  auto* validation_context = upstream_tls_context.mutable_common_tls_context()
505  ->mutable_validation_context();
506  StringMatcher matcher;
507  matcher.mutable_safe_regex()->mutable_google_re2();
508  matcher.mutable_safe_regex()->set_regex(
509  "(foo|waterzooi).test.google.(fr|be)");
510  matcher.set_ignore_case(true);
511  *validation_context->add_match_subject_alt_names() = matcher;
512  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
513  balancer_->ads_service()->SetCdsResource(cluster);
514  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
515  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
516  EXPECT_THAT(response_state->error_message,
518  "StringMatcher: ignore_case has no effect for SAFE_REGEX."));
519 }
520 
521 TEST_P(XdsSecurityTest, UnknownRootCertificateProvider) {
522  auto cluster = default_cluster_;
523  auto* transport_socket = cluster.mutable_transport_socket();
524  transport_socket->set_name("envoy.transport_sockets.tls");
525  UpstreamTlsContext upstream_tls_context;
526  upstream_tls_context.mutable_common_tls_context()
527  ->mutable_validation_context()
528  ->mutable_ca_certificate_provider_instance()
529  ->set_instance_name("unknown");
530  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
531  balancer_->ads_service()->SetCdsResource(cluster);
532  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
533  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
534  EXPECT_THAT(response_state->error_message,
536  "Unrecognized certificate provider instance name: unknown"));
537 }
538 
539 TEST_P(XdsSecurityTest, UnknownIdentityCertificateProvider) {
540  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
541  auto cluster = default_cluster_;
542  auto* transport_socket = cluster.mutable_transport_socket();
543  transport_socket->set_name("envoy.transport_sockets.tls");
544  UpstreamTlsContext upstream_tls_context;
545  upstream_tls_context.mutable_common_tls_context()
546  ->mutable_tls_certificate_provider_instance()
547  ->set_instance_name("unknown");
548  upstream_tls_context.mutable_common_tls_context()
549  ->mutable_validation_context()
550  ->mutable_ca_certificate_provider_instance()
551  ->set_instance_name("fake_plugin1");
552  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
553  balancer_->ads_service()->SetCdsResource(cluster);
554  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
555  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
556  EXPECT_THAT(response_state->error_message,
558  "Unrecognized certificate provider instance name: unknown"));
559 }
560 
561 TEST_P(XdsSecurityTest,
562  NacksCertificateValidationContextWithVerifyCertificateSpki) {
563  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
564  auto cluster = default_cluster_;
565  auto* transport_socket = cluster.mutable_transport_socket();
566  transport_socket->set_name("envoy.transport_sockets.tls");
567  UpstreamTlsContext upstream_tls_context;
568  upstream_tls_context.mutable_common_tls_context()
569  ->mutable_validation_context()
570  ->mutable_ca_certificate_provider_instance()
571  ->set_instance_name("fake_plugin1");
572  upstream_tls_context.mutable_common_tls_context()
573  ->mutable_validation_context()
574  ->add_verify_certificate_spki("spki");
575  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
576  balancer_->ads_service()->SetCdsResource(cluster);
577  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
578  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
579  EXPECT_THAT(
580  response_state->error_message,
582  "CertificateValidationContext: verify_certificate_spki unsupported"));
583 }
584 
585 TEST_P(XdsSecurityTest,
586  NacksCertificateValidationContextWithVerifyCertificateHash) {
587  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
588  auto cluster = default_cluster_;
589  auto* transport_socket = cluster.mutable_transport_socket();
590  transport_socket->set_name("envoy.transport_sockets.tls");
591  UpstreamTlsContext upstream_tls_context;
592  upstream_tls_context.mutable_common_tls_context()
593  ->mutable_validation_context()
594  ->mutable_ca_certificate_provider_instance()
595  ->set_instance_name("fake_plugin1");
596  upstream_tls_context.mutable_common_tls_context()
597  ->mutable_validation_context()
598  ->add_verify_certificate_hash("hash");
599  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
600  balancer_->ads_service()->SetCdsResource(cluster);
601  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
602  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
603  EXPECT_THAT(
604  response_state->error_message,
606  "CertificateValidationContext: verify_certificate_hash unsupported"));
607 }
608 
609 TEST_P(XdsSecurityTest,
610  NacksCertificateValidationContextWithRequireSignedCertificateTimes) {
611  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
612  auto cluster = default_cluster_;
613  auto* transport_socket = cluster.mutable_transport_socket();
614  transport_socket->set_name("envoy.transport_sockets.tls");
615  UpstreamTlsContext upstream_tls_context;
616  upstream_tls_context.mutable_common_tls_context()
617  ->mutable_validation_context()
618  ->mutable_ca_certificate_provider_instance()
619  ->set_instance_name("fake_plugin1");
620  upstream_tls_context.mutable_common_tls_context()
621  ->mutable_validation_context()
622  ->mutable_require_signed_certificate_timestamp()
623  ->set_value(true);
624  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
625  balancer_->ads_service()->SetCdsResource(cluster);
626  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
627  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
628  EXPECT_THAT(
629  response_state->error_message,
630  ::testing::HasSubstr("CertificateValidationContext: "
631  "require_signed_certificate_timestamp unsupported"));
632 }
633 
634 TEST_P(XdsSecurityTest, NacksCertificateValidationContextWithCrl) {
635  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
636  auto cluster = default_cluster_;
637  auto* transport_socket = cluster.mutable_transport_socket();
638  transport_socket->set_name("envoy.transport_sockets.tls");
639  UpstreamTlsContext upstream_tls_context;
640  upstream_tls_context.mutable_common_tls_context()
641  ->mutable_validation_context()
642  ->mutable_ca_certificate_provider_instance()
643  ->set_instance_name("fake_plugin1");
644  upstream_tls_context.mutable_common_tls_context()
645  ->mutable_validation_context()
646  ->mutable_crl();
647  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
648  balancer_->ads_service()->SetCdsResource(cluster);
649  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
650  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
651  EXPECT_THAT(
652  response_state->error_message,
653  ::testing::HasSubstr("CertificateValidationContext: crl unsupported"));
654 }
655 
656 TEST_P(XdsSecurityTest,
657  NacksCertificateValidationContextWithCustomValidatorConfig) {
658  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
659  auto cluster = default_cluster_;
660  auto* transport_socket = cluster.mutable_transport_socket();
661  transport_socket->set_name("envoy.transport_sockets.tls");
662  UpstreamTlsContext upstream_tls_context;
663  upstream_tls_context.mutable_common_tls_context()
664  ->mutable_validation_context()
665  ->mutable_ca_certificate_provider_instance()
666  ->set_instance_name("fake_plugin1");
667  upstream_tls_context.mutable_common_tls_context()
668  ->mutable_validation_context()
669  ->mutable_custom_validator_config();
670  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
671  balancer_->ads_service()->SetCdsResource(cluster);
672  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
673  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
674  EXPECT_THAT(
675  response_state->error_message,
677  "CertificateValidationContext: custom_validator_config unsupported"));
678 }
679 
680 TEST_P(XdsSecurityTest, NacksValidationContextSdsSecretConfig) {
681  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
682  auto cluster = default_cluster_;
683  auto* transport_socket = cluster.mutable_transport_socket();
684  transport_socket->set_name("envoy.transport_sockets.tls");
685  UpstreamTlsContext upstream_tls_context;
686  upstream_tls_context.mutable_common_tls_context()
687  ->mutable_validation_context_sds_secret_config();
688  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
689  balancer_->ads_service()->SetCdsResource(cluster);
690  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
691  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
692  EXPECT_THAT(
693  response_state->error_message,
694  ::testing::HasSubstr("validation_context_sds_secret_config unsupported"));
695 }
696 
697 TEST_P(XdsSecurityTest, NacksTlsParams) {
698  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
699  auto cluster = default_cluster_;
700  auto* transport_socket = cluster.mutable_transport_socket();
701  transport_socket->set_name("envoy.transport_sockets.tls");
702  UpstreamTlsContext upstream_tls_context;
703  upstream_tls_context.mutable_common_tls_context()
704  ->mutable_validation_context()
705  ->mutable_ca_certificate_provider_instance()
706  ->set_instance_name("fake_plugin1");
707  upstream_tls_context.mutable_common_tls_context()->mutable_tls_params();
708  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
709  balancer_->ads_service()->SetCdsResource(cluster);
710  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
711  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
712  EXPECT_THAT(response_state->error_message,
713  ::testing::HasSubstr("tls_params unsupported"));
714 }
715 
716 TEST_P(XdsSecurityTest, NacksCustomHandshaker) {
717  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
718  auto cluster = default_cluster_;
719  auto* transport_socket = cluster.mutable_transport_socket();
720  transport_socket->set_name("envoy.transport_sockets.tls");
721  UpstreamTlsContext upstream_tls_context;
722  upstream_tls_context.mutable_common_tls_context()
723  ->mutable_validation_context()
724  ->mutable_ca_certificate_provider_instance()
725  ->set_instance_name("fake_plugin1");
726  upstream_tls_context.mutable_common_tls_context()
727  ->mutable_custom_handshaker();
728  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
729  balancer_->ads_service()->SetCdsResource(cluster);
730  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
731  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
732  EXPECT_THAT(response_state->error_message,
733  ::testing::HasSubstr("custom_handshaker unsupported"));
734 }
735 
736 TEST_P(XdsSecurityTest, NacksTlsCertificates) {
737  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
738  auto cluster = default_cluster_;
739  auto* transport_socket = cluster.mutable_transport_socket();
740  transport_socket->set_name("envoy.transport_sockets.tls");
741  UpstreamTlsContext upstream_tls_context;
742  upstream_tls_context.mutable_common_tls_context()
743  ->mutable_validation_context()
744  ->mutable_ca_certificate_provider_instance()
745  ->set_instance_name("fake_plugin1");
746  upstream_tls_context.mutable_common_tls_context()->add_tls_certificates();
747  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
748  balancer_->ads_service()->SetCdsResource(cluster);
749  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
750  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
751  EXPECT_THAT(response_state->error_message,
752  ::testing::HasSubstr("tls_certificates unsupported"));
753 }
754 
755 TEST_P(XdsSecurityTest, NacksTlsCertificateSdsSecretConfigs) {
756  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
757  auto cluster = default_cluster_;
758  auto* transport_socket = cluster.mutable_transport_socket();
759  transport_socket->set_name("envoy.transport_sockets.tls");
760  UpstreamTlsContext upstream_tls_context;
761  upstream_tls_context.mutable_common_tls_context()
762  ->mutable_validation_context()
763  ->mutable_ca_certificate_provider_instance()
764  ->set_instance_name("fake_plugin1");
765  upstream_tls_context.mutable_common_tls_context()
766  ->add_tls_certificate_sds_secret_configs();
767  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
768  balancer_->ads_service()->SetCdsResource(cluster);
769  const auto response_state = WaitForCdsNack(DEBUG_LOCATION);
770  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
771  EXPECT_THAT(
772  response_state->error_message,
773  ::testing::HasSubstr("tls_certificate_sds_secret_configs unsupported"));
774 }
775 
776 TEST_P(XdsSecurityTest, TestTlsConfigurationInCombinedValidationContext) {
777  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
778  auto cluster = default_cluster_;
779  auto* transport_socket = cluster.mutable_transport_socket();
780  transport_socket->set_name("envoy.transport_sockets.tls");
781  UpstreamTlsContext upstream_tls_context;
782  upstream_tls_context.mutable_common_tls_context()
783  ->mutable_combined_validation_context()
784  ->mutable_default_validation_context()
785  ->mutable_ca_certificate_provider_instance()
786  ->set_instance_name("fake_plugin1");
787  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
788  balancer_->ads_service()->SetCdsResource(cluster);
789  CheckRpcSendOk(DEBUG_LOCATION);
790 }
791 
792 // TODO(yashykt): Remove this test once we stop supporting old fields
793 TEST_P(XdsSecurityTest,
794  TestTlsConfigurationInValidationContextCertificateProviderInstance) {
795  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
796  auto cluster = default_cluster_;
797  auto* transport_socket = cluster.mutable_transport_socket();
798  transport_socket->set_name("envoy.transport_sockets.tls");
799  UpstreamTlsContext upstream_tls_context;
800  upstream_tls_context.mutable_common_tls_context()
801  ->mutable_combined_validation_context()
802  ->mutable_validation_context_certificate_provider_instance()
803  ->set_instance_name("fake_plugin1");
804  transport_socket->mutable_typed_config()->PackFrom(upstream_tls_context);
805  balancer_->ads_service()->SetCdsResource(cluster);
806  CheckRpcSendOk(DEBUG_LOCATION);
807 }
808 
809 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithNoSanMatchers) {
810  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
811  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
812  "", {}, authenticated_identity_);
813 }
814 
815 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithExactSanMatcher) {
816  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
817  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
818  "", {server_san_exact_},
820 }
821 
822 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithPrefixSanMatcher) {
823  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
824  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
825  "", {server_san_prefix_},
827 }
828 
829 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithSuffixSanMatcher) {
830  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
831  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
832  "", {server_san_suffix_},
834 }
835 
836 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithContainsSanMatcher) {
837  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
838  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
839  "", {server_san_contains_},
841 }
842 
843 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRegexSanMatcher) {
844  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
845  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
846  "", {server_san_regex_},
848 }
849 
850 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithSanMatchersUpdate) {
851  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
852  UpdateAndVerifyXdsSecurityConfiguration(
853  "fake_plugin1", "", "fake_plugin1", "",
855  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
856  "", {bad_san_1_, bad_san_2_}, {},
857  true /* failure */);
858  UpdateAndVerifyXdsSecurityConfiguration(
859  "fake_plugin1", "", "fake_plugin1", "",
861 }
862 
863 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRootPluginUpdate) {
864  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
865  g_fake2_cert_data_map->Set({{"", {bad_root_cert_, bad_identity_pair_}}});
866  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
867  "", {server_san_exact_},
869  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin2" /* bad root */, "",
870  "fake_plugin1", "", {}, {},
871  true /* failure */);
872  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
873  "", {server_san_exact_},
875 }
876 
877 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithIdentityPluginUpdate) {
878  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
879  g_fake2_cert_data_map->Set({{"", {root_cert_, fallback_identity_pair_}}});
880  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
881  "", {server_san_exact_},
883  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin2",
884  "", {server_san_exact_},
886 }
887 
888 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithBothPluginsUpdated) {
889  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
890  g_fake2_cert_data_map->Set({{"", {bad_root_cert_, bad_identity_pair_}},
891  {"good", {root_cert_, fallback_identity_pair_}}});
892  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin2", "", "fake_plugin2",
893  "", {}, {}, true /* failure */);
894  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
895  "", {server_san_prefix_},
897  UpdateAndVerifyXdsSecurityConfiguration(
898  "fake_plugin2", "good", "fake_plugin2", "good", {server_san_prefix_},
900 }
901 
902 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithRootCertificateNameUpdate) {
903  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
904  {"bad", {bad_root_cert_, bad_identity_pair_}}});
905  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
906  "", {server_san_regex_},
908  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "bad", "fake_plugin1",
909  "", {server_san_regex_}, {},
910  true /* failure */);
911 }
912 
913 TEST_P(XdsSecurityTest,
914  TestMtlsConfigurationWithIdentityCertificateNameUpdate) {
915  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
916  {"bad", {bad_root_cert_, bad_identity_pair_}}});
917  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
918  "", {server_san_exact_},
920  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
921  "bad", {server_san_exact_}, {},
922  true /* failure */);
923 }
924 
925 TEST_P(XdsSecurityTest,
926  TestMtlsConfigurationWithIdentityCertificateNameUpdateGoodCerts) {
927  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
928  {"good", {root_cert_, fallback_identity_pair_}}});
929  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
930  "", {server_san_exact_},
932  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
933  "good", {server_san_exact_},
935 }
936 
937 TEST_P(XdsSecurityTest, TestMtlsConfigurationWithBothCertificateNamesUpdated) {
938  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
939  {"bad", {bad_root_cert_, bad_identity_pair_}}});
940  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "bad", "fake_plugin1",
941  "bad", {server_san_prefix_}, {},
942  true /* failure */);
943  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
944  "", {server_san_prefix_},
946 }
947 
948 TEST_P(XdsSecurityTest, TestTlsConfigurationWithNoSanMatchers) {
949  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
950  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "", {},
951  {} /* unauthenticated */);
952 }
953 
954 TEST_P(XdsSecurityTest, TestTlsConfigurationWithSanMatchers) {
955  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
956  UpdateAndVerifyXdsSecurityConfiguration(
957  "fake_plugin1", "", "", "",
959  {} /* unauthenticated */);
960 }
961 
962 TEST_P(XdsSecurityTest, TestTlsConfigurationWithSanMatchersUpdate) {
963  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
964  UpdateAndVerifyXdsSecurityConfiguration(
965  "fake_plugin1", "", "", "", {server_san_exact_, server_san_prefix_},
966  {} /* unauthenticated */);
967  UpdateAndVerifyXdsSecurityConfiguration(
968  "fake_plugin1", "", "", "", {bad_san_1_, bad_san_2_},
969  {} /* unauthenticated */, true /* failure */);
970  UpdateAndVerifyXdsSecurityConfiguration(
971  "fake_plugin1", "", "", "", {server_san_prefix_, server_san_regex_},
972  {} /* unauthenticated */);
973 }
974 
975 TEST_P(XdsSecurityTest, TestTlsConfigurationWithRootCertificateNameUpdate) {
976  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
977  {"bad", {bad_root_cert_, bad_identity_pair_}}});
978  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
980  {} /* unauthenticated */);
981  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "bad", "", "",
982  {server_san_exact_}, {},
983  true /* failure */);
984 }
985 
986 TEST_P(XdsSecurityTest, TestTlsConfigurationWithRootPluginUpdate) {
987  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
988  g_fake2_cert_data_map->Set({{"", {bad_root_cert_, bad_identity_pair_}}});
989  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
991  {} /* unauthenticated */);
992  UpdateAndVerifyXdsSecurityConfiguration(
993  "fake_plugin2", "", "", "", {server_san_exact_}, {}, true /* failure */);
994 }
995 
996 TEST_P(XdsSecurityTest, TestFallbackConfiguration) {
997  UpdateAndVerifyXdsSecurityConfiguration("", "", "", "", {},
999 }
1000 
1001 TEST_P(XdsSecurityTest, TestMtlsToTls) {
1002  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1003  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
1004  "", {server_san_exact_},
1006  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
1008  {} /* unauthenticated */);
1009 }
1010 
1011 TEST_P(XdsSecurityTest, TestMtlsToFallback) {
1012  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1013  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
1014  "", {server_san_exact_},
1016  UpdateAndVerifyXdsSecurityConfiguration("", "", "", "", {},
1018 }
1019 
1020 TEST_P(XdsSecurityTest, TestTlsToMtls) {
1021  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1022  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
1024  {} /* unauthenticated */);
1025  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
1026  "", {server_san_exact_},
1028 }
1029 
1030 TEST_P(XdsSecurityTest, TestTlsToFallback) {
1031  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1032  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
1034  {} /* unauthenticated */);
1035  UpdateAndVerifyXdsSecurityConfiguration("", "", "", "", {},
1037 }
1038 
1039 TEST_P(XdsSecurityTest, TestFallbackToMtls) {
1040  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1041  UpdateAndVerifyXdsSecurityConfiguration("", "", "", "", {},
1043  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "fake_plugin1",
1044  "", {server_san_exact_},
1046 }
1047 
1048 TEST_P(XdsSecurityTest, TestFallbackToTls) {
1049  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1050  UpdateAndVerifyXdsSecurityConfiguration("", "", "", "", {},
1052  UpdateAndVerifyXdsSecurityConfiguration("fake_plugin1", "", "", "",
1054  {} /* unauthenticated */);
1055 }
1056 
1057 TEST_P(XdsSecurityTest, TestFileWatcherCertificateProvider) {
1058  UpdateAndVerifyXdsSecurityConfiguration("file_plugin", "", "file_plugin", "",
1061 }
1062 
1063 class XdsEnabledServerTest : public XdsEnd2endTest {
1064  protected:
1065  void SetUp() override {} // No-op -- individual tests do this themselves.
1066 
1067  void DoSetUp(BootstrapBuilder builder = BootstrapBuilder()) {
1068  InitClient(builder);
1069  CreateBackends(1, /*xds_enabled=*/true);
1070  EdsResourceArgs args({{"locality0", CreateEndpointsForBackends(0, 1)}});
1071  balancer_->ads_service()->SetEdsResource(BuildEdsResource(args));
1072  }
1073 };
1074 
1075 TEST_P(XdsEnabledServerTest, Basic) {
1076  DoSetUp();
1077  backends_[0]->Start();
1078  WaitForBackend(DEBUG_LOCATION, 0);
1079 }
1080 
1081 TEST_P(XdsEnabledServerTest, ListenerDeletionIgnored) {
1082  DoSetUp(BootstrapBuilder().SetIgnoreResourceDeletion());
1083  backends_[0]->Start();
1084  WaitForBackend(DEBUG_LOCATION, 0);
1085  // Check that we ACKed.
1086  // TODO(roth): There may be multiple entries in the resource state response
1087  // queue, because the client doesn't necessarily subscribe to all resources
1088  // in a single message, and the server currently (I suspect incorrectly?)
1089  // thinks that each subscription message is an ACK. So for now, we
1090  // drain the entire LDS resource state response queue, ensuring that
1091  // all responses are ACKs. Need to look more closely at the protocol
1092  // semantics here and make sure the server is doing the right thing,
1093  // in which case we may be able to avoid this.
1094  while (true) {
1095  auto response_state = balancer_->ads_service()->lds_response_state();
1096  if (!response_state.has_value()) break;
1097  ASSERT_TRUE(response_state.has_value());
1098  EXPECT_EQ(response_state->state, AdsServiceImpl::ResponseState::ACKED);
1099  }
1100  // Now unset the resource.
1101  balancer_->ads_service()->UnsetResource(
1102  kLdsTypeUrl, GetServerListenerName(backends_[0]->port()));
1103  // Wait for update to be ACKed.
1104  absl::Time deadline =
1106  while (true) {
1107  auto response_state = balancer_->ads_service()->lds_response_state();
1108  if (!response_state.has_value()) {
1110  continue;
1111  }
1112  EXPECT_EQ(response_state->state, AdsServiceImpl::ResponseState::ACKED);
1113  ASSERT_LT(absl::Now(), deadline);
1114  break;
1115  }
1116  // Make sure server is still serving.
1117  CheckRpcSendOk(DEBUG_LOCATION);
1118 }
1119 
1120 TEST_P(XdsEnabledServerTest, BadLdsUpdateNoApiListenerNorAddress) {
1121  DoSetUp();
1122  Listener listener = default_server_listener_;
1123  listener.clear_address();
1124  listener.set_name(
1125  absl::StrCat("grpc/server?xds.resource.listening_address=",
1126  ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
1127  balancer_->ads_service()->SetLdsResource(listener);
1128  backends_[0]->Start();
1129  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1130  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1131  EXPECT_THAT(
1132  response_state->error_message,
1133  ::testing::HasSubstr("Listener has neither address nor ApiListener"));
1134 }
1135 
1136 // TODO(roth): Re-enable the following test once
1137 // github.com/istio/istio/issues/38914 is resolved.
1138 TEST_P(XdsEnabledServerTest, DISABLED_BadLdsUpdateBothApiListenerAndAddress) {
1139  DoSetUp();
1140  Listener listener = default_server_listener_;
1141  listener.mutable_api_listener();
1142  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1143  backends_[0]->port(),
1144  default_server_route_config_);
1145  backends_[0]->Start();
1146  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1147  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1148  EXPECT_THAT(
1149  response_state->error_message,
1150  ::testing::HasSubstr("Listener has both address and ApiListener"));
1151 }
1152 
1153 TEST_P(XdsEnabledServerTest, NacksNonZeroXffNumTrusterHops) {
1154  DoSetUp();
1155  Listener listener = default_server_listener_;
1156  HttpConnectionManager http_connection_manager =
1157  ServerHcmAccessor().Unpack(listener);
1158  http_connection_manager.set_xff_num_trusted_hops(1);
1159  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1160  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1161  backends_[0]->port(),
1162  default_server_route_config_);
1163  backends_[0]->Start();
1164  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1165  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1166  EXPECT_THAT(response_state->error_message,
1167  ::testing::HasSubstr("'xff_num_trusted_hops' must be zero"));
1168 }
1169 
1170 TEST_P(XdsEnabledServerTest, NacksNonEmptyOriginalIpDetectionExtensions) {
1171  DoSetUp();
1172  Listener listener = default_server_listener_;
1173  HttpConnectionManager http_connection_manager =
1174  ServerHcmAccessor().Unpack(listener);
1175  http_connection_manager.add_original_ip_detection_extensions();
1176  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1177  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1178  backends_[0]->port(),
1179  default_server_route_config_);
1180  backends_[0]->Start();
1181  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1182  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1183  EXPECT_THAT(
1184  response_state->error_message,
1185  ::testing::HasSubstr("'original_ip_detection_extensions' must be empty"));
1186 }
1187 
1188 TEST_P(XdsEnabledServerTest, UnsupportedL4Filter) {
1189  DoSetUp();
1190  Listener listener = default_server_listener_;
1191  listener.mutable_default_filter_chain()->clear_filters();
1192  listener.mutable_default_filter_chain()->add_filters()->mutable_typed_config()->PackFrom(default_listener_ /* any proto object other than HttpConnectionManager */);
1193  balancer_->ads_service()->SetLdsResource(
1194  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
1195  backends_[0]->Start();
1196  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1197  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1198  EXPECT_THAT(response_state->error_message,
1199  ::testing::HasSubstr("Unsupported filter type"));
1200 }
1201 
1202 TEST_P(XdsEnabledServerTest, NacksEmptyHttpFilterList) {
1203  DoSetUp();
1204  Listener listener = default_server_listener_;
1205  HttpConnectionManager http_connection_manager =
1206  ServerHcmAccessor().Unpack(listener);
1207  http_connection_manager.clear_http_filters();
1208  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1209  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1210  backends_[0]->port(),
1211  default_server_route_config_);
1212  backends_[0]->Start();
1213  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1214  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1215  EXPECT_THAT(response_state->error_message,
1216  ::testing::HasSubstr("Expected at least one HTTP filter"));
1217 }
1218 
1219 TEST_P(XdsEnabledServerTest, UnsupportedHttpFilter) {
1220  DoSetUp();
1221  Listener listener = default_server_listener_;
1222  HttpConnectionManager http_connection_manager =
1223  ServerHcmAccessor().Unpack(listener);
1224  http_connection_manager.clear_http_filters();
1225  auto* http_filter = http_connection_manager.add_http_filters();
1226  http_filter->set_name("grpc.testing.unsupported_http_filter");
1227  http_filter->mutable_typed_config()->set_type_url(
1228  "custom/grpc.testing.unsupported_http_filter");
1229  http_filter = http_connection_manager.add_http_filters();
1230  http_filter->set_name("router");
1231  http_filter->mutable_typed_config()->PackFrom(
1232  envoy::extensions::filters::http::router::v3::Router());
1233  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1234  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1235  backends_[0]->port(),
1236  default_server_route_config_);
1237  backends_[0]->Start();
1238  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1239  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1240  EXPECT_THAT(response_state->error_message,
1241  ::testing::HasSubstr("no filter registered for config type "
1242  "grpc.testing.unsupported_http_filter"));
1243 }
1244 
1245 TEST_P(XdsEnabledServerTest, HttpFilterNotSupportedOnServer) {
1246  DoSetUp();
1247  Listener listener = default_server_listener_;
1248  HttpConnectionManager http_connection_manager =
1249  ServerHcmAccessor().Unpack(listener);
1250  http_connection_manager.clear_http_filters();
1251  auto* http_filter = http_connection_manager.add_http_filters();
1252  http_filter->set_name("grpc.testing.client_only_http_filter");
1253  http_filter->mutable_typed_config()->set_type_url(
1254  "custom/grpc.testing.client_only_http_filter");
1255  http_filter = http_connection_manager.add_http_filters();
1256  http_filter->set_name("router");
1257  http_filter->mutable_typed_config()->PackFrom(
1258  envoy::extensions::filters::http::router::v3::Router());
1259  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1260  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1261  backends_[0]->port(),
1262  default_server_route_config_);
1263  backends_[0]->Start();
1264  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1265  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1266  EXPECT_THAT(
1267  response_state->error_message,
1268  ::testing::HasSubstr("Filter grpc.testing.client_only_http_filter is not "
1269  "supported on servers"));
1270 }
1271 
1272 TEST_P(XdsEnabledServerTest,
1273  HttpFilterNotSupportedOnServerIgnoredWhenOptional) {
1274  DoSetUp();
1275  Listener listener = default_server_listener_;
1276  HttpConnectionManager http_connection_manager =
1277  ServerHcmAccessor().Unpack(listener);
1278  http_connection_manager.clear_http_filters();
1279  auto* http_filter = http_connection_manager.add_http_filters();
1280  http_filter->set_name("grpc.testing.client_only_http_filter");
1281  http_filter->mutable_typed_config()->set_type_url(
1282  "custom/grpc.testing.client_only_http_filter");
1283  http_filter->set_is_optional(true);
1284  http_filter = http_connection_manager.add_http_filters();
1285  http_filter->set_name("router");
1286  http_filter->mutable_typed_config()->PackFrom(
1287  envoy::extensions::filters::http::router::v3::Router());
1288  ServerHcmAccessor().Pack(http_connection_manager, &listener);
1289  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1290  backends_[0]->port(),
1291  default_server_route_config_);
1292  backends_[0]->Start();
1293  WaitForBackend(DEBUG_LOCATION, 0);
1294  auto response_state = balancer_->ads_service()->lds_response_state();
1295  ASSERT_TRUE(response_state.has_value());
1296  EXPECT_EQ(response_state->state, AdsServiceImpl::ResponseState::ACKED);
1297 }
1298 
1299 // Verify that a mismatch of listening address results in "not serving"
1300 // status.
1301 TEST_P(XdsEnabledServerTest, ListenerAddressMismatch) {
1302  DoSetUp();
1303  Listener listener = default_server_listener_;
1304  // Set a different listening address in the LDS update
1305  listener.mutable_address()->mutable_socket_address()->set_address(
1306  "192.168.1.1");
1307  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1308  backends_[0]->port(),
1309  default_server_route_config_);
1310  backends_[0]->Start();
1311  backends_[0]->notifier()->WaitOnServingStatusChange(
1312  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
1314 }
1315 
1316 TEST_P(XdsEnabledServerTest, UseOriginalDstNotSupported) {
1317  DoSetUp();
1318  Listener listener = default_server_listener_;
1319  listener.mutable_use_original_dst()->set_value(true);
1320  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1321  backends_[0]->port(),
1322  default_server_route_config_);
1323  backends_[0]->Start();
1324  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1325  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1326  EXPECT_THAT(
1327  response_state->error_message,
1328  ::testing::HasSubstr("Field \'use_original_dst\' is not supported."));
1329 }
1330 
1331 class XdsServerSecurityTest : public XdsEnd2endTest {
1332  protected:
1333  void SetUp() override {
1334  BootstrapBuilder builder = BootstrapBuilder();
1335  builder.AddCertificateProviderPlugin("fake_plugin1", "fake1");
1336  builder.AddCertificateProviderPlugin("fake_plugin2", "fake2");
1337  std::vector<std::string> fields;
1338  fields.push_back(absl::StrFormat(" \"certificate_file\": \"%s\"",
1339  kClientCertPath));
1340  fields.push_back(absl::StrFormat(" \"private_key_file\": \"%s\"",
1341  kClientKeyPath));
1342  fields.push_back(absl::StrFormat(" \"ca_certificate_file\": \"%s\"",
1343  kCaCertPath));
1344  builder.AddCertificateProviderPlugin("file_plugin", "file_watcher",
1345  absl::StrJoin(fields, ",\n"));
1346  InitClient(builder);
1347  CreateBackends(1, /*xds_enabled=*/true);
1348  root_cert_ = ReadFile(kCaCertPath);
1349  bad_root_cert_ = ReadFile(kBadClientCertPath);
1350  identity_pair_ = ReadTlsIdentityPair(kServerKeyPath, kServerCertPath);
1352  ReadTlsIdentityPair(kBadClientKeyPath, kBadClientCertPath);
1353  identity_pair_2_ = ReadTlsIdentityPair(kClientKeyPath, kClientCertPath);
1354  server_authenticated_identity_ = {"*.test.google.fr",
1355  "waterzooi.test.google.be",
1356  "*.test.youtube.com", "192.168.1.3"};
1357  server_authenticated_identity_2_ = {"testclient"};
1358  client_authenticated_identity_ = {"*.test.google.fr",
1359  "waterzooi.test.google.be",
1360  "*.test.youtube.com", "192.168.1.3"};
1361  EdsResourceArgs args({
1362  {"locality0", CreateEndpointsForBackends(0, 1)},
1363  });
1364  balancer_->ads_service()->SetEdsResource(BuildEdsResource(args));
1365  }
1366 
1367  void SetLdsUpdate(absl::string_view root_instance_name,
1368  absl::string_view root_certificate_name,
1369  absl::string_view identity_instance_name,
1370  absl::string_view identity_certificate_name,
1371  bool require_client_certificates) {
1372  Listener listener = default_server_listener_;
1373  auto* filter_chain = listener.mutable_default_filter_chain();
1374  if (!identity_instance_name.empty()) {
1375  auto* transport_socket = filter_chain->mutable_transport_socket();
1376  transport_socket->set_name("envoy.transport_sockets.tls");
1377  DownstreamTlsContext downstream_tls_context;
1378  downstream_tls_context.mutable_common_tls_context()
1379  ->mutable_tls_certificate_provider_instance()
1380  ->set_instance_name(std::string(identity_instance_name));
1381  downstream_tls_context.mutable_common_tls_context()
1382  ->mutable_tls_certificate_provider_instance()
1383  ->set_certificate_name(std::string(identity_certificate_name));
1384  if (!root_instance_name.empty()) {
1385  downstream_tls_context.mutable_common_tls_context()
1386  ->mutable_validation_context()
1387  ->mutable_ca_certificate_provider_instance()
1388  ->set_instance_name(std::string(root_instance_name));
1389  downstream_tls_context.mutable_common_tls_context()
1390  ->mutable_validation_context()
1391  ->mutable_ca_certificate_provider_instance()
1392  ->set_certificate_name(std::string(root_certificate_name));
1393  downstream_tls_context.mutable_require_client_certificate()->set_value(
1394  require_client_certificates);
1395  }
1396  transport_socket->mutable_typed_config()->PackFrom(
1397  downstream_tls_context);
1398  }
1399  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1400  backends_[0]->port(),
1401  default_server_route_config_);
1402  }
1403 
1404  std::shared_ptr<grpc::Channel> CreateMtlsChannel() {
1405  ChannelArguments args;
1406  // Override target name for host name check
1408  ipv6_only_ ? "::1" : "127.0.0.1");
1410  std::string uri = absl::StrCat(
1411  ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
1412  IdentityKeyCertPair key_cert_pair;
1413  key_cert_pair.private_key = ReadFile(kServerKeyPath);
1414  key_cert_pair.certificate_chain = ReadFile(kServerCertPath);
1415  std::vector<IdentityKeyCertPair> identity_key_cert_pairs;
1416  identity_key_cert_pairs.emplace_back(key_cert_pair);
1417  auto certificate_provider = std::make_shared<StaticDataCertificateProvider>(
1418  ReadFile(kCaCertPath), identity_key_cert_pairs);
1420  options.set_certificate_provider(std::move(certificate_provider));
1421  options.watch_root_certs();
1422  options.watch_identity_key_cert_pairs();
1423  auto verifier =
1424  ExternalCertificateVerifier::Create<SyncCertificateVerifier>(true);
1425  options.set_verify_server_certs(true);
1426  options.set_certificate_verifier(std::move(verifier));
1427  auto channel_creds = grpc::experimental::TlsCredentials(options);
1428  GPR_ASSERT(channel_creds.get() != nullptr);
1429  return CreateCustomChannel(uri, channel_creds, args);
1430  }
1431 
1432  std::shared_ptr<grpc::Channel> CreateTlsChannel() {
1433  ChannelArguments args;
1434  // Override target name for host name check
1436  ipv6_only_ ? "::1" : "127.0.0.1");
1438  std::string uri = absl::StrCat(
1439  ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
1440  auto certificate_provider =
1441  std::make_shared<StaticDataCertificateProvider>(ReadFile(kCaCertPath));
1443  options.set_certificate_provider(std::move(certificate_provider));
1444  options.watch_root_certs();
1445  auto verifier =
1446  ExternalCertificateVerifier::Create<SyncCertificateVerifier>(true);
1447  options.set_verify_server_certs(true);
1448  options.set_certificate_verifier(std::move(verifier));
1449  auto channel_creds = grpc::experimental::TlsCredentials(options);
1450  GPR_ASSERT(channel_creds.get() != nullptr);
1451  return CreateCustomChannel(uri, channel_creds, args);
1452  }
1453 
1454  std::shared_ptr<grpc::Channel> CreateInsecureChannel(
1455  bool use_put_requests = false) {
1456  ChannelArguments args;
1457  // Override target name for host name check
1459  ipv6_only_ ? "::1" : "127.0.0.1");
1461  if (use_put_requests) {
1463  }
1464  std::string uri = absl::StrCat(
1465  ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
1467  }
1468 
1469  void SendRpc(
1470  std::function<std::shared_ptr<grpc::Channel>()> channel_creator,
1471  std::vector<std::string> expected_server_identity,
1472  std::vector<std::string> expected_client_identity,
1473  bool test_expects_failure = false,
1474  absl::optional<grpc::StatusCode> expected_status = absl::nullopt) {
1475  gpr_log(GPR_INFO, "Sending RPC");
1476  int num_tries = 0;
1477  constexpr int kRetryCount = 100;
1478  auto overall_deadline = absl::Now() + absl::Seconds(5);
1479  for (; num_tries < kRetryCount || absl::Now() < overall_deadline;
1480  num_tries++) {
1481  auto channel = channel_creator();
1482  auto stub = grpc::testing::EchoTestService::NewStub(channel);
1483  ClientContext context;
1486  EchoRequest request;
1487  // TODO(yashykt): Skipping the cancelled check on the server since the
1488  // server's graceful shutdown isn't as per spec and the check isn't
1489  // necessary for what we want to test here anyway.
1490  // https://github.com/grpc/grpc/issues/24237
1491  request.mutable_param()->set_skip_cancelled_check(true);
1492  request.set_message(kRequestMessage);
1493  EchoResponse response;
1494  Status status = stub->Echo(&context, request, &response);
1495  if (test_expects_failure) {
1496  if (status.ok()) {
1497  gpr_log(GPR_ERROR, "RPC succeeded. Failure expected. Trying again.");
1498  continue;
1499  }
1500  if (expected_status.has_value() &&
1501  *expected_status != status.error_code()) {
1503  "Expected status does not match Actual(%d) vs Expected(%d)",
1504  status.error_code(), *expected_status);
1505  continue;
1506  }
1507  } else {
1508  if (!status.ok()) {
1509  gpr_log(GPR_ERROR, "RPC failed. code=%d message=%s Trying again.",
1510  status.error_code(), status.error_message().c_str());
1511  continue;
1512  }
1513  EXPECT_EQ(response.message(), kRequestMessage);
1514  std::vector<std::string> peer_identity;
1515  for (const auto& entry : context.auth_context()->GetPeerIdentity()) {
1516  peer_identity.emplace_back(
1517  std::string(entry.data(), entry.size()).c_str());
1518  }
1519  if (peer_identity != expected_server_identity) {
1521  "Expected server identity does not match. (actual) %s vs "
1522  "(expected) %s Trying again.",
1523  absl::StrJoin(peer_identity, ",").c_str(),
1524  absl::StrJoin(expected_server_identity, ",").c_str());
1525  continue;
1526  }
1527  if (backends_[0]->backend_service()->last_peer_identity() !=
1528  expected_client_identity) {
1529  gpr_log(
1530  GPR_ERROR,
1531  "Expected client identity does not match. (actual) %s vs "
1532  "(expected) %s Trying again.",
1533  absl::StrJoin(
1534  backends_[0]->backend_service()->last_peer_identity(), ",")
1535  .c_str(),
1536  absl::StrJoin(expected_client_identity, ",").c_str());
1537  continue;
1538  }
1539  }
1540  break;
1541  }
1542  EXPECT_LT(num_tries, kRetryCount);
1543  }
1544 
1550  std::vector<std::string> server_authenticated_identity_;
1551  std::vector<std::string> server_authenticated_identity_2_;
1552  std::vector<std::string> client_authenticated_identity_;
1553 };
1554 
1555 TEST_P(XdsServerSecurityTest, UnknownTransportSocket) {
1556  Listener listener = default_server_listener_;
1557  auto* filter_chain = listener.mutable_default_filter_chain();
1558  auto* transport_socket = filter_chain->mutable_transport_socket();
1559  transport_socket->set_name("unknown_transport_socket");
1560  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1561  backends_[0]->port(),
1562  default_server_route_config_);
1563  backends_[0]->Start();
1564  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1565  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1566  EXPECT_THAT(response_state->error_message,
1568  "Unrecognized transport socket: unknown_transport_socket"));
1569 }
1570 
1571 TEST_P(XdsServerSecurityTest, NacksRequireSNI) {
1572  Listener listener = default_server_listener_;
1573  auto* filter_chain = listener.mutable_default_filter_chain();
1574  auto* transport_socket = filter_chain->mutable_transport_socket();
1575  transport_socket->set_name("envoy.transport_sockets.tls");
1576  DownstreamTlsContext downstream_tls_context;
1577  downstream_tls_context.mutable_common_tls_context()
1578  ->mutable_tls_certificate_provider_instance()
1579  ->set_instance_name("fake_plugin1");
1580  downstream_tls_context.mutable_require_sni()->set_value(true);
1581  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1582  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1583  backends_[0]->port(),
1584  default_server_route_config_);
1585  backends_[0]->Start();
1586  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1587  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1588  EXPECT_THAT(response_state->error_message,
1589  ::testing::HasSubstr("require_sni: unsupported"));
1590 }
1591 
1592 TEST_P(XdsServerSecurityTest, NacksOcspStaplePolicyOtherThanLenientStapling) {
1593  Listener listener = default_server_listener_;
1594  auto* filter_chain = listener.mutable_default_filter_chain();
1595  auto* transport_socket = filter_chain->mutable_transport_socket();
1596  transport_socket->set_name("envoy.transport_sockets.tls");
1597  DownstreamTlsContext downstream_tls_context;
1598  downstream_tls_context.mutable_common_tls_context()
1599  ->mutable_tls_certificate_provider_instance()
1600  ->set_instance_name("fake_plugin1");
1601  downstream_tls_context.set_ocsp_staple_policy(
1602  envoy::extensions::transport_sockets::tls::v3::
1603  DownstreamTlsContext_OcspStaplePolicy_STRICT_STAPLING);
1604  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1605  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1606  backends_[0]->port(),
1607  default_server_route_config_);
1608  backends_[0]->Start();
1609  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1610  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1611  EXPECT_THAT(response_state->error_message,
1613  "ocsp_staple_policy: Only LENIENT_STAPLING supported"));
1614 }
1615 
1616 TEST_P(
1617  XdsServerSecurityTest,
1618  NacksRequiringClientCertificateWithoutValidationCertificateProviderInstance) {
1619  Listener listener = default_server_listener_;
1620  auto* filter_chain = listener.mutable_default_filter_chain();
1621  auto* transport_socket = filter_chain->mutable_transport_socket();
1622  transport_socket->set_name("envoy.transport_sockets.tls");
1623  DownstreamTlsContext downstream_tls_context;
1624  downstream_tls_context.mutable_common_tls_context()
1625  ->mutable_tls_certificate_provider_instance()
1626  ->set_instance_name("fake_plugin1");
1627  downstream_tls_context.mutable_require_client_certificate()->set_value(true);
1628  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1629  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1630  backends_[0]->port(),
1631  default_server_route_config_);
1632  backends_[0]->Start();
1633  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1634  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1635  EXPECT_THAT(response_state->error_message,
1637  "TLS configuration requires client certificates but no "
1638  "certificate provider instance specified for validation."));
1639 }
1640 
1641 TEST_P(XdsServerSecurityTest,
1642  NacksTlsConfigurationWithoutIdentityProviderInstance) {
1643  Listener listener = default_server_listener_;
1644  auto* filter_chain = listener.mutable_default_filter_chain();
1645  auto* transport_socket = filter_chain->mutable_transport_socket();
1646  transport_socket->set_name("envoy.transport_sockets.tls");
1647  DownstreamTlsContext downstream_tls_context;
1648  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1649  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1650  backends_[0]->port(),
1651  default_server_route_config_);
1652  backends_[0]->Start();
1653  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1654  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1655  EXPECT_THAT(response_state->error_message,
1656  ::testing::HasSubstr("TLS configuration provided but no "
1657  "tls_certificate_provider_instance found."));
1658 }
1659 
1660 TEST_P(XdsServerSecurityTest, NacksMatchSubjectAltNames) {
1661  Listener listener = default_server_listener_;
1662  auto* filter_chain = listener.mutable_default_filter_chain();
1663  auto* transport_socket = filter_chain->mutable_transport_socket();
1664  transport_socket->set_name("envoy.transport_sockets.tls");
1665  DownstreamTlsContext downstream_tls_context;
1666  downstream_tls_context.mutable_common_tls_context()
1667  ->mutable_tls_certificate_provider_instance()
1668  ->set_instance_name("fake_plugin1");
1669  downstream_tls_context.mutable_common_tls_context()
1670  ->mutable_validation_context()
1671  ->add_match_subject_alt_names()
1672  ->set_exact("*.test.google.fr");
1673  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1674  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1675  backends_[0]->port(),
1676  default_server_route_config_);
1677  backends_[0]->Start();
1678  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1679  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1680  EXPECT_THAT(
1681  response_state->error_message,
1682  ::testing::HasSubstr("match_subject_alt_names not supported on servers"));
1683 }
1684 
1685 TEST_P(XdsServerSecurityTest, UnknownIdentityCertificateProvider) {
1686  SetLdsUpdate("", "", "unknown", "", false);
1687  SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
1688  true /* test_expects_failure */);
1689  backends_[0]->Start();
1690  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1691  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1692  EXPECT_THAT(response_state->error_message,
1694  "Unrecognized certificate provider instance name: unknown"));
1695 }
1696 
1697 TEST_P(XdsServerSecurityTest, UnknownRootCertificateProvider) {
1698  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1699  SetLdsUpdate("unknown", "", "fake_plugin1", "", false);
1700  backends_[0]->Start();
1701  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
1702  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
1703  EXPECT_THAT(response_state->error_message,
1705  "Unrecognized certificate provider instance name: unknown"));
1706 }
1707 
1708 TEST_P(XdsServerSecurityTest,
1709  TestDeprecateTlsCertificateCertificateProviderInstanceField) {
1710  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1711  Listener listener = default_server_listener_;
1712  auto* filter_chain = listener.mutable_default_filter_chain();
1713  filter_chain->mutable_filters()->at(0).mutable_typed_config()->PackFrom(
1714  ServerHcmAccessor().Unpack(listener));
1715  auto* transport_socket = filter_chain->mutable_transport_socket();
1716  transport_socket->set_name("envoy.transport_sockets.tls");
1717  DownstreamTlsContext downstream_tls_context;
1718  downstream_tls_context.mutable_common_tls_context()
1719  ->mutable_tls_certificate_certificate_provider_instance()
1720  ->set_instance_name("fake_plugin1");
1721  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
1722  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
1723  backends_[0]->port(),
1724  default_server_route_config_);
1725  backends_[0]->Start();
1726  SendRpc([this]() { return CreateTlsChannel(); },
1728 }
1729 
1730 TEST_P(XdsServerSecurityTest, CertificatesNotAvailable) {
1731  g_fake1_cert_data_map->Set({});
1732  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1733  SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
1734  true /* test_expects_failure */);
1735 }
1736 
1737 TEST_P(XdsServerSecurityTest, TestMtls) {
1738  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1739  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1740  backends_[0]->Start();
1741  SendRpc([this]() { return CreateMtlsChannel(); },
1743 }
1744 
1745 TEST_P(XdsServerSecurityTest, TestMtlsWithRootPluginUpdate) {
1746  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1747  g_fake2_cert_data_map->Set({{"", {bad_root_cert_, bad_identity_pair_}}});
1748  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1749  backends_[0]->Start();
1750  SendRpc([this]() { return CreateMtlsChannel(); },
1752  SetLdsUpdate("fake_plugin2", "", "fake_plugin1", "", true);
1753  SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
1754  true /* test_expects_failure */);
1755 }
1756 
1757 TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityPluginUpdate) {
1758  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1759  g_fake2_cert_data_map->Set({{"", {root_cert_, identity_pair_2_}}});
1760  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1761  backends_[0]->Start();
1762  SendRpc([this]() { return CreateMtlsChannel(); },
1764  SetLdsUpdate("fake_plugin1", "", "fake_plugin2", "", true);
1765  SendRpc([this]() { return CreateMtlsChannel(); },
1767 }
1768 
1769 TEST_P(XdsServerSecurityTest, TestMtlsWithBothPluginsUpdated) {
1770  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1771  g_fake2_cert_data_map->Set({{"good", {root_cert_, identity_pair_2_}},
1773  SetLdsUpdate("fake_plugin2", "", "fake_plugin2", "", true);
1774  backends_[0]->Start();
1775  SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
1776  true /* test_expects_failure */);
1777  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1778  SendRpc([this]() { return CreateMtlsChannel(); },
1780  SetLdsUpdate("fake_plugin2", "good", "fake_plugin2", "good", true);
1781  SendRpc([this]() { return CreateMtlsChannel(); },
1783 }
1784 
1785 TEST_P(XdsServerSecurityTest, TestMtlsWithRootCertificateNameUpdate) {
1786  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
1787  {"bad", {bad_root_cert_, bad_identity_pair_}}});
1788  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1789  backends_[0]->Start();
1790  SendRpc([this]() { return CreateMtlsChannel(); },
1792  SetLdsUpdate("fake_plugin1", "bad", "fake_plugin1", "", true);
1793  SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
1794  true /* test_expects_failure */);
1795 }
1796 
1797 TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityCertificateNameUpdate) {
1798  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
1799  {"good", {root_cert_, identity_pair_2_}}});
1800  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1801  backends_[0]->Start();
1802  SendRpc([this]() { return CreateMtlsChannel(); },
1804  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "good", true);
1805  SendRpc([this]() { return CreateMtlsChannel(); },
1807 }
1808 
1809 TEST_P(XdsServerSecurityTest, TestMtlsWithBothCertificateNamesUpdated) {
1810  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
1811  {"good", {root_cert_, identity_pair_2_}}});
1812  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1813  backends_[0]->Start();
1814  SendRpc([this]() { return CreateMtlsChannel(); },
1816  SetLdsUpdate("fake_plugin1", "good", "fake_plugin1", "good", true);
1817  SendRpc([this]() { return CreateMtlsChannel(); },
1819 }
1820 
1821 TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringButProvidingClientCerts) {
1822  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1823  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
1824  backends_[0]->Start();
1825  SendRpc([this]() { return CreateMtlsChannel(); },
1827 }
1828 
1829 TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringAndNotProvidingClientCerts) {
1830  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1831  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
1832  backends_[0]->Start();
1833  SendRpc([this]() { return CreateTlsChannel(); },
1835 }
1836 
1837 TEST_P(XdsServerSecurityTest, TestTls) {
1838  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1839  SetLdsUpdate("", "", "fake_plugin1", "", false);
1840  backends_[0]->Start();
1841  SendRpc([this]() { return CreateTlsChannel(); },
1843 }
1844 
1845 TEST_P(XdsServerSecurityTest, TestTlsWithIdentityPluginUpdate) {
1846  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1847  g_fake2_cert_data_map->Set({{"", {root_cert_, identity_pair_2_}}});
1848  SetLdsUpdate("", "", "fake_plugin1", "", false);
1849  backends_[0]->Start();
1850  SendRpc([this]() { return CreateTlsChannel(); },
1852  SetLdsUpdate("", "", "fake_plugin2", "", false);
1853  SendRpc([this]() { return CreateTlsChannel(); },
1855 }
1856 
1857 TEST_P(XdsServerSecurityTest, TestTlsWithIdentityCertificateNameUpdate) {
1858  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}},
1859  {"good", {root_cert_, identity_pair_2_}}});
1860  SetLdsUpdate("", "", "fake_plugin1", "", false);
1861  backends_[0]->Start();
1862  SendRpc([this]() { return CreateTlsChannel(); },
1864  SetLdsUpdate("", "", "fake_plugin1", "good", false);
1865  SendRpc([this]() { return CreateTlsChannel(); },
1867 }
1868 
1869 TEST_P(XdsServerSecurityTest, TestFallback) {
1870  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1871  SetLdsUpdate("", "", "", "", false);
1872  backends_[0]->Start();
1873  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1874 }
1875 
1876 TEST_P(XdsServerSecurityTest, TestMtlsToTls) {
1877  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1878  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1879  backends_[0]->Start();
1880  SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
1881  true /* test_expects_failure */);
1882  SetLdsUpdate("", "", "fake_plugin1", "", false);
1883  SendRpc([this]() { return CreateTlsChannel(); },
1885 }
1886 
1887 TEST_P(XdsServerSecurityTest, TestTlsToMtls) {
1888  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1889  SetLdsUpdate("", "", "fake_plugin1", "", false);
1890  backends_[0]->Start();
1891  SendRpc([this]() { return CreateTlsChannel(); },
1893  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1894  SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
1895  true /* test_expects_failure */);
1896 }
1897 
1898 TEST_P(XdsServerSecurityTest, TestMtlsToFallback) {
1899  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1900  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
1901  backends_[0]->Start();
1902  SendRpc([this]() { return CreateMtlsChannel(); },
1904  SetLdsUpdate("", "", "", "", false);
1905  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1906 }
1907 
1908 TEST_P(XdsServerSecurityTest, TestFallbackToMtls) {
1909  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1910  SetLdsUpdate("", "", "", "", false);
1911  backends_[0]->Start();
1912  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1913  SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
1914  SendRpc([this]() { return CreateMtlsChannel(); },
1916 }
1917 
1918 TEST_P(XdsServerSecurityTest, TestTlsToFallback) {
1919  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1920  SetLdsUpdate("", "", "fake_plugin1", "", false);
1921  backends_[0]->Start();
1922  SendRpc([this]() { return CreateTlsChannel(); },
1924  SetLdsUpdate("", "", "", "", false);
1925  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1926 }
1927 
1928 TEST_P(XdsServerSecurityTest, TestFallbackToTls) {
1929  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
1930  SetLdsUpdate("", "", "", "", false);
1931  backends_[0]->Start();
1932  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1933  SetLdsUpdate("", "", "fake_plugin1", "", false);
1934  SendRpc([this]() { return CreateTlsChannel(); },
1936 }
1937 
1938 class XdsEnabledServerStatusNotificationTest : public XdsServerSecurityTest {
1939  protected:
1940  void SetValidLdsUpdate() { SetLdsUpdate("", "", "", "", false); }
1941 
1942  void SetInvalidLdsUpdate() {
1943  Listener listener = default_server_listener_;
1944  listener.clear_address();
1945  listener.set_name(absl::StrCat(
1946  "grpc/server?xds.resource.listening_address=",
1947  ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
1948  balancer_->ads_service()->SetLdsResource(listener);
1949  }
1950 
1951  void UnsetLdsUpdate() {
1952  balancer_->ads_service()->UnsetResource(
1953  kLdsTypeUrl, absl::StrCat("grpc/server?xds.resource.listening_address=",
1954  ipv6_only_ ? "[::1]:" : "127.0.0.1:",
1955  backends_[0]->port()));
1956  }
1957 };
1958 
1959 TEST_P(XdsEnabledServerStatusNotificationTest, ServingStatus) {
1960  SetValidLdsUpdate();
1961  backends_[0]->Start();
1962  backends_[0]->notifier()->WaitOnServingStatusChange(
1963  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
1965  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1966 }
1967 
1968 TEST_P(XdsEnabledServerStatusNotificationTest, NotServingStatus) {
1969  SetInvalidLdsUpdate();
1970  backends_[0]->Start();
1971  backends_[0]->notifier()->WaitOnServingStatusChange(
1972  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
1974  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
1975  true /* test_expects_failure */);
1976 }
1977 
1978 TEST_P(XdsEnabledServerStatusNotificationTest, ErrorUpdateWhenAlreadyServing) {
1979  SetValidLdsUpdate();
1980  backends_[0]->Start();
1981  backends_[0]->notifier()->WaitOnServingStatusChange(
1982  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
1984  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1985  // Invalid update does not lead to a change in the serving status.
1986  SetInvalidLdsUpdate();
1987  do {
1988  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1989  } while (!balancer_->ads_service()->lds_response_state().has_value());
1990  backends_[0]->notifier()->WaitOnServingStatusChange(
1991  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
1993  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
1994 }
1995 
1996 TEST_P(XdsEnabledServerStatusNotificationTest,
1997  NotServingStatusToServingStatusTransition) {
1998  SetInvalidLdsUpdate();
1999  backends_[0]->Start();
2000  backends_[0]->notifier()->WaitOnServingStatusChange(
2001  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2003  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2004  true /* test_expects_failure */);
2005  // Send a valid LDS update to change to serving status
2006  SetValidLdsUpdate();
2007  backends_[0]->notifier()->WaitOnServingStatusChange(
2008  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2010  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2011 }
2012 
2013 // This test verifies that the resource getting deleted when already serving
2014 // results in future connections being dropped.
2015 TEST_P(XdsEnabledServerStatusNotificationTest,
2016  ServingStatusToNonServingStatusTransition) {
2017  SetValidLdsUpdate();
2018  backends_[0]->Start();
2019  backends_[0]->notifier()->WaitOnServingStatusChange(
2020  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2022  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2023  // Deleting the resource should result in a non-serving status.
2024  UnsetLdsUpdate();
2025  backends_[0]->notifier()->WaitOnServingStatusChange(
2026  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2028  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2029  true /* test_expects_failure */);
2030 }
2031 
2032 TEST_P(XdsEnabledServerStatusNotificationTest, RepeatedServingStatusChanges) {
2033  backends_[0]->Start();
2034  for (int i = 0; i < 5; i++) {
2035  // Send a valid LDS update to get the server to start listening
2036  SetValidLdsUpdate();
2037  backends_[0]->notifier()->WaitOnServingStatusChange(
2038  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:",
2039  backends_[0]->port()),
2041  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2042  // Deleting the resource will make the server start rejecting connections
2043  UnsetLdsUpdate();
2044  backends_[0]->notifier()->WaitOnServingStatusChange(
2045  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:",
2046  backends_[0]->port()),
2048  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2049  true /* test_expects_failure */);
2050  }
2051 }
2052 
2053 TEST_P(XdsEnabledServerStatusNotificationTest, ExistingRpcsOnResourceDeletion) {
2054  // Send a valid LDS update to get the server to start listening
2055  SetValidLdsUpdate();
2056  backends_[0]->Start();
2057  backends_[0]->notifier()->WaitOnServingStatusChange(
2058  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2060  constexpr int kNumChannels = 10;
2061  struct StreamingRpc {
2062  std::shared_ptr<Channel> channel;
2063  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub;
2064  ClientContext context;
2065  std::unique_ptr<ClientReaderWriter<EchoRequest, EchoResponse>> stream;
2066  } streaming_rpcs[kNumChannels];
2067  EchoRequest request;
2068  EchoResponse response;
2069  request.set_message("Hello");
2070  for (int i = 0; i < kNumChannels; i++) {
2071  streaming_rpcs[i].channel = CreateInsecureChannel();
2072  streaming_rpcs[i].stub =
2073  grpc::testing::EchoTestService::NewStub(streaming_rpcs[i].channel);
2074  streaming_rpcs[i].context.set_wait_for_ready(true);
2075  streaming_rpcs[i].stream =
2076  streaming_rpcs[i].stub->BidiStream(&streaming_rpcs[i].context);
2077  EXPECT_TRUE(streaming_rpcs[i].stream->Write(request));
2078  streaming_rpcs[i].stream->Read(&response);
2079  EXPECT_EQ(request.message(), response.message());
2080  }
2081  // Deleting the resource will make the server start rejecting connections
2082  UnsetLdsUpdate();
2083  backends_[0]->notifier()->WaitOnServingStatusChange(
2084  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2086  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2087  true /* test_expects_failure */);
2088  for (int i = 0; i < kNumChannels; i++) {
2089  EXPECT_TRUE(streaming_rpcs[i].stream->Write(request));
2090  streaming_rpcs[i].stream->Read(&response);
2091  EXPECT_EQ(request.message(), response.message());
2092  EXPECT_TRUE(streaming_rpcs[i].stream->WritesDone());
2093  auto status = streaming_rpcs[i].stream->Finish();
2094  EXPECT_TRUE(status.ok())
2095  << status.error_message() << ", " << status.error_details() << ", "
2096  << streaming_rpcs[i].context.debug_error_string();
2097  // New RPCs on the existing channels should fail.
2098  ClientContext new_context;
2099  new_context.set_deadline(grpc_timeout_milliseconds_to_deadline(1000));
2100  EXPECT_FALSE(
2101  streaming_rpcs[i].stub->Echo(&new_context, request, &response).ok());
2102  }
2103 }
2104 
2105 TEST_P(XdsEnabledServerStatusNotificationTest,
2106  ExistingRpcsFailOnResourceUpdateAfterDrainGraceTimeExpires) {
2107  constexpr int kDrainGraceTimeMs = 100;
2108  xds_drain_grace_time_ms_ = kDrainGraceTimeMs;
2109  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
2110  // Send a valid LDS update to get the server to start listening
2111  SetValidLdsUpdate();
2112  backends_[0]->Start();
2113  backends_[0]->notifier()->WaitOnServingStatusChange(
2114  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2116  constexpr int kNumChannels = 10;
2117  struct StreamingRpc {
2118  std::shared_ptr<Channel> channel;
2119  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub;
2120  ClientContext context;
2121  std::unique_ptr<ClientReaderWriter<EchoRequest, EchoResponse>> stream;
2122  } streaming_rpcs[kNumChannels];
2123  EchoRequest request;
2124  EchoResponse response;
2125  request.set_message("Hello");
2126  for (int i = 0; i < kNumChannels; i++) {
2127  streaming_rpcs[i].channel = CreateInsecureChannel();
2128  streaming_rpcs[i].stub =
2129  grpc::testing::EchoTestService::NewStub(streaming_rpcs[i].channel);
2130  streaming_rpcs[i].context.set_wait_for_ready(true);
2131  streaming_rpcs[i].stream =
2132  streaming_rpcs[i].stub->BidiStream(&streaming_rpcs[i].context);
2133  EXPECT_TRUE(streaming_rpcs[i].stream->Write(request));
2134  streaming_rpcs[i].stream->Read(&response);
2135  EXPECT_EQ(request.message(), response.message());
2136  }
2137  grpc_core::Timestamp update_time = NowFromCycleCounter();
2138  // Update the resource.
2139  SetLdsUpdate("", "", "fake_plugin1", "", false);
2140  // Wait for the updated resource to take effect.
2141  SendRpc([this]() { return CreateTlsChannel(); },
2143  // After the drain grace time expires, the existing RPCs should all fail.
2144  for (int i = 0; i < kNumChannels; i++) {
2145  // Wait for the drain grace time to expire
2146  EXPECT_FALSE(streaming_rpcs[i].stream->Read(&response));
2147  // Make sure that the drain grace interval is honored.
2148  EXPECT_GE(NowFromCycleCounter() - update_time,
2149  grpc_core::Duration::Milliseconds(kDrainGraceTimeMs));
2150  auto status = streaming_rpcs[i].stream->Finish();
2152  << status.error_code() << ", " << status.error_message() << ", "
2153  << status.error_details() << ", "
2154  << streaming_rpcs[i].context.debug_error_string();
2155  }
2156 }
2157 
2158 using XdsServerFilterChainMatchTest = XdsServerSecurityTest;
2159 
2160 TEST_P(XdsServerFilterChainMatchTest,
2161  DefaultFilterChainUsedWhenNoFilterChainMentioned) {
2162  backends_[0]->Start();
2163  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2164 }
2165 
2166 TEST_P(XdsServerFilterChainMatchTest,
2167  DefaultFilterChainUsedWhenOtherFilterChainsDontMatch) {
2168  Listener listener = default_server_listener_;
2169  // Add a filter chain that will never get matched
2170  auto* filter_chain = listener.add_filter_chains();
2171  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2172  ServerHcmAccessor().Unpack(listener));
2173  filter_chain->mutable_filter_chain_match()
2174  ->mutable_destination_port()
2175  ->set_value(8080);
2176  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2177  backends_[0]->port(),
2178  default_server_route_config_);
2179  backends_[0]->Start();
2180  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2181 }
2182 
2183 TEST_P(XdsServerFilterChainMatchTest,
2184  FilterChainsWithDestinationPortDontMatch) {
2185  Listener listener = default_server_listener_;
2186  // Add filter chain with destination port that should never get matched
2187  auto* filter_chain = listener.add_filter_chains();
2188  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2189  ServerHcmAccessor().Unpack(listener));
2190  filter_chain->mutable_filter_chain_match()
2191  ->mutable_destination_port()
2192  ->set_value(8080);
2193  listener.clear_default_filter_chain();
2194  balancer_->ads_service()->SetLdsResource(
2195  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2196  backends_[0]->Start();
2197  // RPC should fail since no matching filter chain was found and no default
2198  // filter chain is configured.
2199  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2200  true /* test_expects_failure */);
2201 }
2202 
2203 TEST_P(XdsServerFilterChainMatchTest, FilterChainsWithServerNamesDontMatch) {
2204  Listener listener = default_server_listener_;
2205  // Add filter chain with server name that should never get matched
2206  auto* filter_chain = listener.add_filter_chains();
2207  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2208  ServerHcmAccessor().Unpack(listener));
2209  filter_chain->mutable_filter_chain_match()->add_server_names("server_name");
2210  listener.clear_default_filter_chain();
2211  balancer_->ads_service()->SetLdsResource(
2212  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2213  backends_[0]->Start();
2214  // RPC should fail since no matching filter chain was found and no default
2215  // filter chain is configured.
2216  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2217  true /* test_expects_failure */);
2218 }
2219 
2220 TEST_P(XdsServerFilterChainMatchTest,
2221  FilterChainsWithTransportProtocolsOtherThanRawBufferDontMatch) {
2222  Listener listener = default_server_listener_;
2223  // Add filter chain with transport protocol "tls" that should never match
2224  auto* filter_chain = listener.add_filter_chains();
2225  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2226  ServerHcmAccessor().Unpack(listener));
2227  filter_chain->mutable_filter_chain_match()->set_transport_protocol("tls");
2228  listener.clear_default_filter_chain();
2229  balancer_->ads_service()->SetLdsResource(
2230  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2231  backends_[0]->Start();
2232  // RPC should fail since no matching filter chain was found and no default
2233  // filter chain is configured.
2234  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2235  true /* test_expects_failure */);
2236 }
2237 
2238 TEST_P(XdsServerFilterChainMatchTest,
2239  FilterChainsWithApplicationProtocolsDontMatch) {
2240  Listener listener = default_server_listener_;
2241  // Add filter chain with application protocol that should never get matched
2242  auto* filter_chain = listener.add_filter_chains();
2243  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2244  ServerHcmAccessor().Unpack(listener));
2245  filter_chain->mutable_filter_chain_match()->add_application_protocols("h2");
2246  listener.clear_default_filter_chain();
2247  balancer_->ads_service()->SetLdsResource(
2248  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2249  backends_[0]->Start();
2250  // RPC should fail since no matching filter chain was found and no default
2251  // filter chain is configured.
2252  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2253  true /* test_expects_failure */);
2254 }
2255 
2256 TEST_P(XdsServerFilterChainMatchTest,
2257  FilterChainsWithTransportProtocolRawBufferIsPreferred) {
2258  Listener listener = default_server_listener_;
2259  // Add filter chain with "raw_buffer" transport protocol
2260  auto* filter_chain = listener.add_filter_chains();
2261  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2262  ServerHcmAccessor().Unpack(listener));
2263  filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2264  "raw_buffer");
2265  // Add another filter chain with no transport protocol set but application
2266  // protocol set (fails match)
2267  filter_chain = listener.add_filter_chains();
2268  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2269  ServerHcmAccessor().Unpack(listener));
2270  filter_chain->mutable_filter_chain_match()->add_application_protocols("h2");
2271  listener.clear_default_filter_chain();
2272  balancer_->ads_service()->SetLdsResource(
2273  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2274  backends_[0]->Start();
2275  // A successful RPC proves that filter chains that mention "raw_buffer" as
2276  // the transport protocol are chosen as the best match in the round.
2277  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2278 }
2279 
2280 TEST_P(XdsServerFilterChainMatchTest,
2281  FilterChainsWithMoreSpecificDestinationPrefixRangesArePreferred) {
2282  Listener listener = default_server_listener_;
2283  // Add filter chain with prefix range (length 4 and 16) but with server name
2284  // mentioned. (Prefix range is matched first.)
2285  auto* filter_chain = listener.add_filter_chains();
2286  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2287  ServerHcmAccessor().Unpack(listener));
2288  auto* prefix_range =
2289  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2290  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2291  prefix_range->mutable_prefix_len()->set_value(4);
2292  prefix_range =
2293  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2294  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2295  prefix_range->mutable_prefix_len()->set_value(16);
2296  filter_chain->mutable_filter_chain_match()->add_server_names("server_name");
2297  // Add filter chain with two prefix ranges (length 8 and 24). Since 24 is
2298  // the highest match, it should be chosen.
2299  filter_chain = listener.add_filter_chains();
2300  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2301  ServerHcmAccessor().Unpack(listener));
2302  prefix_range =
2303  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2304  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2305  prefix_range->mutable_prefix_len()->set_value(8);
2306  prefix_range =
2307  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2308  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2309  prefix_range->mutable_prefix_len()->set_value(24);
2310  // Add another filter chain with a non-matching prefix range (with length
2311  // 30)
2312  filter_chain = listener.add_filter_chains();
2313  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2314  ServerHcmAccessor().Unpack(listener));
2315  prefix_range =
2316  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2317  prefix_range->set_address_prefix("192.168.1.1");
2318  prefix_range->mutable_prefix_len()->set_value(30);
2319  filter_chain->mutable_filter_chain_match()->add_server_names("server_name");
2320  // Add another filter chain with no prefix range mentioned
2321  filter_chain = listener.add_filter_chains();
2322  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2323  ServerHcmAccessor().Unpack(listener));
2324  filter_chain->mutable_filter_chain_match()->add_server_names("server_name");
2325  listener.clear_default_filter_chain();
2326  balancer_->ads_service()->SetLdsResource(
2327  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2328  backends_[0]->Start();
2329  // A successful RPC proves that the filter chain with the longest matching
2330  // prefix range was the best match.
2331  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2332 }
2333 
2334 TEST_P(XdsServerFilterChainMatchTest,
2335  FilterChainsThatMentionSourceTypeArePreferred) {
2336  Listener listener = default_server_listener_;
2337  // Add filter chain with the local source type (best match)
2338  auto* filter_chain = listener.add_filter_chains();
2339  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2340  ServerHcmAccessor().Unpack(listener));
2341  filter_chain->mutable_filter_chain_match()->set_source_type(
2342  FilterChainMatch::SAME_IP_OR_LOOPBACK);
2343  // Add filter chain with the external source type but bad source port.
2344  // Note that backends_[0]->port() will never be a match for the source port
2345  // because it is already being used by a backend.
2346  filter_chain = listener.add_filter_chains();
2347  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2348  ServerHcmAccessor().Unpack(listener));
2349  filter_chain->mutable_filter_chain_match()->set_source_type(
2351  filter_chain->mutable_filter_chain_match()->add_source_ports(
2352  backends_[0]->port());
2353  // Add filter chain with the default source type (ANY) but bad source port.
2354  filter_chain = listener.add_filter_chains();
2355  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2356  ServerHcmAccessor().Unpack(listener));
2357  filter_chain->mutable_filter_chain_match()->add_source_ports(
2358  backends_[0]->port());
2359  listener.clear_default_filter_chain();
2360  balancer_->ads_service()->SetLdsResource(
2361  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2362  backends_[0]->Start();
2363  // A successful RPC proves that the filter chain with the longest matching
2364  // prefix range was the best match.
2365  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2366 }
2367 
2368 TEST_P(XdsServerFilterChainMatchTest,
2369  FilterChainsWithMoreSpecificSourcePrefixRangesArePreferred) {
2370  Listener listener = default_server_listener_;
2371  // Add filter chain with source prefix range (length 16) but with a bad
2372  // source port mentioned. (Prefix range is matched first.) Note that
2373  // backends_[0]->port() will never be a match for the source port because it
2374  // is already being used by a backend.
2375  auto* filter_chain = listener.add_filter_chains();
2376  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2377  ServerHcmAccessor().Unpack(listener));
2378  auto* source_prefix_range =
2379  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2380  source_prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2381  source_prefix_range->mutable_prefix_len()->set_value(4);
2382  source_prefix_range =
2383  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2384  source_prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2385  source_prefix_range->mutable_prefix_len()->set_value(16);
2386  filter_chain->mutable_filter_chain_match()->add_source_ports(
2387  backends_[0]->port());
2388  // Add filter chain with two source prefix ranges (length 8 and 24). Since
2389  // 24 is the highest match, it should be chosen.
2390  filter_chain = listener.add_filter_chains();
2391  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2392  ServerHcmAccessor().Unpack(listener));
2393  source_prefix_range =
2394  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2395  source_prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2396  source_prefix_range->mutable_prefix_len()->set_value(8);
2397  source_prefix_range =
2398  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2399  source_prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2400  source_prefix_range->mutable_prefix_len()->set_value(24);
2401  // Add another filter chain with a non-matching source prefix range (with
2402  // length 30) and bad source port
2403  filter_chain = listener.add_filter_chains();
2404  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2405  ServerHcmAccessor().Unpack(listener));
2406  source_prefix_range =
2407  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2408  source_prefix_range->set_address_prefix("192.168.1.1");
2409  source_prefix_range->mutable_prefix_len()->set_value(30);
2410  filter_chain->mutable_filter_chain_match()->add_source_ports(
2411  backends_[0]->port());
2412  // Add another filter chain with no source prefix range mentioned and bad
2413  // source port
2414  filter_chain = listener.add_filter_chains();
2415  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2416  ServerHcmAccessor().Unpack(listener));
2417  filter_chain->mutable_filter_chain_match()->add_source_ports(
2418  backends_[0]->port());
2419  listener.clear_default_filter_chain();
2420  balancer_->ads_service()->SetLdsResource(
2421  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2422  backends_[0]->Start();
2423  // A successful RPC proves that the filter chain with the longest matching
2424  // source prefix range was the best match.
2425  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2426 }
2427 
2428 TEST_P(XdsServerFilterChainMatchTest,
2429  FilterChainsWithMoreSpecificSourcePortArePreferred) {
2430  Listener listener = default_server_listener_;
2431  auto* filter_chain = listener.add_filter_chains();
2432  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2433  ServerHcmAccessor().Unpack(listener));
2434  // Since we don't know which port will be used by the channel, just add all
2435  // ports except for 0.
2436  for (int i = 1; i < 65536; i++) {
2437  filter_chain->mutable_filter_chain_match()->add_source_ports(i);
2438  }
2439  // Add another filter chain with no source port mentioned with a bad
2440  // DownstreamTlsContext configuration.
2441  filter_chain = listener.add_filter_chains();
2442  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2443  ServerHcmAccessor().Unpack(listener));
2444  auto* transport_socket = filter_chain->mutable_transport_socket();
2445  transport_socket->set_name("envoy.transport_sockets.tls");
2446  DownstreamTlsContext downstream_tls_context;
2447  downstream_tls_context.mutable_common_tls_context()
2448  ->mutable_tls_certificate_provider_instance()
2449  ->set_instance_name("fake_plugin1");
2450  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
2451  listener.clear_default_filter_chain();
2452  balancer_->ads_service()->SetLdsResource(
2453  PopulateServerListenerNameAndPort(listener, backends_[0]->port()));
2454  backends_[0]->Start();
2455  // A successful RPC proves that the filter chain with matching source port
2456  // was chosen.
2457  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2458 }
2459 
2460 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchNacked) {
2461  Listener listener = default_server_listener_;
2462  // Add filter chain
2463  auto* filter_chain = listener.add_filter_chains();
2464  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2465  ServerHcmAccessor().Unpack(listener));
2466  // Add a duplicate filter chain
2467  filter_chain = listener.add_filter_chains();
2468  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2469  ServerHcmAccessor().Unpack(listener));
2470  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2471  backends_[0]->port(),
2472  default_server_route_config_);
2473  backends_[0]->Start();
2474  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2475  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2476  EXPECT_THAT(
2477  response_state->error_message,
2479  "Duplicate matching rules detected when adding filter chain: {}"));
2480 }
2481 
2482 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnPrefixRangesNacked) {
2483  Listener listener = default_server_listener_;
2484  // Add filter chain with prefix range
2485  auto* filter_chain = listener.add_filter_chains();
2486  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2487  ServerHcmAccessor().Unpack(listener));
2488  auto* prefix_range =
2489  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2490  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2491  prefix_range->mutable_prefix_len()->set_value(16);
2492  prefix_range =
2493  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2494  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2495  prefix_range->mutable_prefix_len()->set_value(24);
2496  // Add a filter chain with a duplicate prefix range entry
2497  filter_chain = listener.add_filter_chains();
2498  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2499  ServerHcmAccessor().Unpack(listener));
2500  prefix_range =
2501  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2502  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2503  prefix_range->mutable_prefix_len()->set_value(16);
2504  prefix_range =
2505  filter_chain->mutable_filter_chain_match()->add_prefix_ranges();
2506  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2507  prefix_range->mutable_prefix_len()->set_value(32);
2508  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2509  backends_[0]->port(),
2510  default_server_route_config_);
2511  backends_[0]->Start();
2512  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2513  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2514  if (ipv6_only_) {
2515  EXPECT_THAT(
2516  response_state->error_message,
2518  "Duplicate matching rules detected when adding filter chain: "
2519  "{prefix_ranges={{address_prefix=[::]:0, prefix_len=16}, "
2520  "{address_prefix=[::]:0, prefix_len=32}}}"));
2521  } else {
2522  EXPECT_THAT(
2523  response_state->error_message,
2525  "Duplicate matching rules detected when adding filter chain: "
2526  "{prefix_ranges={{address_prefix=127.0.0.0:0, prefix_len=16}, "
2527  "{address_prefix=127.0.0.1:0, prefix_len=32}}}"));
2528  }
2529 }
2530 
2531 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnTransportProtocolNacked) {
2532  Listener listener = default_server_listener_;
2533  // Add filter chain with "raw_buffer" transport protocol
2534  auto* filter_chain = listener.add_filter_chains();
2535  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2536  ServerHcmAccessor().Unpack(listener));
2537  filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2538  "raw_buffer");
2539  // Add a duplicate filter chain with the same "raw_buffer" transport
2540  // protocol entry
2541  filter_chain = listener.add_filter_chains();
2542  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2543  ServerHcmAccessor().Unpack(listener));
2544  filter_chain->mutable_filter_chain_match()->set_transport_protocol(
2545  "raw_buffer");
2546  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2547  backends_[0]->port(),
2548  default_server_route_config_);
2549  backends_[0]->Start();
2550  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2551  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2552  EXPECT_THAT(
2553  response_state->error_message,
2554  ::testing::HasSubstr("Duplicate matching rules detected when adding "
2555  "filter chain: {transport_protocol=raw_buffer}"));
2556 }
2557 
2558 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnLocalSourceTypeNacked) {
2559  Listener listener = default_server_listener_;
2560  // Add filter chain with the local source type
2561  auto* filter_chain = listener.add_filter_chains();
2562  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2563  ServerHcmAccessor().Unpack(listener));
2564  filter_chain->mutable_filter_chain_match()->set_source_type(
2565  FilterChainMatch::SAME_IP_OR_LOOPBACK);
2566  // Add a duplicate filter chain with the same local source type entry
2567  filter_chain = listener.add_filter_chains();
2568  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2569  ServerHcmAccessor().Unpack(listener));
2570  filter_chain->mutable_filter_chain_match()->set_source_type(
2571  FilterChainMatch::SAME_IP_OR_LOOPBACK);
2572  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2573  backends_[0]->port(),
2574  default_server_route_config_);
2575  backends_[0]->Start();
2576  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2577  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2578  EXPECT_THAT(
2579  response_state->error_message,
2580  ::testing::HasSubstr("Duplicate matching rules detected when adding "
2581  "filter chain: {source_type=SAME_IP_OR_LOOPBACK}"));
2582 }
2583 
2584 TEST_P(XdsServerFilterChainMatchTest,
2585  DuplicateMatchOnExternalSourceTypeNacked) {
2586  Listener listener = default_server_listener_;
2587  // Add filter chain with the external source type
2588  auto* filter_chain = listener.add_filter_chains();
2589  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2590  ServerHcmAccessor().Unpack(listener));
2591  filter_chain->mutable_filter_chain_match()->set_source_type(
2593  // Add a duplicate filter chain with the same external source type entry
2594  filter_chain = listener.add_filter_chains();
2595  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2596  ServerHcmAccessor().Unpack(listener));
2597  filter_chain->mutable_filter_chain_match()->set_source_type(
2599  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2600  backends_[0]->port(),
2601  default_server_route_config_);
2602  backends_[0]->Start();
2603  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2604  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2605  EXPECT_THAT(
2606  response_state->error_message,
2607  ::testing::HasSubstr("Duplicate matching rules detected when adding "
2608  "filter chain: {source_type=EXTERNAL}"));
2609 }
2610 
2611 TEST_P(XdsServerFilterChainMatchTest,
2612  DuplicateMatchOnSourcePrefixRangesNacked) {
2613  Listener listener = default_server_listener_;
2614  // Add filter chain with source prefix range
2615  auto* filter_chain = listener.add_filter_chains();
2616  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2617  ServerHcmAccessor().Unpack(listener));
2618  auto* prefix_range =
2619  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2620  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2621  prefix_range->mutable_prefix_len()->set_value(16);
2622  prefix_range =
2623  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2624  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2625  prefix_range->mutable_prefix_len()->set_value(24);
2626  // Add a filter chain with a duplicate source prefix range entry
2627  filter_chain = listener.add_filter_chains();
2628  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2629  ServerHcmAccessor().Unpack(listener));
2630  prefix_range =
2631  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2632  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2633  prefix_range->mutable_prefix_len()->set_value(16);
2634  prefix_range =
2635  filter_chain->mutable_filter_chain_match()->add_source_prefix_ranges();
2636  prefix_range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
2637  prefix_range->mutable_prefix_len()->set_value(32);
2638  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2639  backends_[0]->port(),
2640  default_server_route_config_);
2641  backends_[0]->Start();
2642  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2643  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2644  if (ipv6_only_) {
2645  EXPECT_THAT(
2646  response_state->error_message,
2648  "Duplicate matching rules detected when adding filter chain: "
2649  "{source_prefix_ranges={{address_prefix=[::]:0, prefix_len=16}, "
2650  "{address_prefix=[::]:0, prefix_len=32}}}"));
2651  } else {
2652  EXPECT_THAT(
2653  response_state->error_message,
2655  "Duplicate matching rules detected when adding filter chain: "
2656  "{source_prefix_ranges={{address_prefix=127.0.0.0:0, "
2657  "prefix_len=16}, "
2658  "{address_prefix=127.0.0.1:0, prefix_len=32}}}"));
2659  }
2660 }
2661 
2662 TEST_P(XdsServerFilterChainMatchTest, DuplicateMatchOnSourcePortNacked) {
2663  Listener listener = default_server_listener_;
2664  // Add filter chain with the external source type
2665  auto* filter_chain = listener.add_filter_chains();
2666  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2667  ServerHcmAccessor().Unpack(listener));
2668  filter_chain->mutable_filter_chain_match()->add_source_ports(8080);
2669  // Add a duplicate filter chain with the same source port entry
2670  filter_chain = listener.add_filter_chains();
2671  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2672  ServerHcmAccessor().Unpack(listener));
2673  filter_chain->mutable_filter_chain_match()->add_source_ports(8080);
2674  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2675  backends_[0]->port(),
2676  default_server_route_config_);
2677  backends_[0]->Start();
2678  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2679  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2680  EXPECT_THAT(
2681  response_state->error_message,
2682  ::testing::HasSubstr("Duplicate matching rules detected when adding "
2683  "filter chain: {source_ports={8080}}"));
2684 }
2685 
2686 class XdsServerRdsTest : public XdsEnabledServerStatusNotificationTest {
2687  protected:
2688  XdsServerRdsTest() : env_var_("GRPC_XDS_EXPERIMENTAL_RBAC") {}
2689 
2690  ScopedExperimentalEnvVar env_var_;
2691 };
2692 
2693 TEST_P(XdsServerRdsTest, Basic) {
2694  backends_[0]->Start();
2695  backends_[0]->notifier()->WaitOnServingStatusChange(
2696  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2698  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2699 }
2700 
2701 TEST_P(XdsServerRdsTest, NacksInvalidDomainPattern) {
2702  RouteConfiguration route_config = default_server_route_config_;
2703  route_config.mutable_virtual_hosts()->at(0).add_domains("");
2704  SetServerListenerNameAndRouteConfiguration(
2705  balancer_.get(), default_server_listener_, backends_[0]->port(),
2706  route_config);
2707  backends_[0]->Start();
2708  const auto response_state = WaitForRouteConfigNack(DEBUG_LOCATION);
2709  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2710  EXPECT_THAT(response_state->error_message,
2711  ::testing::HasSubstr("Invalid domain pattern \"\""));
2712 }
2713 
2714 TEST_P(XdsServerRdsTest, NacksEmptyDomainsList) {
2715  RouteConfiguration route_config = default_server_route_config_;
2716  route_config.mutable_virtual_hosts()->at(0).clear_domains();
2717  SetServerListenerNameAndRouteConfiguration(
2718  balancer_.get(), default_server_listener_, backends_[0]->port(),
2719  route_config);
2720  backends_[0]->Start();
2721  const auto response_state = WaitForRouteConfigNack(DEBUG_LOCATION);
2722  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2723  EXPECT_THAT(response_state->error_message,
2724  ::testing::HasSubstr("VirtualHost has no domains"));
2725 }
2726 
2727 TEST_P(XdsServerRdsTest, NacksEmptyRoutesList) {
2728  RouteConfiguration route_config = default_server_route_config_;
2729  route_config.mutable_virtual_hosts()->at(0).clear_routes();
2730  SetServerListenerNameAndRouteConfiguration(
2731  balancer_.get(), default_server_listener_, backends_[0]->port(),
2732  route_config);
2733  backends_[0]->Start();
2734  const auto response_state = WaitForRouteConfigNack(DEBUG_LOCATION);
2735  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2736  EXPECT_THAT(response_state->error_message,
2737  ::testing::HasSubstr("No route found in the virtual host"));
2738 }
2739 
2740 TEST_P(XdsServerRdsTest, NacksEmptyMatch) {
2741  RouteConfiguration route_config = default_server_route_config_;
2742  route_config.mutable_virtual_hosts()
2743  ->at(0)
2744  .mutable_routes()
2745  ->at(0)
2746  .clear_match();
2747  SetServerListenerNameAndRouteConfiguration(
2748  balancer_.get(), default_server_listener_, backends_[0]->port(),
2749  route_config);
2750  backends_[0]->Start();
2751  const auto response_state = WaitForRouteConfigNack(DEBUG_LOCATION);
2752  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2753  EXPECT_THAT(response_state->error_message,
2754  ::testing::HasSubstr("Match can't be null"));
2755 }
2756 
2757 TEST_P(XdsServerRdsTest, FailsRouteMatchesOtherThanNonForwardingAction) {
2758  SetServerListenerNameAndRouteConfiguration(
2759  balancer_.get(), default_server_listener_, backends_[0]->port(),
2760  default_route_config_ /* inappropriate route config for servers */);
2761  backends_[0]->Start();
2762  // The server should be ready to serve but RPCs should fail.
2763  backends_[0]->notifier()->WaitOnServingStatusChange(
2764  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2766  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2767  true /* test_expects_failure */);
2768 }
2769 
2770 // Test that non-inline route configuration also works for non-default filter
2771 // chains
2772 TEST_P(XdsServerRdsTest, NonInlineRouteConfigurationNonDefaultFilterChain) {
2773  if (!GetParam().enable_rds_testing()) {
2774  return;
2775  }
2776  Listener listener = default_server_listener_;
2777  auto* filter_chain = listener.add_filter_chains();
2778  HttpConnectionManager http_connection_manager =
2779  ServerHcmAccessor().Unpack(listener);
2780  auto* rds = http_connection_manager.mutable_rds();
2781  rds->set_route_config_name(kDefaultServerRouteConfigurationName);
2782  rds->mutable_config_source()->mutable_self();
2783  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2784  http_connection_manager);
2785  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2786  backends_[0]->port(),
2787  default_server_route_config_);
2788  backends_[0]->Start();
2789  backends_[0]->notifier()->WaitOnServingStatusChange(
2790  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2792  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2793 }
2794 
2795 TEST_P(XdsServerRdsTest, NonInlineRouteConfigurationNotAvailable) {
2796  if (!GetParam().enable_rds_testing()) {
2797  return;
2798  }
2799  Listener listener = default_server_listener_;
2800  PopulateServerListenerNameAndPort(listener, backends_[0]->port());
2801  HttpConnectionManager http_connection_manager =
2802  ServerHcmAccessor().Unpack(listener);
2803  auto* rds = http_connection_manager.mutable_rds();
2804  rds->set_route_config_name("unknown_server_route_config");
2805  rds->mutable_config_source()->mutable_self();
2806  listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
2807  http_connection_manager);
2808  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2809  backends_[0]->port(),
2810  default_server_route_config_);
2811  backends_[0]->Start();
2812  backends_[0]->notifier()->WaitOnServingStatusChange(
2813  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2815  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
2816  true /* test_expects_failure */);
2817 }
2818 
2819 // TODO(yashykt): Once https://github.com/grpc/grpc/issues/24035 is fixed, we
2820 // should add tests that make sure that different route configs are used for
2821 // incoming connections with a different match.
2822 TEST_P(XdsServerRdsTest, MultipleRouteConfigurations) {
2823  Listener listener = default_server_listener_;
2824  // Set a filter chain with a new route config name
2825  auto new_route_config = default_server_route_config_;
2826  new_route_config.set_name("new_server_route_config");
2827  HttpConnectionManager http_connection_manager =
2828  ServerHcmAccessor().Unpack(listener);
2829  auto* rds = http_connection_manager.mutable_rds();
2830  rds->set_route_config_name(new_route_config.name());
2831  rds->mutable_config_source()->mutable_self();
2832  listener.add_filter_chains()->add_filters()->mutable_typed_config()->PackFrom(
2833  http_connection_manager);
2834  // Set another filter chain with another route config name
2835  auto another_route_config = default_server_route_config_;
2836  another_route_config.set_name("another_server_route_config");
2837  http_connection_manager.mutable_rds()->set_route_config_name(
2838  another_route_config.name());
2839  auto* filter_chain = listener.add_filter_chains();
2840  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2841  http_connection_manager);
2842  filter_chain->mutable_filter_chain_match()->set_source_type(
2843  FilterChainMatch::SAME_IP_OR_LOOPBACK);
2844  // Add another filter chain with the same route config name
2845  filter_chain = listener.add_filter_chains();
2846  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2847  http_connection_manager);
2848  filter_chain->mutable_filter_chain_match()->set_source_type(
2850  // Add another filter chain with an inline route config
2851  filter_chain = listener.add_filter_chains();
2852  filter_chain->mutable_filter_chain_match()->add_source_ports(1234);
2853  http_connection_manager = ServerHcmAccessor().Unpack(listener);
2854  *http_connection_manager.mutable_route_config() =
2855  default_server_route_config_;
2856  filter_chain->add_filters()->mutable_typed_config()->PackFrom(
2857  http_connection_manager);
2858  // Set resources on the ADS service
2859  balancer_->ads_service()->SetRdsResource(new_route_config);
2860  balancer_->ads_service()->SetRdsResource(another_route_config);
2861  SetServerListenerNameAndRouteConfiguration(balancer_.get(), listener,
2862  backends_[0]->port(),
2863  default_server_route_config_);
2864  backends_[0]->Start();
2865  backends_[0]->notifier()->WaitOnServingStatusChange(
2866  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2868  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2869 }
2870 
2871 // Tests RBAC configurations on the server with RDS testing and route config
2872 // override permutations.
2873 class XdsRbacTest : public XdsServerRdsTest {
2874  protected:
2875  void SetServerRbacPolicies(Listener listener,
2876  const std::vector<RBAC>& rbac_policies) {
2877  HttpConnectionManager http_connection_manager =
2878  ServerHcmAccessor().Unpack(listener);
2879  http_connection_manager.clear_http_filters();
2880  RouteConfiguration route_config = default_server_route_config_;
2881  int count = 0;
2882  for (auto& rbac : rbac_policies) {
2883  auto* filter = http_connection_manager.add_http_filters();
2884  std::string filter_name = absl::StrFormat("rbac%d", ++count);
2885  filter->set_name(filter_name);
2886  switch (GetParam().filter_config_setup()) {
2887  case XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInListener:
2888  filter->mutable_typed_config()->PackFrom(rbac);
2889  break;
2890  case XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute:
2891  filter->mutable_typed_config()->PackFrom(RBAC());
2892  google::protobuf::Any filter_config;
2893  RBACPerRoute rbac_per_route;
2894  *rbac_per_route.mutable_rbac() = rbac;
2895  filter_config.PackFrom(rbac_per_route);
2896  auto* config_map = route_config.mutable_virtual_hosts(0)
2897  ->mutable_routes(0)
2898  ->mutable_typed_per_filter_config();
2899  (*config_map)[filter_name] = std::move(filter_config);
2900  }
2901  }
2902  auto* filter = http_connection_manager.add_http_filters();
2903  filter->set_name("router");
2904  filter->mutable_typed_config()->PackFrom(
2905  envoy::extensions::filters::http::router::v3::Router());
2906  ServerHcmAccessor().Pack(http_connection_manager, &listener);
2907  SetServerListenerNameAndRouteConfiguration(
2908  balancer_.get(), listener, backends_[0]->port(), route_config);
2909  }
2910 
2911  void SetServerRbacPolicy(Listener listener, const RBAC& rbac) {
2912  SetServerRbacPolicies(std::move(listener), {rbac});
2913  }
2914 
2915  void SetServerRbacPolicy(const RBAC& rbac) {
2916  SetServerRbacPolicy(default_server_listener_, rbac);
2917  }
2918 };
2919 
2920 TEST_P(XdsRbacTest, AbsentRbacPolicy) {
2921  SetServerRbacPolicy(RBAC());
2922  backends_[0]->Start();
2923  backends_[0]->notifier()->WaitOnServingStatusChange(
2924  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2926  // An absent RBAC policy leads to all RPCs being accepted.
2927  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2928 }
2929 
2930 TEST_P(XdsRbacTest, LogAction) {
2931  RBAC rbac;
2932  auto* rules = rbac.mutable_rules();
2933  rules->set_action(envoy::config::rbac::v3::RBAC_Action_LOG);
2934  SetServerRbacPolicy(rbac);
2935  backends_[0]->Start();
2936  backends_[0]->notifier()->WaitOnServingStatusChange(
2937  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
2939  // A Log action is identical to no rbac policy being configured.
2940  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
2941 }
2942 
2943 using XdsRbacNackTest = XdsRbacTest;
2944 
2945 TEST_P(XdsRbacNackTest, NacksSchemePrincipalHeader) {
2946  RBAC rbac;
2947  auto* rules = rbac.mutable_rules();
2948  rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
2949  Policy policy;
2950  auto* header = policy.add_principals()->mutable_header();
2951  header->set_name(":scheme");
2952  header->set_exact_match("http");
2953  policy.add_permissions()->set_any(true);
2954  (*rules->mutable_policies())["policy"] = policy;
2955  SetServerRbacPolicy(rbac);
2956  backends_[0]->Start();
2957  if (GetParam().enable_rds_testing() &&
2958  GetParam().filter_config_setup() ==
2959  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
2960  const auto response_state = WaitForRdsNack(DEBUG_LOCATION);
2961  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2962  EXPECT_THAT(response_state->error_message,
2963  ::testing::HasSubstr("':scheme' not allowed in header"));
2964  } else {
2965  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2966  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2967  EXPECT_THAT(response_state->error_message,
2968  ::testing::HasSubstr("':scheme' not allowed in header"));
2969  }
2970 }
2971 
2972 TEST_P(XdsRbacNackTest, NacksGrpcPrefixedPrincipalHeaders) {
2973  RBAC rbac;
2974  auto* rules = rbac.mutable_rules();
2975  rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
2976  Policy policy;
2977  auto* header = policy.add_principals()->mutable_header();
2978  header->set_name("grpc-status");
2979  header->set_exact_match("0");
2980  policy.add_permissions()->set_any(true);
2981  (*rules->mutable_policies())["policy"] = policy;
2982  SetServerRbacPolicy(rbac);
2983  backends_[0]->Start();
2984  if (GetParam().enable_rds_testing() &&
2985  GetParam().filter_config_setup() ==
2986  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
2987  const auto response_state = WaitForRdsNack(DEBUG_LOCATION);
2988  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2989  EXPECT_THAT(response_state->error_message,
2990  ::testing::HasSubstr("'grpc-' prefixes not allowed in header"));
2991  } else {
2992  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
2993  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
2994  EXPECT_THAT(response_state->error_message,
2995  ::testing::HasSubstr("'grpc-' prefixes not allowed in header"));
2996  }
2997 }
2998 
2999 TEST_P(XdsRbacNackTest, NacksSchemePermissionHeader) {
3000  RBAC rbac;
3001  auto* rules = rbac.mutable_rules();
3002  rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
3003  Policy policy;
3004  auto* header = policy.add_permissions()->mutable_header();
3005  header->set_name(":scheme");
3006  header->set_exact_match("http");
3007  policy.add_principals()->set_any(true);
3008  (*rules->mutable_policies())["policy"] = policy;
3009  SetServerRbacPolicy(rbac);
3010  backends_[0]->Start();
3011  if (GetParam().enable_rds_testing() &&
3012  GetParam().filter_config_setup() ==
3013  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
3014  const auto response_state = WaitForRdsNack(DEBUG_LOCATION);
3015  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
3016  EXPECT_THAT(response_state->error_message,
3017  ::testing::HasSubstr("':scheme' not allowed in header"));
3018  } else {
3019  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
3020  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
3021  EXPECT_THAT(response_state->error_message,
3022  ::testing::HasSubstr("':scheme' not allowed in header"));
3023  }
3024 }
3025 
3026 TEST_P(XdsRbacNackTest, NacksGrpcPrefixedPermissionHeaders) {
3027  RBAC rbac;
3028  auto* rules = rbac.mutable_rules();
3029  rules->set_action(envoy::config::rbac::v3::RBAC_Action_ALLOW);
3030  Policy policy;
3031  auto* header = policy.add_permissions()->mutable_header();
3032  header->set_name("grpc-status");
3033  header->set_exact_match("0");
3034  policy.add_principals()->set_any(true);
3035  (*rules->mutable_policies())["policy"] = policy;
3036  SetServerRbacPolicy(rbac);
3037  backends_[0]->Start();
3038  if (GetParam().enable_rds_testing() &&
3039  GetParam().filter_config_setup() ==
3040  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute) {
3041  const auto response_state = WaitForRdsNack(DEBUG_LOCATION);
3042  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
3043  EXPECT_THAT(response_state->error_message,
3044  ::testing::HasSubstr("'grpc-' prefixes not allowed in header"));
3045  } else {
3046  const auto response_state = WaitForLdsNack(DEBUG_LOCATION);
3047  ASSERT_TRUE(response_state.has_value()) << "timed out waiting for NACK";
3048  EXPECT_THAT(response_state->error_message,
3049  ::testing::HasSubstr("'grpc-' prefixes not allowed in header"));
3050  }
3051 }
3052 
3053 // Tests RBAC policies where a route override is always present. Action
3054 // permutations are not added.
3055 using XdsRbacTestWithRouteOverrideAlwaysPresent = XdsRbacTest;
3056 
3057 TEST_P(XdsRbacTestWithRouteOverrideAlwaysPresent, EmptyRBACPerRouteOverride) {
3058  HttpConnectionManager http_connection_manager;
3059  Listener listener = default_server_listener_;
3060  RouteConfiguration route_config = default_server_route_config_;
3061  auto* filter = http_connection_manager.add_http_filters();
3062  filter->set_name("rbac");
3063  // Create a top-level RBAC policy with a DENY action for all RPCs
3064  RBAC rbac;
3065  auto* rules = rbac.mutable_rules();
3066  rules->set_action(RBAC_Action_DENY);
3067  Policy policy;
3068  policy.add_permissions()->set_any(true);
3069  policy.add_principals()->set_any(true);
3070  (*rules->mutable_policies())["policy"] = policy;
3071  filter->mutable_typed_config()->PackFrom(rbac);
3072  // Override with an Empty RBACPerRoute policy which should result in RBAC
3073  // being disabled and RPCs being allowed.
3074  google::protobuf::Any filter_config;
3075  filter_config.PackFrom(RBACPerRoute());
3076  auto* config_map = route_config.mutable_virtual_hosts(0)
3077  ->mutable_routes(0)
3078  ->mutable_typed_per_filter_config();
3079  (*config_map)["rbac"] = std::move(filter_config);
3080  filter = http_connection_manager.add_http_filters();
3081  filter->set_name("router");
3082  filter->mutable_typed_config()->PackFrom(
3083  envoy::extensions::filters::http::router::v3::Router());
3084  ServerHcmAccessor().Pack(http_connection_manager, &listener);
3085  SetServerListenerNameAndRouteConfiguration(
3086  balancer_.get(), listener, backends_[0]->port(), route_config);
3087  backends_[0]->Start();
3088  backends_[0]->notifier()->WaitOnServingStatusChange(
3089  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3091  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
3092 }
3093 
3094 // Test a non-empty top level RBAC with a non-empty RBACPerRouteOverride
3095 TEST_P(XdsRbacTestWithRouteOverrideAlwaysPresent,
3096  NonEmptyTopLevelRBACNonEmptyPerRouteOverride) {
3097  HttpConnectionManager http_connection_manager;
3098  Listener listener = default_server_listener_;
3099  RouteConfiguration route_config = default_server_route_config_;
3100  auto* filter = http_connection_manager.add_http_filters();
3101  filter->set_name("rbac");
3102  // Create a top-level RBAC policy with a DENY action for all RPCs
3103  RBAC rbac;
3104  auto* rules = rbac.mutable_rules();
3105  rules->set_action(RBAC_Action_DENY);
3106  Policy policy;
3107  policy.add_permissions()->set_any(true);
3108  policy.add_principals()->set_any(true);
3109  (*rules->mutable_policies())["policy"] = policy;
3110  filter->mutable_typed_config()->PackFrom(rbac);
3111  // Override with a non-empty RBACPerRoute policy which allows all RPCs.
3112  google::protobuf::Any filter_config;
3113  RBACPerRoute rbac_per_route;
3114  rules = rbac_per_route.mutable_rbac()->mutable_rules();
3115  rules->set_action(RBAC_Action_ALLOW);
3116  (*rules->mutable_policies())["policy"] = policy;
3117  filter_config.PackFrom(RBACPerRoute());
3118  auto* config_map = route_config.mutable_virtual_hosts(0)
3119  ->mutable_routes(0)
3120  ->mutable_typed_per_filter_config();
3121  (*config_map)["rbac"] = std::move(filter_config);
3122  filter = http_connection_manager.add_http_filters();
3123  filter->set_name("router");
3124  filter->mutable_typed_config()->PackFrom(
3125  envoy::extensions::filters::http::router::v3::Router());
3126  ServerHcmAccessor().Pack(http_connection_manager, &listener);
3127  SetServerListenerNameAndRouteConfiguration(
3128  balancer_.get(), listener, backends_[0]->port(), route_config);
3129  backends_[0]->Start();
3130  backends_[0]->notifier()->WaitOnServingStatusChange(
3131  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3133  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
3134 }
3135 
3136 // Adds Action Permutations to XdsRbacTest
3137 using XdsRbacTestWithActionPermutations = XdsRbacTest;
3138 
3139 TEST_P(XdsRbacTestWithActionPermutations, EmptyRbacPolicy) {
3140  RBAC rbac;
3141  rbac.mutable_rules()->set_action(GetParam().rbac_action());
3142  SetServerRbacPolicy(rbac);
3143  backends_[0]->Start();
3144  backends_[0]->notifier()->WaitOnServingStatusChange(
3145  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3147  // An empty RBAC policy leads to all RPCs being rejected.
3148  SendRpc(
3149  [this]() { return CreateInsecureChannel(); }, {}, {},
3150  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3152 }
3153 
3154 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAnyPrincipal) {
3155  RBAC rbac;
3156  auto* rules = rbac.mutable_rules();
3157  rules->set_action(GetParam().rbac_action());
3158  Policy policy;
3159  policy.add_permissions()->set_any(true);
3160  policy.add_principals()->set_any(true);
3161  (*rules->mutable_policies())["policy"] = policy;
3162  SetServerRbacPolicy(rbac);
3163  backends_[0]->Start();
3164  backends_[0]->notifier()->WaitOnServingStatusChange(
3165  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3167  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3168  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3170 }
3171 
3172 TEST_P(XdsRbacTestWithActionPermutations, MultipleRbacPolicies) {
3173  RBAC always_allow;
3174  auto* rules = always_allow.mutable_rules();
3175  rules->set_action(RBAC_Action_ALLOW);
3176  Policy policy;
3177  policy.add_permissions()->set_any(true);
3178  policy.add_principals()->set_any(true);
3179  (*rules->mutable_policies())["policy"] = policy;
3180  RBAC rbac;
3181  rules = rbac.mutable_rules();
3182  rules->set_action(GetParam().rbac_action());
3183  (*rules->mutable_policies())["policy"] = policy;
3184  SetServerRbacPolicies(default_server_listener_,
3185  {always_allow, rbac, always_allow});
3186  backends_[0]->Start();
3187  backends_[0]->notifier()->WaitOnServingStatusChange(
3188  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3190  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3191  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3193 }
3194 
3195 TEST_P(XdsRbacTestWithActionPermutations, MethodPostPermissionAnyPrincipal) {
3196  RBAC rbac;
3197  auto* rules = rbac.mutable_rules();
3198  rules->set_action(GetParam().rbac_action());
3199  Policy policy;
3200  auto* header = policy.add_permissions()->mutable_header();
3201  header->set_name(":method");
3202  header->set_exact_match("POST");
3203  policy.add_principals()->set_any(true);
3204  (*rules->mutable_policies())["policy"] = policy;
3205  SetServerRbacPolicy(rbac);
3206  backends_[0]->set_allow_put_requests(true);
3207  backends_[0]->Start();
3208  backends_[0]->notifier()->WaitOnServingStatusChange(
3209  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3211  // All RPCs use POST method by default
3212  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3213  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3215  // Test that an RPC with PUT method is handled properly.
3216  SendRpc([this]() { return CreateInsecureChannel(/*use_put_requests=*/true); },
3217  {}, {},
3218  /*test_expects_failure=*/GetParam().rbac_action() != RBAC_Action_DENY,
3220 }
3221 
3222 TEST_P(XdsRbacTestWithActionPermutations, MethodGetPermissionAnyPrincipal) {
3223  RBAC rbac;
3224  auto* rules = rbac.mutable_rules();
3225  rules->set_action(GetParam().rbac_action());
3226  Policy policy;
3227  auto* header = policy.add_permissions()->mutable_header();
3228  header->set_name(":method");
3229  header->set_exact_match("GET");
3230  policy.add_principals()->set_any(true);
3231  (*rules->mutable_policies())["policy"] = policy;
3232  SetServerRbacPolicy(rbac);
3233  backends_[0]->Start();
3234  backends_[0]->notifier()->WaitOnServingStatusChange(
3235  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3237  // Test that an RPC with a POST method gets rejected
3238  SendRpc(
3239  [this]() { return CreateInsecureChannel(); }, {}, {},
3240  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3242  // TODO(yashykt): When we start supporting GET requests in the future, this
3243  // should be modified to test that they are accepted with this rule.
3244 }
3245 
3246 TEST_P(XdsRbacTestWithActionPermutations, MethodPutPermissionAnyPrincipal) {
3247  RBAC rbac;
3248  auto* rules = rbac.mutable_rules();
3249  rules->set_action(GetParam().rbac_action());
3250  Policy policy;
3251  auto* header = policy.add_permissions()->mutable_header();
3252  header->set_name(":method");
3253  header->set_exact_match("PUT");
3254  policy.add_principals()->set_any(true);
3255  (*rules->mutable_policies())["policy"] = policy;
3256  SetServerRbacPolicy(rbac);
3257  backends_[0]->set_allow_put_requests(true);
3258  backends_[0]->Start();
3259  backends_[0]->notifier()->WaitOnServingStatusChange(
3260  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3262  // Test that an RPC with a POST method gets rejected
3263  SendRpc(
3264  [this]() { return CreateInsecureChannel(); }, {}, {},
3265  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3267  // Test that an RPC with a PUT method gets accepted
3268  SendRpc(
3269  [this]() { return CreateInsecureChannel(/*use_put_requests=*/true); }, {},
3270  {},
3271  /*test_expects_failure=*/GetParam().rbac_action() != RBAC_Action_ALLOW,
3273 }
3274 
3275 TEST_P(XdsRbacTestWithActionPermutations, UrlPathPermissionAnyPrincipal) {
3276  RBAC rbac;
3277  auto* rules = rbac.mutable_rules();
3278  rules->set_action(GetParam().rbac_action());
3279  Policy policy;
3280  policy.add_permissions()->mutable_url_path()->mutable_path()->set_exact(
3281  "/grpc.testing.EchoTestService/Echo");
3282  policy.add_principals()->set_any(true);
3283  (*rules->mutable_policies())["policy"] = policy;
3284  SetServerRbacPolicy(rbac);
3285  backends_[0]->Start();
3286  backends_[0]->notifier()->WaitOnServingStatusChange(
3287  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3289  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3290  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3292  // Test an RPC with a different URL path
3293  auto stub = grpc::testing::EchoTestService::NewStub(CreateInsecureChannel());
3294  ClientContext context;
3297  EchoRequest request;
3298  request.set_message(kRequestMessage);
3299  EchoResponse response;
3300  Status status = stub->Echo1(&context, request, &response);
3301  EXPECT_TRUE(GetParam().rbac_action() == RBAC_Action_DENY ? status.ok()
3302  : !status.ok())
3303  << status.error_code() << ", " << status.error_message() << ", "
3304  << status.error_details() << ", " << context.debug_error_string();
3305 }
3306 
3307 TEST_P(XdsRbacTestWithActionPermutations, DestinationIpPermissionAnyPrincipal) {
3308  RBAC rbac;
3309  auto* rules = rbac.mutable_rules();
3310  rules->set_action(GetParam().rbac_action());
3311  Policy policy;
3312  auto* range = policy.add_permissions()->mutable_destination_ip();
3313  range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
3314  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3315  policy.add_principals()->set_any(true);
3316  (*rules->mutable_policies())["policy"] = policy;
3317  SetServerRbacPolicy(rbac);
3318  backends_[0]->Start();
3319  backends_[0]->notifier()->WaitOnServingStatusChange(
3320  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3322  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3323  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3325  // Change the policy itself for a negative test where there is no match.
3326  policy.clear_permissions();
3327  range = policy.add_permissions()->mutable_destination_ip();
3328  range->set_address_prefix(ipv6_only_ ? "::2" : "127.0.0.2");
3329  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3330  (*rules->mutable_policies())["policy"] = policy;
3331  SetServerRbacPolicy(rbac);
3332  SendRpc(
3333  [this]() { return CreateInsecureChannel(); }, {}, {},
3334  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3336 }
3337 
3338 TEST_P(XdsRbacTestWithActionPermutations,
3339  DestinationPortPermissionAnyPrincipal) {
3340  RBAC rbac;
3341  auto* rules = rbac.mutable_rules();
3342  rules->set_action(GetParam().rbac_action());
3343  Policy policy;
3344  policy.add_permissions()->set_destination_port(backends_[0]->port());
3345  policy.add_principals()->set_any(true);
3346  (*rules->mutable_policies())["policy"] = policy;
3347  SetServerRbacPolicy(rbac);
3348  backends_[0]->Start();
3349  backends_[0]->notifier()->WaitOnServingStatusChange(
3350  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3352  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3353  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3355  // Change the policy itself for a negative test where there is no match.
3356  policy.clear_permissions();
3357  policy.add_permissions()->set_destination_port(1);
3358  (*rules->mutable_policies())["policy"] = policy;
3359  SetServerRbacPolicy(rbac);
3360  SendRpc(
3361  [this]() { return CreateInsecureChannel(); }, {}, {},
3362  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3364 }
3365 
3366 TEST_P(XdsRbacTestWithActionPermutations, MetadataPermissionAnyPrincipal) {
3367  RBAC rbac;
3368  auto* rules = rbac.mutable_rules();
3369  rules->set_action(GetParam().rbac_action());
3370  Policy policy;
3371  policy.add_permissions()->mutable_metadata();
3372  policy.add_principals()->set_any(true);
3373  (*rules->mutable_policies())["policy"] = policy;
3374  SetServerRbacPolicy(rbac);
3375  backends_[0]->Start();
3376  backends_[0]->notifier()->WaitOnServingStatusChange(
3377  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3379  SendRpc(
3380  [this]() { return CreateInsecureChannel(); }, {}, {},
3381  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3383  // Test metadata with inverted match
3384  policy.clear_permissions();
3385  policy.add_permissions()->mutable_metadata()->set_invert(true);
3386  (*rules->mutable_policies())["policy"] = policy;
3387  SetServerRbacPolicy(rbac);
3388  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3389  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3391 }
3392 
3393 TEST_P(XdsRbacTestWithActionPermutations, ReqServerNamePermissionAnyPrincipal) {
3394  RBAC rbac;
3395  auto* rules = rbac.mutable_rules();
3396  rules->set_action(GetParam().rbac_action());
3397  Policy policy;
3398  policy.add_principals()->set_any(true);
3399  policy.add_permissions()->mutable_requested_server_name()->set_exact(
3400  "server_name");
3401  (*rules->mutable_policies())["policy"] = policy;
3402  SetServerRbacPolicy(rbac);
3403  backends_[0]->Start();
3404  backends_[0]->notifier()->WaitOnServingStatusChange(
3405  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3407  SendRpc(
3408  [this]() { return CreateInsecureChannel(); }, {}, {},
3409  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3411  policy.clear_permissions();
3412  policy.add_permissions()->mutable_requested_server_name()->set_exact("");
3413  (*rules->mutable_policies())["policy"] = policy;
3414  SetServerRbacPolicy(rbac);
3415  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3416  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3418 }
3419 
3420 TEST_P(XdsRbacTestWithActionPermutations, NotRulePermissionAnyPrincipal) {
3421  RBAC rbac;
3422  auto* rules = rbac.mutable_rules();
3423  rules->set_action(GetParam().rbac_action());
3424  Policy policy;
3425  policy.add_permissions()
3426  ->mutable_not_rule()
3427  ->mutable_requested_server_name()
3428  ->set_exact("server_name");
3429  policy.add_principals()->set_any(true);
3430  (*rules->mutable_policies())["policy"] = policy;
3431  SetServerRbacPolicy(rbac);
3432  backends_[0]->Start();
3433  backends_[0]->notifier()->WaitOnServingStatusChange(
3434  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3436  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3437  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3439  // Change the policy itself for a negative test where there is no match.
3440  policy.clear_permissions();
3441  policy.add_permissions()->mutable_not_rule()->set_any(true);
3442  (*rules->mutable_policies())["policy"] = policy;
3443  SetServerRbacPolicy(rbac);
3444  SendRpc(
3445  [this]() { return CreateInsecureChannel(); }, {}, {},
3446  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3448 }
3449 
3450 TEST_P(XdsRbacTestWithActionPermutations, AndRulePermissionAnyPrincipal) {
3451  RBAC rbac;
3452  auto* rules = rbac.mutable_rules();
3453  rules->set_action(GetParam().rbac_action());
3454  Policy policy;
3455  auto* and_rules = policy.add_permissions()->mutable_and_rules();
3456  and_rules->add_rules()->set_any(true);
3457  and_rules->add_rules()->set_destination_port(backends_[0]->port());
3458  policy.add_principals()->set_any(true);
3459  (*rules->mutable_policies())["policy"] = policy;
3460  SetServerRbacPolicy(rbac);
3461  backends_[0]->Start();
3462  backends_[0]->notifier()->WaitOnServingStatusChange(
3463  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3465  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3466  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3468  // Change the policy itself for a negative test where there is no match.
3469  and_rules = (*policy.mutable_permissions())[0].mutable_and_rules();
3470  (*and_rules->mutable_rules())[1].set_destination_port(1);
3471  (*rules->mutable_policies())["policy"] = policy;
3472  SetServerRbacPolicy(rbac);
3473  SendRpc(
3474  [this]() { return CreateInsecureChannel(); }, {}, {},
3475  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3477 }
3478 
3479 TEST_P(XdsRbacTestWithActionPermutations, OrRulePermissionAnyPrincipal) {
3480  RBAC rbac;
3481  auto* rules = rbac.mutable_rules();
3482  rules->set_action(GetParam().rbac_action());
3483  Policy policy;
3484  auto* or_rules = policy.add_permissions()->mutable_or_rules();
3485  or_rules->add_rules()->mutable_not_rule()->set_any(true);
3486  or_rules->add_rules()->set_destination_port(backends_[0]->port());
3487  policy.add_principals()->set_any(true);
3488  (*rules->mutable_policies())["policy"] = policy;
3489  SetServerRbacPolicy(rbac);
3490  backends_[0]->Start();
3491  backends_[0]->notifier()->WaitOnServingStatusChange(
3492  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3494  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3495  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3497  // Change the policy itself for a negative test where there is no match.
3498  or_rules = (*policy.mutable_permissions())[0].mutable_or_rules();
3499  (*or_rules->mutable_rules())[1].set_destination_port(1);
3500  (*rules->mutable_policies())["policy"] = policy;
3501  SetServerRbacPolicy(rbac);
3502  SendRpc(
3503  [this]() { return CreateInsecureChannel(); }, {}, {},
3504  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3506 }
3507 
3508 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodPostPrincipal) {
3509  RBAC rbac;
3510  auto* rules = rbac.mutable_rules();
3511  rules->set_action(GetParam().rbac_action());
3512  Policy policy;
3513  auto* header = policy.add_principals()->mutable_header();
3514  header->set_name(":method");
3515  header->set_exact_match("POST");
3516  policy.add_permissions()->set_any(true);
3517  (*rules->mutable_policies())["policy"] = policy;
3518  SetServerRbacPolicy(rbac);
3519  backends_[0]->set_allow_put_requests(true);
3520  backends_[0]->Start();
3521  backends_[0]->notifier()->WaitOnServingStatusChange(
3522  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3524  // All RPCs use POST method by default
3525  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3526  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3528  // Test that an RPC with PUT method is handled properly.
3529  SendRpc([this]() { return CreateInsecureChannel(/*use_put_requests=*/true); },
3530  {}, {},
3531  /*test_expects_failure=*/GetParam().rbac_action() != RBAC_Action_DENY,
3533 }
3534 
3535 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodGetPrincipal) {
3536  RBAC rbac;
3537  auto* rules = rbac.mutable_rules();
3538  rules->set_action(GetParam().rbac_action());
3539  Policy policy;
3540  auto* header = policy.add_principals()->mutable_header();
3541  header->set_name(":method");
3542  header->set_exact_match("GET");
3543  policy.add_permissions()->set_any(true);
3544  (*rules->mutable_policies())["policy"] = policy;
3545  SetServerRbacPolicy(rbac);
3546  backends_[0]->Start();
3547  backends_[0]->notifier()->WaitOnServingStatusChange(
3548  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3550  // Test that an RPC with a POST method gets rejected
3551  SendRpc(
3552  [this]() { return CreateInsecureChannel(); }, {}, {},
3553  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3555  // TODO(yashykt): When we start supporting GET requests in the future, this
3556  // should be modified to test that they are accepted with this rule.
3557 }
3558 
3559 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMethodPutPrincipal) {
3560  RBAC rbac;
3561  auto* rules = rbac.mutable_rules();
3562  rules->set_action(GetParam().rbac_action());
3563  Policy policy;
3564  auto* header = policy.add_principals()->mutable_header();
3565  header->set_name(":method");
3566  header->set_exact_match("PUT");
3567  policy.add_permissions()->set_any(true);
3568  (*rules->mutable_policies())["policy"] = policy;
3569  SetServerRbacPolicy(rbac);
3570  backends_[0]->set_allow_put_requests(true);
3571  backends_[0]->Start();
3572  backends_[0]->notifier()->WaitOnServingStatusChange(
3573  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3575  // Test that an RPC with a PUT method gets accepted
3576  SendRpc(
3577  [this]() { return CreateInsecureChannel(/*use_put_requests=*/true); }, {},
3578  {},
3579  /*test_expects_failure=*/GetParam().rbac_action() != RBAC_Action_ALLOW,
3581  // Test that an RPC with a POST method gets rejected
3582  SendRpc(
3583  [this]() { return CreateInsecureChannel(); }, {}, {},
3584  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3586 }
3587 
3588 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionUrlPathPrincipal) {
3589  RBAC rbac;
3590  auto* rules = rbac.mutable_rules();
3591  rules->set_action(GetParam().rbac_action());
3592  Policy policy;
3593  policy.add_principals()->mutable_url_path()->mutable_path()->set_exact(
3594  "/grpc.testing.EchoTestService/Echo");
3595  policy.add_permissions()->set_any(true);
3596  (*rules->mutable_policies())["policy"] = policy;
3597  SetServerRbacPolicy(rbac);
3598  backends_[0]->Start();
3599  backends_[0]->notifier()->WaitOnServingStatusChange(
3600  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3602  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3603  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3605  // Test an RPC with a different URL path
3606  auto stub = grpc::testing::EchoTestService::NewStub(CreateInsecureChannel());
3607  ClientContext context;
3610  EchoRequest request;
3611  request.set_message(kRequestMessage);
3612  EchoResponse response;
3613  Status status = stub->Echo1(&context, request, &response);
3614  EXPECT_TRUE(GetParam().rbac_action() == RBAC_Action_DENY ? status.ok()
3615  : !status.ok())
3616  << status.error_code() << ", " << status.error_message() << ", "
3617  << status.error_details() << ", " << context.debug_error_string();
3618 }
3619 
3620 TEST_P(XdsRbacTestWithActionPermutations,
3621  AnyPermissionDirectRemoteIpPrincipal) {
3622  RBAC rbac;
3623  auto* rules = rbac.mutable_rules();
3624  rules->set_action(GetParam().rbac_action());
3625  Policy policy;
3626  auto* range = policy.add_principals()->mutable_direct_remote_ip();
3627  range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
3628  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3629  policy.add_permissions()->set_any(true);
3630  (*rules->mutable_policies())["policy"] = policy;
3631  SetServerRbacPolicy(rbac);
3632  backends_[0]->Start();
3633  backends_[0]->notifier()->WaitOnServingStatusChange(
3634  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3636  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3637  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3639  // Change the policy itself for a negative test where there is no match.
3640  policy.clear_principals();
3641  range = policy.add_principals()->mutable_direct_remote_ip();
3642  range->set_address_prefix(ipv6_only_ ? "::2" : "127.0.0.2");
3643  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3644  (*rules->mutable_policies())["policy"] = policy;
3645  SetServerRbacPolicy(rbac);
3646  SendRpc(
3647  [this]() { return CreateInsecureChannel(); }, {}, {},
3648  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3650 }
3651 
3652 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionRemoteIpPrincipal) {
3653  RBAC rbac;
3654  auto* rules = rbac.mutable_rules();
3655  rules->set_action(GetParam().rbac_action());
3656  Policy policy;
3657  auto* range = policy.add_principals()->mutable_remote_ip();
3658  range->set_address_prefix(ipv6_only_ ? "::1" : "127.0.0.1");
3659  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3660  policy.add_permissions()->set_any(true);
3661  (*rules->mutable_policies())["policy"] = policy;
3662  SetServerRbacPolicy(rbac);
3663  backends_[0]->Start();
3664  backends_[0]->notifier()->WaitOnServingStatusChange(
3665  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3667  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3668  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3670  // Change the policy itself for a negative test where there is no match.
3671  policy.clear_principals();
3672  range = policy.add_principals()->mutable_remote_ip();
3673  range->set_address_prefix(ipv6_only_ ? "::2" : "127.0.0.2");
3674  range->mutable_prefix_len()->set_value(ipv6_only_ ? 128 : 32);
3675  (*rules->mutable_policies())["policy"] = policy;
3676  SetServerRbacPolicy(rbac);
3677  SendRpc(
3678  [this]() { return CreateInsecureChannel(); }, {}, {},
3679  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3681 }
3682 
3683 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAuthenticatedPrincipal) {
3684  g_fake1_cert_data_map->Set({{"", {root_cert_, identity_pair_}}});
3685  Listener listener = default_server_listener_;
3686  auto* filter_chain = listener.mutable_default_filter_chain();
3687  auto* transport_socket = filter_chain->mutable_transport_socket();
3688  transport_socket->set_name("envoy.transport_sockets.tls");
3689  DownstreamTlsContext downstream_tls_context;
3690  downstream_tls_context.mutable_common_tls_context()
3691  ->mutable_tls_certificate_provider_instance()
3692  ->set_instance_name("fake_plugin1");
3693  downstream_tls_context.mutable_common_tls_context()
3694  ->mutable_validation_context()
3695  ->mutable_ca_certificate_provider_instance()
3696  ->set_instance_name("fake_plugin1");
3697  downstream_tls_context.mutable_require_client_certificate()->set_value(true);
3698  transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
3699  RBAC rbac;
3700  auto* rules = rbac.mutable_rules();
3701  rules->set_action(GetParam().rbac_action());
3702  Policy policy;
3703  policy.add_principals()
3704  ->mutable_authenticated()
3705  ->mutable_principal_name()
3706  ->set_exact("*.test.google.fr");
3707  policy.add_permissions()->set_any(true);
3708  (*rules->mutable_policies())["policy"] = policy;
3709  SetServerRbacPolicy(listener, rbac);
3710  backends_[0]->Start();
3711  backends_[0]->notifier()->WaitOnServingStatusChange(
3712  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3714  SendRpc([this]() { return CreateMtlsChannel(); },
3716  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3718 }
3719 
3720 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionMetadataPrincipal) {
3721  RBAC rbac;
3722  auto* rules = rbac.mutable_rules();
3723  rules->set_action(GetParam().rbac_action());
3724  Policy policy;
3725  policy.add_principals()->mutable_metadata();
3726  policy.add_permissions()->set_any(true);
3727  (*rules->mutable_policies())["policy"] = policy;
3728  SetServerRbacPolicy(rbac);
3729  backends_[0]->Start();
3730  backends_[0]->notifier()->WaitOnServingStatusChange(
3731  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3733  SendRpc(
3734  [this]() { return CreateInsecureChannel(); }, {}, {},
3735  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3737  // Test metadata with inverted match
3738  policy.clear_principals();
3739  policy.add_principals()->mutable_metadata()->set_invert(true);
3740  (*rules->mutable_policies())["policy"] = policy;
3741  SetServerRbacPolicy(rbac);
3742  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3743  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3745 }
3746 
3747 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionNotIdPrincipal) {
3748  RBAC rbac;
3749  auto* rules = rbac.mutable_rules();
3750  rules->set_action(GetParam().rbac_action());
3751  Policy policy;
3752  policy.add_principals()
3753  ->mutable_not_id()
3754  ->mutable_url_path()
3755  ->mutable_path()
3756  ->set_exact("/grpc.testing.EchoTestService/Echo1");
3757  policy.add_permissions()->set_any(true);
3758  (*rules->mutable_policies())["policy"] = policy;
3759  SetServerRbacPolicy(rbac);
3760  backends_[0]->Start();
3761  backends_[0]->notifier()->WaitOnServingStatusChange(
3762  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3764  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3765  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3767  // Change the policy itself for a negative test where there is no match.
3768  policy.clear_principals();
3769  policy.add_principals()->mutable_not_id()->set_any(true);
3770  (*rules->mutable_policies())["policy"] = policy;
3771  SetServerRbacPolicy(rbac);
3772  SendRpc(
3773  [this]() { return CreateInsecureChannel(); }, {}, {},
3774  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3776 }
3777 
3778 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionAndIdPrincipal) {
3779  RBAC rbac;
3780  auto* rules = rbac.mutable_rules();
3781  rules->set_action(GetParam().rbac_action());
3782  Policy policy;
3783  auto* and_ids = policy.add_principals()->mutable_and_ids();
3784  and_ids->add_ids()->set_any(true);
3785  and_ids->add_ids()->mutable_url_path()->mutable_path()->set_exact(
3786  "/grpc.testing.EchoTestService/Echo");
3787  policy.add_permissions()->set_any(true);
3788  (*rules->mutable_policies())["policy"] = policy;
3789  SetServerRbacPolicy(rbac);
3790  backends_[0]->Start();
3791  backends_[0]->notifier()->WaitOnServingStatusChange(
3792  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3794  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3795  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3797  // Change the policy itself for a negative test where there is no match.
3798  and_ids = (*policy.mutable_principals())[0].mutable_and_ids();
3799  (*and_ids->mutable_ids())[1].mutable_url_path()->mutable_path()->set_exact(
3800  "/grpc.testing.EchoTestService/Echo1");
3801  (*rules->mutable_policies())["policy"] = policy;
3802  SetServerRbacPolicy(rbac);
3803  SendRpc(
3804  [this]() { return CreateInsecureChannel(); }, {}, {},
3805  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3807 }
3808 
3809 TEST_P(XdsRbacTestWithActionPermutations, AnyPermissionOrIdPrincipal) {
3810  RBAC rbac;
3811  auto* rules = rbac.mutable_rules();
3812  rules->set_action(GetParam().rbac_action());
3813  Policy policy;
3814  auto* or_ids = policy.add_principals()->mutable_or_ids();
3815  or_ids->add_ids()->mutable_not_id()->set_any(true);
3816  or_ids->add_ids()->mutable_url_path()->mutable_path()->set_exact(
3817  "/grpc.testing.EchoTestService/Echo");
3818  policy.add_permissions()->set_any(true);
3819  (*rules->mutable_policies())["policy"] = policy;
3820  SetServerRbacPolicy(rbac);
3821  backends_[0]->Start();
3822  backends_[0]->notifier()->WaitOnServingStatusChange(
3823  absl::StrCat(ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()),
3825  SendRpc([this]() { return CreateInsecureChannel(); }, {}, {},
3826  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_DENY,
3828  // Change the policy itself for a negative test where there is no match.
3829  or_ids = (*policy.mutable_principals())[0].mutable_or_ids();
3830  (*or_ids->mutable_ids())[1].mutable_url_path()->mutable_path()->set_exact(
3831  "/grpc.testing.EchoTestService/Echo1");
3832  (*rules->mutable_policies())["policy"] = policy;
3833  SetServerRbacPolicy(rbac);
3834  SendRpc(
3835  [this]() { return CreateInsecureChannel(); }, {}, {},
3836  /*test_expects_failure=*/GetParam().rbac_action() == RBAC_Action_ALLOW,
3838 }
3839 
3840 // CDS depends on XdsResolver.
3841 // Security depends on v3.
3842 // Not enabling load reporting or RDS, since those are irrelevant to these
3843 // tests.
3845  XdsTest, XdsSecurityTest,
3846  ::testing::Values(XdsTestType().set_use_xds_credentials()),
3848 
3849 // We are only testing the server here.
3850 // Run with bootstrap from env var, so that we use a global XdsClient
3851 // instance. Otherwise, we would need to use a separate fake resolver
3852 // result generator on the client and server sides.
3853 INSTANTIATE_TEST_SUITE_P(XdsTest, XdsEnabledServerTest,
3854  ::testing::Values(XdsTestType().set_bootstrap_source(
3857 
3858 // We are only testing the server here.
3859 // Run with bootstrap from env var so that we use one XdsClient.
3861  XdsTest, XdsServerSecurityTest,
3862  ::testing::Values(
3863  XdsTestType()
3864  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)
3865  .set_use_xds_credentials()),
3867 
3869  XdsTest, XdsEnabledServerStatusNotificationTest,
3870  ::testing::Values(XdsTestType().set_use_xds_credentials()),
3872 
3873 // Run with bootstrap from env var so that we use one XdsClient.
3875  XdsTest, XdsServerFilterChainMatchTest,
3876  ::testing::Values(
3877  XdsTestType()
3878  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)
3879  .set_use_xds_credentials()),
3881 
3882 // Test xDS-enabled server with and without RDS.
3883 // Run with bootstrap from env var so that we use one XdsClient.
3885  XdsTest, XdsServerRdsTest,
3886  ::testing::Values(
3887  XdsTestType()
3888  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)
3889  .set_use_xds_credentials(),
3890  XdsTestType()
3891  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)
3892  .set_use_xds_credentials()
3893  .set_enable_rds_testing()),
3895 
3896 // We are only testing the server here.
3897 // Run with bootstrap from env var, so that we use a global XdsClient
3898 // instance. Otherwise, we would need to use a separate fake resolver
3899 // result generator on the client and server sides.
3901  XdsTest, XdsRbacTest,
3902  ::testing::Values(
3903  XdsTestType().set_use_xds_credentials().set_bootstrap_source(
3905  XdsTestType()
3906  .set_use_xds_credentials()
3907  .set_enable_rds_testing()
3908  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3909  XdsTestType()
3910  .set_use_xds_credentials()
3911  .set_filter_config_setup(
3912  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3913  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3914  XdsTestType()
3915  .set_use_xds_credentials()
3916  .set_enable_rds_testing()
3917  .set_filter_config_setup(
3918  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3919  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)),
3921 
3922 // We are only testing the server here.
3923 // Run with bootstrap from env var, so that we use a global XdsClient
3924 // instance. Otherwise, we would need to use a separate fake resolver
3925 // result generator on the client and server sides.
3926 // Note that we are simply using the default fake credentials instead of xds
3927 // credentials for NACK tests to avoid a mismatch between the client and the
3928 // server's security settings when using the WaitForNack() infrastructure.
3930  XdsTest, XdsRbacNackTest,
3931  ::testing::Values(
3932  XdsTestType().set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3933  XdsTestType().set_enable_rds_testing().set_bootstrap_source(
3935  XdsTestType()
3936  .set_filter_config_setup(
3937  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3938  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3939  XdsTestType()
3940  .set_enable_rds_testing()
3941  .set_filter_config_setup(
3942  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3943  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)),
3945 
3946 // We are only testing the server here.
3947 // Run with bootstrap from env var, so that we use a global XdsClient
3948 // instance. Otherwise, we would need to use a separate fake resolver
3949 // result generator on the client and server sides.
3951  XdsTest, XdsRbacTestWithRouteOverrideAlwaysPresent,
3952  ::testing::Values(
3953  XdsTestType()
3954  .set_use_xds_credentials()
3955  .set_filter_config_setup(
3956  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3957  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3958  XdsTestType()
3959  .set_use_xds_credentials()
3960  .set_enable_rds_testing()
3961  .set_filter_config_setup(
3962  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3963  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)),
3965 
3966 // We are only testing the server here.
3967 // Run with bootstrap from env var, so that we use a global XdsClient
3968 // instance. Otherwise, we would need to use a separate fake resolver
3969 // result generator on the client and server sides.
3971  XdsTest, XdsRbacTestWithActionPermutations,
3972  ::testing::Values(
3973  XdsTestType()
3974  .set_use_xds_credentials()
3975  .set_rbac_action(RBAC_Action_ALLOW)
3976  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3977  XdsTestType()
3978  .set_use_xds_credentials()
3979  .set_rbac_action(RBAC_Action_DENY)
3980  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3981  XdsTestType()
3982  .set_use_xds_credentials()
3983  .set_enable_rds_testing()
3984  .set_rbac_action(RBAC_Action_ALLOW)
3985  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3986  XdsTestType()
3987  .set_use_xds_credentials()
3988  .set_enable_rds_testing()
3989  .set_rbac_action(RBAC_Action_DENY)
3990  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3991  XdsTestType()
3992  .set_use_xds_credentials()
3993  .set_filter_config_setup(
3994  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
3995  .set_rbac_action(RBAC_Action_ALLOW)
3996  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
3997  XdsTestType()
3998  .set_use_xds_credentials()
3999  .set_filter_config_setup(
4000  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4001  .set_rbac_action(RBAC_Action_DENY)
4002  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
4003  XdsTestType()
4004  .set_use_xds_credentials()
4005  .set_enable_rds_testing()
4006  .set_filter_config_setup(
4007  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4008  .set_rbac_action(RBAC_Action_ALLOW)
4009  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar),
4010  XdsTestType()
4011  .set_use_xds_credentials()
4012  .set_enable_rds_testing()
4013  .set_filter_config_setup(
4014  XdsTestType::HttpFilterConfigLocation::kHttpFilterConfigInRoute)
4015  .set_rbac_action(RBAC_Action_DENY)
4016  .set_bootstrap_source(XdsTestType::kBootstrapFromEnvVar)),
4018 
4019 } // namespace
4020 } // namespace testing
4021 } // namespace grpc
4022 
4023 int main(int argc, char** argv) {
4024  grpc::testing::TestEnvironment env(&argc, argv);
4025  ::testing::InitGoogleTest(&argc, argv);
4026  // Make the backup poller poll very frequently in order to pick up
4027  // updates from all the subchannels's FDs.
4028  GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);
4029 #if TARGET_OS_IPHONE
4030  // Workaround Apple CFStream bug
4031  gpr_setenv("grpc_cfstream", "0");
4032 #endif
4033  grpc::testing::FakeCertificateProvider::CertDataMapWrapper cert_data_map_1;
4034  grpc::testing::g_fake1_cert_data_map = &cert_data_map_1;
4036  absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
4037  "fake1", grpc::testing::g_fake1_cert_data_map));
4038  grpc::testing::FakeCertificateProvider::CertDataMapWrapper cert_data_map_2;
4039  grpc::testing::g_fake2_cert_data_map = &cert_data_map_2;
4041  absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
4042  "fake2", grpc::testing::g_fake2_cert_data_map));
4043  grpc_init();
4045  absl::make_unique<grpc::testing::NoOpHttpFilter>(
4046  "grpc.testing.client_only_http_filter",
4047  /* supported_on_clients = */ true, /* supported_on_servers = */ false,
4048  /* is_terminal_filter */ false),
4049  {"grpc.testing.client_only_http_filter"});
4051  absl::make_unique<grpc::testing::NoOpHttpFilter>(
4052  "grpc.testing.server_only_http_filter",
4053  /* supported_on_clients = */ false, /* supported_on_servers = */ true,
4054  /* is_terminal_filter */ false),
4055  {"grpc.testing.server_only_http_filter"});
4057  absl::make_unique<grpc::testing::NoOpHttpFilter>(
4058  "grpc.testing.terminal_http_filter",
4059  /* supported_on_clients = */ true, /* supported_on_servers = */ true,
4060  /* is_terminal_filter */ true),
4061  {"grpc.testing.terminal_http_filter"});
4062  const auto result = RUN_ALL_TESTS();
4063  grpc_shutdown();
4064  return result;
4065 }
prefix_range
absl::optional< XdsListenerResource::FilterChainMap::CidrRange > prefix_range
Definition: xds_listener.cc:750
bad_san_1_
StringMatcher bad_san_1_
Definition: xds_end2end_test.cc:425
grpc::EXPECT_THAT
EXPECT_THAT(status.error_message(), ::testing::HasSubstr("subject_token_type"))
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
server_san_suffix_
StringMatcher server_san_suffix_
Definition: xds_end2end_test.cc:422
xds_server_builder.h
Any
struct Any Any
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:633
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
testing
Definition: aws_request_signer_test.cc:25
grpc::status
auto status
Definition: cpp/client/credentials_test.cc:200
absl::cord_internal::EXTERNAL
@ EXTERNAL
Definition: abseil-cpp/absl/strings/internal/cord_internal.h:183
grpc::testing::XdsTestType::kBootstrapFromEnvVar
@ kBootstrapFromEnvVar
Definition: xds_end2end_test_lib.h:64
grpc_core::MakeRefCounted
RefCountedPtr< T > MakeRefCounted(Args &&... args)
Definition: ref_counted_ptr.h:335
regen-readme.it
it
Definition: regen-readme.py:15
fake_credentials.h
grpc_timeout_seconds_to_deadline
gpr_timespec grpc_timeout_seconds_to_deadline(int64_t time_s)
Definition: test/core/util/test_config.cc:81
ipv6_only_
bool ipv6_only_
Definition: client_lb_end2end_test.cc:217
log.h
port.h
grpc_core::CertificateProviderRegistry::RegisterCertificateProviderFactory
static void RegisterCertificateProviderFactory(std::unique_ptr< CertificateProviderFactory > factory)
Definition: certificate_provider_registry.cc:85
sockaddr_utils.h
generate.env
env
Definition: generate.py:37
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
load_file.h
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
absl::Time
Definition: third_party/abseil-cpp/absl/time/time.h:642
main
int main(int argc, char **argv)
Definition: xds_end2end_test.cc:4023
grpc
Definition: grpcpp/alarm.h:33
name_
const char * name_
Definition: xds_end2end_test.cc:232
backends_
std::vector< std::unique_ptr< BackendServiceImpl > > backends_
Definition: client_channel_stress_test.cc:333
capstone.range
range
Definition: third_party/bloaty/third_party/capstone/bindings/python/capstone/__init__.py:6
cpp.utils.ReadFile
def ReadFile(filename, print_error=True)
Definition: bloaty/third_party/googletest/googlemock/scripts/generator/cpp/utils.py:30
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
grpc::ClientContext::set_wait_for_ready
void set_wait_for_ready(bool wait_for_ready)
Definition: grpcpp/impl/codegen/client_context.h:285
string.h
options
double_dict options[]
Definition: capstone_test.c:55
Listener
Definition: transport_common.h:31
benchmark.request
request
Definition: benchmark.py:77
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_core::Timestamp
Definition: src/core/lib/gprpp/time.h:62
GRPC_ARG_TEST_ONLY_USE_PUT_REQUESTS
#define GRPC_ARG_TEST_ONLY_USE_PUT_REQUESTS
Definition: http_client_filter.h:57
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
fake_resolver.h
secure_credentials.h
grpc::ClientContext::set_deadline
void set_deadline(const T &deadline)
Definition: grpcpp/impl/codegen/client_context.h:274
time_util.h
bad_identity_pair_
grpc_core::PemKeyCertPairList bad_identity_pair_
Definition: xds_end2end_test.cc:419
absl::LocalTimeZone
TimeZone LocalTimeZone()
Definition: third_party/abseil-cpp/absl/time/time.h:1109
grpc_tls_certificate_distributor
Definition: grpc_tls_certificate_distributor.h:43
ABSL_GUARDED_BY
#define ABSL_GUARDED_BY(x)
Definition: abseil-cpp/absl/base/thread_annotations.h:62
GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL
#define GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL
Definition: grpc_types.h:443
setup.name
name
Definition: setup.py:542
env.h
time.h
grpc_core::XdsHttpFilterRegistry::RegisterFilter
static void RegisterFilter(std::unique_ptr< XdsHttpFilterImpl > filter, const std::set< absl::string_view > &config_proto_type_names)
Definition: xds_http_filters.cc:89
identity_pair_2_
grpc_core::PemKeyCertPairList identity_pair_2_
Definition: xds_end2end_test.cc:1549
grpc_security.h
async_greeter_client.stub
stub
Definition: hellostreamingworld/async_greeter_client.py:26
sockaddr.h
tls_test_utils.h
verifier
static void verifier(grpc_server *server, grpc_completion_queue *cq, void *)
Definition: badreq.cc:31
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
check_bazel_workspace.rules
dictionary rules
Definition: check_bazel_workspace.py:180
identity_pair_
grpc_core::PemKeyCertPairList identity_pair_
Definition: xds_end2end_test.cc:417
grpc.StatusCode.FAILED_PRECONDITION
tuple FAILED_PRECONDITION
Definition: src/python/grpcio/grpc/__init__.py:272
absl::FormatTime
std::string FormatTime(absl::string_view format, absl::Time t, absl::TimeZone tz)
Definition: abseil-cpp/absl/time/format.cc:74
absl::synchronization_internal::Get
static GraphId Get(const IdMap &id, int num)
Definition: abseil-cpp/absl/synchronization/internal/graphcycles_test.cc:44
grpc_tls_certificate_distributor::SetKeyMaterials
void SetKeyMaterials(const std::string &cert_name, absl::optional< std::string > pem_root_certs, absl::optional< grpc_core::PemKeyCertPairList > pem_key_cert_pairs)
Definition: grpc_tls_certificate_distributor.cc:27
client_authenticated_identity_
std::vector< std::string > client_authenticated_identity_
Definition: xds_end2end_test.cc:1552
http_client_filter.h
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
parse_address.h
root_cert_
std::string root_cert_
Definition: xds_end2end_test.cc:415
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
no_op_http_filter.h
xds_channel_args.h
grpc_core::RefCountedPtr< grpc_tls_certificate_distributor >
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
ASSERT_LT
#define ASSERT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2068
GRPC_SSL_TARGET_NAME_OVERRIDE_ARG
#define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG
Definition: grpc_types.h:278
grpc.StatusCode.OK
tuple OK
Definition: src/python/grpcio/grpc/__init__.py:260
absl::StrJoin
std::string StrJoin(Iterator start, Iterator end, absl::string_view sep, Formatter &&fmt)
Definition: abseil-cpp/absl/strings/str_join.h:239
cluster
absl::string_view cluster
Definition: xds_resolver.cc:331
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc.StatusCode.PERMISSION_DENIED
tuple PERMISSION_DENIED
Definition: src/python/grpcio/grpc/__init__.py:268
grpc_timeout_milliseconds_to_deadline
gpr_timespec grpc_timeout_milliseconds_to_deadline(int64_t time_ms)
Definition: test/core/util/test_config.cc:89
xds_client.h
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc.StatusCode.NOT_FOUND
tuple NOT_FOUND
Definition: src/python/grpcio/grpc/__init__.py:266
fallback_authenticated_identity_
std::vector< std::string > fallback_authenticated_identity_
Definition: xds_end2end_test.cc:428
gpr_sleep_until
GPRAPI void gpr_sleep_until(gpr_timespec until)
grpc.h
header
struct absl::base_internal::@2940::AllocList::Header header
tmpfile.h
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
grpc_test_slowdown_factor
int64_t grpc_test_slowdown_factor()
Definition: test/core/util/test_config.cc:76
channel.h
server_address.h
time.h
xds_end2end_test_lib.h
xds_channel_args.h
grpc::testing::kLdsTypeUrl
constexpr char kLdsTypeUrl[]
Definition: xds_server.h:51
grpc::testing::INSTANTIATE_TEST_SUITE_P
INSTANTIATE_TEST_SUITE_P(HistogramTestCases, HistogramTest, ::testing::Range< int >(0, GRPC_STATS_HISTOGRAM_COUNT))
backup_poller.h
grpc::ClientContext::auth_context
std::shared_ptr< const grpc::AuthContext > auth_context() const
Definition: grpcpp/impl/codegen/client_context.h:309
xds_listener.h
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
bad_root_cert_
std::string bad_root_cert_
Definition: xds_end2end_test.cc:416
distributor_
grpc_core::RefCountedPtr< grpc_tls_certificate_distributor > distributor_
Definition: xds_end2end_test.cc:216
tls_certificate_provider.h
server_authenticated_identity_
std::vector< std::string > server_authenticated_identity_
Definition: xds_end2end_test.cc:1550
GPR_GLOBAL_CONFIG_SET
#define GPR_GLOBAL_CONFIG_SET(name, value)
Definition: global_config_generic.h:26
grpc::experimental::TlsChannelCredentialsOptions
Definition: tls_credentials_options.h:125
server_authenticated_identity_2_
std::vector< std::string > server_authenticated_identity_2_
Definition: xds_end2end_test.cc:1551
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
test_config.h
absl::Seconds
constexpr Duration Seconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:419
grpc_core::Duration::Milliseconds
static constexpr Duration Milliseconds(int64_t millis)
Definition: src/core/lib/gprpp/time.h:155
identity_key_cert_pairs
grpc_core::PemKeyCertPairList identity_key_cert_pairs
Definition: xds_end2end_test.cc:143
secure_server_credentials.h
env_var_
ScopedExperimentalEnvVar env_var_
Definition: xds_end2end_test.cc:2690
absl::Now
ABSL_NAMESPACE_BEGIN Time Now()
Definition: abseil-cpp/absl/time/clock.cc:39
grpc::testing::AdsServiceImpl::ResponseState::ACKED
@ ACKED
Definition: xds_server.h:73
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
server_san_contains_
StringMatcher server_san_contains_
Definition: xds_end2end_test.cc:423
client_context.h
testing::InitGoogleTest
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:6106
cert_data_map_
CertDataMap cert_data_map_
Definition: xds_end2end_test.cc:217
grpc::experimental::TlsCredentials
std::shared_ptr< ChannelCredentials > TlsCredentials(const TlsChannelCredentialsOptions &options)
Builds TLS Credentials given TLS options.
Definition: secure_credentials.cc:316
grpc_core::UniqueTypeName
Definition: unique_type_name.h:56
testing::Values
internal::ValueArray< T... > Values(T... v)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest-param-test.h:335
grpc_core::QsortCompare
int QsortCompare(const T &a, const T &b)
Definition: useful.h:95
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
grpc_core::PemKeyCertPairList
std::vector< PemKeyCertPair > PemKeyCertPairList
Definition: ssl_utils.h:183
grpc_core::CertificateProviderFactory::Config
Definition: certificate_provider_factory.h:40
bad_san_2_
StringMatcher bad_san_2_
Definition: xds_end2end_test.cc:426
grpc::testing::ToString
std::string ToString(const grpc::string_ref &r)
Definition: string_ref_helper.cc:24
alloc.h
server_san_regex_
StringMatcher server_san_regex_
Definition: xds_end2end_test.cc:424
profile_analyzer.fields
list fields
Definition: profile_analyzer.py:266
xds_api.h
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
EXPECT_LT
#define EXPECT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2032
server_san_prefix_
StringMatcher server_san_prefix_
Definition: xds_end2end_test.cc:421
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
certificate_provider_registry.h
grpc::CreateCustomChannel
std::shared_ptr< Channel > CreateCustomChannel(const grpc::string &target, const std::shared_ptr< ChannelCredentials > &creds, const ChannelArguments &args)
mu_
grpc_core::Mutex mu_
Definition: xds_end2end_test.cc:160
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
test_config.h
grpc::testing::EXPECT_EQ
EXPECT_EQ(options.token_exchange_service_uri, "https://foo/exchange")
ref_counted_ptr.h
Any::PackFrom
void PackFrom(const ::PROTOBUF_NAMESPACE_ID::Message &message)
Definition: bloaty/third_party/protobuf/src/google/protobuf/any.pb.cc:88
EXPECT_GE
#define EXPECT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2034
grpc.StatusCode.UNAVAILABLE
tuple UNAVAILABLE
Definition: src/python/grpcio/grpc/__init__.py:278
channel_args.h
check_redundant_namespace_qualifiers.Config
Config
Definition: check_redundant_namespace_qualifiers.py:142
authenticated_identity_
std::vector< std::string > authenticated_identity_
Definition: xds_end2end_test.cc:427
fallback_identity_pair_
grpc_core::PemKeyCertPairList fallback_identity_pair_
Definition: xds_end2end_test.cc:418
absl::string_view::empty
constexpr bool empty() const noexcept
Definition: abseil-cpp/absl/strings/string_view.h:292
grpc_tls_certificate_provider
Definition: grpc_tls_certificate_provider.h:53
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
grpc::testing::TEST_P
TEST_P(HistogramTest, IncHistogram)
Definition: stats_test.cc:87
backend_index_
int backend_index_
Definition: xds_end2end_test.cc:429
grpc::testing::EXPECT_TRUE
EXPECT_TRUE(grpc::experimental::StsCredentialsOptionsFromJson(minimum_valid_json, &options) .ok())
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_core::CertificateProviderFactory
Definition: certificate_provider_factory.h:37
server.h
run_xds_tests.backend_service
def backend_service
Definition: run_xds_tests.py:3255
grpc::InsecureChannelCredentials
std::shared_ptr< ChannelCredentials > InsecureChannelCredentials()
Credentials for an unencrypted, unauthenticated channel.
Definition: cpp/client/insecure_credentials.cc:69
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
server_san_exact_
StringMatcher server_san_exact_
Definition: xds_end2end_test.cc:420
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
grpc::ClientContext::debug_error_string
std::string debug_error_string() const
Definition: grpcpp/impl/codegen/client_context.h:414
grpc::testing::SendRpc
static void SendRpc(grpc::testing::EchoTestService::Stub *stub, int num_rpcs, bool allow_exhaustion, gpr_atm *errors)
Definition: thread_stress_test.cc:277
grpc_core::UniqueTypeName::Factory
Definition: unique_type_name.h:60
grpc_core::Json
Definition: src/core/lib/json/json.h:37
testing::HasSubstr
PolymorphicMatcher< internal::HasSubstrMatcher< internal::string > > HasSubstr(const internal::string &substring)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8803
root_certificate
std::string root_certificate
Definition: xds_end2end_test.cc:142
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
if
if(p->owned &&p->wrapped !=NULL)
Definition: call.c:42
server_builder.h
sync.h
grpc_tls_certificate_distributor::SetWatchStatusCallback
void SetWatchStatusCallback(std::function< void(std::string, bool, bool)> callback)
Definition: grpc_tls_certificate_distributor.h:133
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
create_channel.h
grpc::testing::XdsTestType::Name
static std::string Name(const ::testing::TestParamInfo< XdsTestType > &info)
Definition: xds_end2end_test_lib.h:143
gpr_setenv
void gpr_setenv(const char *name, const char *value)
time_precise.h
stream
voidpf stream
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:58