face: Prevent infinite loop in TcpFactory and UdpFactory
Change-Id: Idd694bc08033c524f3c0e569ed74341aa33fce31
Refs: #2292
diff --git a/tests/core/network-interface.cpp b/tests/core/network-interface.cpp
index 5ac5a31..c26d46a 100644
--- a/tests/core/network-interface.cpp
+++ b/tests/core/network-interface.cpp
@@ -30,7 +30,7 @@
BOOST_FIXTURE_TEST_SUITE(CoreNetworkInterface, BaseFixture)
-BOOST_AUTO_TEST_CASE(ListNetworkInterfaces)
+BOOST_AUTO_TEST_CASE(ListRealNetworkInterfaces)
{
std::vector<NetworkInterfaceInfo> netifs;
BOOST_CHECK_NO_THROW(netifs = listNetworkInterfaces());
@@ -48,6 +48,64 @@
}
}
+class FakeNetworkInterfaceFixture : public BaseFixture
+{
+public:
+ FakeNetworkInterfaceFixture()
+ {
+ using namespace boost::asio::ip;
+
+ auto fakeInterfaces = make_shared<std::vector<NetworkInterfaceInfo>>();
+
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {0, "lo0",
+ ethernet::Address(),
+ {address_v4::from_string("127.0.0.1")},
+ {address_v6::from_string("fe80::1")},
+ address_v4::from_string("127.255.255.255"),
+ IFF_LOOPBACK | IFF_UP});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {1, "eth0",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("192.168.2.1")},
+ {},
+ address_v4::from_string("192.168.2.255"),
+ 0});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {2, "eth1",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("198.51.100.1")},
+ {address_v6::from_string("2001:db8::1")},
+ address_v4::from_string("198.51.100.255"),
+ IFF_MULTICAST | IFF_BROADCAST | IFF_UP});
+
+ setDebugNetworkInterfaces(fakeInterfaces);
+ }
+
+ ~FakeNetworkInterfaceFixture()
+ {
+ setDebugNetworkInterfaces(nullptr);
+ }
+};
+
+BOOST_FIXTURE_TEST_CASE(ListFakeNetworkInterfaces, FakeNetworkInterfaceFixture)
+{
+ std::vector<NetworkInterfaceInfo> netifs;
+ BOOST_CHECK_NO_THROW(netifs = listNetworkInterfaces());
+
+ BOOST_REQUIRE_EQUAL(netifs.size(), 3);
+
+ BOOST_CHECK_EQUAL(netifs[0].index, 0);
+ BOOST_CHECK_EQUAL(netifs[1].index, 1);
+ BOOST_CHECK_EQUAL(netifs[2].index, 2);
+
+ BOOST_CHECK_EQUAL(netifs[0].name, "lo0");
+ BOOST_CHECK_EQUAL(netifs[1].name, "eth0");
+ BOOST_CHECK_EQUAL(netifs[2].name, "eth1");
+
+ // no real value of testing other parameters
+}
+
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
diff --git a/tests/daemon/face/tcp.cpp b/tests/daemon/face/tcp.cpp
index 99c2d5b..7c8e33b 100644
--- a/tests/daemon/face/tcp.cpp
+++ b/tests/daemon/face/tcp.cpp
@@ -685,6 +685,88 @@
BOOST_TEST_MESSAGE("Unexpected assertion test passed");
}
+class FakeNetworkInterfaceFixture : public BaseFixture
+{
+public:
+ FakeNetworkInterfaceFixture()
+ {
+ using namespace boost::asio::ip;
+
+ auto fakeInterfaces = make_shared<std::vector<NetworkInterfaceInfo>>();
+
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {0, "eth0",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("0.0.0.0")},
+ {address_v6::from_string("::")},
+ address_v4(),
+ IFF_UP});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {1, "eth0",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("192.168.2.1"), address_v4::from_string("192.168.2.2")},
+ {},
+ address_v4::from_string("192.168.2.255"),
+ 0});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {2, "eth1",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("198.51.100.1")},
+ {address_v6::from_string("2001:db8::2"), address_v6::from_string("2001:db8::3")},
+ address_v4::from_string("198.51.100.255"),
+ IFF_MULTICAST | IFF_BROADCAST | IFF_UP});
+
+ setDebugNetworkInterfaces(fakeInterfaces);
+ }
+
+ ~FakeNetworkInterfaceFixture()
+ {
+ setDebugNetworkInterfaces(nullptr);
+ }
+};
+
+BOOST_FIXTURE_TEST_CASE(Bug2292, FakeNetworkInterfaceFixture)
+{
+ using namespace boost::asio::ip;
+
+ TcpFactory factory;
+ factory.prohibitEndpoint(tcp::Endpoint(address_v4::from_string("192.168.2.1"), 1024));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 1);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<tcp::Endpoint> {
+ tcp::Endpoint(address_v4::from_string("192.168.2.1"), 1024),
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(tcp::Endpoint(address_v6::from_string("2001:db8::1"), 2048));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 1);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<tcp::Endpoint> {
+ tcp::Endpoint(address_v6::from_string("2001:db8::1"), 2048)
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(tcp::Endpoint(address_v4(), 1024));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 4);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<tcp::Endpoint> {
+ tcp::Endpoint(address_v4::from_string("192.168.2.1"), 1024),
+ tcp::Endpoint(address_v4::from_string("192.168.2.2"), 1024),
+ tcp::Endpoint(address_v4::from_string("198.51.100.1"), 1024),
+ tcp::Endpoint(address_v4::from_string("0.0.0.0"), 1024)
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(tcp::Endpoint(address_v6(), 2048));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 3);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<tcp::Endpoint> {
+ tcp::Endpoint(address_v6::from_string("2001:db8::2"), 2048),
+ tcp::Endpoint(address_v6::from_string("2001:db8::3"), 2048),
+ tcp::Endpoint(address_v6::from_string("::"), 2048)
+ }));
+}
+
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
diff --git a/tests/daemon/face/udp.cpp b/tests/daemon/face/udp.cpp
index 87ee8f0..abab320 100644
--- a/tests/daemon/face/udp.cpp
+++ b/tests/daemon/face/udp.cpp
@@ -24,6 +24,7 @@
*/
#include "face/udp-factory.hpp"
+#include "core/network-interface.hpp"
#include "tests/test-common.hpp"
#include "tests/limited-io.hpp"
@@ -988,6 +989,90 @@
BOOST_CHECK_EQUAL(channel2->size(), 1);
}
+class FakeNetworkInterfaceFixture : public BaseFixture
+{
+public:
+ FakeNetworkInterfaceFixture()
+ {
+ using namespace boost::asio::ip;
+
+ auto fakeInterfaces = make_shared<std::vector<NetworkInterfaceInfo>>();
+
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {0, "eth0",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("0.0.0.0")},
+ {address_v6::from_string("::")},
+ address_v4(),
+ IFF_UP});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {1, "eth0",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("192.168.2.1"), address_v4::from_string("192.168.2.2")},
+ {},
+ address_v4::from_string("192.168.2.255"),
+ 0});
+ fakeInterfaces->push_back(
+ NetworkInterfaceInfo {2, "eth1",
+ ethernet::Address::fromString("3e:15:c2:8b:65:00"),
+ {address_v4::from_string("198.51.100.1")},
+ {address_v6::from_string("2001:db8::2"), address_v6::from_string("2001:db8::3")},
+ address_v4::from_string("198.51.100.255"),
+ IFF_MULTICAST | IFF_BROADCAST | IFF_UP});
+
+ setDebugNetworkInterfaces(fakeInterfaces);
+ }
+
+ ~FakeNetworkInterfaceFixture()
+ {
+ setDebugNetworkInterfaces(nullptr);
+ }
+};
+
+BOOST_FIXTURE_TEST_CASE(Bug2292, FakeNetworkInterfaceFixture)
+{
+ using namespace boost::asio::ip;
+
+ UdpFactory factory;
+ factory.prohibitEndpoint(udp::Endpoint(address_v4::from_string("192.168.2.1"), 1024));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 1);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<udp::Endpoint> {
+ udp::Endpoint(address_v4::from_string("192.168.2.1"), 1024),
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(udp::Endpoint(address_v6::from_string("2001:db8::1"), 2048));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 1);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<udp::Endpoint> {
+ udp::Endpoint(address_v6::from_string("2001:db8::1"), 2048),
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(udp::Endpoint(address_v4(), 1024));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 6);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<udp::Endpoint> {
+ udp::Endpoint(address_v4::from_string("192.168.2.1"), 1024),
+ udp::Endpoint(address_v4::from_string("192.168.2.2"), 1024),
+ udp::Endpoint(address_v4::from_string("198.51.100.1"), 1024),
+ udp::Endpoint(address_v4::from_string("198.51.100.255"), 1024),
+ udp::Endpoint(address_v4::from_string("255.255.255.255"), 1024),
+ udp::Endpoint(address_v4::from_string("0.0.0.0"), 1024)
+ }));
+
+ factory.m_prohibitedEndpoints.clear();
+ factory.prohibitEndpoint(udp::Endpoint(address_v6(), 2048));
+ BOOST_REQUIRE_EQUAL(factory.m_prohibitedEndpoints.size(), 3);
+ BOOST_CHECK((factory.m_prohibitedEndpoints ==
+ std::set<udp::Endpoint> {
+ udp::Endpoint(address_v6::from_string("2001:db8::2"), 2048),
+ udp::Endpoint(address_v6::from_string("2001:db8::3"), 2048),
+ udp::Endpoint(address_v6::from_string("::"), 2048),
+ }));
+}
+
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests