face: Implementing Face::getUri() method

Change-Id: I9a9f774b95784e5b7ec75472f1cc6cf64c4e5d7b
Refs: #1319
diff --git a/daemon/core/face-uri.cpp b/daemon/core/face-uri.cpp
index 0a3f1d4..cc6c8c8 100644
--- a/daemon/core/face-uri.cpp
+++ b/daemon/core/face-uri.cpp
@@ -47,7 +47,7 @@
 
   boost::regex v6Exp("^\\[(([a-fA-F0-9:]+))\\](:(\\d+))?$"); // [host]:port
   boost::regex v4Exp("^((\\d+\\.){3}\\d+)(:(\\d+))?$");
-  boost::regex hostExp("^(([^:]+))(:(\\d+))?$"); // host:port
+  boost::regex hostExp("^(([^:]*))(:(\\d+))?$"); // host:port
 
   boost::smatch match;
   m_isV6 = boost::regex_match(authority, match, v6Exp);
diff --git a/daemon/face/datagram-face.hpp b/daemon/face/datagram-face.hpp
index f4f9a18..78a4a12 100644
--- a/daemon/face/datagram-face.hpp
+++ b/daemon/face/datagram-face.hpp
@@ -18,7 +18,8 @@
   typedef T protocol;
   
   explicit
-  DatagramFace(const shared_ptr<typename protocol::socket>& socket);
+  DatagramFace(const FaceUri& uri,
+               const shared_ptr<typename protocol::socket>& socket);
 
   virtual
   ~DatagramFace();
@@ -64,8 +65,10 @@
 
 template <class T>
 inline
-DatagramFace<T>::DatagramFace(const shared_ptr<typename DatagramFace::protocol::socket>& socket)
-  : m_socket(socket)
+DatagramFace<T>::DatagramFace(const FaceUri& uri,
+                              const shared_ptr<typename DatagramFace::protocol::socket>& socket)
+  : Face(uri)
+  , m_socket(socket)
 {
   m_socket->async_receive(boost::asio::buffer(m_inputBuffer, MAX_NDN_PACKET_SIZE), 0,
                           bind(&DatagramFace<T>::handleReceive, this, _1, _2));
diff --git a/daemon/face/ethernet-face.cpp b/daemon/face/ethernet-face.cpp
index 2d3b8e3..f98a3da 100644
--- a/daemon/face/ethernet-face.cpp
+++ b/daemon/face/ethernet-face.cpp
@@ -34,7 +34,8 @@
 EthernetFace::EthernetFace(const shared_ptr<boost::asio::posix::stream_descriptor>& socket,
                            const ethernet::Endpoint& interface,
                            const ethernet::Address& address)
-  : m_socket(socket)
+  : Face(FaceUri("ether://" + interface + "/" + address.toString(':')))
+  , m_socket(socket)
   , m_interface(interface)
   , m_destAddress(address)
 {
diff --git a/daemon/face/face.cpp b/daemon/face/face.cpp
index 8e81217..7268ee4 100644
--- a/daemon/face/face.cpp
+++ b/daemon/face/face.cpp
@@ -11,9 +11,10 @@
 
 NFD_LOG_INIT("Face")
 
-Face::Face(bool isLocal)
+Face::Face(const FaceUri& uri, bool isLocal)
   : m_id(INVALID_FACEID)
   , m_isLocal(isLocal)
+  , m_uri(uri)
 {
 }
 
diff --git a/daemon/face/face.hpp b/daemon/face/face.hpp
index f20c37b..893a253 100644
--- a/daemon/face/face.hpp
+++ b/daemon/face/face.hpp
@@ -37,8 +37,7 @@
     Error(const std::string& what) : std::runtime_error(what) {}
   };
 
-  explicit
-  Face(bool isLocal = false);
+  Face(const FaceUri& uri, bool isLocal = false);
 
   virtual
   ~Face();
@@ -104,6 +103,9 @@
   const FaceCounters&
   getCounters() const;
 
+  const FaceUri&
+  getUri() const;
+
 protected:
   // this is a non-virtual method
   bool
@@ -121,6 +123,7 @@
   std::string m_description;
   bool m_isLocal; // for scoping purposes
   FaceCounters m_counters;
+  FaceUri m_uri;
 
   // allow setting FaceId
   friend class FaceTable;
@@ -145,6 +148,12 @@
   return m_counters;
 }
 
+inline const FaceUri&
+Face::getUri() const
+{
+  return m_uri;
+}
+
 } // namespace nfd
 
 #endif // NFD_FACE_FACE_HPP
diff --git a/daemon/face/local-face.hpp b/daemon/face/local-face.hpp
index b7d973a..7023efb 100644
--- a/daemon/face/local-face.hpp
+++ b/daemon/face/local-face.hpp
@@ -31,7 +31,8 @@
 class LocalFace : public Face
 {
 public:
-  LocalFace();
+  explicit
+  LocalFace(const FaceUri& uri);
 
   /** \brief get whether a LocalControlHeader feature is enabled
    *
@@ -81,8 +82,8 @@
 };
 
 inline
-LocalFace::LocalFace()
-  : Face(true)
+LocalFace::LocalFace(const FaceUri& uri)
+  : Face(uri, true)
   , m_localControlHeaderFeatures(LOCAL_CONTROL_HEADER_FEATURE_MAX)
 {
 }
diff --git a/daemon/face/multicast-udp-face.cpp b/daemon/face/multicast-udp-face.cpp
index edd2ff4..e56c147 100644
--- a/daemon/face/multicast-udp-face.cpp
+++ b/daemon/face/multicast-udp-face.cpp
@@ -12,7 +12,7 @@
 
 
 MulticastUdpFace::MulticastUdpFace(const shared_ptr<MulticastUdpFace::protocol::socket>& socket)
-  : UdpFace(socket)
+  : DatagramFace<protocol>(FaceUri(socket->local_endpoint()), socket)
 {
   NFD_LOG_DEBUG("Face creation. Multicast group: "
                 << m_socket->local_endpoint());
diff --git a/daemon/face/multicast-udp-face.hpp b/daemon/face/multicast-udp-face.hpp
index 46404da..2697a7f 100644
--- a/daemon/face/multicast-udp-face.hpp
+++ b/daemon/face/multicast-udp-face.hpp
@@ -7,7 +7,7 @@
 #ifndef NFD_FACE_MULTICAST_UDP_FACE_HPP
 #define NFD_FACE_MULTICAST_UDP_FACE_HPP
 
-#include "udp-face.hpp"
+#include "datagram-face.hpp"
 
 namespace nfd
 {
@@ -16,7 +16,7 @@
  * \brief Implementation of Face abstraction that uses 
  *        multicast UDP as underlying transport mechanism
  */
-class MulticastUdpFace : public UdpFace
+class MulticastUdpFace : public DatagramFace<boost::asio::ip::udp>
 {
 public:
   typedef boost::asio::ip::udp protocol;
diff --git a/daemon/face/stream-face.hpp b/daemon/face/stream-face.hpp
index db37660..8a0f960 100644
--- a/daemon/face/stream-face.hpp
+++ b/daemon/face/stream-face.hpp
@@ -25,7 +25,8 @@
    * \brief Create instance of StreamFace
    */
   explicit
-  StreamFace(const shared_ptr<typename protocol::socket>& socket);
+  StreamFace(const FaceUri& uri,
+             const shared_ptr<typename protocol::socket>& socket);
 
   virtual
   ~StreamFace();
@@ -95,15 +96,17 @@
 };
 
 
-template<class T, class U>
+template<class T, class FaceBase>
 inline
-StreamFace<T, U>::StreamFace(const shared_ptr<typename StreamFace::protocol::socket>& socket)
-  : m_socket(socket)
+StreamFace<T, FaceBase>::StreamFace(const FaceUri& uri,
+                                    const shared_ptr<typename StreamFace::protocol::socket>& socket)
+  : FaceBase(uri)
+  , m_socket(socket)
   , m_inputBufferSize(0)
 {
-  StreamFaceValidator<T, U>::validateSocket(*socket);
+  StreamFaceValidator<T, FaceBase>::validateSocket(*socket);
   m_socket->async_receive(boost::asio::buffer(m_inputBuffer, MAX_NDN_PACKET_SIZE), 0,
-                          bind(&StreamFace<T, U>::handleReceive, this, _1, _2));
+                          bind(&StreamFace<T, FaceBase>::handleReceive, this, _1, _2));
 }
 
 template<class T, class U>
diff --git a/daemon/face/tcp-face.cpp b/daemon/face/tcp-face.cpp
index 4f8cbab..6f85a21 100644
--- a/daemon/face/tcp-face.cpp
+++ b/daemon/face/tcp-face.cpp
@@ -17,14 +17,14 @@
                                                 TcpLocalFace::protocol, LocalFace, "TcpLocalFace");
 
 TcpFace::TcpFace(const shared_ptr<TcpFace::protocol::socket>& socket)
-  : StreamFace<protocol>(socket)
+  : StreamFace<protocol>(FaceUri(socket->remote_endpoint()), socket)
 {
 }
 
 //
 
 TcpLocalFace::TcpLocalFace(const shared_ptr<TcpLocalFace::protocol::socket>& socket)
-  : StreamFace<protocol, LocalFace>(socket)
+  : StreamFace<protocol, LocalFace>(FaceUri(socket->remote_endpoint()), socket)
 {
 }
 
diff --git a/daemon/face/udp-face.cpp b/daemon/face/udp-face.cpp
index 0ee40cc..dc516a7 100644
--- a/daemon/face/udp-face.cpp
+++ b/daemon/face/udp-face.cpp
@@ -11,7 +11,7 @@
 NFD_LOG_INCLASS_TEMPLATE_SPECIALIZATION_DEFINE(DatagramFace, UdpFace::protocol, "UdpFace");
 
 UdpFace::UdpFace(const shared_ptr<UdpFace::protocol::socket>& socket)
-  : DatagramFace<protocol>(socket)
+  : DatagramFace<protocol>(FaceUri(socket->remote_endpoint()), socket)
 {
 }
 
diff --git a/daemon/face/unix-stream-face.cpp b/daemon/face/unix-stream-face.cpp
index 27ba693..43e2369 100644
--- a/daemon/face/unix-stream-face.cpp
+++ b/daemon/face/unix-stream-face.cpp
@@ -16,7 +16,7 @@
                                                 "UnixStreamFace");
 
 UnixStreamFace::UnixStreamFace(const shared_ptr<UnixStreamFace::protocol::socket>& socket)
-  : StreamFace<protocol, LocalFace>(socket)
+  : StreamFace<protocol, LocalFace>(FaceUri(socket->local_endpoint()), socket)
 {
 }
 
diff --git a/daemon/mgmt/internal-face.cpp b/daemon/mgmt/internal-face.cpp
index a6c116b..f7e5018 100644
--- a/daemon/mgmt/internal-face.cpp
+++ b/daemon/mgmt/internal-face.cpp
@@ -11,7 +11,7 @@
 NFD_LOG_INIT("InternalFace");
 
 InternalFace::InternalFace()
-  : Face(true)
+  : Face(FaceUri("internal://"), true)
 {
 }
 
