From 3c45ae0132278bc2447befb022eedf18dbeecbb9 Mon Sep 17 00:00:00 2001 From: alyssawilk Date: Wed, 30 Mar 2022 12:56:27 -0400 Subject: [PATCH] test: creating a test listener filter and moving the xds test over to it (#20571) Part of #9953 Signed-off-by: Alyssa Wilk --- test/config/utility.cc | 8 +++++ test/config/utility.h | 3 ++ test/integration/BUILD | 2 +- test/integration/filters/BUILD | 15 ++++++++ .../filters/test_listener_filter.cc | 34 ++++++++++++++++++ .../filters/test_listener_filter.h | 35 +++++++++++++++++++ test/integration/xds_integration_test.cc | 9 ++--- 7 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 test/integration/filters/test_listener_filter.cc create mode 100644 test/integration/filters/test_listener_filter.h diff --git a/test/config/utility.cc b/test/config/utility.cc index 265fec66f477..8a3cfffd6ebe 100644 --- a/test/config/utility.cc +++ b/test/config/utility.cc @@ -145,6 +145,14 @@ std::string ConfigHelper::startTlsConfig() { TestEnvironment::runfilesPath("test/config/integration/certs/serverkey.pem"))); } +std::string ConfigHelper::testInspectorFilter() { + return R"EOF( +name: "envoy.filters.listener.test" +typed_config: + "@type": type.googleapis.com/google.protobuf.Struct +)EOF"; +} + std::string ConfigHelper::tlsInspectorFilter(bool enable_ja3_fingerprinting) { if (!enable_ja3_fingerprinting) { return R"EOF( diff --git a/test/config/utility.h b/test/config/utility.h index 29500b9c8746..a122498d950c 100644 --- a/test/config/utility.h +++ b/test/config/utility.h @@ -147,6 +147,9 @@ class ConfigHelper { // A string for a tls inspector listener filter which can be used with addListenerFilter() static std::string tlsInspectorFilter(bool enable_ja3_fingerprinting = false); + // A string for the test inspector filter. + static std::string testInspectorFilter(); + // A basic configuration for L4 proxying. static std::string tcpProxyConfig(); // A basic configuration for L7 proxying. diff --git a/test/integration/BUILD b/test/integration/BUILD index a3db9aea3fe0..fcb29ecc109c 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -1433,11 +1433,11 @@ envoy_cc_test( ":http_integration_lib", ":http_protocol_integration_lib", "//source/extensions/filters/listener/tls_inspector:config", - "//source/extensions/filters/listener/tls_inspector:tls_inspector_lib", "//source/extensions/filters/network/tcp_proxy:config", "//source/extensions/transport_sockets/tls:config", "//source/extensions/transport_sockets/tls:context_config_lib", "//source/extensions/transport_sockets/tls:context_lib", + "//test/integration/filters:test_listener_filter_lib", "//test/test_common:environment_lib", "//test/test_common:utility_lib", "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", diff --git a/test/integration/filters/BUILD b/test/integration/filters/BUILD index f495efca2a44..2208f0745cbf 100644 --- a/test/integration/filters/BUILD +++ b/test/integration/filters/BUILD @@ -14,6 +14,21 @@ envoy_proto_library( srcs = ["add_body_filter.proto"], ) +envoy_cc_test_library( + name = "test_listener_filter_lib", + srcs = [ + "test_listener_filter.cc", + ], + hdrs = [ + "test_listener_filter.h", + ], + deps = [ + "//envoy/network:filter_interface", + "//envoy/registry", + "//envoy/server:filter_config_interface", + ], +) + envoy_cc_test_library( name = "add_body_filter_config_lib", srcs = [ diff --git a/test/integration/filters/test_listener_filter.cc b/test/integration/filters/test_listener_filter.cc new file mode 100644 index 000000000000..e4b6b01a5489 --- /dev/null +++ b/test/integration/filters/test_listener_filter.cc @@ -0,0 +1,34 @@ +#include "test/integration/filters/test_listener_filter.h" + +namespace Envoy { + +/** + * Config registration for the test filter. + */ +class TestInspectorConfigFactory : public Server::Configuration::NamedListenerFilterConfigFactory { +public: + // NamedListenerFilterConfigFactory + Network::ListenerFilterFactoryCb createListenerFilterFactoryFromProto( + const Protobuf::Message& /*message*/, + const Network::ListenerFilterMatcherSharedPtr& listener_filter_matcher, + Server::Configuration::ListenerFactoryContext& /*context*/) override { + return [listener_filter_matcher](Network::ListenerFilterManager& filter_manager) -> void { + filter_manager.addAcceptFilter(listener_filter_matcher, + std::make_unique()); + }; + } + + ProtobufTypes::MessagePtr createEmptyConfigProto() override { + return ProtobufTypes::MessagePtr{new Envoy::ProtobufWkt::Struct()}; + } + + std::string name() const override { return "envoy.filters.listener.test"; } +}; + +absl::Mutex TestListenerFilter::alpn_lock_; +std::string TestListenerFilter::alpn_; + +REGISTER_FACTORY(TestInspectorConfigFactory, + Server::Configuration::NamedListenerFilterConfigFactory){"envoy.listener.test"}; + +} // namespace Envoy diff --git a/test/integration/filters/test_listener_filter.h b/test/integration/filters/test_listener_filter.h new file mode 100644 index 000000000000..aae0424aac06 --- /dev/null +++ b/test/integration/filters/test_listener_filter.h @@ -0,0 +1,35 @@ +#include "envoy/registry/registry.h" +#include "envoy/server/filter_config.h" + +namespace Envoy { +/** + * Test listener filter which sets the ALPN to a manually configured string. + */ +class TestListenerFilter : public Network::ListenerFilter { +public: + TestListenerFilter() = default; + + // Network::ListenerFilter + Network::FilterStatus onAccept(Network::ListenerFilterCallbacks& cb) override { + absl::MutexLock m(&alpn_lock_); + ASSERT(!alpn_.empty()); + cb.socket().setRequestedApplicationProtocols({alpn_}); + alpn_.clear(); + return Network::FilterStatus::Continue; + } + Network::FilterStatus onData(Network::ListenerFilterBuffer&) override { + return Network::FilterStatus::Continue; + } + size_t maxReadBytes() const override { return 0; } + + static void setAlpn(std::string alpn) { + absl::MutexLock m(&alpn_lock_); + alpn_ = alpn; + } + +private: + static absl::Mutex alpn_lock_; + static std::string alpn_; +}; + +} // namespace Envoy diff --git a/test/integration/xds_integration_test.cc b/test/integration/xds_integration_test.cc index 820eecefac89..32f471d10b7a 100644 --- a/test/integration/xds_integration_test.cc +++ b/test/integration/xds_integration_test.cc @@ -3,6 +3,7 @@ #include "source/common/buffer/buffer_impl.h" +#include "test/integration/filters/test_listener_filter.h" #include "test/integration/http_integration.h" #include "test/integration/http_protocol_integration.h" #include "test/integration/ssl_utility.h" @@ -140,8 +141,7 @@ class LdsInplaceUpdateTcpProxyIntegrationTest void initialize() override { config_helper_.renameListener("tcp"); - std::string tls_inspector_config = ConfigHelper::tlsInspectorFilter(); - config_helper_.addListenerFilter(tls_inspector_config); + config_helper_.addListenerFilter(ConfigHelper::testInspectorFilter()); config_helper_.addSslConfig(); config_helper_.addConfigModifier([](envoy::config::bootstrap::v3::Bootstrap& bootstrap) { @@ -168,6 +168,7 @@ class LdsInplaceUpdateTcpProxyIntegrationTest const std::string& request, std::string& response) { Buffer::OwnedImpl buffer(request); + TestListenerFilter::setAlpn(alpn); return std::make_unique( lookupPort("tcp"), buffer, [&response](Network::ClientConnection&, const Buffer::Instance& data) -> void { @@ -298,8 +299,7 @@ class LdsInplaceUpdateHttpIntegrationTest setUpstreamCount(2); config_helper_.renameListener("http"); - std::string tls_inspector_config = ConfigHelper::tlsInspectorFilter(); - config_helper_.addListenerFilter(tls_inspector_config); + config_helper_.addListenerFilter(ConfigHelper::testInspectorFilter()); config_helper_.addSslConfig(); config_helper_.addConfigModifier( [&](envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager& @@ -361,6 +361,7 @@ class LdsInplaceUpdateHttpIntegrationTest } IntegrationCodecClientPtr createHttpCodec(const std::string& alpn) { + TestListenerFilter::setAlpn(alpn); auto ssl_conn = dispatcher_->createClientConnection( address_, Network::Address::InstanceConstSharedPtr(), context_->createTransportSocket(std::make_shared(