face: process face_system.udp config section in UdpFactory
refs #3904
Change-Id: I8edf69c152f7c164cbab2b482d6b138cbf89d3e2
diff --git a/tests/daemon/face/face-system-fixture.hpp b/tests/daemon/face/face-system-fixture.hpp
index 2198c7e..42ed02c 100644
--- a/tests/daemon/face/face-system-fixture.hpp
+++ b/tests/daemon/face/face-system-fixture.hpp
@@ -28,6 +28,7 @@
#include "face/face.hpp"
#include "face/face-system.hpp"
+#include "face/protocol-factory.hpp"
#include "fw/face-table.hpp"
#include "tests/test-common.hpp"
diff --git a/tests/daemon/face/face-system.t.cpp b/tests/daemon/face/face-system.t.cpp
index cd90078..de1b6b1 100644
--- a/tests/daemon/face/face-system.t.cpp
+++ b/tests/daemon/face/face-system.t.cpp
@@ -26,9 +26,6 @@
#include "face/face-system.hpp"
#include "face-system-fixture.hpp"
-// ProtocolFactory includes, sorted alphabetically
-#include "face/udp-factory.hpp"
-
#include "tests/test-common.hpp"
namespace nfd {
@@ -199,207 +196,6 @@
BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
-///\todo #3904 move Config* to *Factory test suite
-
-BOOST_AUTO_TEST_SUITE(ConfigUdp)
-
-BOOST_AUTO_TEST_CASE(Normal)
-{
- SKIP_IF_NOT_SUPERUSER();
-
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- port 6363
- enable_v4 yes
- enable_v6 yes
- idle_timeout 30
- keep_alive_interval 25
- mcast yes
- mcast_port 56363
- mcast_group 224.0.23.170
- }
- }
- )CONFIG";
-
- BOOST_CHECK_NO_THROW(parseConfig(CONFIG, true));
- BOOST_CHECK_NO_THROW(parseConfig(CONFIG, false));
-
- auto& factory = this->getFactoryByScheme<UdpFactory>("udp");
- BOOST_CHECK_EQUAL(factory.getChannels().size(), 2);
-}
-
-BOOST_AUTO_TEST_CASE(BadIdleTimeout)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- idle_timeout hello
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(BadMcast)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- mcast hello
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(BadMcastGroup)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- mcast no
- mcast_port 50
- mcast_group hello
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(BadMcastGroupV6)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- mcast no
- mcast_port 50
- mcast_group ::1
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(ChannelsDisabled)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- port 6363
- enable_v4 no
- enable_v6 no
- idle_timeout 30
- keep_alive_interval 25
- mcast yes
- mcast_port 56363
- mcast_group 224.0.23.170
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(ConflictingMcast)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- port 6363
- enable_v4 no
- enable_v6 yes
- idle_timeout 30
- keep_alive_interval 25
- mcast yes
- mcast_port 56363
- mcast_group 224.0.23.170
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(UnknownOption)
-{
- const std::string CONFIG = R"CONFIG(
- face_system
- {
- udp
- {
- hello
- }
- }
- )CONFIG";
-
- BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
- BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
-}
-
-BOOST_AUTO_TEST_CASE(MulticastReinit)
-{
- SKIP_IF_NOT_SUPERUSER();
-
- const std::string CONFIG_WITH_MCAST = R"CONFIG(
- face_system
- {
- udp
- {
- mcast yes
- }
- }
- )CONFIG";
-
- BOOST_CHECK_NO_THROW(parseConfig(CONFIG_WITH_MCAST, false));
-
- auto& factory = this->getFactoryByScheme<UdpFactory>("udp");
-
- if (factory.getMulticastFaces().empty()) {
- BOOST_WARN_MESSAGE(false, "skipping assertions that require at least one UDP multicast face");
- return;
- }
-
- const std::string CONFIG_WITHOUT_MCAST = R"CONFIG(
- face_system
- {
- udp
- {
- mcast no
- }
- }
- )CONFIG";
-
- BOOST_CHECK_NO_THROW(parseConfig(CONFIG_WITHOUT_MCAST, false));
- BOOST_REQUIRE_NO_THROW(g_io.poll());
- BOOST_CHECK_EQUAL(factory.getMulticastFaces().size(), 0);
-}
-BOOST_AUTO_TEST_SUITE_END() // ConfigUdp
-
BOOST_AUTO_TEST_SUITE_END() // TestFaceSystem
BOOST_AUTO_TEST_SUITE_END() // Mgmt
diff --git a/tests/daemon/face/udp-factory.t.cpp b/tests/daemon/face/udp-factory.t.cpp
index d6ef39c..ac468cb 100644
--- a/tests/daemon/face/udp-factory.t.cpp
+++ b/tests/daemon/face/udp-factory.t.cpp
@@ -26,17 +26,343 @@
#include "face/udp-factory.hpp"
#include "factory-test-common.hpp"
-#include "core/network-interface.hpp"
+#include "face-system-fixture.hpp"
#include "tests/limited-io.hpp"
namespace nfd {
+namespace face {
namespace tests {
+using namespace nfd::tests;
+
BOOST_AUTO_TEST_SUITE(Face)
BOOST_FIXTURE_TEST_SUITE(TestUdpFactory, BaseFixture)
using nfd::Face;
+BOOST_FIXTURE_TEST_SUITE(ProcessConfig, FaceSystemFixture)
+
+BOOST_AUTO_TEST_CASE(Channels)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ port 7001
+ enable_v4 yes
+ enable_v6 yes
+ idle_timeout 30
+ mcast no
+ }
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG, true);
+ parseConfig(CONFIG, false);
+
+ auto& factory = this->getFactoryById<UdpFactory>("udp");
+ checkChannelListEqual(factory, {"udp4://0.0.0.0:7001", "udp6://[::]:7001"});
+}
+
+BOOST_AUTO_TEST_CASE(ChannelV4)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ port 7001
+ enable_v4 yes
+ enable_v6 no
+ mcast no
+ }
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG, true);
+ parseConfig(CONFIG, false);
+
+ auto& factory = this->getFactoryById<UdpFactory>("udp");
+ checkChannelListEqual(factory, {"udp4://0.0.0.0:7001"});
+}
+
+BOOST_AUTO_TEST_CASE(ChannelV6)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ port 7001
+ enable_v4 no
+ enable_v6 yes
+ mcast no
+ }
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG, true);
+ parseConfig(CONFIG, false);
+
+ auto& factory = this->getFactoryById<UdpFactory>("udp");
+ checkChannelListEqual(factory, {"udp6://[::]:7001"});
+}
+
+class UdpMcastConfigFixture : public FaceSystemFixture
+{
+protected:
+ UdpMcastConfigFixture()
+ {
+ for (const auto& netif : listNetworkInterfaces()) {
+ if (netif.isUp() && netif.isMulticastCapable() && !netif.ipv4Addresses.empty()) {
+ netifs.push_back(netif);
+ }
+ }
+ }
+
+ std::vector<const Face*>
+ listUdpMcastFaces() const
+ {
+ return this->listFacesByScheme("udp4", ndn::nfd::LINK_TYPE_MULTI_ACCESS);
+ }
+
+ size_t
+ countUdpMcastFaces() const
+ {
+ return this->listUdpMcastFaces().size();
+ }
+
+protected:
+ /** \brief MulticastUdpTransport-capable network interfaces
+ */
+ std::vector<NetworkInterfaceInfo> netifs;
+};
+
+#define SKIP_IF_UDP_MCAST_NETIF_COUNT_LT(n) \
+ do { \
+ if (this->netifs.size() < (n)) { \
+ BOOST_WARN_MESSAGE(false, "skipping assertions that require " #n \
+ " or more MulticastUdpTransport-capable network interfaces"); \
+ return; \
+ } \
+ } while (false)
+
+BOOST_FIXTURE_TEST_CASE(EnableDisableMcast, UdpMcastConfigFixture)
+{
+#ifdef __linux__
+ // need superuser privilege for creating multicast faces on linux
+ SKIP_IF_NOT_SUPERUSER();
+#endif // __linux__
+
+ const std::string CONFIG_WITH_MCAST = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast yes
+ }
+ }
+ )CONFIG";
+ const std::string CONFIG_WITHOUT_MCAST = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast no
+ }
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG_WITHOUT_MCAST, false);
+ BOOST_CHECK_EQUAL(this->countUdpMcastFaces(), 0);
+
+ SKIP_IF_UDP_MCAST_NETIF_COUNT_LT(1);
+
+ parseConfig(CONFIG_WITH_MCAST, false);
+ g_io.poll();
+ BOOST_CHECK_EQUAL(this->countUdpMcastFaces(), netifs.size());
+
+ parseConfig(CONFIG_WITHOUT_MCAST, false);
+ g_io.poll();
+ BOOST_CHECK_EQUAL(this->countUdpMcastFaces(), 0);
+}
+
+BOOST_FIXTURE_TEST_CASE(ChangeMcastEndpoint, UdpMcastConfigFixture)
+{
+#ifdef __linux__
+ // need superuser privilege for creating multicast faces on linux
+ SKIP_IF_NOT_SUPERUSER();
+#endif // __linux__
+ SKIP_IF_UDP_MCAST_NETIF_COUNT_LT(1);
+
+ const std::string CONFIG1 = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast_group 239.66.30.1
+ mcast_port 7011
+ }
+ }
+ )CONFIG";
+ const std::string CONFIG2 = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast_group 239.66.30.2
+ mcast_port 7012
+ }
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG1, false);
+ auto udpMcastFaces = this->listUdpMcastFaces();
+ BOOST_REQUIRE_EQUAL(udpMcastFaces.size(), netifs.size());
+ BOOST_CHECK_EQUAL(udpMcastFaces.front()->getRemoteUri(),
+ FaceUri("udp4://239.66.30.1:7011"));
+
+ parseConfig(CONFIG2, false);
+ g_io.poll();
+ udpMcastFaces = this->listUdpMcastFaces();
+ BOOST_REQUIRE_EQUAL(udpMcastFaces.size(), netifs.size());
+ BOOST_CHECK_EQUAL(udpMcastFaces.front()->getRemoteUri(),
+ FaceUri("udp4://239.66.30.2:7012"));
+}
+
+BOOST_AUTO_TEST_CASE(Omitted)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ }
+ )CONFIG";
+
+ parseConfig(CONFIG, true);
+ parseConfig(CONFIG, false);
+
+ auto& factory = this->getFactoryById<UdpFactory>("udp");
+ BOOST_CHECK_EQUAL(factory.getChannels().size(), 0);
+ BOOST_CHECK_EQUAL(this->listFacesByScheme("udp4", ndn::nfd::LINK_TYPE_MULTI_ACCESS).size(), 0);
+}
+
+BOOST_AUTO_TEST_CASE(BadIdleTimeout)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ idle_timeout hello
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(BadMcast)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast hello
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(BadMcastGroup)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast_group hello
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(BadMcastGroupV4Unicast)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast_group 10.0.0.1
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(BadMcastGroupV6)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ mcast_group ff00::1
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(AllDisabled)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ enable_v4 no
+ enable_v6 no
+ mcast no
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_CASE(UnknownOption)
+{
+ const std::string CONFIG = R"CONFIG(
+ face_system
+ {
+ udp
+ {
+ hello
+ }
+ }
+ )CONFIG";
+
+ BOOST_CHECK_THROW(parseConfig(CONFIG, true), ConfigFile::Error);
+ BOOST_CHECK_THROW(parseConfig(CONFIG, false), ConfigFile::Error);
+}
+
+BOOST_AUTO_TEST_SUITE_END() // ProcessConfig
+
BOOST_AUTO_TEST_CASE(GetChannels)
{
UdpFactory factory;
@@ -277,4 +603,5 @@
BOOST_AUTO_TEST_SUITE_END() // Face
} // namespace tests
+} // namespace face
} // namespace nfd