diff --git a/tests/face/dummy-face.hpp b/tests/face/dummy-face.hpp
index 969053a..e64a162 100644
--- a/tests/face/dummy-face.hpp
+++ b/tests/face/dummy-face.hpp
@@ -20,6 +20,11 @@
 class DummyFaceImpl : public FaceBase
 {
 public:
+  DummyFaceImpl()
+    : FaceBase(FaceUri("dummy://"))
+  {
+  }
+
   virtual void
   sendInterest(const Interest& interest)
   {
diff --git a/tests/face/ethernet.cpp b/tests/face/ethernet.cpp
index 9322d4c..2e731bf 100644
--- a/tests/face/ethernet.cpp
+++ b/tests/face/ethernet.cpp
@@ -75,6 +75,9 @@
 
   BOOST_REQUIRE(static_cast<bool>(face));
   BOOST_CHECK_EQUAL(face->isLocal(), false);
+  BOOST_CHECK_EQUAL(face->getUri().toString(),
+                    "ether://" + interfaces[0] + "/" +
+                    ethernet::getDefaultMulticastAddress().toString(':'));
 
   Interest interest1("ndn:/TpnzGvW9R");
   Data     data1    ("ndn:/KfczhUqVix");
diff --git a/tests/face/tcp.cpp b/tests/face/tcp.cpp
index 9223283..47c3b5b 100644
--- a/tests/face/tcp.cpp
+++ b/tests/face/tcp.cpp
@@ -162,20 +162,19 @@
 };
 
 
-BOOST_FIXTURE_TEST_CASE(EndToEnd, EndToEndFixture)
+BOOST_FIXTURE_TEST_CASE(EndToEnd4, EndToEndFixture)
 {
   TcpFactory factory;
 
   shared_ptr<TcpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
-  shared_ptr<TcpChannel> channel2 = factory.createChannel("127.0.0.1", "20071");
+  factory.createChannel("127.0.0.1", "20071");
 
   channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated,   this, _1),
                    bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
 
-  channel2->connect("127.0.0.1", "20070",
-                    bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
-                    bind(&EndToEndFixture::channel2_onConnectFailed, this, _1),
-                    time::seconds(4));
+  factory.createFace(FaceUri("tcp://127.0.0.1:20070"),
+                     bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
+                     bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
 
   BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
                       "TcpChannel error: cannot connect or cannot accept connection");
@@ -183,6 +182,74 @@
   BOOST_REQUIRE(static_cast<bool>(m_face1));
   BOOST_REQUIRE(static_cast<bool>(m_face2));
 
+  BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "tcp4://127.0.0.1:20070");
+  // face1 has an unknown URI, since the source port is automatically chosen by OS
+
+  BOOST_CHECK_EQUAL(m_face1->isLocal(), true);
+  BOOST_CHECK_EQUAL(m_face2->isLocal(), true);
+
+  BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face1)), true);
+  BOOST_CHECK_EQUAL(static_cast<bool>(dynamic_pointer_cast<LocalFace>(m_face2)), true);
+
+  // integrated tests needs to check that TcpFace for non-loopback fails these tests...
+
+  Interest interest1("ndn:/TpnzGvW9R");
+  Data     data1    ("ndn:/KfczhUqVix");
+  data1.setContent(0, 0);
+  Interest interest2("ndn:/QWiIMfj5sL");
+  Data     data2    ("ndn:/XNBV796f");
+  data2.setContent(0, 0);
+
+  ndn::SignatureSha256WithRsa fakeSignature;
+  fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue, reinterpret_cast<const uint8_t*>(0), 0));
+
+  // set fake signature on data1 and data2
+  data1.setSignature(fakeSignature);
+  data2.setSignature(fakeSignature);
+
+  m_face1->sendInterest(interest1);
+  m_face1->sendData    (data1    );
+  m_face2->sendInterest(interest2);
+  m_face2->sendData    (data2    );
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(4, time::seconds(10)) == LimitedIo::EXCEED_OPS,
+                      "TcpChannel error: cannot send or receive Interest/Data packets");
+
+
+  BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face1_receivedDatas    .size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face2_receivedInterests.size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face2_receivedDatas    .size(), 1);
+
+  BOOST_CHECK_EQUAL(m_face1_receivedInterests[0].getName(), interest2.getName());
+  BOOST_CHECK_EQUAL(m_face1_receivedDatas    [0].getName(), data2.getName());
+  BOOST_CHECK_EQUAL(m_face2_receivedInterests[0].getName(), interest1.getName());
+  BOOST_CHECK_EQUAL(m_face2_receivedDatas    [0].getName(), data1.getName());
+}
+
+BOOST_FIXTURE_TEST_CASE(EndToEnd6, EndToEndFixture)
+{
+  TcpFactory factory;
+
+  shared_ptr<TcpChannel> channel1 = factory.createChannel("::1", "20070");
+  shared_ptr<TcpChannel> channel2 = factory.createChannel("::1", "20071");
+
+  channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated,   this, _1),
+                   bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
+
+  factory.createFace(FaceUri("tcp://[::1]:20070"),
+                     bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
+                     bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(10)) == LimitedIo::EXCEED_OPS,
+                      "TcpChannel error: cannot connect or cannot accept connection");
+
+  BOOST_REQUIRE(static_cast<bool>(m_face1));
+  BOOST_REQUIRE(static_cast<bool>(m_face2));
+
+  BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "tcp6://[::1]:20070");
+  // face1 has an unknown URI, since the source port is automatically chosen by OS
+
   BOOST_CHECK_EQUAL(m_face1->isLocal(), true);
   BOOST_CHECK_EQUAL(m_face2->isLocal(), true);
 
