blob: 0b1c4795b89eb01fd0b59e73ea77a107ebcf260b [file] [log] [blame]
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev1013fd02017-01-03 13:19:03 -08003 * Copyright (c) 2013-2017 Regents of the University of California.
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -04004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#include "face.hpp"
Junxiao Shia1478db2016-09-09 04:13:15 +000023#include "lp/tags.hpp"
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040024#include "security/key-chain.hpp"
Alexander Afanasyev3a6da362015-12-29 20:31:03 -080025#include "transport/tcp-transport.hpp"
Alexander Afanasyev57e00362016-06-23 13:22:54 -070026#include "transport/unix-transport.hpp"
Junxiao Shia1478db2016-09-09 04:13:15 +000027#include "util/dummy-client-face.hpp"
28#include "util/scheduler.hpp"
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040029
30#include "boost-test.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070031#include "identity-management-time-fixture.hpp"
32#include "key-chain-fixture.hpp"
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080033#include "make-interest-data.hpp"
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040034
35namespace ndn {
36namespace tests {
37
Junxiao Shia60d9362014-11-12 09:38:21 -070038using ndn::util::DummyClientFace;
Junxiao Shia60d9362014-11-12 09:38:21 -070039
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070040class FaceFixture : public IdentityManagementTimeFixture
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040041{
42public:
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080043 explicit
Junxiao Shia1ea5062014-12-27 22:33:39 -070044 FaceFixture(bool enableRegistrationReply = true)
Junxiao Shif5b5ae22016-08-08 05:54:41 +000045 : face(io, m_keyChain, {true, enableRegistrationReply})
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040046 {
47 }
48
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080049public:
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -080050 DummyClientFace face;
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040051};
52
Junxiao Shia1ea5062014-12-27 22:33:39 -070053class FacesNoRegistrationReplyFixture : public FaceFixture
Junxiao Shia60d9362014-11-12 09:38:21 -070054{
55public:
56 FacesNoRegistrationReplyFixture()
Junxiao Shia1ea5062014-12-27 22:33:39 -070057 : FaceFixture(false)
Junxiao Shia60d9362014-11-12 09:38:21 -070058 {
59 }
60};
61
Junxiao Shia1ea5062014-12-27 22:33:39 -070062BOOST_FIXTURE_TEST_SUITE(TestFace, FaceFixture)
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040063
Junxiao Shi103d8ed2016-08-07 20:34:10 +000064BOOST_AUTO_TEST_SUITE(Consumer)
65
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040066BOOST_AUTO_TEST_CASE(ExpressInterestData)
67{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080068 size_t nData = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -080069 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
70 [&] (const Interest& i, const Data& d) {
71 BOOST_CHECK(i.getName().isPrefixOf(d.getName()));
72 BOOST_CHECK_EQUAL(i.getName(), "/Hello/World");
73 ++nData;
74 },
Junxiao Shi103d8ed2016-08-07 20:34:10 +000075 bind([] { BOOST_FAIL("Unexpected Nack"); }),
76 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Eric Newberry83872fd2015-08-06 17:01:24 -070077
Junxiao Shif5b5ae22016-08-08 05:54:41 +000078 advanceClocks(time::milliseconds(40));
Eric Newberry83872fd2015-08-06 17:01:24 -070079
Junxiao Shi85d90832016-08-04 03:19:46 +000080 face.receive(*makeData("/Bye/World/a"));
81 face.receive(*makeData("/Hello/World/a"));
Eric Newberry83872fd2015-08-06 17:01:24 -070082
Junxiao Shif5b5ae22016-08-08 05:54:41 +000083 advanceClocks(time::milliseconds(50), 2);
Eric Newberry83872fd2015-08-06 17:01:24 -070084
85 BOOST_CHECK_EQUAL(nData, 1);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -080086 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
87 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
Eric Newberry83872fd2015-08-06 17:01:24 -070088
89 size_t nTimeouts = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -080090 face.expressInterest(Interest("/Hello/World/a/2", time::milliseconds(50)),
91 bind([]{}),
92 bind([]{}),
Junxiao Shi103d8ed2016-08-07 20:34:10 +000093 bind([&nTimeouts] { ++nTimeouts; }));
Junxiao Shif5b5ae22016-08-08 05:54:41 +000094 advanceClocks(time::milliseconds(200), 5);
Eric Newberry83872fd2015-08-06 17:01:24 -070095 BOOST_CHECK_EQUAL(nTimeouts, 1);
96}
97
Alexander Afanasyev1013fd02017-01-03 13:19:03 -080098BOOST_AUTO_TEST_CASE(ExpressMultipleInterestData)
99{
100 size_t nData = 0;
101
102 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
103 [&] (const Interest& i, const Data& d) {
104 ++nData;
105 },
106 bind([] { BOOST_FAIL("Unexpected Nack"); }),
107 bind([] { BOOST_FAIL("Unexpected timeout"); }));
108
109 face.expressInterest(Interest("/Hello/World/a", time::milliseconds(50)),
110 [&] (const Interest& i, const Data& d) {
111 ++nData;
112 },
113 bind([] { BOOST_FAIL("Unexpected Nack"); }),
114 bind([] { BOOST_FAIL("Unexpected timeout"); }));
115
116 advanceClocks(time::milliseconds(40));
117
118 face.receive(*makeData("/Hello/World/a/b"));
119
120 advanceClocks(time::milliseconds(50), 2);
121
122 BOOST_CHECK_EQUAL(nData, 2);
123 BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
124 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
125}
126
Junxiao Shi76e0eb22016-08-08 05:54:10 +0000127BOOST_AUTO_TEST_CASE(ExpressInterestEmptyDataCallback)
128{
129 face.expressInterest(Interest("/Hello/World"),
130 nullptr,
131 bind([] { BOOST_FAIL("Unexpected Nack"); }),
132 bind([] { BOOST_FAIL("Unexpected timeout"); }));
133 advanceClocks(time::milliseconds(1));
134
135 BOOST_CHECK_NO_THROW(do {
136 face.receive(*makeData("/Hello/World/a"));
137 advanceClocks(time::milliseconds(1));
138 } while (false));
139}
140
Eric Newberry83872fd2015-08-06 17:01:24 -0700141BOOST_AUTO_TEST_CASE(DeprecatedExpressInterestData)
142{
143 size_t nData = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800144 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000145 [&] (const Interest& i, Data& d) {
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800146 BOOST_CHECK(i.getName().isPrefixOf(d.getName()));
147 ++nData;
148 },
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000149 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400150
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000151 advanceClocks(time::milliseconds(40));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400152
Junxiao Shi85d90832016-08-04 03:19:46 +0000153 face.receive(*makeData("/Bye/World/a"));
154 face.receive(*makeData("/Hello/World/a"));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800155
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000156 advanceClocks(time::milliseconds(50), 2);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400157
158 BOOST_CHECK_EQUAL(nData, 1);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800159 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
160 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800161
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800162 face.expressInterest(Interest("/Hello/World/a", time::milliseconds(50)),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000163 [&] (const Interest& i, Data& d) {
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800164 BOOST_CHECK(i.getName().isPrefixOf(d.getName()));
165 ++nData;
166 },
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000167 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000168 advanceClocks(time::milliseconds(40));
Junxiao Shi85d90832016-08-04 03:19:46 +0000169 face.receive(*makeData("/Hello/World/a/1/xxxxx"));
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800170
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000171 advanceClocks(time::milliseconds(50), 2);
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800172
173 BOOST_CHECK_EQUAL(nData, 2);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800174 BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
175 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400176}
177
178BOOST_AUTO_TEST_CASE(ExpressInterestTimeout)
179{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800180 size_t nTimeouts = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800181 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000182 bind([] { BOOST_FAIL("Unexpected Data"); }),
183 bind([] { BOOST_FAIL("Unexpected Nack"); }),
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800184 [&nTimeouts] (const Interest& i) {
185 BOOST_CHECK_EQUAL(i.getName(), "/Hello/World");
186 ++nTimeouts;
187 });
Eric Newberry83872fd2015-08-06 17:01:24 -0700188
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000189 advanceClocks(time::milliseconds(200), 5);
Eric Newberry83872fd2015-08-06 17:01:24 -0700190
191 BOOST_CHECK_EQUAL(nTimeouts, 1);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800192 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
193 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
194 BOOST_CHECK_EQUAL(face.sentNacks.size(), 0);
Eric Newberry83872fd2015-08-06 17:01:24 -0700195}
196
Junxiao Shi76e0eb22016-08-08 05:54:10 +0000197BOOST_AUTO_TEST_CASE(ExpressInterestEmptyTimeoutCallback)
198{
199 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
200 bind([] { BOOST_FAIL("Unexpected Data"); }),
201 bind([] { BOOST_FAIL("Unexpected Nack"); }),
202 nullptr);
203 advanceClocks(time::milliseconds(40));
204
205 BOOST_CHECK_NO_THROW(do {
206 advanceClocks(time::milliseconds(6), 2);
207 } while (false));
208}
209
Eric Newberry83872fd2015-08-06 17:01:24 -0700210BOOST_AUTO_TEST_CASE(DeprecatedExpressInterestTimeout)
211{
212 size_t nTimeouts = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800213 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000214 bind([] { BOOST_FAIL("Unexpected data"); }),
215 bind([&nTimeouts] { ++nTimeouts; }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400216
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000217 advanceClocks(time::milliseconds(200), 5);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400218
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400219 BOOST_CHECK_EQUAL(nTimeouts, 1);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800220 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
221 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400222}
223
Eric Newberry83872fd2015-08-06 17:01:24 -0700224BOOST_AUTO_TEST_CASE(ExpressInterestNack)
225{
226 size_t nNacks = 0;
227
228 Interest interest("/Hello/World", time::milliseconds(50));
229
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800230 face.expressInterest(interest,
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000231 bind([] { BOOST_FAIL("Unexpected Data"); }),
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800232 [&] (const Interest& i, const lp::Nack& n) {
233 BOOST_CHECK(i.getName().isPrefixOf(n.getInterest().getName()));
234 BOOST_CHECK_EQUAL(i.getName(), "/Hello/World");
235 BOOST_CHECK_EQUAL(n.getReason(), lp::NackReason::DUPLICATE);
236 ++nNacks;
237 },
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000238 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Eric Newberry83872fd2015-08-06 17:01:24 -0700239
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000240 advanceClocks(time::milliseconds(40));
Eric Newberry83872fd2015-08-06 17:01:24 -0700241
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000242 face.receive(makeNack(face.sentInterests.at(0), lp::NackReason::DUPLICATE));
Eric Newberry83872fd2015-08-06 17:01:24 -0700243
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000244 advanceClocks(time::milliseconds(50), 2);
Eric Newberry83872fd2015-08-06 17:01:24 -0700245
246 BOOST_CHECK_EQUAL(nNacks, 1);
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800247 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
Eric Newberry83872fd2015-08-06 17:01:24 -0700248}
249
Alexander Afanasyev1013fd02017-01-03 13:19:03 -0800250BOOST_AUTO_TEST_CASE(ExpressMultipleInterestNack)
251{
252 size_t nNacks = 0;
253
254 Interest interest("/Hello/World", time::milliseconds(50));
255 interest.setNonce(1);
256
257 face.expressInterest(interest,
258 bind([] { BOOST_FAIL("Unexpected Data"); }),
259 [&] (const Interest& i, const lp::Nack& n) {
260 ++nNacks;
261 },
262 bind([] { BOOST_FAIL("Unexpected timeout"); }));
263
264 interest.setNonce(2);
265 face.expressInterest(interest,
266 bind([] { BOOST_FAIL("Unexpected Data"); }),
267 [&] (const Interest& i, const lp::Nack& n) {
268 ++nNacks;
269 },
270 bind([] { BOOST_FAIL("Unexpected timeout"); }));
271
272 advanceClocks(time::milliseconds(40));
273
274 face.receive(makeNack(face.sentInterests.at(1), lp::NackReason::DUPLICATE));
275
276 advanceClocks(time::milliseconds(50), 2);
277
278 BOOST_CHECK_EQUAL(nNacks, 2);
279 BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
280}
281
Junxiao Shi76e0eb22016-08-08 05:54:10 +0000282BOOST_AUTO_TEST_CASE(ExpressInterestEmptyNackCallback)
283{
284 face.expressInterest(Interest("/Hello/World"),
285 bind([] { BOOST_FAIL("Unexpected Data"); }),
286 nullptr,
287 bind([] { BOOST_FAIL("Unexpected timeout"); }));
288 advanceClocks(time::milliseconds(1));
289
290 BOOST_CHECK_NO_THROW(do {
291 face.receive(makeNack(face.sentInterests.at(0), lp::NackReason::DUPLICATE));
292 advanceClocks(time::milliseconds(1));
293 } while (false));
294}
295
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000296BOOST_AUTO_TEST_CASE(DeprecatedExpressInterestNack)
297{
298 size_t nTimeouts = 0;
299 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
300 bind([] { BOOST_FAIL("Unexpected data"); }),
301 bind([&nTimeouts] { ++nTimeouts; }));
302 advanceClocks(time::milliseconds(1));
303
304 face.receive(makeNack(face.sentInterests.at(0), lp::NackReason::CONGESTION));
305 advanceClocks(time::milliseconds(1));
306
307 BOOST_CHECK_EQUAL(nTimeouts, 1);
308 BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
309 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
310}
311
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800312BOOST_AUTO_TEST_CASE(RemovePendingInterest)
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400313{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800314 const PendingInterestId* interestId =
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800315 face.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000316 bind([] { BOOST_FAIL("Unexpected data"); }),
317 bind([] { BOOST_FAIL("Unexpected nack"); }),
318 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800319 advanceClocks(time::milliseconds(10));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400320
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800321 face.removePendingInterest(interestId);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800322 advanceClocks(time::milliseconds(10));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400323
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000324 face.receive(*makeData("/Hello/World/%21"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000325 advanceClocks(time::milliseconds(200), 5);
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100326
327 // avoid "test case [...] did not check any assertions" message from Boost.Test
328 BOOST_CHECK(true);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400329}
330
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000331BOOST_AUTO_TEST_CASE(RemoveAllPendingInterests)
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500332{
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800333 face.expressInterest(Interest("/Hello/World/0", time::milliseconds(50)),
334 bind([] { BOOST_FAIL("Unexpected data"); }),
335 bind([] { BOOST_FAIL("Unexpected nack"); }),
336 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500337
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800338 face.expressInterest(Interest("/Hello/World/1", time::milliseconds(50)),
339 bind([] { BOOST_FAIL("Unexpected data"); }),
340 bind([] { BOOST_FAIL("Unexpected nack"); }),
341 bind([] { BOOST_FAIL("Unexpected timeout"); }));
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500342
343 advanceClocks(time::milliseconds(10));
344
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800345 face.removeAllPendingInterests();
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500346 advanceClocks(time::milliseconds(10));
347
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800348 BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500349
Junxiao Shi85d90832016-08-04 03:19:46 +0000350 face.receive(*makeData("/Hello/World/0"));
351 face.receive(*makeData("/Hello/World/1"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000352 advanceClocks(time::milliseconds(200), 5);
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500353}
354
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000355BOOST_AUTO_TEST_CASE(DestructionWithoutCancellingPendingInterests) // Bug #2518
356{
357 {
358 DummyClientFace face2(io, m_keyChain);
359 face2.expressInterest(Interest("/Hello/World", time::milliseconds(50)),
360 bind([]{}), bind([]{}));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000361 advanceClocks(time::milliseconds(50), 2);
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000362 }
363
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100364 advanceClocks(time::milliseconds(50), 2); // should not crash
365
366 // avoid "test case [...] did not check any assertions" message from Boost.Test
367 BOOST_CHECK(true);
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000368}
369
370BOOST_AUTO_TEST_SUITE_END() // Consumer
371
372BOOST_AUTO_TEST_SUITE(Producer)
373
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000374BOOST_AUTO_TEST_CASE(PutData)
375{
376 BOOST_CHECK_EQUAL(face.sentData.size(), 0);
377
378 Data data("/4g7xxcuEow/KFvK5Kf2m");
379 signData(data);
380 face.put(data);
381
382 lp::CachePolicy cachePolicy;
383 cachePolicy.setPolicy(lp::CachePolicyType::NO_CACHE);
384 data.setTag(make_shared<lp::CachePolicyTag>(cachePolicy));
Eric Newberry4d261b62016-11-10 13:40:09 -0700385 data.setTag(make_shared<lp::CongestionMarkTag>(1));
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000386 face.put(data);
387
388 advanceClocks(time::milliseconds(10));
389 BOOST_REQUIRE_EQUAL(face.sentData.size(), 2);
390 BOOST_CHECK(face.sentData[0].getTag<lp::CachePolicyTag>() == nullptr);
Eric Newberry4d261b62016-11-10 13:40:09 -0700391 BOOST_CHECK(face.sentData[0].getTag<lp::CongestionMarkTag>() == nullptr);
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000392 BOOST_CHECK(face.sentData[1].getTag<lp::CachePolicyTag>() != nullptr);
Eric Newberry4d261b62016-11-10 13:40:09 -0700393 BOOST_CHECK(face.sentData[1].getTag<lp::CongestionMarkTag>() != nullptr);
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000394}
395
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000396BOOST_AUTO_TEST_CASE(PutNack)
397{
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000398 BOOST_CHECK_EQUAL(face.sentNacks.size(), 0);
399
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000400 face.put(makeNack(Interest("/Hello/World", time::milliseconds(50)), lp::NackReason::NO_ROUTE));
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000401
Junxiao Shie7bb6c82016-08-08 23:16:35 +0000402 advanceClocks(time::milliseconds(10));
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000403 BOOST_CHECK_EQUAL(face.sentNacks.size(), 1);
Eric Newberry4d261b62016-11-10 13:40:09 -0700404
405 auto nack = makeNack(Interest("/another/prefix", time::milliseconds(50)), lp::NackReason::NO_ROUTE);
406 nack.setTag(make_shared<lp::CongestionMarkTag>(1));
407 face.put(nack);
408
409 advanceClocks(time::milliseconds(10));
410 BOOST_REQUIRE_EQUAL(face.sentNacks.size(), 2);
411 BOOST_CHECK(face.sentNacks[0].getTag<lp::CongestionMarkTag>() == nullptr);
412 BOOST_CHECK(face.sentNacks[1].getTag<lp::CongestionMarkTag>() != nullptr);
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000413}
Ilya Moiseenko56b0bf82015-11-08 11:14:28 -0500414
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400415BOOST_AUTO_TEST_CASE(SetUnsetInterestFilter)
416{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800417 size_t nInterests = 0;
418 size_t nRegs = 0;
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400419 const RegisteredPrefixId* regPrefixId =
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800420 face.setInterestFilter("/Hello/World",
421 bind([&nInterests] { ++nInterests; }),
422 bind([&nRegs] { ++nRegs; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000423 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000424 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800425 BOOST_CHECK_EQUAL(nRegs, 1);
426 BOOST_CHECK_EQUAL(nInterests, 0);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400427
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000428 face.receive(Interest("/Hello/World/%21"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000429 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400430
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800431 BOOST_CHECK_EQUAL(nRegs, 1);
432 BOOST_CHECK_EQUAL(nInterests, 1);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400433
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000434 face.receive(Interest("/Bye/World/%21"));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800435 advanceClocks(time::milliseconds(10000), 10);
436 BOOST_CHECK_EQUAL(nInterests, 1);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400437
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000438 face.receive(Interest("/Hello/World/%21/2"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000439 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800440 BOOST_CHECK_EQUAL(nInterests, 2);
441
442 // removing filter
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800443 face.unsetInterestFilter(regPrefixId);
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000444 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400445
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000446 face.receive(Interest("/Hello/World/%21/3"));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800447 BOOST_CHECK_EQUAL(nInterests, 2);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400448
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000449 face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000450 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400451
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000452 face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000453 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800454}
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400455
Junxiao Shi76e0eb22016-08-08 05:54:10 +0000456BOOST_AUTO_TEST_CASE(SetInterestFilterEmptyInterestCallback)
457{
458 face.setInterestFilter("/A", nullptr);
459 advanceClocks(time::milliseconds(1));
460
461 BOOST_CHECK_NO_THROW(do {
462 face.receive(*makeInterest("/A/1"));
463 advanceClocks(time::milliseconds(1));
464 } while (false));
465}
466
Joao Pereira0b3cac52015-07-02 14:49:49 -0400467BOOST_AUTO_TEST_CASE(SetUnsetInterestFilterWithoutSucessCallback)
468{
469 size_t nInterests = 0;
470 const RegisteredPrefixId* regPrefixId =
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800471 face.setInterestFilter("/Hello/World",
472 bind([&nInterests] { ++nInterests; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000473 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000474 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400475 BOOST_CHECK_EQUAL(nInterests, 0);
476
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000477 face.receive(Interest("/Hello/World/%21"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000478 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400479
480 BOOST_CHECK_EQUAL(nInterests, 1);
481
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000482 face.receive(Interest("/Bye/World/%21"));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400483 advanceClocks(time::milliseconds(10000), 10);
484 BOOST_CHECK_EQUAL(nInterests, 1);
485
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000486 face.receive(Interest("/Hello/World/%21/2"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000487 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400488 BOOST_CHECK_EQUAL(nInterests, 2);
489
490 // removing filter
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800491 face.unsetInterestFilter(regPrefixId);
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000492 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400493
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000494 face.receive(Interest("/Hello/World/%21/3"));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400495 BOOST_CHECK_EQUAL(nInterests, 2);
496
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000497 face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000498 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400499
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000500 face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000501 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400502}
503
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800504BOOST_FIXTURE_TEST_CASE(SetInterestFilterFail, FacesNoRegistrationReplyFixture)
505{
506 // don't enable registration reply
507 size_t nRegFailed = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800508 face.setInterestFilter("/Hello/World",
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000509 bind([] { BOOST_FAIL("Unexpected Interest"); }),
510 bind([] { BOOST_FAIL("Unexpected success of setInterestFilter"); }),
511 bind([&nRegFailed] { ++nRegFailed; }));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800512
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000513 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800514 BOOST_CHECK_EQUAL(nRegFailed, 0);
515
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000516 advanceClocks(time::milliseconds(2000), 5);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800517 BOOST_CHECK_EQUAL(nRegFailed, 1);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400518}
519
Joao Pereira0b3cac52015-07-02 14:49:49 -0400520BOOST_FIXTURE_TEST_CASE(SetInterestFilterFailWithoutSuccessCallback, FacesNoRegistrationReplyFixture)
521{
522 // don't enable registration reply
523 size_t nRegFailed = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800524 face.setInterestFilter("/Hello/World",
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000525 bind([] { BOOST_FAIL("Unexpected Interest"); }),
526 bind([&nRegFailed] { ++nRegFailed; }));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400527
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000528 advanceClocks(time::milliseconds(25), 4);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400529 BOOST_CHECK_EQUAL(nRegFailed, 0);
530
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000531 advanceClocks(time::milliseconds(2000), 5);
Joao Pereira0b3cac52015-07-02 14:49:49 -0400532 BOOST_CHECK_EQUAL(nRegFailed, 1);
533}
534
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400535BOOST_AUTO_TEST_CASE(RegisterUnregisterPrefix)
536{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800537 size_t nRegSuccesses = 0;
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400538 const RegisteredPrefixId* regPrefixId =
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800539 face.registerPrefix("/Hello/World",
540 bind([&nRegSuccesses] { ++nRegSuccesses; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000541 bind([] { BOOST_FAIL("Unexpected registerPrefix failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400542
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000543 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400544 BOOST_CHECK_EQUAL(nRegSuccesses, 1);
545
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800546 size_t nUnregSuccesses = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800547 face.unregisterPrefix(regPrefixId,
548 bind([&nUnregSuccesses] { ++nUnregSuccesses; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000549 bind([] { BOOST_FAIL("Unexpected unregisterPrefix failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400550
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000551 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400552 BOOST_CHECK_EQUAL(nUnregSuccesses, 1);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400553}
554
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800555BOOST_FIXTURE_TEST_CASE(RegisterUnregisterPrefixFail, FacesNoRegistrationReplyFixture)
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400556{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800557 size_t nRegFailures = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800558 face.registerPrefix("/Hello/World",
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000559 bind([] { BOOST_FAIL("Unexpected registerPrefix success"); }),
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800560 bind([&nRegFailures] { ++nRegFailures; }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400561
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000562 advanceClocks(time::milliseconds(5000), 20);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800563 BOOST_CHECK_EQUAL(nRegFailures, 1);
564}
565
566BOOST_AUTO_TEST_CASE(SimilarFilters)
567{
568 size_t nInInterests1 = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800569 face.setInterestFilter("/Hello/World",
570 bind([&nInInterests1] { ++nInInterests1; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000571 nullptr,
572 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800573
574 size_t nInInterests2 = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800575 face.setInterestFilter("/Hello",
576 bind([&nInInterests2] { ++nInInterests2; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000577 nullptr,
578 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400579
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800580 size_t nInInterests3 = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800581 face.setInterestFilter("/Los/Angeles/Lakers",
582 bind([&nInInterests3] { ++nInInterests3; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000583 nullptr,
584 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400585
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000586 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400587
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000588 face.receive(Interest("/Hello/World/%21"));
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000589 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400590
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800591 BOOST_CHECK_EQUAL(nInInterests1, 1);
592 BOOST_CHECK_EQUAL(nInInterests2, 1);
593 BOOST_CHECK_EQUAL(nInInterests3, 0);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400594}
595
596BOOST_AUTO_TEST_CASE(SetRegexFilterError)
597{
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800598 face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
599 [] (const Name&, const Interest&) {
600 BOOST_FAIL("InterestFilter::Error should have been triggered");
601 },
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000602 nullptr,
603 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400604
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000605 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400606
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800607 BOOST_REQUIRE_THROW(face.receive(Interest("/Hello/World/XXX/b/c")), InterestFilter::Error);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400608}
609
610BOOST_AUTO_TEST_CASE(SetRegexFilter)
611{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800612 size_t nInInterests = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800613 face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
614 bind([&nInInterests] { ++nInInterests; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000615 nullptr,
616 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400617
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000618 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400619
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800620 face.receive(Interest("/Hello/World/a")); // shouldn't match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400621 BOOST_CHECK_EQUAL(nInInterests, 0);
622
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800623 face.receive(Interest("/Hello/World/a/b")); // should match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400624 BOOST_CHECK_EQUAL(nInInterests, 1);
625
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800626 face.receive(Interest("/Hello/World/a/b/c")); // should match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400627 BOOST_CHECK_EQUAL(nInInterests, 2);
628
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800629 face.receive(Interest("/Hello/World/a/b/d")); // should not match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400630 BOOST_CHECK_EQUAL(nInInterests, 2);
631}
632
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400633BOOST_AUTO_TEST_CASE(SetRegexFilterAndRegister)
634{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800635 size_t nInInterests = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800636 face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
637 bind([&nInInterests] { ++nInInterests; }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400638
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800639 size_t nRegSuccesses = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800640 face.registerPrefix("/Hello/World",
641 bind([&nRegSuccesses] { ++nRegSuccesses; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000642 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400643
Junxiao Shif5b5ae22016-08-08 05:54:41 +0000644 advanceClocks(time::milliseconds(25), 4);
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400645 BOOST_CHECK_EQUAL(nRegSuccesses, 1);
646
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800647 face.receive(Interest("/Hello/World/a")); // shouldn't match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400648 BOOST_CHECK_EQUAL(nInInterests, 0);
649
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800650 face.receive(Interest("/Hello/World/a/b")); // should match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400651 BOOST_CHECK_EQUAL(nInInterests, 1);
652
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800653 face.receive(Interest("/Hello/World/a/b/c")); // should match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400654 BOOST_CHECK_EQUAL(nInInterests, 2);
655
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800656 face.receive(Interest("/Hello/World/a/b/d")); // should not match
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400657 BOOST_CHECK_EQUAL(nInInterests, 2);
658}
659
Junxiao Shia1ea5062014-12-27 22:33:39 -0700660BOOST_FIXTURE_TEST_CASE(SetInterestFilterNoReg, FacesNoRegistrationReplyFixture) // Bug 2318
661{
662 // This behavior is specific to DummyClientFace.
663 // Regular Face won't accept incoming packets until something is sent.
664
665 int hit = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800666 face.setInterestFilter(Name("/"), bind([&hit] { ++hit; }));
667 face.processEvents(time::milliseconds(-1));
Junxiao Shia1ea5062014-12-27 22:33:39 -0700668
669 auto interest = make_shared<Interest>("/A");
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800670 face.receive(*interest);
671 face.processEvents(time::milliseconds(-1));
Junxiao Shia1ea5062014-12-27 22:33:39 -0700672
673 BOOST_CHECK_EQUAL(hit, 1);
674}
675
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000676BOOST_AUTO_TEST_SUITE_END() // Producer
677
Junxiao Shiae0b4182016-08-08 22:53:17 +0000678BOOST_AUTO_TEST_SUITE(IoRoutines)
679
Alexander Afanasyev8e158542014-11-18 00:47:18 -0500680BOOST_AUTO_TEST_CASE(ProcessEvents)
681{
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800682 face.processEvents(time::milliseconds(-1)); // io_service::reset()/poll() inside
Alexander Afanasyev8e158542014-11-18 00:47:18 -0500683
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800684 size_t nRegSuccesses = 0;
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800685 face.registerPrefix("/Hello/World",
686 bind([&nRegSuccesses] { ++nRegSuccesses; }),
Junxiao Shi103d8ed2016-08-07 20:34:10 +0000687 bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
Alexander Afanasyev8e158542014-11-18 00:47:18 -0500688
689 // io_service::poll() without reset
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800690 face.getIoService().poll();
Alexander Afanasyev8e158542014-11-18 00:47:18 -0500691 BOOST_CHECK_EQUAL(nRegSuccesses, 0);
692
Alexander Afanasyev9bdbb832015-12-30 12:54:22 -0800693 face.processEvents(time::milliseconds(-1)); // io_service::reset()/poll() inside
Alexander Afanasyev8e158542014-11-18 00:47:18 -0500694 BOOST_CHECK_EQUAL(nRegSuccesses, 1);
695}
696
Junxiao Shiae0b4182016-08-08 22:53:17 +0000697BOOST_AUTO_TEST_CASE(DestroyWithoutProcessEvents) // Bug 3248
698{
699 auto face2 = make_unique<Face>(io);
700 face2.reset();
701
702 io.poll(); // should not crash
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100703
704 // avoid "test case [...] did not check any assertions" message from Boost.Test
705 BOOST_CHECK(true);
Junxiao Shiae0b4182016-08-08 22:53:17 +0000706}
707
708BOOST_AUTO_TEST_SUITE_END() // IoRoutines
709
710BOOST_AUTO_TEST_SUITE(Transport)
711
712using ndn::Transport;
713
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700714struct PibDirWithDefaultTpm
715{
716 const std::string PATH = "build/keys-with-default-tpm";
717};
718
719BOOST_FIXTURE_TEST_CASE(FaceTransport, PibDirFixture<PibDirWithDefaultTpm>)
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800720{
721 KeyChain keyChain;
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700722 boost::asio::io_service io;
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800723
724 BOOST_CHECK(Face().getTransport() != nullptr);
725
Alexander Afanasyevbb64c172015-12-29 20:32:45 -0800726 BOOST_CHECK(Face(shared_ptr<Transport>()).getTransport() != nullptr);
727 BOOST_CHECK(Face(shared_ptr<Transport>(), io).getTransport() != nullptr);
728 BOOST_CHECK(Face(shared_ptr<Transport>(), io, keyChain).getTransport() != nullptr);
Alexander Afanasyev3a6da362015-12-29 20:31:03 -0800729
730 auto transport = make_shared<TcpTransport>("localhost", "6363"); // no real io operations will be scheduled
731 BOOST_CHECK(Face(transport).getTransport() == transport);
732 BOOST_CHECK(Face(transport, io).getTransport() == transport);
733 BOOST_CHECK(Face(transport, io, keyChain).getTransport() == transport);
734}
735
Alexander Afanasyevcf490552016-06-27 22:51:36 -0700736class WithEnv : private IdentityManagementTimeFixture
737{
738public:
739 WithEnv()
740 {
741 if (getenv("NDN_CLIENT_TRANSPORT") != nullptr) {
742 m_oldTransport = getenv("NDN_CLIENT_TRANSPORT");
743 unsetenv("NDN_CLIENT_TRANSPORT");
744 }
745 }
746
747 void
748 configure(const std::string& faceUri)
749 {
750 setenv("NDN_CLIENT_TRANSPORT", faceUri.c_str(), true);
751 }
752
753 ~WithEnv()
754 {
755 if (!m_oldTransport.empty()) {
756 setenv("NDN_CLIENT_TRANSPORT", m_oldTransport.c_str(), true);
757 }
758 else {
759 unsetenv("NDN_CLIENT_TRANSPORT");
760 }
761 }
762
763private:
764 std::string m_oldTransport;
765};
766
767class WithConfig : private TestHomeFixture<DefaultPibDir>
768{
769public:
770 void
771 configure(const std::string& faceUri)
772 {
773 createClientConf({"transport=" + faceUri});
774 }
775};
776
777class WithEnvAndConfig : public WithEnv, public WithConfig
778{
779};
780
781typedef boost::mpl::vector<WithEnv, WithConfig> ConfigOptions;
782
783BOOST_FIXTURE_TEST_CASE(NoConfig, WithEnvAndConfig) // fixture configures test HOME and PIB/TPM path
Alexander Afanasyev57e00362016-06-23 13:22:54 -0700784{
785 shared_ptr<Face> face;
786 BOOST_REQUIRE_NO_THROW(face = make_shared<Face>());
787 BOOST_CHECK(dynamic_pointer_cast<UnixTransport>(face->getTransport()) != nullptr);
Alexander Afanasyev57e00362016-06-23 13:22:54 -0700788}
789
Alexander Afanasyevcf490552016-06-27 22:51:36 -0700790BOOST_FIXTURE_TEST_CASE_TEMPLATE(Unix, T, ConfigOptions, T)
791{
792 this->configure("unix://some/path");
Alexander Afanasyev57e00362016-06-23 13:22:54 -0700793
Alexander Afanasyevcf490552016-06-27 22:51:36 -0700794 shared_ptr<Face> face;
795 BOOST_REQUIRE_NO_THROW(face = make_shared<Face>());
796 BOOST_CHECK(dynamic_pointer_cast<UnixTransport>(face->getTransport()) != nullptr);
797}
798
799BOOST_FIXTURE_TEST_CASE_TEMPLATE(Tcp, T, ConfigOptions, T)
800{
801 this->configure("tcp://127.0.0.1:6000");
802
803 shared_ptr<Face> face;
804 BOOST_REQUIRE_NO_THROW(face = make_shared<Face>());
805 BOOST_CHECK(dynamic_pointer_cast<TcpTransport>(face->getTransport()) != nullptr);
806}
807
808BOOST_FIXTURE_TEST_CASE_TEMPLATE(WrongTransport, T, ConfigOptions, T)
809{
810 this->configure("wrong-transport:");
811
812 BOOST_CHECK_THROW(make_shared<Face>(), ConfigFile::Error);
813}
814
815BOOST_FIXTURE_TEST_CASE_TEMPLATE(WrongUri, T, ConfigOptions, T)
816{
817 this->configure("wrong-uri");
818
819 BOOST_CHECK_THROW(make_shared<Face>(), ConfigFile::Error);
820}
821
822BOOST_FIXTURE_TEST_CASE(EnvOverride, WithEnvAndConfig)
823{
824 this->WithEnv::configure("tcp://127.0.0.1:6000");
825 this->WithConfig::configure("unix://some/path");
826
827 shared_ptr<Face> face;
828 BOOST_REQUIRE_NO_THROW(face = make_shared<Face>());
829 BOOST_CHECK(dynamic_pointer_cast<TcpTransport>(face->getTransport()) != nullptr);
830}
831
832BOOST_FIXTURE_TEST_CASE(ExplicitTransport, WithEnvAndConfig)
833{
834 this->WithEnv::configure("wrong-uri");
835 this->WithConfig::configure("wrong-transport:");
836
837 auto transport = make_shared<UnixTransport>("unix://some/path");
838 shared_ptr<Face> face;
839 BOOST_REQUIRE_NO_THROW(face = make_shared<Face>(transport));
840 BOOST_CHECK(dynamic_pointer_cast<UnixTransport>(face->getTransport()) != nullptr);
841}
842
Junxiao Shiae0b4182016-08-08 22:53:17 +0000843BOOST_AUTO_TEST_SUITE_END() // Transport
844
Alexander Afanasyev57e00362016-06-23 13:22:54 -0700845BOOST_AUTO_TEST_SUITE_END() // TestFace
846
847} // namespace tests
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400848} // namespace ndn