blob: 799a562df002843c7468ebd4781abe713804fe1c [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev20d2c582014-01-26 15:32:51 -08002/**
Alexander Afanasyev4c9a3d52017-01-03 17:45:19 -08003 * Copyright (c) 2013-2017 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * 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.
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080020 */
21
Alexander Afanasyeve6c65e22015-01-28 19:56:03 -080022#define BOOST_TEST_MAIN 1
23#define BOOST_TEST_DYN_LINK 1
24#define BOOST_TEST_MODULE ndn-cxx Integrated Tests (Face)
25
Alexander Afanasyev09c613f2014-01-29 00:23:58 -080026#include "face.hpp"
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -080027#include "util/scheduler.hpp"
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080028
Yingdi Yu41546342014-11-30 23:37:53 -080029#include "identity-management-fixture.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070030#include "boost-test.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070031#include "key-chain-fixture.hpp"
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070032
Junxiao Shicf9c6bb2016-07-27 02:18:19 +000033#include <stdio.h>
34
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -080035namespace ndn {
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -040036namespace tests {
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080037
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070038struct PibDirWithDefaultTpm
39{
40 const std::string PATH = "build/keys-with-default-tpm";
41};
42
43class FacesFixture : public IdentityManagementFixture,
44 public PibDirFixture<PibDirWithDefaultTpm>
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080045{
Alexander Afanasyev90164962014-03-06 08:29:59 +000046public:
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080047 FacesFixture()
Alexander Afanasyev90164962014-03-06 08:29:59 +000048 : nData(0)
Eric Newberry06690612016-12-27 12:50:15 -070049 , nNacks(0)
Alexander Afanasyev90164962014-03-06 08:29:59 +000050 , nTimeouts(0)
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -080051 , regPrefixId(0)
Alexander Afanasyev90164962014-03-06 08:29:59 +000052 , nInInterests(0)
53 , nInInterests2(0)
54 , nRegFailures(0)
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080055 {
56 }
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070057
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080058 void
59 onData()
60 {
Alexander Afanasyev90164962014-03-06 08:29:59 +000061 ++nData;
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080062 }
63
64 void
Eric Newberry06690612016-12-27 12:50:15 -070065 onNack()
66 {
67 ++nNacks;
68 }
69
70 void
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080071 onTimeout()
72 {
Alexander Afanasyev90164962014-03-06 08:29:59 +000073 ++nTimeouts;
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080074 }
75
76 void
Alexander Afanasyev90164962014-03-06 08:29:59 +000077 onInterest(Face& face,
78 const Name&, const Interest&)
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080079 {
Alexander Afanasyev90164962014-03-06 08:29:59 +000080 ++nInInterests;
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -080081
82 face.unsetInterestFilter(regPrefixId);
Alexander Afanasyev20d2c582014-01-26 15:32:51 -080083 }
84
85 void
Alexander Afanasyev90164962014-03-06 08:29:59 +000086 onInterest2(Face& face,
87 const Name&, const Interest&)
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -080088 {
Alexander Afanasyev90164962014-03-06 08:29:59 +000089 ++nInInterests2;
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -080090
91 face.unsetInterestFilter(regPrefixId2);
92 }
93
94 void
Alexander Afanasyev90164962014-03-06 08:29:59 +000095 onInterestRegex(Face& face,
96 const InterestFilter&, const Interest&)
97 {
98 ++nInInterests;
99 }
100
101 void
102 onInterestRegexError(Face& face,
103 const Name&, const Interest&)
104 {
105 BOOST_FAIL("InterestFilter::Error should have been triggered");
106 }
107
108 void
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800109 onRegFailed()
110 {
Alexander Afanasyev90164962014-03-06 08:29:59 +0000111 ++nRegFailures;
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800112 }
113
114 void
115 expressInterest(Face& face, const Name& name)
116 {
117 Interest i(name);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700118 i.setInterestLifetime(time::milliseconds(50));
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800119 face.expressInterest(i,
120 bind(&FacesFixture::onData, this),
Eric Newberry06690612016-12-27 12:50:15 -0700121 bind(&FacesFixture::onNack, this),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800122 bind(&FacesFixture::onTimeout, this));
123 }
124
125 void
126 terminate(Face& face)
127 {
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800128 face.getIoService().stop();
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800129 }
130
Alexander Afanasyev90164962014-03-06 08:29:59 +0000131 uint32_t nData;
Eric Newberry06690612016-12-27 12:50:15 -0700132 uint32_t nNacks;
Alexander Afanasyev90164962014-03-06 08:29:59 +0000133 uint32_t nTimeouts;
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800134
135 const RegisteredPrefixId* regPrefixId;
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800136 const RegisteredPrefixId* regPrefixId2;
Alexander Afanasyev90164962014-03-06 08:29:59 +0000137 uint32_t nInInterests;
138 uint32_t nInInterests2;
139 uint32_t nRegFailures;
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800140};
141
Alexander Afanasyev90164962014-03-06 08:29:59 +0000142BOOST_FIXTURE_TEST_SUITE(TestFaces, FacesFixture)
143
144BOOST_AUTO_TEST_CASE(Unix)
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800145{
146 Face face;
147
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700148 face.expressInterest(Interest("/", time::milliseconds(1000)),
149 bind(&FacesFixture::onData, this),
Eric Newberry06690612016-12-27 12:50:15 -0700150 bind(&FacesFixture::onNack, this),
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700151 bind(&FacesFixture::onTimeout, this));
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800152
153 BOOST_REQUIRE_NO_THROW(face.processEvents());
154
Alexander Afanasyev90164962014-03-06 08:29:59 +0000155 BOOST_CHECK_EQUAL(nData, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700156 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000157 BOOST_CHECK_EQUAL(nTimeouts, 0);
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800158
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700159 face.expressInterest(Interest("/localhost/non-existing/data/should/not/exist/anywhere",
160 time::milliseconds(50)),
161 bind(&FacesFixture::onData, this),
Eric Newberry06690612016-12-27 12:50:15 -0700162 bind(&FacesFixture::onNack, this),
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700163 bind(&FacesFixture::onTimeout, this));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700164
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700165 Name veryLongName;
Eric Newberry06690612016-12-27 12:50:15 -0700166 for (size_t i = 0; i <= MAX_NDN_PACKET_SIZE / 10; i++) {
167 veryLongName.append("0123456789");
168 }
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700169
Eric Newberry06690612016-12-27 12:50:15 -0700170 BOOST_CHECK_THROW(face.expressInterest(veryLongName, nullptr, nullptr, nullptr), Face::Error);
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700171
172 shared_ptr<Data> data = make_shared<Data>(veryLongName);
173 data->setContent(reinterpret_cast<const uint8_t*>("01234567890"), 10);
Yingdi Yu41546342014-11-30 23:37:53 -0800174 m_keyChain.sign(*data);
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700175 BOOST_CHECK_THROW(face.put(*data), Face::Error);
176
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800177 BOOST_REQUIRE_NO_THROW(face.processEvents());
178
Alexander Afanasyev90164962014-03-06 08:29:59 +0000179 BOOST_CHECK_EQUAL(nData, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700180 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000181 BOOST_CHECK_EQUAL(nTimeouts, 1);
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800182}
183
Alexander Afanasyev90164962014-03-06 08:29:59 +0000184BOOST_AUTO_TEST_CASE(Tcp)
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800185{
186 Face face("localhost");
187
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700188 face.expressInterest(Interest("/", time::milliseconds(1000)),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800189 bind(&FacesFixture::onData, this),
Eric Newberry06690612016-12-27 12:50:15 -0700190 bind(&FacesFixture::onNack, this),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800191 bind(&FacesFixture::onTimeout, this));
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800192
193 BOOST_REQUIRE_NO_THROW(face.processEvents());
194
Alexander Afanasyev90164962014-03-06 08:29:59 +0000195 BOOST_CHECK_EQUAL(nData, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700196 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000197 BOOST_CHECK_EQUAL(nTimeouts, 0);
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800198
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700199 face.expressInterest(Interest("/localhost/non-existing/data/should/not/exist/anywhere",
200 time::milliseconds(50)),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800201 bind(&FacesFixture::onData, this),
Eric Newberry06690612016-12-27 12:50:15 -0700202 bind(&FacesFixture::onNack, this),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800203 bind(&FacesFixture::onTimeout, this));
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800204
205 BOOST_REQUIRE_NO_THROW(face.processEvents());
206
Alexander Afanasyev90164962014-03-06 08:29:59 +0000207 BOOST_CHECK_EQUAL(nData, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700208 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000209 BOOST_CHECK_EQUAL(nTimeouts, 1);
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800210}
211
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800212
Alexander Afanasyev90164962014-03-06 08:29:59 +0000213BOOST_AUTO_TEST_CASE(SetFilter)
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800214{
215 Face face;
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700216 Face face2(face.getIoService());
217 Scheduler scheduler(face.getIoService());
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800218 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700219 bind(&FacesFixture::terminate, this, ref(face)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700220
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800221 regPrefixId = face.setInterestFilter("/Hello/World",
Alexander Afanasyev90164962014-03-06 08:29:59 +0000222 bind(&FacesFixture::onInterest, this, ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700223 nullptr,
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800224 bind(&FacesFixture::onRegFailed, this));
225
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700226 scheduler.scheduleEvent(time::milliseconds(200),
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800227 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700228 ref(face2), Name("/Hello/World/!")));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700229
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800230 BOOST_REQUIRE_NO_THROW(face.processEvents());
231
Alexander Afanasyev90164962014-03-06 08:29:59 +0000232 BOOST_CHECK_EQUAL(nRegFailures, 0);
233 BOOST_CHECK_EQUAL(nInInterests, 1);
234 BOOST_CHECK_EQUAL(nTimeouts, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700235 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000236 BOOST_CHECK_EQUAL(nData, 0);
Alexander Afanasyevbf9671d2014-02-11 13:44:13 -0800237}
238
Alexander Afanasyev90164962014-03-06 08:29:59 +0000239BOOST_AUTO_TEST_CASE(SetTwoFilters)
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800240{
241 Face face;
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700242 Face face2(face.getIoService());
243 Scheduler scheduler(face.getIoService());
Eric Newberry06690612016-12-27 12:50:15 -0700244 scheduler.scheduleEvent(time::seconds(6),
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700245 bind(&FacesFixture::terminate, this, ref(face)));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700246
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800247 regPrefixId = face.setInterestFilter("/Hello/World",
Alexander Afanasyev90164962014-03-06 08:29:59 +0000248 bind(&FacesFixture::onInterest, this, ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700249 nullptr,
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800250 bind(&FacesFixture::onRegFailed, this));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700251
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800252 regPrefixId2 = face.setInterestFilter("/Los/Angeles/Lakers",
Alexander Afanasyev90164962014-03-06 08:29:59 +0000253 bind(&FacesFixture::onInterest2, this, ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700254 nullptr,
Alexander Afanasyev90164962014-03-06 08:29:59 +0000255 bind(&FacesFixture::onRegFailed, this));
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800256
257
Eric Newberry06690612016-12-27 12:50:15 -0700258 scheduler.scheduleEvent(time::seconds(2),
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800259 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyevb67090a2014-04-29 22:31:01 -0700260 ref(face2), Name("/Hello/World/!")));
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -0700261
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800262 BOOST_REQUIRE_NO_THROW(face.processEvents());
263
Alexander Afanasyev90164962014-03-06 08:29:59 +0000264 BOOST_CHECK_EQUAL(nRegFailures, 0);
265 BOOST_CHECK_EQUAL(nInInterests, 1);
266 BOOST_CHECK_EQUAL(nInInterests2, 0);
267 BOOST_CHECK_EQUAL(nTimeouts, 1);
Eric Newberry06690612016-12-27 12:50:15 -0700268 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000269 BOOST_CHECK_EQUAL(nData, 0);
Alexander Afanasyeva68aa7f2014-02-11 15:42:33 -0800270}
271
Alexander Afanasyev90164962014-03-06 08:29:59 +0000272BOOST_AUTO_TEST_CASE(SetRegexFilterError)
273{
274 Face face;
275 Face face2(face.getIoService());
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700276 Scheduler scheduler(face.getIoService());
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800277 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyev90164962014-03-06 08:29:59 +0000278 bind(&FacesFixture::terminate, this, ref(face)));
279
280 regPrefixId = face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
281 bind(&FacesFixture::onInterestRegexError, this,
282 ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700283 nullptr,
Alexander Afanasyev90164962014-03-06 08:29:59 +0000284 bind(&FacesFixture::onRegFailed, this));
285
286 scheduler.scheduleEvent(time::milliseconds(300),
287 bind(&FacesFixture::expressInterest, this,
288 ref(face2), Name("/Hello/World/XXX/b/c"))); // should match
289
290 BOOST_REQUIRE_THROW(face.processEvents(), InterestFilter::Error);
291}
292
293BOOST_AUTO_TEST_CASE(SetRegexFilter)
294{
295 Face face;
296 Face face2(face.getIoService());
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700297 Scheduler scheduler(face.getIoService());
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800298 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyev90164962014-03-06 08:29:59 +0000299 bind(&FacesFixture::terminate, this, ref(face)));
300
301 regPrefixId = face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
302 bind(&FacesFixture::onInterestRegex, this,
303 ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700304 nullptr,
Alexander Afanasyev90164962014-03-06 08:29:59 +0000305 bind(&FacesFixture::onRegFailed, this));
306
307 scheduler.scheduleEvent(time::milliseconds(200),
308 bind(&FacesFixture::expressInterest, this,
309 ref(face2), Name("/Hello/World/a"))); // shouldn't match
310
311 scheduler.scheduleEvent(time::milliseconds(300),
312 bind(&FacesFixture::expressInterest, this,
313 ref(face2), Name("/Hello/World/a/b"))); // should match
314
315 scheduler.scheduleEvent(time::milliseconds(400),
316 bind(&FacesFixture::expressInterest, this,
317 ref(face2), Name("/Hello/World/a/b/c"))); // should match
318
319 scheduler.scheduleEvent(time::milliseconds(500),
320 bind(&FacesFixture::expressInterest, this,
321 ref(face2), Name("/Hello/World/a/b/d"))); // should not match
322
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700323 BOOST_REQUIRE_NO_THROW(face.processEvents());
Alexander Afanasyev90164962014-03-06 08:29:59 +0000324
325 BOOST_CHECK_EQUAL(nRegFailures, 0);
326 BOOST_CHECK_EQUAL(nInInterests, 2);
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700327 BOOST_CHECK_EQUAL(nTimeouts, 4);
Eric Newberry06690612016-12-27 12:50:15 -0700328 BOOST_CHECK_EQUAL(nNacks, 0);
Alexander Afanasyev90164962014-03-06 08:29:59 +0000329 BOOST_CHECK_EQUAL(nData, 0);
330}
331
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700332class FacesFixture2 : public FacesFixture
333{
334public:
335 void
Junxiao Shicf9c6bb2016-07-27 02:18:19 +0000336 checkPrefix(bool shouldExist)
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700337 {
Junxiao Shicf9c6bb2016-07-27 02:18:19 +0000338 // Boost.Test fails if a child process exits with non-zero.
339 // http://stackoverflow.com/q/5325202
Eric Newberry06690612016-12-27 12:50:15 -0700340 std::string output = this->executeCommand("nfdc route list | grep /Hello/World || true");
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700341
Junxiao Shicf9c6bb2016-07-27 02:18:19 +0000342 if (shouldExist) {
343 BOOST_CHECK_NE(output.size(), 0);
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700344 }
345 else {
Junxiao Shicf9c6bb2016-07-27 02:18:19 +0000346 BOOST_CHECK_EQUAL(output.size(), 0);
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700347 }
348 }
Junxiao Shicf9c6bb2016-07-27 02:18:19 +0000349
350protected:
351 std::string
352 executeCommand(const std::string& cmd)
353 {
354 std::string output;
355 char buf[256];
356 FILE* pipe = popen(cmd.c_str(), "r");
357 BOOST_REQUIRE_MESSAGE(pipe != nullptr, "cannot execute '" << cmd << "'");
358 while (fgets(buf, sizeof(buf), pipe) != nullptr) {
359 output += buf;
360 }
361 pclose(pipe);
362 return output;
363 }
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700364};
365
366BOOST_FIXTURE_TEST_CASE(RegisterUnregisterPrefix, FacesFixture2)
367{
368 Face face;
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700369 Scheduler scheduler(face.getIoService());
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800370 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700371 bind(&FacesFixture::terminate, this, ref(face)));
372
373 regPrefixId = face.setInterestFilter(InterestFilter("/Hello/World"),
374 bind(&FacesFixture::onInterest, this,
375 ref(face), _1, _2),
Eric Newberry06690612016-12-27 12:50:15 -0700376 nullptr,
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700377 bind(&FacesFixture::onRegFailed, this));
378
379 scheduler.scheduleEvent(time::milliseconds(500),
380 bind(&FacesFixture2::checkPrefix, this, true));
381
382 scheduler.scheduleEvent(time::seconds(1),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700383 bind(static_cast<void(Face::*)(const RegisteredPrefixId*)>(&Face::unsetInterestFilter),
384 &face,
385 regPrefixId)); // shouldn't match
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700386
Alexander Afanasyev9d158f02015-02-17 21:30:19 -0800387 scheduler.scheduleEvent(time::milliseconds(2000),
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700388 bind(&FacesFixture2::checkPrefix, this, false));
389
390 BOOST_REQUIRE_NO_THROW(face.processEvents());
391}
Alexander Afanasyev90164962014-03-06 08:29:59 +0000392
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700393
394class FacesFixture3 : public FacesFixture2
395{
396public:
397 FacesFixture3()
398 : nRegSuccesses(0)
399 , nUnregSuccesses(0)
400 , nUnregFailures(0)
401 {
402 }
403
404 void
405 onRegSucceeded()
406 {
407 ++nRegSuccesses;
408 }
409
410 void
411 onUnregSucceeded()
412 {
413 ++nUnregSuccesses;
414 }
415
416 void
417 onUnregFailed()
418 {
419 ++nUnregFailures;
420 }
421
422public:
423 uint64_t nRegSuccesses;
424 uint64_t nUnregSuccesses;
425 uint64_t nUnregFailures;
426};
427
428BOOST_FIXTURE_TEST_CASE(RegisterPrefix, FacesFixture3)
429{
430 Face face;
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700431 Face face2(face.getIoService());
432 Scheduler scheduler(face.getIoService());
Eric Newberry06690612016-12-27 12:50:15 -0700433 scheduler.scheduleEvent(time::seconds(6),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700434 bind(&FacesFixture::terminate, this, ref(face)));
435
Eric Newberry06690612016-12-27 12:50:15 -0700436 scheduler.scheduleEvent(time::seconds(2),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700437 bind(&FacesFixture2::checkPrefix, this, true));
438
439 regPrefixId = face.registerPrefix("/Hello/World",
440 bind(&FacesFixture3::onRegSucceeded, this),
441 bind(&FacesFixture3::onRegFailed, this));
442
Eric Newberry06690612016-12-27 12:50:15 -0700443 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700444 bind(&Face::unregisterPrefix, &face,
445 regPrefixId,
446 static_cast<UnregisterPrefixSuccessCallback>(bind(&FacesFixture3::onUnregSucceeded, this)),
447 static_cast<UnregisterPrefixFailureCallback>(bind(&FacesFixture3::onUnregFailed, this))));
448
Eric Newberry06690612016-12-27 12:50:15 -0700449 scheduler.scheduleEvent(time::milliseconds(6500),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700450 bind(&FacesFixture2::checkPrefix, this, false));
451
452 BOOST_REQUIRE_NO_THROW(face.processEvents());
453
454 BOOST_CHECK_EQUAL(nRegFailures, 0);
455 BOOST_CHECK_EQUAL(nRegSuccesses, 1);
456
457 BOOST_CHECK_EQUAL(nUnregFailures, 0);
458 BOOST_CHECK_EQUAL(nUnregSuccesses, 1);
459}
460
461BOOST_AUTO_TEST_CASE(SetRegexFilterButNoRegister)
462{
463 Face face;
464 Face face2(face.getIoService());
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700465 Scheduler scheduler(face.getIoService());
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700466 scheduler.scheduleEvent(time::seconds(2),
467 bind(&FacesFixture::terminate, this, ref(face)));
468
469 face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
470 bind(&FacesFixture::onInterestRegex, this,
471 ref(face), _1, _2));
472
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700473 // prefix is not registered, and also does not match regex
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700474 scheduler.scheduleEvent(time::milliseconds(200),
475 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700476 ref(face2), Name("/Hello/World/a")));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700477
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700478 // matches regex, but prefix is not registered
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700479 scheduler.scheduleEvent(time::milliseconds(300),
480 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700481 ref(face2), Name("/Hello/World/a/b")));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700482
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700483 // matches regex, but prefix is not registered
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700484 scheduler.scheduleEvent(time::milliseconds(400),
485 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700486 ref(face2), Name("/Hello/World/a/b/c")));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700487
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700488 // prefix is not registered, and also does not match regex
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700489 scheduler.scheduleEvent(time::milliseconds(500),
490 bind(&FacesFixture::expressInterest, this,
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700491 ref(face2), Name("/Hello/World/a/b/d")));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700492
493 BOOST_REQUIRE_NO_THROW(face.processEvents());
494
495 BOOST_CHECK_EQUAL(nRegFailures, 0);
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700496 BOOST_CHECK_EQUAL(nInInterests, 0);
Eric Newberry06690612016-12-27 12:50:15 -0700497 BOOST_CHECK_EQUAL(nTimeouts, 0);
498 BOOST_CHECK_EQUAL(nNacks, 4);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700499 BOOST_CHECK_EQUAL(nData, 0);
500}
501
502
503BOOST_FIXTURE_TEST_CASE(SetRegexFilterAndRegister, FacesFixture3)
504{
505 Face face;
506 Face face2(face.getIoService());
Alexander Afanasyev9c578182014-05-14 17:28:28 -0700507 Scheduler scheduler(face.getIoService());
Eric Newberry06690612016-12-27 12:50:15 -0700508 scheduler.scheduleEvent(time::seconds(4),
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700509 bind(&FacesFixture::terminate, this, ref(face)));
510
511 face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
512 bind(&FacesFixture::onInterestRegex, this,
513 ref(face), _1, _2));
514
515 face.registerPrefix("/Hello/World",
516 bind(&FacesFixture3::onRegSucceeded, this),
517 bind(&FacesFixture3::onRegFailed, this));
518
519 scheduler.scheduleEvent(time::milliseconds(200),
520 bind(&FacesFixture::expressInterest, this,
521 ref(face2), Name("/Hello/World/a"))); // shouldn't match
522
523 scheduler.scheduleEvent(time::milliseconds(300),
524 bind(&FacesFixture::expressInterest, this,
525 ref(face2), Name("/Hello/World/a/b"))); // should match
526
527 scheduler.scheduleEvent(time::milliseconds(400),
528 bind(&FacesFixture::expressInterest, this,
529 ref(face2), Name("/Hello/World/a/b/c"))); // should match
530
531 scheduler.scheduleEvent(time::milliseconds(500),
532 bind(&FacesFixture::expressInterest, this,
533 ref(face2), Name("/Hello/World/a/b/d"))); // should not match
534
535 BOOST_REQUIRE_NO_THROW(face.processEvents());
536
537 BOOST_CHECK_EQUAL(nRegFailures, 0);
538 BOOST_CHECK_EQUAL(nRegSuccesses, 1);
539
540 BOOST_CHECK_EQUAL(nInInterests, 2);
541 BOOST_CHECK_EQUAL(nTimeouts, 4);
Eric Newberry06690612016-12-27 12:50:15 -0700542 BOOST_CHECK_EQUAL(nNacks, 0);
543 BOOST_CHECK_EQUAL(nData, 0);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700544}
Alexander Afanasyev5fc795f2014-10-20 23:06:56 -0400545
Alexander Afanasyevfba1ac62015-08-26 15:19:13 -0700546BOOST_AUTO_TEST_CASE(ShutdownWhileSendInProgress) // Bug #3136
547{
548 Face face;
Eric Newberry06690612016-12-27 12:50:15 -0700549 face.expressInterest(Name("/Hello/World/!"), nullptr, nullptr, nullptr);
Alexander Afanasyevfba1ac62015-08-26 15:19:13 -0700550 BOOST_REQUIRE_NO_THROW(face.processEvents(time::seconds(1)));
551
Eric Newberry06690612016-12-27 12:50:15 -0700552 face.expressInterest(Name("/Bye/World/1"), nullptr, nullptr, nullptr);
553 face.expressInterest(Name("/Bye/World/2"), nullptr, nullptr, nullptr);
554 face.expressInterest(Name("/Bye/World/3"), nullptr, nullptr, nullptr);
Alexander Afanasyevfba1ac62015-08-26 15:19:13 -0700555 face.shutdown();
556
557 BOOST_REQUIRE_NO_THROW(face.processEvents(time::seconds(1)));
558 // should not segfault
559}
560
Alexander Afanasyeve508f142015-09-01 15:14:45 -0700561BOOST_AUTO_TEST_CASE(LargeDelayBetweenFaceConstructorAndProcessEvents) // Bug #2742
562{
563 ndn::Face face;
564
565 ::sleep(5); // simulate setup workload
566
567 BOOST_CHECK_NO_THROW(face.processEvents(time::seconds(1)));
568}
569
Alexander Afanasyev20d2c582014-01-26 15:32:51 -0800570BOOST_AUTO_TEST_SUITE_END()
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800571
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700572} // namespace tests
Alexander Afanasyev0abb2da2014-01-30 18:07:57 -0800573} // namespace ndn