diff --git a/tests/face/udp.cpp b/tests/face/udp.cpp
index f877e2f..3c86a6d 100644
--- a/tests/face/udp.cpp
+++ b/tests/face/udp.cpp
@@ -320,16 +320,11 @@
 };
 
 
-BOOST_FIXTURE_TEST_CASE(EndToEnd, EndToEndFixture)
+BOOST_FIXTURE_TEST_CASE(EndToEnd4, EndToEndFixture)
 {
   UdpFactory factory;
 
-  shared_ptr<UdpChannel> channel2 = factory.createChannel("127.0.0.1", "20071");
-
-
-  //channel2->connect("127.0.0.1", "20070",
-  //                  bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
-  //                  bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
+  factory.createChannel("127.0.0.1", "20071");
 
   factory.createFace(FaceUri("udp4://127.0.0.1:20070"),
                      bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
@@ -340,12 +335,14 @@
                       "UdpChannel error: cannot connect or cannot accept connection");
 
   BOOST_REQUIRE(static_cast<bool>(m_face2));
+  BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "udp4://127.0.0.1:20070");
+  BOOST_CHECK_EQUAL(m_face2->isLocal(), false);
+  // m_face1 is not created yet
 
   shared_ptr<UdpChannel> channel1 = factory.createChannel("127.0.0.1", "20070");
   channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated,   this, _1),
                    bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
 
-
   Interest interest1("ndn:/TpnzGvW9R");
   Data     data1    ("ndn:/KfczhUqVix");
   data1.setContent(0, 0);
@@ -375,6 +372,8 @@
                       "UdpChannel error: cannot send or receive Interest/Data packets");
 
   BOOST_REQUIRE(static_cast<bool>(m_face1));
+  BOOST_CHECK_EQUAL(m_face1->getUri().toString(), "udp4://127.0.0.1:20071");
+  BOOST_CHECK_EQUAL(m_face1->isLocal(), false);
 
   m_face1->sendInterest(interest1);
   m_face1->sendData    (data1    );
@@ -408,7 +407,95 @@
 
   BOOST_CHECK_EQUAL(m_face1_receivedInterests[1].getName(), interest3.getName());
   BOOST_CHECK_EQUAL(m_face1_receivedDatas    [1].getName(), data3.getName());
+}
 
