Skip to content

Commit 3c45ae0

Browse files
alyssawilkravenblackx
authored andcommitted
test: creating a test listener filter and moving the xds test over to it (envoyproxy#20571)
Part of envoyproxy#9953 Signed-off-by: Alyssa Wilk <alyssar@chromium.org>
1 parent b93f4d7 commit 3c45ae0

File tree

7 files changed

+101
-5
lines changed

7 files changed

+101
-5
lines changed

test/config/utility.cc

+8
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,14 @@ std::string ConfigHelper::startTlsConfig() {
145145
TestEnvironment::runfilesPath("test/config/integration/certs/serverkey.pem")));
146146
}
147147

148+
std::string ConfigHelper::testInspectorFilter() {
149+
return R"EOF(
150+
name: "envoy.filters.listener.test"
151+
typed_config:
152+
"@type": type.googleapis.com/google.protobuf.Struct
153+
)EOF";
154+
}
155+
148156
std::string ConfigHelper::tlsInspectorFilter(bool enable_ja3_fingerprinting) {
149157
if (!enable_ja3_fingerprinting) {
150158
return R"EOF(

test/config/utility.h

+3
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ class ConfigHelper {
147147
// A string for a tls inspector listener filter which can be used with addListenerFilter()
148148
static std::string tlsInspectorFilter(bool enable_ja3_fingerprinting = false);
149149

150+
// A string for the test inspector filter.
151+
static std::string testInspectorFilter();
152+
150153
// A basic configuration for L4 proxying.
151154
static std::string tcpProxyConfig();
152155
// A basic configuration for L7 proxying.

test/integration/BUILD

+1-1
Original file line numberDiff line numberDiff line change
@@ -1433,11 +1433,11 @@ envoy_cc_test(
14331433
":http_integration_lib",
14341434
":http_protocol_integration_lib",
14351435
"//source/extensions/filters/listener/tls_inspector:config",
1436-
"//source/extensions/filters/listener/tls_inspector:tls_inspector_lib",
14371436
"//source/extensions/filters/network/tcp_proxy:config",
14381437
"//source/extensions/transport_sockets/tls:config",
14391438
"//source/extensions/transport_sockets/tls:context_config_lib",
14401439
"//source/extensions/transport_sockets/tls:context_lib",
1440+
"//test/integration/filters:test_listener_filter_lib",
14411441
"//test/test_common:environment_lib",
14421442
"//test/test_common:utility_lib",
14431443
"@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto",

test/integration/filters/BUILD

+15
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ envoy_proto_library(
1414
srcs = ["add_body_filter.proto"],
1515
)
1616

17+
envoy_cc_test_library(
18+
name = "test_listener_filter_lib",
19+
srcs = [
20+
"test_listener_filter.cc",
21+
],
22+
hdrs = [
23+
"test_listener_filter.h",
24+
],
25+
deps = [
26+
"//envoy/network:filter_interface",
27+
"//envoy/registry",
28+
"//envoy/server:filter_config_interface",
29+
],
30+
)
31+
1732
envoy_cc_test_library(
1833
name = "add_body_filter_config_lib",
1934
srcs = [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "test/integration/filters/test_listener_filter.h"
2+
3+
namespace Envoy {
4+
5+
/**
6+
* Config registration for the test filter.
7+
*/
8+
class TestInspectorConfigFactory : public Server::Configuration::NamedListenerFilterConfigFactory {
9+
public:
10+
// NamedListenerFilterConfigFactory
11+
Network::ListenerFilterFactoryCb createListenerFilterFactoryFromProto(
12+
const Protobuf::Message& /*message*/,
13+
const Network::ListenerFilterMatcherSharedPtr& listener_filter_matcher,
14+
Server::Configuration::ListenerFactoryContext& /*context*/) override {
15+
return [listener_filter_matcher](Network::ListenerFilterManager& filter_manager) -> void {
16+
filter_manager.addAcceptFilter(listener_filter_matcher,
17+
std::make_unique<TestListenerFilter>());
18+
};
19+
}
20+
21+
ProtobufTypes::MessagePtr createEmptyConfigProto() override {
22+
return ProtobufTypes::MessagePtr{new Envoy::ProtobufWkt::Struct()};
23+
}
24+
25+
std::string name() const override { return "envoy.filters.listener.test"; }
26+
};
27+
28+
absl::Mutex TestListenerFilter::alpn_lock_;
29+
std::string TestListenerFilter::alpn_;
30+
31+
REGISTER_FACTORY(TestInspectorConfigFactory,
32+
Server::Configuration::NamedListenerFilterConfigFactory){"envoy.listener.test"};
33+
34+
} // namespace Envoy
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "envoy/registry/registry.h"
2+
#include "envoy/server/filter_config.h"
3+
4+
namespace Envoy {
5+
/**
6+
* Test listener filter which sets the ALPN to a manually configured string.
7+
*/
8+
class TestListenerFilter : public Network::ListenerFilter {
9+
public:
10+
TestListenerFilter() = default;
11+
12+
// Network::ListenerFilter
13+
Network::FilterStatus onAccept(Network::ListenerFilterCallbacks& cb) override {
14+
absl::MutexLock m(&alpn_lock_);
15+
ASSERT(!alpn_.empty());
16+
cb.socket().setRequestedApplicationProtocols({alpn_});
17+
alpn_.clear();
18+
return Network::FilterStatus::Continue;
19+
}
20+
Network::FilterStatus onData(Network::ListenerFilterBuffer&) override {
21+
return Network::FilterStatus::Continue;
22+
}
23+
size_t maxReadBytes() const override { return 0; }
24+
25+
static void setAlpn(std::string alpn) {
26+
absl::MutexLock m(&alpn_lock_);
27+
alpn_ = alpn;
28+
}
29+
30+
private:
31+
static absl::Mutex alpn_lock_;
32+
static std::string alpn_;
33+
};
34+
35+
} // namespace Envoy

test/integration/xds_integration_test.cc

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "source/common/buffer/buffer_impl.h"
55

6+
#include "test/integration/filters/test_listener_filter.h"
67
#include "test/integration/http_integration.h"
78
#include "test/integration/http_protocol_integration.h"
89
#include "test/integration/ssl_utility.h"
@@ -140,8 +141,7 @@ class LdsInplaceUpdateTcpProxyIntegrationTest
140141

141142
void initialize() override {
142143
config_helper_.renameListener("tcp");
143-
std::string tls_inspector_config = ConfigHelper::tlsInspectorFilter();
144-
config_helper_.addListenerFilter(tls_inspector_config);
144+
config_helper_.addListenerFilter(ConfigHelper::testInspectorFilter());
145145

146146
config_helper_.addSslConfig();
147147
config_helper_.addConfigModifier([](envoy::config::bootstrap::v3::Bootstrap& bootstrap) {
@@ -168,6 +168,7 @@ class LdsInplaceUpdateTcpProxyIntegrationTest
168168
const std::string& request,
169169
std::string& response) {
170170
Buffer::OwnedImpl buffer(request);
171+
TestListenerFilter::setAlpn(alpn);
171172
return std::make_unique<RawConnectionDriver>(
172173
lookupPort("tcp"), buffer,
173174
[&response](Network::ClientConnection&, const Buffer::Instance& data) -> void {
@@ -298,8 +299,7 @@ class LdsInplaceUpdateHttpIntegrationTest
298299
setUpstreamCount(2);
299300

300301
config_helper_.renameListener("http");
301-
std::string tls_inspector_config = ConfigHelper::tlsInspectorFilter();
302-
config_helper_.addListenerFilter(tls_inspector_config);
302+
config_helper_.addListenerFilter(ConfigHelper::testInspectorFilter());
303303
config_helper_.addSslConfig();
304304
config_helper_.addConfigModifier(
305305
[&](envoy::extensions::filters::network::http_connection_manager::v3::HttpConnectionManager&
@@ -361,6 +361,7 @@ class LdsInplaceUpdateHttpIntegrationTest
361361
}
362362

363363
IntegrationCodecClientPtr createHttpCodec(const std::string& alpn) {
364+
TestListenerFilter::setAlpn(alpn);
364365
auto ssl_conn = dispatcher_->createClientConnection(
365366
address_, Network::Address::InstanceConstSharedPtr(),
366367
context_->createTransportSocket(std::make_shared<Network::TransportSocketOptionsImpl>(

0 commit comments

Comments
 (0)