blob: dd02becb7fd62716e7b14b47afcb355bee9e8cc6 [file] [log] [blame]
Junxiao Shicbba04c2014-01-26 14:21:22 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev319f2c82015-01-07 14:56:53 -08003 * 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.
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070010 *
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/>.
Alexander Afanasyevc026d252014-06-16 11:14:15 -070024 */
Junxiao Shicbba04c2014-01-26 14:21:22 -070025
26#include "table/pit.hpp"
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070027#include "tests/daemon/face/dummy-face.hpp"
Junxiao Shicbba04c2014-01-26 14:21:22 -070028
Junxiao Shid9ee45c2014-02-27 15:38:11 -070029#include "tests/test-common.hpp"
Junxiao Shicbba04c2014-01-26 14:21:22 -070030
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080031namespace nfd {
Spyridon Mastorakisd0381c02015-02-19 10:29:41 -080032namespace pit {
Junxiao Shid9ee45c2014-02-27 15:38:11 -070033namespace tests {
Junxiao Shicbba04c2014-01-26 14:21:22 -070034
Spyridon Mastorakisd0381c02015-02-19 10:29:41 -080035using namespace nfd::tests;
36
Junxiao Shi5e5e4452015-09-24 16:56:52 -070037BOOST_AUTO_TEST_SUITE(Table)
38BOOST_FIXTURE_TEST_SUITE(TestPit, BaseFixture)
Junxiao Shicbba04c2014-01-26 14:21:22 -070039
Junxiao Shi5e5e4452015-09-24 16:56:52 -070040BOOST_AUTO_TEST_SUITE(PitEntry)
41
42BOOST_AUTO_TEST_CASE(InOutRecords)
Junxiao Shicbba04c2014-01-26 14:21:22 -070043{
Junxiao Shi8c8d2182014-01-30 22:33:00 -070044 shared_ptr<Face> face1 = make_shared<DummyFace>();
45 shared_ptr<Face> face2 = make_shared<DummyFace>();
Junxiao Shicbba04c2014-01-26 14:21:22 -070046 Name name("ndn:/KuYfjtRq");
Junxiao Shif3c07812014-03-11 21:48:49 -070047 shared_ptr<Interest> interest = makeInterest(name);
48 shared_ptr<Interest> interest1 = makeInterest(name);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070049 interest1->setInterestLifetime(time::milliseconds(2528));
Junxiao Shif3c07812014-03-11 21:48:49 -070050 interest1->setNonce(25559);
51 shared_ptr<Interest> interest2 = makeInterest(name);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070052 interest2->setInterestLifetime(time::milliseconds(6464));
Junxiao Shif3c07812014-03-11 21:48:49 -070053 interest2->setNonce(19004);
54 shared_ptr<Interest> interest3 = makeInterest(name);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070055 interest3->setInterestLifetime(time::milliseconds(3585));
Junxiao Shif3c07812014-03-11 21:48:49 -070056 interest3->setNonce(24216);
57 shared_ptr<Interest> interest4 = makeInterest(name);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070058 interest4->setInterestLifetime(time::milliseconds(8795));
Junxiao Shif3c07812014-03-11 21:48:49 -070059 interest4->setNonce(17365);
Junxiao Shi57f0f312014-03-16 11:52:20 -070060
Junxiao Shif3c07812014-03-11 21:48:49 -070061 pit::Entry entry(*interest);
Junxiao Shi57f0f312014-03-16 11:52:20 -070062
Junxiao Shif3c07812014-03-11 21:48:49 -070063 BOOST_CHECK_EQUAL(entry.getInterest().getName(), name);
64 BOOST_CHECK_EQUAL(entry.getName(), name);
Haowei Yuan78c84d12014-02-27 15:35:13 -060065
Junxiao Shicbba04c2014-01-26 14:21:22 -070066 const pit::InRecordCollection& inRecords1 = entry.getInRecords();
67 BOOST_CHECK_EQUAL(inRecords1.size(), 0);
68 const pit::OutRecordCollection& outRecords1 = entry.getOutRecords();
69 BOOST_CHECK_EQUAL(outRecords1.size(), 0);
Junxiao Shi57f0f312014-03-16 11:52:20 -070070
Junxiao Shicbba04c2014-01-26 14:21:22 -070071 // insert InRecord
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070072 time::steady_clock::TimePoint before1 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -070073 pit::InRecordCollection::iterator in1 =
Junxiao Shif3c07812014-03-11 21:48:49 -070074 entry.insertOrUpdateInRecord(face1, *interest1);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070075 time::steady_clock::TimePoint after1 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -070076 const pit::InRecordCollection& inRecords2 = entry.getInRecords();
77 BOOST_CHECK_EQUAL(inRecords2.size(), 1);
78 BOOST_CHECK(in1 == inRecords2.begin());
79 BOOST_CHECK_EQUAL(in1->getFace(), face1);
Junxiao Shif3c07812014-03-11 21:48:49 -070080 BOOST_CHECK_EQUAL(in1->getLastNonce(), interest1->getNonce());
Junxiao Shicbba04c2014-01-26 14:21:22 -070081 BOOST_CHECK_GE(in1->getLastRenewed(), before1);
82 BOOST_CHECK_LE(in1->getLastRenewed(), after1);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070083 BOOST_CHECK_LE(in1->getExpiry() - in1->getLastRenewed()
84 - interest1->getInterestLifetime(),
85 (after1 - before1));
Junxiao Shib2bcbcd2014-11-08 09:30:28 -070086 BOOST_CHECK(in1 == entry.getInRecord(*face1));
Junxiao Shi57f0f312014-03-16 11:52:20 -070087
Junxiao Shicbba04c2014-01-26 14:21:22 -070088 // insert OutRecord
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070089 time::steady_clock::TimePoint before2 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -070090 pit::OutRecordCollection::iterator out1 =
Junxiao Shif3c07812014-03-11 21:48:49 -070091 entry.insertOrUpdateOutRecord(face1, *interest1);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -070092 time::steady_clock::TimePoint after2 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -070093 const pit::OutRecordCollection& outRecords2 = entry.getOutRecords();
94 BOOST_CHECK_EQUAL(outRecords2.size(), 1);
95 BOOST_CHECK(out1 == outRecords2.begin());
96 BOOST_CHECK_EQUAL(out1->getFace(), face1);
Junxiao Shif3c07812014-03-11 21:48:49 -070097 BOOST_CHECK_EQUAL(out1->getLastNonce(), interest1->getNonce());
Junxiao Shicbba04c2014-01-26 14:21:22 -070098 BOOST_CHECK_GE(out1->getLastRenewed(), before2);
99 BOOST_CHECK_LE(out1->getLastRenewed(), after2);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700100 BOOST_CHECK_LE(out1->getExpiry() - out1->getLastRenewed()
101 - interest1->getInterestLifetime(),
102 (after2 - before2));
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700103 BOOST_CHECK(out1 == entry.getOutRecord(*face1));
Junxiao Shi57f0f312014-03-16 11:52:20 -0700104
Junxiao Shicbba04c2014-01-26 14:21:22 -0700105 // update InRecord
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700106 time::steady_clock::TimePoint before3 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -0700107 pit::InRecordCollection::iterator in2 =
Junxiao Shif3c07812014-03-11 21:48:49 -0700108 entry.insertOrUpdateInRecord(face1, *interest2);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700109 time::steady_clock::TimePoint after3 = time::steady_clock::now();
Junxiao Shicbba04c2014-01-26 14:21:22 -0700110 const pit::InRecordCollection& inRecords3 = entry.getInRecords();
111 BOOST_CHECK_EQUAL(inRecords3.size(), 1);
112 BOOST_CHECK(in2 == inRecords3.begin());
113 BOOST_CHECK_EQUAL(in2->getFace(), face1);
Junxiao Shif3c07812014-03-11 21:48:49 -0700114 BOOST_CHECK_EQUAL(in2->getLastNonce(), interest2->getNonce());
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700115 BOOST_CHECK_LE(in2->getExpiry() - in2->getLastRenewed()
116 - interest2->getInterestLifetime(),
117 (after3 - before3));
Junxiao Shicbba04c2014-01-26 14:21:22 -0700118
Junxiao Shicbba04c2014-01-26 14:21:22 -0700119 // insert another InRecord
120 pit::InRecordCollection::iterator in3 =
Junxiao Shif3c07812014-03-11 21:48:49 -0700121 entry.insertOrUpdateInRecord(face2, *interest3);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700122 const pit::InRecordCollection& inRecords4 = entry.getInRecords();
123 BOOST_CHECK_EQUAL(inRecords4.size(), 2);
124 BOOST_CHECK_EQUAL(in3->getFace(), face2);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700125
Junxiao Shi66f91f82014-05-10 17:28:58 -0700126 // get InRecord
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700127 pit::InRecordCollection::const_iterator in4 = entry.getInRecord(*face1);
Junxiao Shi66f91f82014-05-10 17:28:58 -0700128 BOOST_REQUIRE(in4 != entry.getInRecords().end());
129 BOOST_CHECK_EQUAL(in4->getFace(), face1);
130
Junxiao Shicbba04c2014-01-26 14:21:22 -0700131 // delete all InRecords
132 entry.deleteInRecords();
133 const pit::InRecordCollection& inRecords5 = entry.getInRecords();
134 BOOST_CHECK_EQUAL(inRecords5.size(), 0);
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700135 BOOST_CHECK(entry.getInRecord(*face1) == entry.getInRecords().end());
Junxiao Shicbba04c2014-01-26 14:21:22 -0700136
Junxiao Shicbba04c2014-01-26 14:21:22 -0700137 // insert another OutRecord
138 pit::OutRecordCollection::iterator out2 =
Junxiao Shif3c07812014-03-11 21:48:49 -0700139 entry.insertOrUpdateOutRecord(face2, *interest4);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700140 const pit::OutRecordCollection& outRecords3 = entry.getOutRecords();
141 BOOST_CHECK_EQUAL(outRecords3.size(), 2);
142 BOOST_CHECK_EQUAL(out2->getFace(), face2);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700143
Junxiao Shi66f91f82014-05-10 17:28:58 -0700144 // get OutRecord
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700145 pit::OutRecordCollection::const_iterator out3 = entry.getOutRecord(*face1);
Junxiao Shi66f91f82014-05-10 17:28:58 -0700146 BOOST_REQUIRE(out3 != entry.getOutRecords().end());
147 BOOST_CHECK_EQUAL(out3->getFace(), face1);
148
Junxiao Shicbba04c2014-01-26 14:21:22 -0700149 // delete OutRecord
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700150 entry.deleteOutRecord(*face2);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700151 const pit::OutRecordCollection& outRecords4 = entry.getOutRecords();
152 BOOST_REQUIRE_EQUAL(outRecords4.size(), 1);
153 BOOST_CHECK_EQUAL(outRecords4.begin()->getFace(), face1);
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700154 BOOST_CHECK(entry.getOutRecord(*face2) == entry.getOutRecords().end());
Junxiao Shid3c792f2014-01-30 00:46:13 -0700155}
156
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700157BOOST_AUTO_TEST_CASE(Nonce)
Junxiao Shid3c792f2014-01-30 00:46:13 -0700158{
Junxiao Shia110f262014-10-12 12:35:20 -0700159 shared_ptr<Face> face1 = make_shared<DummyFace>();
160 shared_ptr<Face> face2 = make_shared<DummyFace>();
161
Junxiao Shi57f0f312014-03-16 11:52:20 -0700162 shared_ptr<Interest> interest = makeInterest("ndn:/qtCQ7I1c");
Junxiao Shia110f262014-10-12 12:35:20 -0700163 interest->setNonce(25559);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700164
Junxiao Shia110f262014-10-12 12:35:20 -0700165 pit::Entry entry0(*interest);
166 BOOST_CHECK_EQUAL(entry0.findNonce(25559, *face1), pit::DUPLICATE_NONCE_NONE);
167 BOOST_CHECK_EQUAL(entry0.findNonce(25559, *face2), pit::DUPLICATE_NONCE_NONE);
168 BOOST_CHECK_EQUAL(entry0.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
169 BOOST_CHECK_EQUAL(entry0.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700170
Junxiao Shia110f262014-10-12 12:35:20 -0700171 pit::Entry entry1(*interest);
172 entry1.insertOrUpdateInRecord(face1, *interest);
173 BOOST_CHECK_EQUAL(entry1.findNonce(25559, *face1), pit::DUPLICATE_NONCE_IN_SAME);
174 BOOST_CHECK_EQUAL(entry1.findNonce(25559, *face2), pit::DUPLICATE_NONCE_IN_OTHER);
175 BOOST_CHECK_EQUAL(entry1.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
176 BOOST_CHECK_EQUAL(entry1.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
177
178 pit::Entry entry2(*interest);
179 entry2.insertOrUpdateOutRecord(face1, *interest);
180 BOOST_CHECK_EQUAL(entry2.findNonce(25559, *face1), pit::DUPLICATE_NONCE_OUT_SAME);
181 BOOST_CHECK_EQUAL(entry2.findNonce(25559, *face2), pit::DUPLICATE_NONCE_OUT_OTHER);
182 BOOST_CHECK_EQUAL(entry2.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
183 BOOST_CHECK_EQUAL(entry2.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
184
185 pit::Entry entry3(*interest);
186 entry3.insertOrUpdateInRecord(face1, *interest);
187 entry3.insertOrUpdateOutRecord(face1, *interest);
188 BOOST_CHECK_EQUAL(entry3.findNonce(25559, *face1),
189 pit::DUPLICATE_NONCE_IN_SAME | pit::DUPLICATE_NONCE_OUT_SAME);
190 BOOST_CHECK_EQUAL(entry3.findNonce(25559, *face2),
191 pit::DUPLICATE_NONCE_IN_OTHER | pit::DUPLICATE_NONCE_OUT_OTHER);
192 BOOST_CHECK_EQUAL(entry3.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
193 BOOST_CHECK_EQUAL(entry3.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
194
195 pit::Entry entry4(*interest);
196 entry4.insertOrUpdateInRecord(face1, *interest);
197 entry4.insertOrUpdateInRecord(face2, *interest);
198 BOOST_CHECK_EQUAL(entry4.findNonce(25559, *face1),
199 pit::DUPLICATE_NONCE_IN_SAME | pit::DUPLICATE_NONCE_IN_OTHER);
200 BOOST_CHECK_EQUAL(entry4.findNonce(25559, *face2),
201 pit::DUPLICATE_NONCE_IN_SAME | pit::DUPLICATE_NONCE_IN_OTHER);
202 BOOST_CHECK_EQUAL(entry4.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
203 BOOST_CHECK_EQUAL(entry4.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
204
205 pit::Entry entry5(*interest);
206 entry5.insertOrUpdateOutRecord(face1, *interest);
207 entry5.insertOrUpdateOutRecord(face2, *interest);
208 BOOST_CHECK_EQUAL(entry5.findNonce(25559, *face1),
209 pit::DUPLICATE_NONCE_OUT_SAME | pit::DUPLICATE_NONCE_OUT_OTHER);
210 BOOST_CHECK_EQUAL(entry5.findNonce(25559, *face2),
211 pit::DUPLICATE_NONCE_OUT_SAME | pit::DUPLICATE_NONCE_OUT_OTHER);
212 BOOST_CHECK_EQUAL(entry5.findNonce(19004, *face1), pit::DUPLICATE_NONCE_NONE);
213 BOOST_CHECK_EQUAL(entry5.findNonce(19004, *face2), pit::DUPLICATE_NONCE_NONE);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700214}
215
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700216BOOST_AUTO_TEST_CASE(Lifetime)
Junxiao Shi57f0f312014-03-16 11:52:20 -0700217{
218 shared_ptr<Interest> interest = makeInterest("ndn:/7oIEurbgy6");
Junxiao Shia110f262014-10-12 12:35:20 -0700219 // library uses -1 to indicate unset lifetime
220 BOOST_ASSERT(interest->getInterestLifetime() < time::milliseconds::zero());
Junxiao Shi57f0f312014-03-16 11:52:20 -0700221
222 shared_ptr<Face> face = make_shared<DummyFace>();
223 pit::Entry entry(*interest);
224
225 pit::InRecordCollection::iterator inIt = entry.insertOrUpdateInRecord(face, *interest);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700226 BOOST_CHECK_GT(inIt->getExpiry(), time::steady_clock::now());
Junxiao Shi57f0f312014-03-16 11:52:20 -0700227
228 pit::OutRecordCollection::iterator outIt = entry.insertOrUpdateOutRecord(face, *interest);
Alexander Afanasyeveb3197f2014-03-17 19:28:18 -0700229 BOOST_CHECK_GT(outIt->getExpiry(), time::steady_clock::now());
Junxiao Shi57f0f312014-03-16 11:52:20 -0700230}
231
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700232BOOST_AUTO_TEST_CASE(CanForwardTo)
Junxiao Shi57f0f312014-03-16 11:52:20 -0700233{
234 shared_ptr<Interest> interest = makeInterest("ndn:/WDsuBLIMG");
235 pit::Entry entry(*interest);
236
237 shared_ptr<Face> face1 = make_shared<DummyFace>();
238 shared_ptr<Face> face2 = make_shared<DummyFace>();
239
240 entry.insertOrUpdateInRecord(face1, *interest);
241 BOOST_CHECK_EQUAL(entry.canForwardTo(*face1), false);
242 BOOST_CHECK_EQUAL(entry.canForwardTo(*face2), true);
243
244 entry.insertOrUpdateInRecord(face2, *interest);
245 BOOST_CHECK_EQUAL(entry.canForwardTo(*face1), true);
246 BOOST_CHECK_EQUAL(entry.canForwardTo(*face2), true);
247
248 entry.insertOrUpdateOutRecord(face1, *interest);
249 BOOST_CHECK_EQUAL(entry.canForwardTo(*face1), false);
250 BOOST_CHECK_EQUAL(entry.canForwardTo(*face2), true);
251}
252
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700253BOOST_AUTO_TEST_CASE(OutRecordNack)
254{
255 shared_ptr<Face> face1 = make_shared<DummyFace>();
256 pit::OutRecord outR(face1);
257 BOOST_CHECK(outR.getIncomingNack() == nullptr);
258
259 shared_ptr<Interest> interest1 = makeInterest("ndn:/uWiapGjYL");
260 interest1->setNonce(165);
261 outR.update(*interest1);
262 BOOST_CHECK(outR.getIncomingNack() == nullptr);
263
264 shared_ptr<Interest> interest2 = makeInterest("ndn:/uWiapGjYL");
265 interest2->setNonce(996);
266 lp::Nack nack2(*interest2);
267 nack2.setReason(lp::NackReason::CONGESTION);
268 BOOST_CHECK_EQUAL(outR.setIncomingNack(nack2), false);
269 BOOST_CHECK(outR.getIncomingNack() == nullptr);
270
271 lp::Nack nack1(*interest1);
272 nack1.setReason(lp::NackReason::DUPLICATE);
273 BOOST_CHECK_EQUAL(outR.setIncomingNack(nack1), true);
274 BOOST_REQUIRE(outR.getIncomingNack() != nullptr);
275 BOOST_CHECK_EQUAL(outR.getIncomingNack()->getReason(), lp::NackReason::DUPLICATE);
276
277 outR.clearIncomingNack();
278 BOOST_CHECK(outR.getIncomingNack() == nullptr);
279}
280
281BOOST_AUTO_TEST_SUITE_END() // PitEntry
282
283
Junxiao Shicbba04c2014-01-26 14:21:22 -0700284BOOST_AUTO_TEST_CASE(Insert)
285{
286 Name name1("ndn:/5vzBNnMst");
287 Name name2("ndn:/igSGfEIM62");
Junxiao Shicbba04c2014-01-26 14:21:22 -0700288 Exclude exclude1;
289 exclude1.excludeOne(Name::Component("u26p47oep"));
290 Exclude exclude2;
Junxiao Shi30d35992014-04-03 14:51:58 -0700291 exclude2.excludeBefore(Name::Component("u26p47oep"));
292 ndn::KeyLocator keyLocator1("ndn:/sGAE3peMHA");
293 ndn::KeyLocator keyLocator2("ndn:/nIJH6pr4");
Junxiao Shi57f0f312014-03-16 11:52:20 -0700294
Haowei Yuan78c84d12014-02-27 15:35:13 -0600295 NameTree nameTree(16);
296 Pit pit(nameTree);
Junxiao Shi30d35992014-04-03 14:51:58 -0700297 BOOST_CHECK_EQUAL(pit.size(), 0);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700298 std::pair<shared_ptr<pit::Entry>, bool> insertResult;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700299
Junxiao Shi30d35992014-04-03 14:51:58 -0700300 // base
301 shared_ptr<Interest> interestA = make_shared<Interest>(name1);
302 insertResult = pit.insert(*interestA);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700303 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600304 BOOST_CHECK_EQUAL(pit.size(), 1);
305
Junxiao Shi30d35992014-04-03 14:51:58 -0700306 // A+MinSuffixComponents
307 shared_ptr<Interest> interestB = make_shared<Interest>(*interestA);
308 interestB->setMinSuffixComponents(2);
309 insertResult = pit.insert(*interestB);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700310 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600311 BOOST_CHECK_EQUAL(pit.size(), 2);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700312
Junxiao Shi30d35992014-04-03 14:51:58 -0700313 // A+MaxSuffixComponents
314 shared_ptr<Interest> interestC = make_shared<Interest>(*interestA);
315 interestC->setMaxSuffixComponents(4);
316 insertResult = pit.insert(*interestC);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700317 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600318 BOOST_CHECK_EQUAL(pit.size(), 3);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700319
Junxiao Shi30d35992014-04-03 14:51:58 -0700320 // A+KeyLocator1
321 shared_ptr<Interest> interestD = make_shared<Interest>(*interestA);
322 interestD->setPublisherPublicKeyLocator(keyLocator1);
323 insertResult = pit.insert(*interestD);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700324 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600325 BOOST_CHECK_EQUAL(pit.size(), 4);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700326
Junxiao Shi30d35992014-04-03 14:51:58 -0700327 // A+KeyLocator2
328 shared_ptr<Interest> interestE = make_shared<Interest>(*interestA);
329 interestE->setPublisherPublicKeyLocator(keyLocator2);
330 insertResult = pit.insert(*interestE);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700331 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600332 BOOST_CHECK_EQUAL(pit.size(), 5);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700333
Junxiao Shi30d35992014-04-03 14:51:58 -0700334 // A+Exclude1
335 shared_ptr<Interest> interestF = make_shared<Interest>(*interestA);
336 interestF->setExclude(exclude1);
337 insertResult = pit.insert(*interestF);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700338 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600339 BOOST_CHECK_EQUAL(pit.size(), 6);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700340
Junxiao Shi30d35992014-04-03 14:51:58 -0700341 // A+Exclude2
342 shared_ptr<Interest> interestG = make_shared<Interest>(*interestA);
343 interestG->setExclude(exclude2);
344 insertResult = pit.insert(*interestG);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700345 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600346 BOOST_CHECK_EQUAL(pit.size(), 7);
347
Junxiao Shi30d35992014-04-03 14:51:58 -0700348 // A+ChildSelector0
349 shared_ptr<Interest> interestH = make_shared<Interest>(*interestA);
350 interestH->setChildSelector(0);
351 insertResult = pit.insert(*interestH);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700352 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600353 BOOST_CHECK_EQUAL(pit.size(), 8);
Junxiao Shi30d35992014-04-03 14:51:58 -0700354
355 // A+ChildSelector1
356 shared_ptr<Interest> interestI = make_shared<Interest>(*interestA);
357 interestI->setChildSelector(1);
358 insertResult = pit.insert(*interestI);
359 BOOST_CHECK_EQUAL(insertResult.second, true);
360 BOOST_CHECK_EQUAL(pit.size(), 9);
361
362 // A+MustBeFresh
363 shared_ptr<Interest> interestJ = make_shared<Interest>(*interestA);
364 interestJ->setMustBeFresh(true);
365 insertResult = pit.insert(*interestJ);
366 BOOST_CHECK_EQUAL(insertResult.second, true);
367 BOOST_CHECK_EQUAL(pit.size(), 10);
368
369 // A+InterestLifetime
370 shared_ptr<Interest> interestK = make_shared<Interest>(*interestA);
371 interestK->setInterestLifetime(time::milliseconds(1000));
372 insertResult = pit.insert(*interestK);
373 BOOST_CHECK_EQUAL(insertResult.second, false);// only guiders differ
374 BOOST_CHECK_EQUAL(pit.size(), 10);
375
376 // A+Nonce
377 shared_ptr<Interest> interestL = make_shared<Interest>(*interestA);
378 interestL->setNonce(2192);
379 insertResult = pit.insert(*interestL);
380 BOOST_CHECK_EQUAL(insertResult.second, false);// only guiders differ
381 BOOST_CHECK_EQUAL(pit.size(), 10);
382
383 // different Name+Exclude1
384 shared_ptr<Interest> interestM = make_shared<Interest>(name2);
385 interestM->setExclude(exclude1);
386 insertResult = pit.insert(*interestM);
387 BOOST_CHECK_EQUAL(insertResult.second, true);
388 BOOST_CHECK_EQUAL(pit.size(), 11);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700389}
390
Haowei Yuan78c84d12014-02-27 15:35:13 -0600391BOOST_AUTO_TEST_CASE(Erase)
Junxiao Shicbba04c2014-01-26 14:21:22 -0700392{
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700393 shared_ptr<Interest> interest = makeInterest("/z88Admz6A2");
Junxiao Shicbba04c2014-01-26 14:21:22 -0700394
Haowei Yuan78c84d12014-02-27 15:35:13 -0600395 NameTree nameTree(16);
396 Pit pit(nameTree);
397
Junxiao Shicbba04c2014-01-26 14:21:22 -0700398 std::pair<shared_ptr<pit::Entry>, bool> insertResult;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700399
Haowei Yuan78c84d12014-02-27 15:35:13 -0600400 BOOST_CHECK_EQUAL(pit.size(), 0);
401
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700402 insertResult = pit.insert(*interest);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700403 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600404 BOOST_CHECK_EQUAL(pit.size(), 1);
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700405 BOOST_CHECK(pit.find(*interest) != nullptr);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700406
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700407 insertResult = pit.insert(*interest);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700408 BOOST_CHECK_EQUAL(insertResult.second, false);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600409 BOOST_CHECK_EQUAL(pit.size(), 1);
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700410 BOOST_CHECK(pit.find(*interest) != nullptr);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700411
Haowei Yuan78c84d12014-02-27 15:35:13 -0600412 pit.erase(insertResult.first);
413 BOOST_CHECK_EQUAL(pit.size(), 0);
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700414 BOOST_CHECK(pit.find(*interest) == nullptr);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700415
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700416 insertResult = pit.insert(*interest);
Junxiao Shicbba04c2014-01-26 14:21:22 -0700417 BOOST_CHECK_EQUAL(insertResult.second, true);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600418 BOOST_CHECK_EQUAL(pit.size(), 1);
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700419 BOOST_CHECK(pit.find(*interest) != nullptr);
Haowei Yuan78c84d12014-02-27 15:35:13 -0600420}
Junxiao Shicbba04c2014-01-26 14:21:22 -0700421
Junxiao Shiee5a4442014-07-27 17:13:43 -0700422BOOST_AUTO_TEST_CASE(EraseNameTreeEntry)
423{
424 NameTree nameTree;
425 Pit pit(nameTree);
426 size_t nNameTreeEntriesBefore = nameTree.size();
427
428 shared_ptr<Interest> interest = makeInterest("/37xWVvQ2K");
429 shared_ptr<pit::Entry> entry = pit.insert(*interest).first;
430 pit.erase(entry);
431 BOOST_CHECK_EQUAL(nameTree.size(), nNameTreeEntriesBefore);
432}
433
Junxiao Shicbba04c2014-01-26 14:21:22 -0700434BOOST_AUTO_TEST_CASE(FindAllDataMatches)
435{
Haowei Yuane1079fc2014-03-08 14:41:25 -0600436 Name nameA ("ndn:/A");
437 Name nameAB ("ndn:/A/B");
438 Name nameABC ("ndn:/A/B/C");
439 Name nameABCD("ndn:/A/B/C/D");
440 Name nameD ("ndn:/D");
441
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700442 shared_ptr<Interest> interestA = makeInterest(nameA );
443 shared_ptr<Interest> interestABC = makeInterest(nameABC);
444 shared_ptr<Interest> interestD = makeInterest(nameD );
Junxiao Shicbba04c2014-01-26 14:21:22 -0700445
Haowei Yuan78c84d12014-02-27 15:35:13 -0600446 NameTree nameTree(16);
447 Pit pit(nameTree);
Haowei Yuane1079fc2014-03-08 14:41:25 -0600448 int count = 0;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700449
Haowei Yuan78c84d12014-02-27 15:35:13 -0600450 BOOST_CHECK_EQUAL(pit.size(), 0);
451
Alexander Afanasyev28d586a2014-07-10 20:10:54 -0700452 pit.insert(*interestA );
453 pit.insert(*interestABC);
454 pit.insert(*interestD );
Haowei Yuane1079fc2014-03-08 14:41:25 -0600455
456 nameTree.lookup(nameABCD); // make sure /A/B/C/D is in nameTree
Junxiao Shi57f0f312014-03-16 11:52:20 -0700457
Haowei Yuan78c84d12014-02-27 15:35:13 -0600458 BOOST_CHECK_EQUAL(pit.size(), 3);
459
Alexander Afanasyevc026d252014-06-16 11:14:15 -0700460 shared_ptr<Data> data = makeData(nameABCD);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700461
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700462 pit::DataMatchResult matches = pit.findAllDataMatches(*data);
Junxiao Shi57f0f312014-03-16 11:52:20 -0700463
Haowei Yuane1079fc2014-03-08 14:41:25 -0600464 bool hasA = false;
465 bool hasAB = false;
466 bool hasABC = false;
467 bool hasD = false;
468
Junxiao Shib2bcbcd2014-11-08 09:30:28 -0700469 for (const shared_ptr<pit::Entry>& entry : matches) {
Junxiao Shicbba04c2014-01-26 14:21:22 -0700470 ++count;
Haowei Yuane1079fc2014-03-08 14:41:25 -0600471
472 if (entry->getName().equals(nameA ))
473 hasA = true;
474
475 if (entry->getName().equals(nameAB))
476 hasAB = true;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700477
Haowei Yuane1079fc2014-03-08 14:41:25 -0600478 if (entry->getName().equals(nameABC))
479 hasABC = true;
Junxiao Shi57f0f312014-03-16 11:52:20 -0700480
Haowei Yuane1079fc2014-03-08 14:41:25 -0600481 if (entry->getName().equals(nameD))
482 hasD = true;
Junxiao Shicbba04c2014-01-26 14:21:22 -0700483 }
Haowei Yuane1079fc2014-03-08 14:41:25 -0600484 BOOST_CHECK_EQUAL(hasA , true);
485 BOOST_CHECK_EQUAL(hasAB , false);
486 BOOST_CHECK_EQUAL(hasABC, true);
487 BOOST_CHECK_EQUAL(hasD , false);
488
Junxiao Shicbba04c2014-01-26 14:21:22 -0700489 BOOST_CHECK_EQUAL(count, 2);
Haowei Yuane1079fc2014-03-08 14:41:25 -0600490
Junxiao Shicbba04c2014-01-26 14:21:22 -0700491}
492
Alexander Afanasyev750fa1c2015-01-03 17:28:31 -0800493BOOST_AUTO_TEST_CASE(Iterator)
494{
495 NameTree nameTree(16);
496 Pit pit(nameTree);
497
498 shared_ptr<Interest> interestA = makeInterest("/A");
499 shared_ptr<Interest> interestABC1 = makeInterest("/A/B/C");
500 shared_ptr<Interest> interestABC2 = makeInterest("/A/B/C");
501 interestABC2->setSelectors(ndn::Selectors().setMinSuffixComponents(10));
502 shared_ptr<Interest> interestD = makeInterest("/D");
503
504 BOOST_CHECK_EQUAL(pit.size(), 0);
505 BOOST_CHECK(pit.begin() == pit.end());
506
507 pit.insert(*interestABC1);
508 BOOST_CHECK_EQUAL(pit.size(), 1);
509 BOOST_CHECK(pit.begin() != pit.end());
510 BOOST_CHECK(pit.begin()->getInterest() == *interestABC1);
511 BOOST_CHECK((*pit.begin()).getInterest() == *interestABC1);
512
513 auto i = pit.begin();
514 auto j = pit.begin();
515 BOOST_CHECK(++i == pit.end());
516 BOOST_CHECK(j++ == pit.begin());
517 BOOST_CHECK(j == pit.end());
518
519 pit.insert(*interestA);
520 pit.insert(*interestABC2);
521 pit.insert(*interestD);
522
523 std::set<const Interest*> expected = {&*interestA, &*interestABC1, &*interestABC2, &*interestD};
524 std::set<const Interest*> actual;
525 for (const auto& pitEntry : pit) {
526 actual.insert(&pitEntry.getInterest());
527 }
528 BOOST_CHECK(actual == expected);
529 for (auto actualIt = actual.begin(), expectedIt = expected.begin();
530 actualIt != actual.end() && expectedIt != expected.end(); ++actualIt, ++expectedIt) {
531 BOOST_CHECK_EQUAL(**actualIt, **expectedIt);
532 }
533}
534
Junxiao Shicbba04c2014-01-26 14:21:22 -0700535BOOST_AUTO_TEST_SUITE_END()
Junxiao Shi5e5e4452015-09-24 16:56:52 -0700536BOOST_AUTO_TEST_SUITE_END()
Junxiao Shicbba04c2014-01-26 14:21:22 -0700537
Junxiao Shid9ee45c2014-02-27 15:38:11 -0700538} // namespace tests
Spyridon Mastorakisd0381c02015-02-19 10:29:41 -0800539} // namespace pit
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800540} // namespace nfd