+BOOST_FIXTURE_TEST_CASE(EndToEnd6, EndToEndFixture)
+{
+  UdpFactory factory;
+
+  factory.createChannel("::1", "20071");
+
+  factory.createFace(FaceUri("udp://[::1]:20070"),
+                     bind(&EndToEndFixture::channel2_onFaceCreated, this, _1),
+                     bind(&EndToEndFixture::channel2_onConnectFailed, this, _1));
+
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(1, time::seconds(1)) == LimitedIo::EXCEED_OPS,
+                      "UdpChannel error: cannot connect or cannot accept connection");
+
+  BOOST_REQUIRE(static_cast<bool>(m_face2));
+  BOOST_CHECK_EQUAL(m_face2->getUri().toString(), "udp6://[::1]:20070");
+  BOOST_CHECK_EQUAL(m_face2->isLocal(), false);
+  // m_face1 is not created yet
+
+  shared_ptr<UdpChannel> channel1 = factory.createChannel("::1", "20070");
+  channel1->listen(bind(&EndToEndFixture::channel1_onFaceCreated,   this, _1),
+                   bind(&EndToEndFixture::channel1_onConnectFailed, this, _1));
+
+  Interest interest1("ndn:/TpnzGvW9R");
+  Data     data1    ("ndn:/KfczhUqVix");
+  data1.setContent(0, 0);
+  Interest interest2("ndn:/QWiIMfj5sL");
+  Data     data2    ("ndn:/XNBV796f");
+  data2.setContent(0, 0);
+  Interest interest3("ndn:/QWiIhjgkj5sL");
+  Data     data3    ("ndn:/XNBV794f");
+  data3.setContent(0, 0);
+
+
+  ndn::SignatureSha256WithRsa fakeSignature;
+  fakeSignature.setValue(ndn::dataBlock(tlv::SignatureValue,
+                                        reinterpret_cast<const uint8_t*>(0),
+                                        0));
+
+  // set fake signature on data1 and data2
+  data1.setSignature(fakeSignature);
+  data2.setSignature(fakeSignature);
+  data3.setSignature(fakeSignature);
+
+  m_face2->sendInterest(interest2);
+  m_face2->sendData    (data2    );
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(3,//2 send + 1 listen return
+                      time::seconds(1)) == LimitedIo::EXCEED_OPS,
+                      "UdpChannel error: cannot send or receive Interest/Data packets");
+
+  BOOST_REQUIRE(static_cast<bool>(m_face1));
+  BOOST_CHECK_EQUAL(m_face1->getUri().toString(), "udp6://[::1]:20071");
+  BOOST_CHECK_EQUAL(m_face1->isLocal(), false);
+
+  m_face1->sendInterest(interest1);
+  m_face1->sendData    (data1    );
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
+                      "UdpChannel error: cannot send or receive Interest/Data packets");
+
+
+  BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face1_receivedDatas    .size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face2_receivedInterests.size(), 1);
+  BOOST_REQUIRE_EQUAL(m_face2_receivedDatas    .size(), 1);
+
+  BOOST_CHECK_EQUAL(m_face1_receivedInterests[0].getName(), interest2.getName());
+  BOOST_CHECK_EQUAL(m_face1_receivedDatas    [0].getName(), data2.getName());
+  BOOST_CHECK_EQUAL(m_face2_receivedInterests[0].getName(), interest1.getName());
+  BOOST_CHECK_EQUAL(m_face2_receivedDatas    [0].getName(), data1.getName());
+
+
+
+  //checking if the connection accepting mechanism works properly.
+
+  m_face2->sendData    (data3    );
+  m_face2->sendInterest(interest3);
+
+  BOOST_CHECK_MESSAGE(m_limitedIo.run(2, time::seconds(1)) == LimitedIo::EXCEED_OPS,
+                      "UdpChannel error: cannot send or receive Interest/Data packets");
+
+  BOOST_REQUIRE_EQUAL(m_face1_receivedInterests.size(), 2);
+  BOOST_REQUIRE_EQUAL(m_face1_receivedDatas    .size(), 2);
+
+  BOOST_CHECK_EQUAL(m_face1_receivedInterests[1].getName(), interest3.getName());
+  BOOST_CHECK_EQUAL(m_face1_receivedDatas    [1].getName(), data3.getName());
 }
 
 BOOST_FIXTURE_TEST_CASE(MultipleAccepts, EndToEndFixture)
diff --git a/tests/face/unix-stream.cpp b/tests/face/unix-stream.cpp
index 921c1ff..09ee905 100644
--- a/tests/face/unix-stream.cpp
+++ b/tests/face/unix-stream.cpp
@@ -148,6 +148,11 @@
 
   BOOST_REQUIRE(static_cast<bool>(m_face1));
 
+  std::string face1uri = m_face1->getUri().toString();
+  BOOST_CHECK_EQUAL(face1uri.find("unix:///"), 0); // third '/' is the path separator
+  BOOST_CHECK_EQUAL(face1uri.rfind(CHANNEL_PATH1),
+                    face1uri.size() - std::string(CHANNEL_PATH1).size());
+
   m_face2 = make_shared<UnixStreamFace>(client);
   m_face2->onReceiveInterest +=
     bind(&EndToEndFixture::face2_onReceiveInterest, this, _1);