blob: 4371317646b79d09805c9fe6ab3128afaaebd43f [file] [log] [blame]
Yanbiao Li4ee73d42015-08-19 16:30:16 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2015, Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "face/internal-face.hpp"
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070027
Junxiao Shicde37ad2015-12-24 01:02:05 -070028#include "transport-test-common.hpp"
Junxiao Shi6535f1e2015-10-08 13:02:18 -070029#include "tests/identity-management-fixture.hpp"
Yanbiao Li4ee73d42015-08-19 16:30:16 -070030
31namespace nfd {
Junxiao Shi6535f1e2015-10-08 13:02:18 -070032namespace face {
Yanbiao Li4ee73d42015-08-19 16:30:16 -070033namespace tests {
34
Junxiao Shi6535f1e2015-10-08 13:02:18 -070035using namespace nfd::tests;
36
37BOOST_AUTO_TEST_SUITE(Face)
38
39class InternalFaceFixture : public UnitTestTimeFixture
40 , public IdentityManagementFixture
Yanbiao Li4ee73d42015-08-19 16:30:16 -070041{
42public:
43 InternalFaceFixture()
44 {
Junxiao Shicde37ad2015-12-24 01:02:05 -070045 std::tie(forwarderFace, clientFace) = makeInternalFace(m_keyChain);;
Junxiao Shi6535f1e2015-10-08 13:02:18 -070046
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070047 forwarderFace->afterReceiveInterest.connect(
Junxiao Shi6535f1e2015-10-08 13:02:18 -070048 [this] (const Interest& interest) { receivedInterests.push_back(interest); } );
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070049 forwarderFace->afterReceiveData.connect(
Junxiao Shi6535f1e2015-10-08 13:02:18 -070050 [this] (const Data& data) { receivedData.push_back(data); } );
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070051 forwarderFace->afterReceiveNack.connect(
Junxiao Shi6535f1e2015-10-08 13:02:18 -070052 [this] (const lp::Nack& nack) { receivedNacks.push_back(nack); } );
Yanbiao Li4ee73d42015-08-19 16:30:16 -070053 }
54
55protected:
Junxiao Shicde37ad2015-12-24 01:02:05 -070056 shared_ptr<nfd::Face> forwarderFace;
Junxiao Shi6535f1e2015-10-08 13:02:18 -070057 shared_ptr<ndn::Face> clientFace;
58
59 std::vector<Interest> receivedInterests;
60 std::vector<Data> receivedData;
61 std::vector<lp::Nack> receivedNacks;
Yanbiao Li4ee73d42015-08-19 16:30:16 -070062};
63
Junxiao Shi6535f1e2015-10-08 13:02:18 -070064BOOST_FIXTURE_TEST_SUITE(TestInternalFace, InternalFaceFixture)
Yanbiao Li4ee73d42015-08-19 16:30:16 -070065
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070066BOOST_AUTO_TEST_CASE(TransportStaticProperties)
67{
68 Transport* transport = forwarderFace->getTransport();
69 checkStaticPropertiesInitialized(*transport);
70
71 BOOST_CHECK_EQUAL(transport->getLocalUri(), FaceUri("internal://"));
72 BOOST_CHECK_EQUAL(transport->getRemoteUri(), FaceUri("internal://"));
73 BOOST_CHECK_EQUAL(transport->getScope(), ndn::nfd::FACE_SCOPE_LOCAL);
74 BOOST_CHECK_EQUAL(transport->getPersistency(), ndn::nfd::FACE_PERSISTENCY_PERMANENT);
75 BOOST_CHECK_EQUAL(transport->getLinkType(), ndn::nfd::LINK_TYPE_POINT_TO_POINT);
76 BOOST_CHECK_EQUAL(transport->getMtu(), MTU_UNLIMITED);
77}
78
Junxiao Shi6535f1e2015-10-08 13:02:18 -070079// note: "send" and "receive" in test case names refer to the direction seen on forwarderFace.
80// i.e. "send" means transmission from forwarder to client,
Junxiao Shi5b8a2b22015-10-22 17:20:44 -070081// "receive" means transmission from client to forwarder.
Junxiao Shi6535f1e2015-10-08 13:02:18 -070082
83BOOST_AUTO_TEST_CASE(ReceiveInterestTimeout)
Yanbiao Li4ee73d42015-08-19 16:30:16 -070084{
Junxiao Shi6535f1e2015-10-08 13:02:18 -070085 shared_ptr<Interest> interest = makeInterest("/TLETccRv");
86 interest->setInterestLifetime(time::milliseconds(100));
Yanbiao Li4ee73d42015-08-19 16:30:16 -070087
Junxiao Shi6535f1e2015-10-08 13:02:18 -070088 bool hasTimeout = false;
89 clientFace->expressInterest(*interest,
90 bind([] { BOOST_ERROR("unexpected Data"); }),
91 bind([] { BOOST_ERROR("unexpected Nack"); }),
92 bind([&hasTimeout] { hasTimeout = true; }));
93 this->advanceClocks(time::milliseconds(1), 10);
Yanbiao Li4ee73d42015-08-19 16:30:16 -070094
Junxiao Shi6535f1e2015-10-08 13:02:18 -070095 BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
96 BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/TLETccRv");
97
98 this->advanceClocks(time::milliseconds(1), 100);
99
100 BOOST_CHECK(hasTimeout);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700101}
102
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700103BOOST_AUTO_TEST_CASE(ReceiveInterestSendData)
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700104{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700105 shared_ptr<Interest> interest = makeInterest("/PQstEJGdL");
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700106
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700107 bool hasReceivedData = false;
108 clientFace->expressInterest(*interest,
109 [&hasReceivedData] (const Interest&, const Data& data) {
110 hasReceivedData = true;
111 BOOST_CHECK_EQUAL(data.getName(), "/PQstEJGdL/aI7oCrDXNX");
112 },
113 bind([] { BOOST_ERROR("unexpected Nack"); }),
114 bind([] { BOOST_ERROR("unexpected timeout"); }));
115 this->advanceClocks(time::milliseconds(1), 10);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700116
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700117 BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
118 BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/PQstEJGdL");
119
120 shared_ptr<Data> data = makeData("/PQstEJGdL/aI7oCrDXNX");
121 forwarderFace->sendData(*data);
122 this->advanceClocks(time::milliseconds(1), 10);
123
124 BOOST_CHECK(hasReceivedData);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700125}
126
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700127BOOST_AUTO_TEST_CASE(ReceiveInterestSendNack)
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700128{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700129 shared_ptr<Interest> interest = makeInterest("/1HrsRM1X", 152);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700130
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700131 bool hasReceivedNack = false;
132 clientFace->expressInterest(*interest,
133 bind([] { BOOST_ERROR("unexpected Data"); }),
134 [&hasReceivedNack] (const Interest&, const lp::Nack& nack) {
135 hasReceivedNack = true;
136 BOOST_CHECK_EQUAL(nack.getReason(), lp::NackReason::NO_ROUTE);
137 },
138 bind([] { BOOST_ERROR("unexpected timeout"); }));
139 this->advanceClocks(time::milliseconds(1), 10);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700140
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700141 BOOST_REQUIRE_EQUAL(receivedInterests.size(), 1);
142 BOOST_CHECK_EQUAL(receivedInterests.back().getName(), "/1HrsRM1X");
143
144 lp::Nack nack = makeNack("/1HrsRM1X", 152, lp::NackReason::NO_ROUTE);
145 forwarderFace->sendNack(nack);
146 this->advanceClocks(time::milliseconds(1), 10);
147
148 BOOST_CHECK(hasReceivedNack);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700149}
150
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700151BOOST_AUTO_TEST_CASE(SendInterestReceiveData)
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700152{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700153 bool hasDeliveredInterest = false;
154 clientFace->setInterestFilter("/Wpc8TnEeoF",
155 [this, &hasDeliveredInterest] (const ndn::InterestFilter&, const Interest& interest) {
156 hasDeliveredInterest = true;
157 BOOST_CHECK_EQUAL(interest.getName(), "/Wpc8TnEeoF/f6SzV8hD");
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700158
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700159 shared_ptr<Data> data = makeData("/Wpc8TnEeoF/f6SzV8hD/3uytUJCuIi");
160 clientFace->put(*data);
161 });
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700162
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700163 shared_ptr<Interest> interest = makeInterest("/Wpc8TnEeoF/f6SzV8hD");
164 forwarderFace->sendInterest(*interest);
165 this->advanceClocks(time::milliseconds(1), 10);
166
167 BOOST_CHECK(hasDeliveredInterest);
168 BOOST_REQUIRE_EQUAL(receivedData.size(), 1);
169 BOOST_CHECK_EQUAL(receivedData.back().getName(), "/Wpc8TnEeoF/f6SzV8hD/3uytUJCuIi");
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700170}
171
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700172BOOST_AUTO_TEST_CASE(SendInterestReceiveNack)
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700173{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700174 bool hasDeliveredInterest = false;
175 clientFace->setInterestFilter("/4YgJKWcXN",
176 [this, &hasDeliveredInterest] (const ndn::InterestFilter&, const Interest& interest) {
177 hasDeliveredInterest = true;
178 BOOST_CHECK_EQUAL(interest.getName(), "/4YgJKWcXN/5oaTe05o");
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700179
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700180 lp::Nack nack = makeNack("/4YgJKWcXN/5oaTe05o", 191, lp::NackReason::NO_ROUTE);
181 clientFace->put(nack);
182 });
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700183
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700184 shared_ptr<Interest> interest = makeInterest("/4YgJKWcXN/5oaTe05o", 191);
185 forwarderFace->sendInterest(*interest);
186 this->advanceClocks(time::milliseconds(1), 10);
187
188 BOOST_CHECK(hasDeliveredInterest);
189 BOOST_REQUIRE_EQUAL(receivedNacks.size(), 1);
190 BOOST_CHECK_EQUAL(receivedNacks.back().getReason(), lp::NackReason::NO_ROUTE);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700191}
192
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700193BOOST_AUTO_TEST_CASE(CloseForwarderFace)
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700194{
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700195 forwarderFace->close();
196 this->advanceClocks(time::milliseconds(1), 10);
Junxiao Shi5b8a2b22015-10-22 17:20:44 -0700197 BOOST_CHECK_EQUAL(forwarderFace->getState(), FaceState::CLOSED);
Junxiao Shicde37ad2015-12-24 01:02:05 -0700198 forwarderFace.reset();
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700199
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700200 shared_ptr<Interest> interest = makeInterest("/zpHsVesu0B");
201 interest->setInterestLifetime(time::milliseconds(100));
202
203 bool hasTimeout = false;
204 clientFace->expressInterest(*interest,
205 bind([] { BOOST_ERROR("unexpected Data"); }),
206 bind([] { BOOST_ERROR("unexpected Nack"); }),
207 bind([&hasTimeout] { hasTimeout = true; }));
208 BOOST_CHECK_NO_THROW(this->advanceClocks(time::milliseconds(1), 200));
209
210 BOOST_CHECK_EQUAL(receivedInterests.size(), 0);
211 BOOST_CHECK(hasTimeout);
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700212}
213
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700214BOOST_AUTO_TEST_CASE(CloseClientFace)
215{
216 g_io.poll(); // #3248 workaround
217 clientFace.reset();
218
219 shared_ptr<Interest> interest = makeInterest("/aau42XQqb");
220 forwarderFace->sendInterest(*interest);
221 BOOST_CHECK_NO_THROW(this->advanceClocks(time::milliseconds(1), 10));
222}
223
224BOOST_AUTO_TEST_SUITE_END() // TestInternalFace
225BOOST_AUTO_TEST_SUITE_END() // Face
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700226
227} // namespace tests
Junxiao Shi6535f1e2015-10-08 13:02:18 -0700228} // namespace face
Yanbiao Li4ee73d42015-08-19 16:30:16 -0700229} // namespace nfd