diff --git a/include/envoy/network/listen_socket.h b/include/envoy/network/listen_socket.h index 6b475c318e13c..fd5e897131b0d 100644 --- a/include/envoy/network/listen_socket.h +++ b/include/envoy/network/listen_socket.h @@ -35,6 +35,11 @@ class Socket { */ virtual int fd() const PURE; + /** + * @return the type (stream or datagram) of the socket. + */ + virtual Address::SocketType socketType() const PURE; + /** * Close the underlying socket. */ diff --git a/include/envoy/server/listener_manager.h b/include/envoy/server/listener_manager.h index b00ba6da93176..fd2808cd6da76 100644 --- a/include/envoy/server/listener_manager.h +++ b/include/envoy/server/listener_manager.h @@ -44,12 +44,14 @@ class ListenerComponentFactory { /** * Creates a socket. * @param address supplies the socket's address. + * @param socket_type the type of socket (stream or datagram) to create. * @param options to be set on the created socket just before calling 'bind()'. * @param bind_to_port supplies whether to actually bind the socket. * @return Network::SocketSharedPtr an initialized and potentially bound socket. */ virtual Network::SocketSharedPtr createListenSocket(Network::Address::InstanceConstSharedPtr address, + Network::Address::SocketType socket_type, const Network::Socket::OptionsSharedPtr& options, bool bind_to_port) PURE; /** diff --git a/source/common/network/listen_socket_impl.h b/source/common/network/listen_socket_impl.h index 51b86449e6dc8..86d1cf81bf545 100644 --- a/source/common/network/listen_socket_impl.h +++ b/source/common/network/listen_socket_impl.h @@ -92,6 +92,8 @@ template class NetworkListenSocket : public ListenSocketImpl { setListenSocketOptions(options); } + Address::SocketType socketType() const override { return T::type; } + protected: void setPrebindSocketOptions(); }; @@ -106,6 +108,7 @@ class UdsListenSocket : public ListenSocketImpl { public: UdsListenSocket(const Address::InstanceConstSharedPtr& address); UdsListenSocket(int fd, const Address::InstanceConstSharedPtr& address); + Address::SocketType socketType() const override { return Address::SocketType::Stream; } }; class ConnectionSocketImpl : public SocketImpl, public ConnectionSocket { @@ -114,6 +117,9 @@ class ConnectionSocketImpl : public SocketImpl, public ConnectionSocket { const Address::InstanceConstSharedPtr& remote_address) : SocketImpl(fd, local_address), remote_address_(remote_address) {} + // Network::Socket + Address::SocketType socketType() const override { return Address::SocketType::Stream; } + // Network::ConnectionSocket const Address::InstanceConstSharedPtr& remoteAddress() const override { return remote_address_; } void setLocalAddress(const Address::InstanceConstSharedPtr& local_address, diff --git a/source/common/network/utility.cc b/source/common/network/utility.cc index 1fcb8fb1b92f2..4d53ce3668bac 100644 --- a/source/common/network/utility.cc +++ b/source/common/network/utility.cc @@ -501,5 +501,26 @@ void Utility::addressToProtobufAddress(const Address::Instance& address, } } +Address::SocketType +Utility::protobufAddressSocketType(const envoy::api::v2::core::Address& proto_address) { + switch (proto_address.address_case()) { + case envoy::api::v2::core::Address::kSocketAddress: { + auto protocol = proto_address.socket_address().protocol(); + switch (protocol) { + case envoy::api::v2::core::SocketAddress::TCP: + return Address::SocketType::Stream; + case envoy::api::v2::core::SocketAddress::UDP: + return Address::SocketType::Datagram; + default: + NOT_REACHED_GCOVR_EXCL_LINE; + } + } + case envoy::api::v2::core::Address::kPipe: + return Address::SocketType::Stream; + default: + NOT_REACHED_GCOVR_EXCL_LINE; + } +} + } // namespace Network } // namespace Envoy diff --git a/source/common/network/utility.h b/source/common/network/utility.h index 4a732b0ef87be..68f56d7ec5491 100644 --- a/source/common/network/utility.h +++ b/source/common/network/utility.h @@ -239,6 +239,15 @@ class Utility { static void addressToProtobufAddress(const Address::Instance& address, envoy::api::v2::core::Address& proto_address); + /** + * Returns socket type corresponding to SocketAddress.protocol value of the + * given address, or SocketType::Stream if the address is a pipe address. + * @param proto_address the address protobuf + * @return socket type + */ + static Address::SocketType + protobufAddressSocketType(const envoy::api::v2::core::Address& proto_address); + private: static void throwWithMalformedIp(const std::string& ip_address); diff --git a/source/server/config_validation/server.h b/source/server/config_validation/server.h index 222c863e46e78..df320e9bc0a1e 100644 --- a/source/server/config_validation/server.h +++ b/source/server/config_validation/server.h @@ -114,6 +114,7 @@ class ValidationInstance : Logger::Loggable, return ProdListenerComponentFactory::createListenerFilterFactoryList_(filters, context); } Network::SocketSharedPtr createListenSocket(Network::Address::InstanceConstSharedPtr, + Network::Address::SocketType, const Network::Socket::OptionsSharedPtr&, bool) override { // Returned sockets are not currently used so we can return nothing here safely vs. a diff --git a/source/server/listener_manager_impl.cc b/source/server/listener_manager_impl.cc index b294e981523ee..06b3a659331b0 100644 --- a/source/server/listener_manager_impl.cc +++ b/source/server/listener_manager_impl.cc @@ -25,9 +25,24 @@ #include "extensions/transport_sockets/well_known_names.h" #include "absl/strings/match.h" +#include "absl/strings/str_cat.h" namespace Envoy { namespace Server { +namespace { + +std::string toString(Network::Address::SocketType socket_type) { + switch (socket_type) { + case Network::Address::SocketType::Stream: + return "SocketType::Stream"; + case Network::Address::SocketType::Datagram: + return "SocketType::Datagram"; + default: + NOT_REACHED_GCOVR_EXCL_LINE; + } +} + +} // namespace std::vector ProdListenerComponentFactory::createNetworkFilterFactoryList_( const Protobuf::RepeatedPtrField& filters, @@ -82,16 +97,24 @@ ProdListenerComponentFactory::createListenerFilterFactoryList_( return ret; } -Network::SocketSharedPtr -ProdListenerComponentFactory::createListenSocket(Network::Address::InstanceConstSharedPtr address, - const Network::Socket::OptionsSharedPtr& options, - bool bind_to_port) { +Network::SocketSharedPtr ProdListenerComponentFactory::createListenSocket( + Network::Address::InstanceConstSharedPtr address, Network::Address::SocketType socket_type, + const Network::Socket::OptionsSharedPtr& options, bool bind_to_port) { ASSERT(address->type() == Network::Address::Type::Ip || address->type() == Network::Address::Type::Pipe); + ASSERT(socket_type == Network::Address::SocketType::Stream || + socket_type == Network::Address::SocketType::Datagram); // For each listener config we share a single socket among all threaded listeners. // First we try to get the socket from our parent if applicable. if (address->type() == Network::Address::Type::Pipe) { + if (socket_type != Network::Address::SocketType::Stream) { + // This could be implemented in the future, since Unix domain sockets + // support SOCK_DGRAM, but there would need to be a way to specify it in + // envoy.api.v2.core.Pipe. + throw EnvoyException( + fmt::format("socket type {} not supported for pipes", toString(socket_type))); + } const std::string addr = fmt::format("unix://{}", address->asString()); const int fd = server_.hotRestart().duplicateParentListenSocket(addr); if (fd != -1) { @@ -101,13 +124,24 @@ ProdListenerComponentFactory::createListenSocket(Network::Address::InstanceConst return std::make_shared(address); } - const std::string addr = fmt::format("tcp://{}", address->asString()); + const std::string scheme = (socket_type == Network::Address::SocketType::Stream) + ? Network::Utility::TCP_SCHEME + : Network::Utility::UDP_SCHEME; + const std::string addr = absl::StrCat(scheme, address->asString()); const int fd = server_.hotRestart().duplicateParentListenSocket(addr); if (fd != -1) { ENVOY_LOG(debug, "obtained socket for address {} from parent", addr); - return std::make_shared(fd, address, options); + if (socket_type == Network::Address::SocketType::Stream) { + return std::make_shared(fd, address, options); + } else { + return std::make_shared(fd, address, options); + } + } + if (socket_type == Network::Address::SocketType::Stream) { + return std::make_shared(address, options, bind_to_port); + } else { + return std::make_shared(address, options, bind_to_port); } - return std::make_shared(address, options, bind_to_port); } DrainManagerPtr @@ -119,6 +153,7 @@ ListenerImpl::ListenerImpl(const envoy::api::v2::Listener& config, const std::st ListenerManagerImpl& parent, const std::string& name, bool modifiable, bool workers_started, uint64_t hash) : parent_(parent), address_(Network::Address::resolveProtoAddress(config.address())), + socket_type_(Network::Utility::protobufAddressSocketType(config.address())), global_scope_(parent_.server_.stats().createScope("")), listener_scope_( parent_.server_.stats().createScope(fmt::format("listener.{}.", address_->asString()))), @@ -774,6 +809,7 @@ bool ListenerManagerImpl::addOrUpdateListener(const envoy::api::v2::Listener& co new_listener->setSocket(draining_listener_socket ? draining_listener_socket : factory_.createListenSocket(new_listener->address(), + new_listener->socketType(), new_listener->listenSocketOptions(), new_listener->bindToPort())); if (workers_started_) { diff --git a/source/server/listener_manager_impl.h b/source/server/listener_manager_impl.h index 745691e144bd3..bf860ad9baa31 100644 --- a/source/server/listener_manager_impl.h +++ b/source/server/listener_manager_impl.h @@ -61,6 +61,7 @@ class ProdListenerComponentFactory : public ListenerComponentFactory, return createListenerFilterFactoryList_(filters, context); } Network::SocketSharedPtr createListenSocket(Network::Address::InstanceConstSharedPtr address, + Network::Address::SocketType socket_type, const Network::Socket::OptionsSharedPtr& options, bool bind_to_port) override; DrainManagerPtr createDrainManager(envoy::api::v2::Listener::DrainType drain_type) override; @@ -227,6 +228,7 @@ class ListenerImpl : public Network::ListenerConfig, } Network::Address::InstanceConstSharedPtr address() const { return address_; } + Network::Address::SocketType socketType() const { return socket_type_; } const envoy::api::v2::Listener& config() { return config_; } const Network::SocketSharedPtr& getSocket() const { return socket_; } void debugLog(const std::string& message); @@ -386,6 +388,7 @@ class ListenerImpl : public Network::ListenerConfig, ListenerManagerImpl& parent_; Network::Address::InstanceConstSharedPtr address_; + Network::Address::SocketType socket_type_; Network::SocketSharedPtr socket_; Stats::ScopePtr global_scope_; // Stats with global named scope, but needed for LDS cleanup. Stats::ScopePtr listener_scope_; // Stats with listener named scope. diff --git a/test/common/network/listen_socket_impl_test.cc b/test/common/network/listen_socket_impl_test.cc index 5995e93cf6443..cc9bb42e05319 100644 --- a/test/common/network/listen_socket_impl_test.cc +++ b/test/common/network/listen_socket_impl_test.cc @@ -70,6 +70,7 @@ class ListenSocketImplTest : public testing::TestWithParam { } continue; } + // TODO (conqerAtapple): This is unfortunate. We should be able to templatize this // instead of if block. if (NetworkSocketTrait::type == Address::SocketType::Stream) { @@ -78,6 +79,7 @@ class ListenSocketImplTest : public testing::TestWithParam { EXPECT_EQ(addr->ip()->port(), socket1->localAddress()->ip()->port()); EXPECT_EQ(addr->ip()->addressAsString(), socket1->localAddress()->ip()->addressAsString()); + EXPECT_EQ(Type, socket1->socketType()); auto option2 = std::make_unique(); auto options2 = std::make_shared>(); @@ -103,6 +105,7 @@ class ListenSocketImplTest : public testing::TestWithParam { EXPECT_EQ(version_, socket->localAddress()->ip()->version()); EXPECT_EQ(loopback->ip()->addressAsString(), socket->localAddress()->ip()->addressAsString()); EXPECT_GT(socket->localAddress()->ip()->port(), 0U); + EXPECT_EQ(Type, socket->socketType()); } }; diff --git a/test/common/network/utility_test.cc b/test/common/network/utility_test.cc index fcac051d36333..910a8a2d0d9ff 100644 --- a/test/common/network/utility_test.cc +++ b/test/common/network/utility_test.cc @@ -320,6 +320,29 @@ TEST(NetworkUtility, AddressToProtobufAddress) { } } +TEST(NetworkUtility, ProtobufAddressSocketType) { + { + envoy::api::v2::core::Address proto_address; + proto_address.mutable_socket_address(); + EXPECT_EQ(Address::SocketType::Stream, Utility::protobufAddressSocketType(proto_address)); + } + { + envoy::api::v2::core::Address proto_address; + proto_address.mutable_socket_address()->set_protocol(envoy::api::v2::core::SocketAddress::TCP); + EXPECT_EQ(Address::SocketType::Stream, Utility::protobufAddressSocketType(proto_address)); + } + { + envoy::api::v2::core::Address proto_address; + proto_address.mutable_socket_address()->set_protocol(envoy::api::v2::core::SocketAddress::UDP); + EXPECT_EQ(Address::SocketType::Datagram, Utility::protobufAddressSocketType(proto_address)); + } + { + envoy::api::v2::core::Address proto_address; + proto_address.mutable_pipe(); + EXPECT_EQ(Address::SocketType::Stream, Utility::protobufAddressSocketType(proto_address)); + } +} + TEST(PortRangeListTest, Errors) { { std::string port_range_str = "a1"; diff --git a/test/mocks/network/mocks.h b/test/mocks/network/mocks.h index 46352cfdca111..e8bd7c70eb093 100644 --- a/test/mocks/network/mocks.h +++ b/test/mocks/network/mocks.h @@ -193,6 +193,7 @@ class MockListenSocket : public Socket { MOCK_CONST_METHOD0(localAddress, const Address::InstanceConstSharedPtr&()); MOCK_CONST_METHOD0(fd, int()); + MOCK_CONST_METHOD0(socketType, Address::SocketType()); MOCK_METHOD0(close, void()); MOCK_METHOD1(addOption_, void(const Socket::OptionConstSharedPtr& option)); MOCK_METHOD1(addOptions_, void(const Socket::OptionsSharedPtr& options)); @@ -238,6 +239,7 @@ class MockConnectionSocket : public ConnectionSocket { MOCK_METHOD1(addOptions_, void(const Socket::OptionsSharedPtr&)); MOCK_CONST_METHOD0(options, const Network::ConnectionSocket::OptionsSharedPtr&()); MOCK_CONST_METHOD0(fd, int()); + MOCK_CONST_METHOD0(socketType, Address::SocketType()); MOCK_METHOD0(close, void()); Address::InstanceConstSharedPtr local_address_; diff --git a/test/mocks/server/mocks.cc b/test/mocks/server/mocks.cc index dc194d3f58102..5729d1608a3e6 100644 --- a/test/mocks/server/mocks.cc +++ b/test/mocks/server/mocks.cc @@ -83,16 +83,16 @@ MockOverloadManager::~MockOverloadManager() {} MockListenerComponentFactory::MockListenerComponentFactory() : socket_(std::make_shared>()) { - ON_CALL(*this, createListenSocket(_, _, _)) - .WillByDefault(Invoke([&](Network::Address::InstanceConstSharedPtr, - const Network::Socket::OptionsSharedPtr& options, - bool) -> Network::SocketSharedPtr { - if (!Network::Socket::applyOptions(options, *socket_, - envoy::api::v2::core::SocketOption::STATE_PREBIND)) { - throw EnvoyException("MockListenerComponentFactory: Setting socket options failed"); - } - return socket_; - })); + ON_CALL(*this, createListenSocket(_, _, _, _)) + .WillByDefault(Invoke( + [&](Network::Address::InstanceConstSharedPtr, Network::Address::SocketType, + const Network::Socket::OptionsSharedPtr& options, bool) -> Network::SocketSharedPtr { + if (!Network::Socket::applyOptions(options, *socket_, + envoy::api::v2::core::SocketOption::STATE_PREBIND)) { + throw EnvoyException("MockListenerComponentFactory: Setting socket options failed"); + } + return socket_; + })); } MockListenerComponentFactory::~MockListenerComponentFactory() {} diff --git a/test/mocks/server/mocks.h b/test/mocks/server/mocks.h index 8c9f9c4454454..9e929c826bbd8 100644 --- a/test/mocks/server/mocks.h +++ b/test/mocks/server/mocks.h @@ -220,8 +220,9 @@ class MockListenerComponentFactory : public ListenerComponentFactory { std::vector( const Protobuf::RepeatedPtrField&, Configuration::ListenerFactoryContext& context)); - MOCK_METHOD3(createListenSocket, + MOCK_METHOD4(createListenSocket, Network::SocketSharedPtr(Network::Address::InstanceConstSharedPtr address, + Network::Address::SocketType socket_type, const Network::Socket::OptionsSharedPtr& options, bool bind_to_port)); MOCK_METHOD1(createDrainManager_, DrainManager*(envoy::api::v2::Listener::DrainType drain_type)); diff --git a/test/server/BUILD b/test/server/BUILD index b48f39d3c6bc8..5054dea51c9f8 100644 --- a/test/server/BUILD +++ b/test/server/BUILD @@ -160,6 +160,7 @@ envoy_cc_test( "//source/common/network:listen_socket_lib", "//source/common/network:socket_option_lib", "//source/common/network:utility_lib", + "//source/common/protobuf", "//source/common/ssl:ssl_socket_lib", "//source/extensions/filters/listener/original_dst:config", "//source/extensions/filters/listener/tls_inspector:config", diff --git a/test/server/listener_manager_impl_test.cc b/test/server/listener_manager_impl_test.cc index 87a02dc9b7b64..cc12cdd052e29 100644 --- a/test/server/listener_manager_impl_test.cc +++ b/test/server/listener_manager_impl_test.cc @@ -10,6 +10,7 @@ #include "common/network/listen_socket_impl.h" #include "common/network/socket_option_impl.h" #include "common/network/utility.h" +#include "common/protobuf/protobuf.h" #include "common/ssl/ssl_socket.h" #include "server/configuration_impl.h" @@ -231,7 +232,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, EmptyFilter) { )EOF"; EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromJson(json), "", true); EXPECT_EQ(1U, manager_->listeners().size()); EXPECT_EQ(std::chrono::milliseconds(15000), @@ -246,7 +247,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, DefaultListenerPerConnectionBuffe } )EOF"; - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromJson(json), "", true); EXPECT_EQ(1024 * 1024U, manager_->listeners().back().get().perConnectionBufferLimitBytes()); } @@ -260,7 +261,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SetListenerPerConnectionBufferLim } )EOF"; - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromJson(json), "", true); EXPECT_EQ(8192U, manager_->listeners().back().get().perConnectionBufferLimitBytes()); } @@ -283,7 +284,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SslContext) { )EOF", Network::Address::IpVersion::v4); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromJson(json), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -293,6 +294,27 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SslContext) { EXPECT_TRUE(filter_chain->transportSocketFactory().implementsSecureTransport()); } +TEST_F(ListenerManagerImplWithRealFiltersTest, UdpAddress) { + const std::string proto_text = R"EOF( + address: { + socket_address: { + protocol: UDP + address: "127.0.0.1" + port_value: 1234 + } + } + filter_chains: {} + )EOF"; + envoy::api::v2::Listener listener_proto; + EXPECT_TRUE(Protobuf::TextFormat::ParseFromString(proto_text, &listener_proto)); + + EXPECT_CALL(server_.random_, uuid()); + EXPECT_CALL(listener_factory_, + createListenSocket(_, Network::Address::SocketType::Datagram, _, true)); + manager_->addOrUpdateListener(listener_proto, "", true); + EXPECT_EQ(1U, manager_->listeners().size()); +} + TEST_F(ListenerManagerImplWithRealFiltersTest, BadListenerConfig) { const std::string json = R"EOF( { @@ -370,7 +392,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, StatsScopeTest) { } )EOF"; - EXPECT_CALL(listener_factory_, createListenSocket(_, _, false)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, false)); manager_->addOrUpdateListener(parseListenerFromJson(json), "", true); manager_->listeners().front().get().listenerScope().counter("foo").inc(); @@ -388,7 +410,7 @@ TEST_F(ListenerManagerImplTest, NotDefaultListenerFiltersTimeout) { listener_filters_timeout: 0s )EOF"; - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromV2Yaml(json), "", true)); EXPECT_EQ(std::chrono::milliseconds(), manager_->listeners().front().get().listenerFiltersTimeout()); @@ -403,7 +425,7 @@ TEST_F(ListenerManagerImplTest, ReversedWriteFilterOrder) { - filters: )EOF"; - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromV2Yaml(json), "", true)); EXPECT_TRUE(manager_->listeners().front().get().reverseWriteFilterOrder()); } @@ -423,7 +445,7 @@ TEST_F(ListenerManagerImplTest, ModifyOnlyDrainType) { ListenerHandle* listener_foo = expectListenerCreate(false, envoy::api::v2::Listener_DrainType_MODIFY_ONLY); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromV2Yaml(listener_foo_yaml), "", true)); checkStats(1, 0, 0, 0, 1, 0); @@ -444,7 +466,7 @@ TEST_F(ListenerManagerImplTest, AddListenerAddressNotMatching) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); checkStats(1, 0, 0, 0, 1, 0); @@ -494,7 +516,7 @@ TEST_F(ListenerManagerImplTest, AddListenerOnIpv4OnlySetups) { EXPECT_CALL(os_sys_calls, socket(AF_INET, _, 0)).WillOnce(Return(Api::SysCallIntResult{5, 0})); EXPECT_CALL(os_sys_calls, socket(AF_INET6, _, 0)).WillOnce(Return(Api::SysCallIntResult{-1, 0})); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); checkStats(1, 0, 0, 0, 1, 0); @@ -524,7 +546,7 @@ TEST_F(ListenerManagerImplTest, AddListenerOnIpv6OnlySetups) { EXPECT_CALL(os_sys_calls, socket(AF_INET, _, 0)).WillOnce(Return(Api::SysCallIntResult{-1, 0})); EXPECT_CALL(os_sys_calls, socket(AF_INET6, _, 0)).WillOnce(Return(Api::SysCallIntResult{5, 0})); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); checkStats(1, 0, 0, 0, 1, 0); @@ -547,7 +569,7 @@ TEST_F(ListenerManagerImplTest, UpdateRemoveNotModifiableListener) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", false)); checkStats(1, 0, 0, 0, 1, 0); checkConfigDump(R"EOF( @@ -618,7 +640,7 @@ filter_chains: {} )EOF"; ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_TRUE( manager_->addOrUpdateListener(parseListenerFromV2Yaml(listener_foo_yaml), "version1", true)); checkStats(1, 0, 0, 0, 1, 0); @@ -760,7 +782,7 @@ filter_chains: {} )EOF"; ListenerHandle* listener_bar = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(*worker_, addListener(_, _)); EXPECT_TRUE( manager_->addOrUpdateListener(parseListenerFromV2Yaml(listener_bar_yaml), "version4", true)); @@ -781,7 +803,7 @@ filter_chains: {} )EOF"; ListenerHandle* listener_baz = expectListenerCreate(true); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(listener_baz->target_, initialize(_)); EXPECT_TRUE( manager_->addOrUpdateListener(parseListenerFromV2Yaml(listener_baz_yaml), "version5", true)); @@ -887,7 +909,7 @@ TEST_F(ListenerManagerImplTest, AddDrainingListener) { ON_CALL(*listener_factory_.socket_, localAddress()).WillByDefault(ReturnRef(local_address)); ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(*worker_, addListener(_, _)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); worker_->callAddCompletion(true); @@ -931,7 +953,7 @@ TEST_F(ListenerManagerImplTest, CantBindSocket) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(true); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)) + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)) .WillOnce(Throw(EnvoyException("can't bind"))); EXPECT_CALL(*listener_foo, onDestroy()); EXPECT_THROW(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true), @@ -953,7 +975,7 @@ TEST_F(ListenerManagerImplTest, ListenerDraining) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(*worker_, addListener(_, _)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); worker_->callAddCompletion(true); @@ -1005,7 +1027,7 @@ TEST_F(ListenerManagerImplTest, RemoveListener) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(true); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(listener_foo->target_, initialize(_)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); EXPECT_EQ(0UL, manager_->listeners().size()); @@ -1019,7 +1041,7 @@ TEST_F(ListenerManagerImplTest, RemoveListener) { // Add foo again and initialize it. listener_foo = expectListenerCreate(true); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(listener_foo->target_, initialize(_)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); checkStats(2, 0, 1, 1, 0, 0); @@ -1078,7 +1100,7 @@ TEST_F(ListenerManagerImplTest, AddListenerFailure) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(false); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_CALL(*worker_, addListener(_, _)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); @@ -1127,7 +1149,7 @@ TEST_F(ListenerManagerImplTest, DuplicateAddressDontBind) { )EOF"; ListenerHandle* listener_foo = expectListenerCreate(true); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, false)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, false)); EXPECT_CALL(listener_foo->target_, initialize(_)); EXPECT_TRUE(manager_->addOrUpdateListener(parseListenerFromJson(listener_foo_json), "", true)); @@ -1190,7 +1212,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithDestinationP Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1235,7 +1257,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithDestinationI Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1280,7 +1302,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithServerNamesM Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1325,7 +1347,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithTransportPro Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1366,7 +1388,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithApplicationP Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1407,7 +1429,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SingleFilterChainWithSourceTypeMa Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1474,7 +1496,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainWithSourceType Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1549,7 +1571,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithDestinati Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1629,7 +1651,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithDestinati Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1718,7 +1740,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithServerNam Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1787,7 +1809,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithTransport Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1830,7 +1852,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithApplicati Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1875,7 +1897,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithMultipleR Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -1940,7 +1962,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, MultipleFilterChainsWithDifferent Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -1975,7 +1997,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -2050,7 +2072,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, TlsFilterChainWithoutTlsInspector Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2077,7 +2099,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, SniFilterChainWithoutTlsInspector Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2104,7 +2126,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, AlpnFilterChainWithoutTlsInspecto Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2132,7 +2154,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, CustomTransportProtocolWithSniWit Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2168,7 +2190,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, TlsCertificateInline) { )EOF"); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -2190,7 +2212,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, TlsCertificateChainInlinePrivateK Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -2330,7 +2352,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, OriginalDstFilter) { Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2416,7 +2438,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, OriginalDstTestFilter) { Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2486,7 +2508,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, OriginalDstTestFilterOptionFail) )EOF", Network::Address::IpVersion::v4); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_THROW_WITH_MESSAGE(manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true), EnvoyException, @@ -2553,7 +2575,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, OriginalDstTestFilterIPv6) { Network::Address::IpVersion::v6); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); @@ -2623,7 +2645,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, OriginalDstTestFilterOptionFailIP )EOF", Network::Address::IpVersion::v6); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); EXPECT_THROW_WITH_MESSAGE(manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true), EnvoyException, @@ -2642,8 +2664,8 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, TransparentFreebindListenerDisabl - filters: )EOF", Network::Address::IpVersion::v4); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)) - .WillOnce(Invoke([&](Network::Address::InstanceConstSharedPtr, + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)) + .WillOnce(Invoke([&](Network::Address::InstanceConstSharedPtr, Network::Address::SocketType, const Network::Socket::OptionsSharedPtr& options, bool) -> Network::SocketSharedPtr { EXPECT_EQ(options, nullptr); @@ -2673,17 +2695,18 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, TransparentListenerEnabled) { )EOF", Network::Address::IpVersion::v4); if (ENVOY_SOCKET_IP_TRANSPARENT.has_value()) { - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)) - .WillOnce(Invoke([this](Network::Address::InstanceConstSharedPtr, - const Network::Socket::OptionsSharedPtr& options, - bool) -> Network::SocketSharedPtr { - EXPECT_NE(options.get(), nullptr); - EXPECT_EQ(options->size(), 2); - EXPECT_TRUE( - Network::Socket::applyOptions(options, *listener_factory_.socket_, - envoy::api::v2::core::SocketOption::STATE_PREBIND)); - return listener_factory_.socket_; - })); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)) + .WillOnce( + Invoke([this](Network::Address::InstanceConstSharedPtr, Network::Address::SocketType, + const Network::Socket::OptionsSharedPtr& options, + bool) -> Network::SocketSharedPtr { + EXPECT_NE(options.get(), nullptr); + EXPECT_EQ(options->size(), 2); + EXPECT_TRUE( + Network::Socket::applyOptions(options, *listener_factory_.socket_, + envoy::api::v2::core::SocketOption::STATE_PREBIND)); + return listener_factory_.socket_; + })); // Expecting the socket option to bet set twice, once pre-bind, once post-bind. EXPECT_CALL(os_sys_calls, setsockopt_(_, ENVOY_SOCKET_IP_TRANSPARENT.value().first, @@ -2724,17 +2747,18 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, FreebindListenerEnabled) { )EOF", Network::Address::IpVersion::v4); if (ENVOY_SOCKET_IP_FREEBIND.has_value()) { - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)) - .WillOnce(Invoke([this](Network::Address::InstanceConstSharedPtr, - const Network::Socket::OptionsSharedPtr& options, - bool) -> Network::SocketSharedPtr { - EXPECT_NE(options.get(), nullptr); - EXPECT_EQ(options->size(), 1); - EXPECT_TRUE( - Network::Socket::applyOptions(options, *listener_factory_.socket_, - envoy::api::v2::core::SocketOption::STATE_PREBIND)); - return listener_factory_.socket_; - })); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)) + .WillOnce( + Invoke([this](Network::Address::InstanceConstSharedPtr, Network::Address::SocketType, + const Network::Socket::OptionsSharedPtr& options, + bool) -> Network::SocketSharedPtr { + EXPECT_NE(options.get(), nullptr); + EXPECT_EQ(options->size(), 1); + EXPECT_TRUE( + Network::Socket::applyOptions(options, *listener_factory_.socket_, + envoy::api::v2::core::SocketOption::STATE_PREBIND)); + return listener_factory_.socket_; + })); EXPECT_CALL(os_sys_calls, setsockopt_(_, ENVOY_SOCKET_IP_FREEBIND.value().first, ENVOY_SOCKET_IP_FREEBIND.value().second, _, sizeof(int))) .WillOnce(Invoke([](int, int, int, const void* optval, socklen_t) -> int { @@ -2771,17 +2795,18 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, LiteralSockoptListenerEnabled) { ] )EOF", Network::Address::IpVersion::v4); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)) - .WillOnce(Invoke([this](Network::Address::InstanceConstSharedPtr, - const Network::Socket::OptionsSharedPtr& options, - bool) -> Network::SocketSharedPtr { - EXPECT_NE(options.get(), nullptr); - EXPECT_EQ(options->size(), 3); - EXPECT_TRUE( - Network::Socket::applyOptions(options, *listener_factory_.socket_, - envoy::api::v2::core::SocketOption::STATE_PREBIND)); - return listener_factory_.socket_; - })); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)) + .WillOnce( + Invoke([this](Network::Address::InstanceConstSharedPtr, Network::Address::SocketType, + const Network::Socket::OptionsSharedPtr& options, + bool) -> Network::SocketSharedPtr { + EXPECT_NE(options.get(), nullptr); + EXPECT_EQ(options->size(), 3); + EXPECT_TRUE( + Network::Socket::applyOptions(options, *listener_factory_.socket_, + envoy::api::v2::core::SocketOption::STATE_PREBIND)); + return listener_factory_.socket_; + })); EXPECT_CALL(os_sys_calls, setsockopt_(_, 1, 2, _, sizeof(int))) .WillOnce(Invoke([](int, int, int, const void* optval, socklen_t) -> int { EXPECT_EQ(3, *static_cast(optval)); @@ -2814,7 +2839,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, AddressResolver) { Registry::InjectFactory register_resolver(mock_resolver); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -2836,7 +2861,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, CRLFilename) { Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); } @@ -2861,7 +2886,7 @@ TEST_F(ListenerManagerImplWithRealFiltersTest, CRLInline) { Network::Address::IpVersion::v4); EXPECT_CALL(server_.random_, uuid()); - EXPECT_CALL(listener_factory_, createListenSocket(_, _, true)); + EXPECT_CALL(listener_factory_, createListenSocket(_, _, _, true)); manager_->addOrUpdateListener(parseListenerFromV2Yaml(yaml), "", true); EXPECT_EQ(1U, manager_->listeners().size()); }