tests: test IP transports under various combos of address family/scope

In particular, link-local addresses are now tested as well.

Additionally, WebSocketTransport send/receive tests are extended
to check transport counters.

Change-Id: I5b35f498a5d8d70cb1f7a2bea3ce99d22370e050
Refs: #1428
diff --git a/tests/daemon/face/multicast-udp-transport.t.cpp b/tests/daemon/face/multicast-udp-transport.t.cpp
index 2b9407d..6e4a8cf 100644
--- a/tests/daemon/face/multicast-udp-transport.t.cpp
+++ b/tests/daemon/face/multicast-udp-transport.t.cpp
@@ -1,5 +1,5 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/**
+/*
  * Copyright (c) 2014-2017,  Regents of the University of California,
  *                           Arizona Board of Regents,
  *                           Colorado State University,
@@ -27,47 +27,58 @@
 
 #include "multicast-udp-transport-fixture.hpp"
 
+#include <boost/mpl/vector.hpp>
+
 namespace nfd {
 namespace face {
 namespace tests {
 
 BOOST_AUTO_TEST_SUITE(Face)
-BOOST_FIXTURE_TEST_SUITE(TestMulticastUdpTransport, MulticastUdpTransportFixture)
 
-BOOST_AUTO_TEST_CASE(StaticPropertiesNonLocalIpv4)
+using MulticastUdpTransportFixtureWithAddress =
+  // TODO: change to AddressFamily::Any after IPv6 support is implemented
+  IpTransportFixture<MulticastUdpTransportFixture, AddressFamily::V4,
+                     AddressScope::Global, MulticastInterface::Yes>;
+
+BOOST_FIXTURE_TEST_SUITE(TestMulticastUdpTransport, MulticastUdpTransportFixtureWithAddress)
+
+using MulticastUdpTransportFixtures = boost::mpl::vector<
+  IpTransportFixture<MulticastUdpTransportFixture, AddressFamily::V4, AddressScope::Global, MulticastInterface::Yes>
+  // TODO: IPv6 not supported yet
+  //IpTransportFixture<MulticastUdpTransportFixture, AddressFamily::V6, AddressScope::LinkLocal, MulticastInterface::Yes>,
+  //IpTransportFixture<MulticastUdpTransportFixture, AddressFamily::V6, AddressScope::Global, MulticastInterface::Yes>
+>;
+
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(StaticProperties, T, MulticastUdpTransportFixtures, T)
 {
-  SKIP_IF_IP_UNAVAILABLE(defaultAddr);
-  initialize(defaultAddr);
+  TRANSPORT_TEST_INIT();
 
-  checkStaticPropertiesInitialized(*transport);
+  checkStaticPropertiesInitialized(*this->transport);
 
-  BOOST_CHECK_EQUAL(transport->getLocalUri(),
-                    FaceUri("udp4://" + defaultAddr.to_string() + ":" + to_string(localEp.port())));
-  BOOST_CHECK_EQUAL(transport->getRemoteUri(),
-                    FaceUri("udp4://" + multicastEp.address().to_string() + ":" + to_string(multicastEp.port())));
-  BOOST_CHECK_EQUAL(transport->getScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL);
-  BOOST_CHECK_EQUAL(transport->getPersistency(), ndn::nfd::FACE_PERSISTENCY_PERMANENT);
-  BOOST_CHECK_EQUAL(transport->getLinkType(), ndn::nfd::LINK_TYPE_MULTI_ACCESS);
-  BOOST_CHECK_EQUAL(transport->getMtu(), 65535 - 60 - 8);
+  BOOST_CHECK_EQUAL(this->transport->getLocalUri(), FaceUri(udp::endpoint(this->address, this->localEp.port())));
+  BOOST_CHECK_EQUAL(this->transport->getRemoteUri(), FaceUri(this->multicastEp));
+  BOOST_CHECK_EQUAL(this->transport->getScope(), ndn::nfd::FACE_SCOPE_NON_LOCAL);
+  BOOST_CHECK_EQUAL(this->transport->getPersistency(), ndn::nfd::FACE_PERSISTENCY_PERMANENT);
+  BOOST_CHECK_EQUAL(this->transport->getLinkType(), ndn::nfd::LINK_TYPE_MULTI_ACCESS);
+  BOOST_CHECK_EQUAL(this->transport->getMtu(),
+                    this->addressFamily == AddressFamily::V4 ? (65535 - 60 - 8) : (65535 - 8));
 }
 
 BOOST_AUTO_TEST_CASE(PersistencyChange)
 {
-  SKIP_IF_IP_UNAVAILABLE(defaultAddr);
-  initialize(defaultAddr);
+  TRANSPORT_TEST_INIT();
 
   BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_ON_DEMAND), false);
   BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERSISTENT), false);
   BOOST_CHECK_EQUAL(transport->canChangePersistencyTo(ndn::nfd::FACE_PERSISTENCY_PERMANENT), true);
 }
 
-BOOST_AUTO_TEST_CASE(ReceiveMultipleRemoteEndpoints)
+BOOST_FIXTURE_TEST_CASE_TEMPLATE(ReceiveMultipleRemoteEndpoints, T, MulticastUdpTransportFixtures, T)
 {
-  SKIP_IF_IP_UNAVAILABLE(defaultAddr);
-  initialize(defaultAddr);
+  TRANSPORT_TEST_INIT();
 
   // remoteSockRx2 unnecessary for this test case - only remoteSockTx2 is needed
-  udp::socket remoteSockTx2(g_io);
+  udp::socket remoteSockTx2(this->g_io);
   remoteSockTx2.open(udp::v4());
   remoteSockTx2.set_option(udp::socket::reuse_address(true));
   remoteSockTx2.set_option(ip::multicast::enable_loopback(true));
@@ -75,21 +86,21 @@
 
   Block pkt1 = ndn::encoding::makeStringBlock(300, "hello");
   ndn::Buffer buf1(pkt1.begin(), pkt1.end());
-  remoteWrite(buf1);
+  this->remoteWrite(buf1);
 
   Block pkt2 = ndn::encoding::makeStringBlock(301, "world");
   ndn::Buffer buf2(pkt2.begin(), pkt2.end());
-  remoteWrite(buf2);
+  this->remoteWrite(buf2);
 
-  BOOST_CHECK_EQUAL(transport->getCounters().nInPackets, 2);
-  BOOST_CHECK_EQUAL(transport->getCounters().nInBytes, buf1.size() + buf2.size());
-  BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
+  BOOST_CHECK_EQUAL(this->transport->getCounters().nInPackets, 2);
+  BOOST_CHECK_EQUAL(this->transport->getCounters().nInBytes, buf1.size() + buf2.size());
+  BOOST_CHECK_EQUAL(this->transport->getState(), TransportState::UP);
 
-  BOOST_REQUIRE_EQUAL(receivedPackets->size(), 2);
-  BOOST_CHECK_EQUAL(receivedPackets->at(0).remoteEndpoint,
-                    receivedPackets->at(1).remoteEndpoint);
+  BOOST_REQUIRE_EQUAL(this->receivedPackets->size(), 2);
+  BOOST_CHECK_EQUAL(this->receivedPackets->at(0).remoteEndpoint,
+                    this->receivedPackets->at(1).remoteEndpoint);
 
-  udp::endpoint destEp(multicastEp.address(), localEp.port());
+  udp::endpoint destEp(this->multicastEp.address(), this->localEp.port());
   remoteSockTx2.async_send_to(boost::asio::buffer(buf1), destEp,
     [] (const boost::system::error_code& error, size_t) {
       BOOST_REQUIRE_EQUAL(error, boost::system::errc::success);
@@ -98,17 +109,17 @@
     [] (const boost::system::error_code& error, size_t) {
       BOOST_REQUIRE_EQUAL(error, boost::system::errc::success);
     });
-  limitedIo.defer(time::seconds(1));
+  this->limitedIo.defer(time::seconds(1));
 
-  BOOST_CHECK_EQUAL(transport->getCounters().nInPackets, 4);
-  BOOST_CHECK_EQUAL(transport->getCounters().nInBytes, 2 * buf1.size() + 2 * buf2.size());
-  BOOST_CHECK_EQUAL(transport->getState(), TransportState::UP);
+  BOOST_CHECK_EQUAL(this->transport->getCounters().nInPackets, 4);
+  BOOST_CHECK_EQUAL(this->transport->getCounters().nInBytes, 2 * buf1.size() + 2 * buf2.size());
+  BOOST_CHECK_EQUAL(this->transport->getState(), TransportState::UP);
 
-  BOOST_REQUIRE_EQUAL(receivedPackets->size(), 4);
-  BOOST_CHECK_EQUAL(receivedPackets->at(2).remoteEndpoint,
-                    receivedPackets->at(3).remoteEndpoint);
-  BOOST_CHECK_NE(receivedPackets->at(0).remoteEndpoint,
-                 receivedPackets->at(2).remoteEndpoint);
+  BOOST_REQUIRE_EQUAL(this->receivedPackets->size(), 4);
+  BOOST_CHECK_EQUAL(this->receivedPackets->at(2).remoteEndpoint,
+                    this->receivedPackets->at(3).remoteEndpoint);
+  BOOST_CHECK_NE(this->receivedPackets->at(0).remoteEndpoint,
+                 this->receivedPackets->at(2).remoteEndpoint);
 }
 
 BOOST_AUTO_TEST_SUITE_END() // TestMulticastUdpTransport